summaryrefslogtreecommitdiff
path: root/tex
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2002-01-11 00:00:00 +0100
committerHans Hagen <pragma@wxs.nl>2002-01-11 00:00:00 +0100
commit736de6a312c37fbb8cea65cf0a86eda7dbbe0575 (patch)
treead6691db97ee31450f9ca5b30a90a22df067331b /tex
parent398264e8338d79fc389c76f0a1f0b30e4442f4e3 (diff)
downloadcontext-736de6a312c37fbb8cea65cf0a86eda7dbbe0575.tar.gz
stable 2002.01.11
Diffstat (limited to 'tex')
-rw-r--r--tex/context/base/colo-ini.tex855
-rw-r--r--tex/context/base/colo-rgb.tex29
-rw-r--r--tex/context/base/cont-fil.tex8
-rw-r--r--tex/context/base/cont-log.tex14
-rw-r--r--tex/context/base/cont-new.tex403
-rw-r--r--tex/context/base/cont-sys.ori4
-rw-r--r--tex/context/base/cont-usr.ori18
-rw-r--r--tex/context/base/context.tex34
-rw-r--r--tex/context/base/core-buf.tex109
-rw-r--r--tex/context/base/core-con.tex153
-rw-r--r--tex/context/base/core-dat.tex38
-rw-r--r--tex/context/base/core-des.tex46
-rw-r--r--tex/context/base/core-fig.tex265
-rw-r--r--tex/context/base/core-fil.tex115
-rw-r--r--tex/context/base/core-fld.tex65
-rw-r--r--tex/context/base/core-fnt.tex85
-rw-r--r--tex/context/base/core-gen.tex60
-rw-r--r--tex/context/base/core-grd.tex73
-rw-r--r--tex/context/base/core-hlp.tex18
-rw-r--r--tex/context/base/core-int.tex914
-rw-r--r--tex/context/base/core-itm.tex1057
-rw-r--r--tex/context/base/core-job.tex22
-rw-r--r--tex/context/base/core-lst.tex129
-rw-r--r--tex/context/base/core-mak.tex2
-rw-r--r--tex/context/base/core-mar.tex144
-rw-r--r--tex/context/base/core-mat.tex42
-rw-r--r--tex/context/base/core-mis.tex77
-rw-r--r--tex/context/base/core-nav.tex62
-rw-r--r--tex/context/base/core-new.tex360
-rw-r--r--tex/context/base/core-not.tex251
-rw-r--r--tex/context/base/core-ntb.tex180
-rw-r--r--tex/context/base/core-num.tex91
-rw-r--r--tex/context/base/core-obj.tex235
-rw-r--r--tex/context/base/core-par.tex4
-rw-r--r--tex/context/base/core-pos.tex226
-rw-r--r--tex/context/base/core-ref.tex1617
-rw-r--r--tex/context/base/core-reg.tex314
-rw-r--r--tex/context/base/core-rul.tex469
-rw-r--r--tex/context/base/core-sec.tex871
-rw-r--r--tex/context/base/core-spa.tex1323
-rw-r--r--tex/context/base/core-syn.tex46
-rw-r--r--tex/context/base/core-sys.tex101
-rw-r--r--tex/context/base/core-tab.tex99
-rw-r--r--tex/context/base/core-tbl.tex200
-rw-r--r--tex/context/base/core-uti.tex109
-rw-r--r--tex/context/base/core-var.tex55
-rw-r--r--tex/context/base/core-ver.tex92
-rw-r--r--tex/context/base/core-vis.tex76
-rw-r--r--tex/context/base/enco-ans.tex26
-rw-r--r--tex/context/base/enco-com.tex1
-rw-r--r--tex/context/base/enco-def.tex12
-rw-r--r--tex/context/base/enco-fde.tex2
-rw-r--r--tex/context/base/enco-fpl.tex2
-rw-r--r--tex/context/base/enco-ini.tex110
-rw-r--r--tex/context/base/enco-pfr.tex91
-rw-r--r--tex/context/base/enco-tbo.tex5
-rw-r--r--tex/context/base/font-ini.tex1090
-rw-r--r--tex/context/base/font-run.tex10
-rw-r--r--tex/context/base/hand-ini.tex123
-rw-r--r--tex/context/base/java-fld.tex9
-rw-r--r--tex/context/base/java-ini.tex14
-rw-r--r--tex/context/base/lang-alt.tex30
-rw-r--r--tex/context/base/lang-ger.tex35
-rw-r--r--tex/context/base/lang-ini.tex496
-rw-r--r--tex/context/base/lang-ita.tex2
-rw-r--r--tex/context/base/lang-lab.tex186
-rw-r--r--tex/context/base/lang-sla.tex2
-rw-r--r--tex/context/base/lang-ura.tex2
-rw-r--r--tex/context/base/m-chart.tex57
-rw-r--r--tex/context/base/m-pstric.tex14
-rw-r--r--tex/context/base/m-quest.tex8
-rw-r--r--tex/context/base/m-steps.tex5
-rw-r--r--tex/context/base/m-units.tex66
-rw-r--r--tex/context/base/math-ini.tex48
-rw-r--r--tex/context/base/math-pln.tex336
-rw-r--r--tex/context/base/math-tex.tex19
-rw-r--r--tex/context/base/meta-fig.tex57
-rw-r--r--tex/context/base/meta-ini.tex261
-rw-r--r--tex/context/base/meta-pag.tex111
-rw-r--r--tex/context/base/meta-txt.tex62
-rw-r--r--tex/context/base/mult-com.tex49
-rw-r--r--tex/context/base/mult-con.tex27
-rw-r--r--tex/context/base/mult-ini.tex106
-rw-r--r--tex/context/base/mult-sys.tex18
-rw-r--r--tex/context/base/page-bck.tex138
-rw-r--r--tex/context/base/page-flt.tex585
-rw-r--r--tex/context/base/page-imp.tex867
-rw-r--r--tex/context/base/page-ini.tex284
-rw-r--r--tex/context/base/page-lay.tex363
-rw-r--r--tex/context/base/page-lin.tex5
-rw-r--r--tex/context/base/page-log.tex8
-rw-r--r--tex/context/base/page-lyr.tex161
-rw-r--r--tex/context/base/page-mak.tex28
-rw-r--r--tex/context/base/page-mar.tex31
-rw-r--r--tex/context/base/page-mul.tex41
-rw-r--r--tex/context/base/page-num.tex206
-rw-r--r--tex/context/base/page-one.tex135
-rw-r--r--tex/context/base/page-run.tex92
-rw-r--r--tex/context/base/page-set.tex563
-rw-r--r--tex/context/base/page-sid.tex175
-rw-r--r--tex/context/base/page-txt.tex65
-rw-r--r--tex/context/base/ppchtex.tex312
-rw-r--r--tex/context/base/s-abr-01.tex2
-rw-r--r--tex/context/base/s-faq-01.tex31
-rw-r--r--tex/context/base/s-faq-02.tex17
-rw-r--r--tex/context/base/s-faq-03.tex40
-rw-r--r--tex/context/base/s-mod-00.tex247
-rw-r--r--tex/context/base/s-mod-01.tex30
-rw-r--r--tex/context/base/s-pre-19.tex3
-rw-r--r--tex/context/base/setupa.tex335
-rw-r--r--tex/context/base/setupb.tex111
-rw-r--r--tex/context/base/setupd.tex6
-rw-r--r--tex/context/base/setupe.tex310
-rw-r--r--tex/context/base/spec-def.tex893
-rw-r--r--tex/context/base/spec-dpm.tex82
-rw-r--r--tex/context/base/spec-dvi.tex16
-rw-r--r--tex/context/base/spec-fdf.tex420
-rw-r--r--tex/context/base/spec-ini.tex953
-rw-r--r--tex/context/base/spec-mis.tex12
-rw-r--r--tex/context/base/spec-pdf.tex57
-rw-r--r--tex/context/base/spec-ps.tex18
-rw-r--r--tex/context/base/spec-tpd.tex205
-rw-r--r--tex/context/base/spec-tr.tex10
-rw-r--r--tex/context/base/spec-win.tex23
-rw-r--r--tex/context/base/spec-yy.tex4
-rw-r--r--tex/context/base/supp-box.tex798
-rw-r--r--tex/context/base/supp-emp.tex4
-rw-r--r--tex/context/base/supp-eps.tex151
-rw-r--r--tex/context/base/supp-fil.tex72
-rw-r--r--tex/context/base/supp-fun.tex5
-rw-r--r--tex/context/base/supp-ini.tex48
-rw-r--r--tex/context/base/supp-lan.tex140
-rw-r--r--tex/context/base/supp-mat.tex5
-rw-r--r--tex/context/base/supp-mis.tex21
-rw-r--r--tex/context/base/supp-mpe.tex712
-rw-r--r--tex/context/base/supp-mps.tex464
-rw-r--r--tex/context/base/supp-mrk.tex619
-rw-r--r--tex/context/base/supp-num.tex13
-rw-r--r--tex/context/base/supp-pdf.tex556
-rw-r--r--tex/context/base/supp-ran.tex21
-rw-r--r--tex/context/base/supp-vis.tex138
-rw-r--r--tex/context/base/symb-ini.tex218
-rw-r--r--tex/context/base/symb-mvs.tex215
-rw-r--r--tex/context/base/symb-nav.tex4
-rw-r--r--tex/context/base/symb-run.tex53
-rw-r--r--tex/context/base/syst-eet.tex270
-rw-r--r--tex/context/base/syst-etx.tex91
-rw-r--r--tex/context/base/syst-ext.tex1364
-rw-r--r--tex/context/base/syst-gen.tex1544
-rw-r--r--tex/context/base/syst-new.tex200
-rw-r--r--tex/context/base/syst-pln.tex636
-rw-r--r--tex/context/base/syst-prm.tex85
-rw-r--r--tex/context/base/syst-tex.tex30
-rw-r--r--tex/context/base/type-buy.tex27
-rw-r--r--tex/context/base/type-enc.tex183
-rw-r--r--tex/context/base/type-exa.tex16
-rw-r--r--tex/context/base/type-ini.tex205
-rw-r--r--tex/context/base/type-map.tex21
-rw-r--r--tex/context/base/type-pre.tex32
-rw-r--r--tex/context/base/type-syn.tex2
-rw-r--r--tex/context/base/verb-ini.tex189
-rw-r--r--tex/context/base/verb-raw.tex7
-rw-r--r--tex/context/base/x-chemml.tex212
-rw-r--r--tex/context/base/x-contml.tex451
-rw-r--r--tex/context/base/x-fdf-00.tex40
-rw-r--r--tex/context/base/x-fig-00.tex12
-rw-r--r--tex/context/base/x-fig-01.tex33
-rw-r--r--tex/context/base/x-fig-02.tex10
-rw-r--r--tex/context/base/x-mathml.tex (renamed from tex/context/base/m-mathml.tex)8
-rw-r--r--tex/context/base/x-physml.tex16
-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-xml-01.tex80
-rw-r--r--tex/context/base/x-xml-02.tex67
-rw-r--r--tex/context/base/xtag-cml.tex222
-rw-r--r--tex/context/base/xtag-exp.tex81
-rw-r--r--tex/context/base/xtag-ext.tex115
-rw-r--r--tex/context/base/xtag-ini.tex1949
-rw-r--r--tex/context/base/xtag-map.tex405
-rw-r--r--tex/context/base/xtag-meh.tex2
-rw-r--r--tex/context/base/xtag-mmc.tex89
-rw-r--r--tex/context/base/xtag-mml.tex65
-rw-r--r--tex/context/base/xtag-mmp.tex14
-rw-r--r--tex/context/base/xtag-pml.tex83
-rw-r--r--tex/context/base/xtag-pmu.tex188
-rw-r--r--tex/context/base/xtag-pre.tex325
-rw-r--r--tex/context/base/xtag-run.tex233
-rw-r--r--tex/context/base/xtag-xsd.tex28
-rw-r--r--tex/context/config/cont-usr.tex18
-rw-r--r--tex/context/extra/setup-qr.tex169
-rw-r--r--tex/context/user/cont-sys.rme4
-rw-r--r--tex/generic/context/mptopdf.tex2
-rw-r--r--tex/generic/context/ppchtex.noc7
193 files changed, 24748 insertions, 12779 deletions
diff --git a/tex/context/base/colo-ini.tex b/tex/context/base/colo-ini.tex
index e98e14217..b3e10792d 100644
--- a/tex/context/base/colo-ini.tex
+++ b/tex/context/base/colo-ini.tex
@@ -170,6 +170,16 @@
11: culoarea este convertita la gri
\stopmessages
+%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 \macros
%D {definecolor}
%D
@@ -194,51 +204,64 @@
%D \stoptypen
%D
%D Gray scales are specified with the \type{s} parameter,
-%D where the is derived from screen.
+%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 \starttypen
+%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 \stoptypen
-\def\colorlist{}
+\let\colorlist\empty
\def\@@cl@@z{0}
\def\@@cl@@o{1}
+\def\@@resetcolorparameters
+ {\let\@@cl@@r\@@cl@@z\let\@@cl@@g\@@cl@@z\let\@@cl@@b\@@cl@@z
+ \let\@@cl@@c\@@cl@@z\let\@@cl@@m\@@cl@@z\let\@@cl@@y\@@cl@@z
+ \let\@@cl@@k\@@cl@@z\let\@@cl@@s\@@cl@@z
+ \let\@@cl@@t\@@cl@@z\let\@@cl@@a\@@cl@@z}
+
+\def\@@cl@@A{\@@cl@@a} % a hook for symbolic conversion, see below
+
+\def\colorZpattern{S:\@@cl@@z:\@@cl@@A:\@@cl@@t}
+\def\colorSpattern{S:\@@cl@@s:\@@cl@@A:\@@cl@@t}
+\def\colorCpattern{C:\@@cl@@c:\@@cl@@m:\@@cl@@y:\@@cl@@k:\@@cl@@A:\@@cl@@t}
+\def\colorRpattern{R:\@@cl@@r:\@@cl@@g:\@@cl@@b:\@@cl@@A:\@@cl@@t}
+
\def\definecolor%
{\dodoubleargument\dodefinecolor}
-\def\dodefinecolor[#1][#2]%
- {% beware
-\saveglobal % ? \dodoglobal
- \addtocommalist{#1}\colorlist
-\restoreglobal
+\def\dodefinecolor[#1][#2]%
+ {\addtocommalist{#1}\colorlist
\doifassignmentelse{#2}
- {\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
+ {\@@resetcolorparameters
\getparameters[\??cl @@][#2]%
\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!colors}{8}{{[#2]},#1}%
- \redoglobal\setevalue{\??cr#1}{S:\@@cl@@z}}
- {\redoglobal\setevalue{\??cr#1}{S:\@@cl@@s}}}
- {\redoglobal\setevalue{\??cr#1}{C:\@@cl@@c:\@@cl@@m:\@@cl@@y:\@@cl@@k}}}
- {\redoglobal\setevalue{\??cr#1}{R:\@@cl@@r:\@@cl@@g:\@@cl@@b}}}
+ \setevalue{\??cr#1}{\colorZpattern}}
+ {\setevalue{\??cr#1}{\colorSpattern}}}
+ {\setevalue{\??cr#1}{\colorCpattern}}}
+ {\setevalue{\??cr#1}{\colorRpattern}}}
{\doifdefinedelse{\??cr#2}
- {\redoglobal\setevalue{\??cr#1}{\getvalue{\??cr#2}}}
+ {\setevalue{\??cr#1}{\getvalue{\??cr#2}}}
{\showmessage{\m!colors}{3}{#1}}}%
- \dodoglobal\setvalue{#1}{\color[#1]}}
+ \unexpanded\setvalue{#1}{\color[#1]}} % \unexpanded toegevoegd
%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 Colors can be defined global by using \type{\doglobal},
-%D like in
-%D
-%D \startbuffer
-%D \doglobal\definecolor [SomeKindOfRed] [r=.8,g=.05,b=.05]
-%D \stopbuffer
-%D
+%D only for the purpose of showing them with \type {\showcolor}.
+%D
%D \typebuffer
-%D
%D \haalbuffer
%D
%D This color shows up as \color[SomeKindOfRed]{some kind
@@ -265,7 +288,7 @@
%D \setupcolor[rgb]
%D \stoptypen
-\def\colorstyle{}
+\let\colorstyle\empty
\def\setupcolor%
{\dosingleargument\dosetupcolor}
@@ -273,13 +296,14 @@
\def\dosetupcolor[#1]%
{\doifnot{#1}{\colorstyle}
{\def\colorstyle{#1}%
- \def\dodosetupcolor##1%
- {\makeshortfilename[\f!colorprefix\truefilename{##1}]%
- \readsysfile{\shortfilename}%
- {\showmessage{\m!colors}{4}{\colorstyle}}
- {\showmessage{\m!colors}{5}{\colorstyle}}}%
\processcommalist[#1]\dodosetupcolor}}
+\def\dodosetupcolor#1%
+ {\makeshortfilename[\f!colorprefix\truefilename{#1}]%
+ \readsysfile\shortfilename
+ {\showmessage\m!colors4\colorstyle}
+ {\showmessage\m!colors5\colorstyle}}
+
%D When typesetting for paper, we prefer using the \kap{CMYK}
%D color space, but for on||screen viewing we prefer \kap{RGB}
%D (the previous implementation supported only this scheme).
@@ -303,19 +327,91 @@
\newif\ifRGBsupported
\newif\ifCMYKsupported
-\newif\ifconverttoGRAY % obsolete
\newif\ifpreferGRAY
\newif\ifGRAYprefered
\newif\ifreduceCMYK
-%D needs:
+%D The last boolean controls reduction of \kap{CMYK} to
+%D \kap{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.
+
+%D The next (internal) switch suppresses duplicate messages.
+
+\newif\ifconverttoGRAY
+
+%D This module also needs:
% \newif\ifMPgraphics
% \newif\ifinpagebody
-%D The last boolean controls reduction of \kap{CMYK} to
-%D \kap{CMY} colors. When set to true, the black component
-%D is added to the other ones.
+%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
+
+%D Since color is used frequently today (at least by the
+%D author of this module) it makes sense to optimize switching
+%D to the max.
+%D
+%D \starttypen
+%D \def\startcolormode#1%
+%D {\ifincolor\ifpermitcolormode
+%D \doifcolorelse{#1}
+%D {\getcurrentcolorspecs{#1}%
+%D \expandafter\dostartcolormode\currentcolorspecs\od}
+%D {\nostartcolormode}%
+%D \fi\fi}
+%D \stoptypen
+%D
+%D So, the more readable alternatives like the one above are
+%D gone now.
+
+\beginETEX \ifcsname
+
+\def\dowithcolor#1#2% #1=\action #2=color
+ {\ifincolor\ifpermitcolormode
+ \ifcsname\??cr\currentpalet#2\endcsname
+ \@EAEAEA#1\csname\??cr\currentpalet#2\endcsname\od
+ \else\ifcsname\??cr#2\endcsname
+ \@EAEAEA#1\csname\??cr#2\endcsname\od
+ \fi\fi
+ \fi\fi}
+
+\endETEX
+
+\beginTEX
+
+\def\dowithcolor#1#2% #1=\action #2=color
+ {\ifincolor\ifpermitcolormode
+ \@EA\ifx\csname\??cr\currentpalet#2\endcsname\relax
+ \@EA\ifx\csname\??cr#2\endcsname\relax \else
+ \@EAEAEA#1\csname\??cr#2\endcsname\od
+ \fi
+ \else
+ \@EAEAEA#1\csname\??cr\currentpalet#2\endcsname\od
+ \fi\fi
+ \fi\fi}
+
+\endTEX
+
+\def\startcolormode % includes \ifincolor\ifpermitcolormode
+ {\dowithcolor\execcolorRCS}
+
+\def\stopcolormode
+ {\ifincolor\ifpermitcolormode
+ \dostoptransparency
+ \dostopcolormode
+ \fi\fi}
%D Color modes are entered using the next set of commands.
%D The \type{\stop} alternatives are implemented in a way
@@ -324,10 +420,11 @@
%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\dostartcolormodeR#1:#2:#3\od%
- {\bgroup
- %\def\@@cl@@r{#1}\def \@@cl@@g{#2}\def \@@cl@@b{#3}%
- \edef\@@cl@@r{#1}\edef\@@cl@@g{#2}\edef\@@cl@@b{#3}%
+\def\execcolorRCS#1:%
+ {\csname execcolor#1\endcsname}
+
+\def\execcolorR#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
@@ -343,12 +440,10 @@
\convertRGBtoGRAY\@@cl@@r\@@cl@@g\@@cl@@b
\dostartgraycolormode\@@cl@@s
\fi\fi\fi
- \egroup}
-
-\def\dostartcolormodeC#1:#2:#3:#4\od%
- {\bgroup
- %\def\@@cl@@c{#1}\def \@@cl@@m{#2}\def \@@cl@@y{#3}\def \@@cl@@k{#4}%
- \edef\@@cl@@c{#1}\edef\@@cl@@m{#2}\edef\@@cl@@y{#3}\edef\@@cl@@k{#4}%
+ \exectransparency}
+
+\def\execcolorC#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
@@ -358,10 +453,8 @@
\else\ifCMYKsupported
\ifreduceCMYK
\convertCMYKtoCMY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
- \else
- \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
\fi
+ \dostartcmykcolormode\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
\else\ifRGBsupported
\convertCMYKtoRGB\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
\dostartrgbcolormode\@@cl@@r\@@cl@@g\@@cl@@b
@@ -369,38 +462,77 @@
\convertCMYKtoGRAY\@@cl@@c\@@cl@@m\@@cl@@y\@@cl@@k
\dostartgraycolormode\@@cl@@s
\fi\fi\fi
- \egroup}
+ \exectransparency}
+
+\def\execcolorS#1:%
+ {\dostartgraycolormode{#1}%
+ \exectransparency}
-\def\dostartcolormodeS#1\od%
- {\dostartgraycolormode{#1}}
+%D Transparency is handled similar for all three color modes. We
+%D can turn transparency off with the following switch:
-%D Prefering gray is not the same as converting to gray. Conversion treats
-%D each color components in a different way, while prefering is just a
-%D reduction and thus a space||saving option.
+\newif\iftransparancysupported \transparancysupportedtrue % todo
-%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,
+\def\exectransparency
+ {\iftransparancysupported
+ \expandafter\doexectransparency
+ \else
+ \expandafter\noexectransparency
+ \fi}
-\newif\ifpermitcolormode \permitcolormodetrue
+\def\doexectransparency#1:#2\od
+ {\global\@EA\chardef\csname\@@currenttransparent\endcsname % nasty
+ \ifcase#1\space
+ \zerocount
+ \else
+ \plusone
+ \dostarttransparency{#1}{#2}%
+ \fi}
-\def\dostartcolormode#1:%
- {\getvalue{dostartcolormode#1}}
+\def\noexectransparency#1\od
+ {}
-\def\startcolormode#1%
- {\ifincolor\ifpermitcolormode
- \doifcolorelse{#1}
- {\getcurrentcolorspecs{#1}%
- \expandafter\dostartcolormode\currentcolorspecs\od}
- {\dostopcolormode}%
- \fi\fi}
+%D Todo: minimize resets.
+
+\def\conditionalstoptransparancy
+ {\ifcase\csname\@@currenttransparent\endcsname\or
+ \dostoptransparency
+ \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\definetransparency
+ {\dodoubleargument\dodefinetransparency}
-\def\stopcolormode%
- {\ifincolor\ifpermitcolormode\dostopcolormode\fi\fi}
+%\def\dodefinetransparency[#1][#2]%
+% {\@EA\chardef\csname\??cl-#1\endcsname#2\relax
+% \ifundefined{\??cl-#2}#2\else\csname\??cl-#2\endcsname\fi}
+
+\def\dodefinetransparency[#1][#2]%
+ {\@EA\chardef\csname\??cl-#1\endcsname#2\relax}
+
+\def\transparencynumber#1%
+ {\the\executeifdefined{\??cl-#1}\zerocount}
+
+\definetransparency [none] [0] \definetransparency [0] [0]
+\definetransparency [normal] [1] \definetransparency [1] [1]
+\definetransparency [multiply] [2] \definetransparency [2] [2]
+\definetransparency [screen] [3] \definetransparency [3] [3]
+\definetransparency [overlay] [4] \definetransparency [4] [4]
+\definetransparency [softlight] [5] \definetransparency [5] [5]
+\definetransparency [hardlight] [6] \definetransparency [6] [6]
+\definetransparency [colordodge] [7] \definetransparency [7] [7]
+\definetransparency [colorburn] [8] \definetransparency [8] [8]
+\definetransparency [darken] [9] \definetransparency [9] [9]
+\definetransparency [lighten] [10] \definetransparency [10] [10]
+\definetransparency [difference] [11] \definetransparency [11] [11]
+\definetransparency [exclusion] [12] \definetransparency [12] [12]
+
+%D Now we hook 'm into the patterns:
+
+\def\@@cl@@A{\transparencynumber\@@cl@@a}
%D \macros
%D {startregistercolor,stopregistercolor,permitcolormode}
@@ -412,9 +544,42 @@
\def\startregistercolor[#1]%
{\permitcolormodefalse\startcolor[#1]\permitcolormodetrue}
-\def\stopregistercolor%
+\def\stopregistercolor
{\permitcolormodefalse\stopcolor\permitcolormodetrue}
+%D We use these macros for implementing text colors
+%D (actually, the first application was in foreground
+%D colors).
+%D
+%D \starttypen
+%D \starttextcolor[red]
+%D \dorecurse{10}{\input tufte \color[green]{oeps} \par}
+%D \stoptextcolor
+%D \stoptypen
+%D
+%D This is more efficient than the alternative:
+%D
+%D \starttypen
+%D \setupbackgrounds[text][foregroundcolor=red]
+%D \startregistercolor[red]
+%D \dorecurse{10}{\input tufte \color[green]{oeps} \par}
+%D \stopregistercolor
+%D \stoptypen
+
+\let\maintextcolor\empty
+
+\def\starttextcolor[#1]% to be translated
+ {\bgroup
+ \let\starttextcolor\relax
+ \let\stoptextcolor \relax
+ \startregistercolor[#1]%
+ \def\maintextcolor{#1}}
+
+\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)
+
%D We use some reserved names for local color components.
%D Consistent use of these scratch variables saves us
%D unneccessary hash entries.
@@ -459,38 +624,23 @@
%D in three digits precision.
\def\realcolorvalue#1%
- {\ifnum #1<10 0.00\the#1%
- \else\ifnum#1<100 0.0\the#1%
- \else\ifnum#1<1000 0.\the#1%
- \else 1\fi\fi\fi}
-
-% \def\doconvertCMYKtoRGB#1\k#2\to#3%
-% {\scratchdimen=#1\s!pt
-% \advance\scratchdimen by #2\s!pt\relax
-% \ifdim\scratchdimen>1\s!pt
-% \scratchdimen=-1\s!pt
-% \else
-% \scratchdimen=-\scratchdimen
-% \fi
-% \advance\scratchdimen by 1\s!pt
-% \multiply\scratchdimen by 1000
-% \scratchcounter=\scratchdimen
-% \advance\scratchcounter by \!!medcard
-% \divide\scratchcounter by \!!maxcard
-% \edef#3{\realcolorvalue\scratchcounter}}
+ {\ifnum#1<10 0.00\the#1\else
+ \ifnum#1<100 0.0\the#1\else
+ \ifnum#1<1000 0.\the#1\else
+ 1\fi\fi\fi}
\def\doconvertCMYKtoRGB#1\k#2\to#3%
- {\ifdim#2\s!pt<#1\s!pt % k>color
- \scratchdimen=1\s!pt
- \advance\scratchdimen -#1\s!pt
- \advance\scratchdimen -#2\s!pt
- \multiply\scratchdimen by 1000
- \scratchcounter=\scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard
- \edef#3{\realcolorvalue\scratchcounter}%
- \else
- \edef#3{0}%
+ {\ifdim#2\s!pt<#1\s!pt
+ \colordimen1\s!pt
+ \advance\colordimen -#1\s!pt
+ \advance\colordimen -#2\s!pt
+ \multiply\colordimen 1000
+ \colorcount\colordimen
+ \advance\colorcount \medcard
+ \divide\colorcount \maxcard
+ \edef#3{\realcolorvalue\colorcount}%
+ \else % k >= color
+ \let#3\@@cl@@z
\fi}
\def\convertCMYKtoRGB#1#2#3#4%
@@ -499,20 +649,20 @@
\doconvertCMYKtoRGB#3\k#4\to\@@cl@@b}
\def\doconvertRGBtoCMYK#1\to#2%
- {\scratchdimen=#1\s!pt
- \multiply\scratchdimen by 1000
- \scratchcounter=\scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard
- \scratchcounter=-\scratchcounter
- \advance\scratchcounter by 1000
- \edef#2{\realcolorvalue\scratchcounter}}
+ {\colordimen#1\s!pt
+ \multiply\colordimen 1000
+ \colorcount\colordimen
+ \advance\colorcount \medcard
+ \divide\colorcount \maxcard
+ \colorcount-\colorcount
+ \advance\colorcount 1000
+ \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}
+ \let\@@cl@@k\@@cl@@z}
%D The following switch is mainly meant for (hidden)
%D documentation purposes.
@@ -525,42 +675,42 @@
\def\bGRAYfactor{\ifweightGRAY110\else\nGRAYfactor\fi}
\def\convertRGBtoGRAY#1#2#3%
- {\scratchdimen=#1\s!pt
- \scratchdimen=\rGRAYfactor\scratchdimen
- \scratchcounter=\scratchdimen
- \scratchdimen=#2\s!pt
- \scratchdimen=\gGRAYfactor\scratchdimen
- \advance\scratchcounter by \scratchdimen
- \scratchdimen=#3\s!pt
- \scratchdimen=\bGRAYfactor\scratchdimen
- \advance\scratchcounter by \scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard
- \edef\@@cl@@s{\realcolorvalue\scratchcounter}}
+ {\colordimen#1\s!pt
+ \colordimen\rGRAYfactor\colordimen
+ \colorcount\colordimen
+ \colordimen#2\s!pt
+ \colordimen\gGRAYfactor\colordimen
+ \advance\colorcount \colordimen
+ \colordimen#3\s!pt
+ \colordimen\bGRAYfactor\colordimen
+ \advance\colorcount \colordimen
+ \advance\colorcount \medcard
+ \divide\colorcount \maxcard
+ \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%
- {\scratchdimen=#1\s!pt
- \advance\scratchdimen by #2\s!pt\relax
- \ifdim\scratchdimen>1\s!pt
- \scratchdimen=1\s!pt
- \else
- \scratchdimen=\scratchdimen
+ {\colordimen#1\s!pt
+ \advance\colordimen #2\s!pt\relax
+ \ifdim\colordimen>1\s!pt
+ \colordimen1\s!pt
+ %\else
+ % \colordimen\colordimen
\fi
- \multiply\scratchdimen by 1000
- \scratchcounter=\scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard
- \edef#3{\realcolorvalue\scratchcounter}}
+ \multiply\colordimen 1000
+ \colorcount\colordimen
+ \advance\colorcount \medcard
+ \divide\colorcount \maxcard
+ \edef#3{\realcolorvalue\colorcount}}
\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}
+ \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
@@ -575,27 +725,34 @@
\def\dosetupcolors[#1]%
{\getparameters[\??cl][#1]%
- \doifelse{\@@clreductie}{\v!ja}
- {\reduceCMYKtrue}
- {\reduceCMYKfalse}%
- \doifelse{\@@clrgb}{\v!nee}
- {\ifRGBsupported \showmessage{\m!colors} {9}{\v!rgb}\RGBsupportedfalse\fi}
- {\ifRGBsupported\else\showmessage{\m!colors}{10}{\v!rgb}\RGBsupportedtrue \fi}%
- \doifelse{\@@clcmyk}{\v!nee}
- {\ifCMYKsupported \showmessage{\m!colors} {9}{\v!cmyk}\CMYKsupportedfalse\fi}
- {\ifCMYKsupported\else\showmessage{\m!colors}{10}{\v!cmyk}\CMYKsupportedtrue \fi}%
- \doifelse{\@@clmpcmyk}{\v!nee}
- {\ifMPcmyk \showmessage{\m!colors} {9}{\v!mp\v!cmyk}\MPcmykfalse\fi}
- {\ifMPcmyk\else\showmessage{\m!colors}{10}{\v!mp\v!cmyk}\MPcmyktrue \fi}%
+ \doifelse\@@clreductie\v!ja
+ \reduceCMYKtrue
+ \reduceCMYKfalse
+ \doifelse\@@clrgb\v!nee
+ {\ifRGBsupported \showmessage\m!colors {9}\v!rgb\RGBsupportedfalse\fi}
+ {\ifRGBsupported\else\showmessage\m!colors{10}\v!rgb\RGBsupportedtrue \fi}%
+ \doifelse\@@clcmyk\v!nee
+ {\ifCMYKsupported \showmessage\m!colors {9}\v!cmyk\CMYKsupportedfalse\fi}
+ {\ifCMYKsupported\else\showmessage\m!colors{10}\v!cmyk\CMYKsupportedtrue \fi}%
+ \doifelse\@@clmpcmyk\v!nee
+ {\ifMPcmyk \showmessage\m!colors {9}{\v!mp\v!cmyk}\MPcmykfalse\fi}
+ {\ifMPcmyk\else\showmessage\m!colors{10}{\v!mp\v!cmyk}\MPcmyktrue \fi}%
+% \processaction
+% [\@@clconversie]
+% [ \v!ja=>\preferGRAYtrue,
+% \v!nee=>\preferGRAYfalse,
+% \v!altijd=>\preferGRAYtrue
+% \RGBsupportedfalse
+% \CMYKsupportedfalse,
+% \s!default=>\preferGRAYfalse,
+% \s!unknown=>\preferGRAYfalse]%
+%
+ \preferGRAYfalse
\processaction
[\@@clconversie]
[ \v!ja=>\preferGRAYtrue,
- \v!nee=>\preferGRAYfalse,
- \v!altijd=>\preferGRAYtrue
- \RGBsupportedfalse
- \CMYKsupportedfalse,
- \s!default=>\preferGRAYfalse,
- \s!unknown=>\preferGRAYfalse]%
+ \v!altijd=>\preferGRAYtrue\RGBsupportedfalse\CMYKsupportedfalse]%
+%
\ifRGBsupported
\converttoGRAYfalse
\forcegrayMPcolorsfalse
@@ -607,7 +764,7 @@
\reduceMPcolorstrue
\fi
\else
- \ifconverttoGRAY\else\showmessage{\m!colors}{11}{}\fi
+ \ifconverttoGRAY\else\showmessage\m!colors{11}\empty\fi
\converttoGRAYtrue
\forcegrayMPcolorstrue
\convertMPcolorsfalse
@@ -615,13 +772,13 @@
\fi\fi
\processaction
[\@@clstatus]
- [\v!globaal=>\ifincolor\else\showmessage{\m!colors}{1}{\colorstyle}\fi
+ [\v!globaal=>\ifincolor\else\showmessage\m!colors1\colorstyle\fi
\incolortrue\localcolorfalse,
- \v!lokaal=>\ifincolor\else\showmessage{\m!colors}{2}{\colorstyle}\fi
+ \v!lokaal=>\ifincolor\else\showmessage\m!colors2\colorstyle\fi
\incolortrue\localcolortrue,
- \v!start=>\ifincolor\else\showmessage{\m!colors}{1}{\colorstyle}\fi
+ \v!start=>\ifincolor\else\showmessage\m!colors1\colorstyle\fi
\incolortrue\localcolorfalse
- \let\@@clstatus=\v!globaal,
+ \let\@@clstatus\v!globaal,
\v!stop=>\incolorfalse\localcolorfalse
\forcegrayMPcolorstrue]}
@@ -632,14 +789,6 @@
%D command. Later on we will explain the use of palets. We
%D define ourselves a color conditional first.
-% \let\currentpalet\empty
-%
-% \def\doifcolorelse#1%
-% {\doifdefinedelse{\??cr\currentpalet#1}}
-%
-% \def\getcurrentcolorspecs#1%
-% {\edef\currentcolorspecs{\getvalue{\??cr\currentpalet#1}}}
-
\let\currentpalet\empty
\beginETEX \ifcsname
@@ -651,11 +800,13 @@
\expandafter\secondoftwoarguments
\fi}
-\def\getcurrentcolorspecs#1%
- {\edef\currentcolorspecs%
- {\csname\??cr
- \ifcsname\??cr\currentpalet#1\endcsname\currentpalet\fi
- #1\endcsname}}
+% no longer needed
+%
+% \def\getcurrentcolorspecs#1%
+% {\edef\currentcolorspecs%
+% {\csname\??cr
+% \ifcsname\??cr\currentpalet#1\endcsname\currentpalet\fi
+% #1\endcsname}}
\endETEX
@@ -668,11 +819,13 @@
\expandafter\firstoftwoarguments
\fi}
-\def\getcurrentcolorspecs#1%
- {\edef\currentcolorspecs%
- {\csname\??cr\@EA
- \ifx\csname\??cr\currentpalet#1\endcsname\relax\else\currentpalet\fi
- #1\endcsname}}
+% no longer needed
+%
+% \def\getcurrentcolorspecs#1%
+% {\edef\currentcolorspecs%
+% {\csname\??cr\@EA
+% \ifx\csname\??cr\currentpalet#1\endcsname\relax\else\currentpalet\fi
+% #1\endcsname}}
\endTEX
@@ -682,15 +835,19 @@
%D Simple color support, that is without nesting, is provided
%D by:
-\def\localstartcolor[#1]%
+\def\localstartcolor
{\ifincolor
\localcolortrue
- \doglobalstartcolor[#1]%
+ \expandafter\doglobalstartcolor
+ \else
+ \expandafter\noglobalstartcolor
\fi}
-\def\localstopcolor%
+\def\localstopcolor
{\ifincolor
\doglobalstopcolor
+ \else
+ \noglobalstopcolor
\fi}
%D \macros
@@ -701,14 +858,18 @@
%D
%D \showsetup{\y!startcolor}
-\def\startcolor[#1]%
+\def\startcolor
{\ifincolor
- \doglobalstartcolor[#1]%
+ \expandafter\doglobalstartcolor
+ \else
+ \expandafter\noglobalstartcolor
\fi}
\def\stopcolor%
{\ifincolor
\doglobalstopcolor
+ \else
+ \noglobalstopcolor
\fi}
%D This macros call the global color switching ones. Starting
@@ -717,73 +878,93 @@
\newcount\colorlevel
-\setvalue{\??cl0C}{} % saved color
-\setvalue{\??cl0S}{} % stop command
+\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.
-\def\@@colorplus {+}
-\def\@@colorminus{-}
+\let\@@colorplus \plusone
+\let\@@colorminus\minusone
+
+\def\@@currentcolorname {\??cl\the\colorlevel C}
+\def\@@currentcolorstop {\??cl\the\colorlevel S}
+\def\@@currenttransparent{\??cl\the\colorlevel T}
-\def\dodoglobalstartcolor[#1]%
- {\xdef\currentcolor{\getvalue{\??cl\the\colorlevel C}}%
- \global\advance\colorlevel by \@@colorplus1
- \setxvalue{\??cl\the\colorlevel C}{#1}%
+\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 #1 at level \the\colorlevel}%
- \doifelsenothing{#1}
- {\setxvalue{\??cl\the\colorlevel C}{\currentcolor}%
- \setgvalue{\??cl\the\colorlevel S}{\donoglobalstopcolor}}
- {\doifelse{#1}{\currentcolor}
- {\setgvalue{\??cl\the\colorlevel S}{\donoglobalstopcolor}}
- {\doifcolorelse{#1}
- {\docolormark{#1}%
- \setgvalue{\??cl\the\colorlevel S}{\dodoglobalstopcolor}%
- \startcolormode{#1}}
- {\setgvalue{\??cl\the\colorlevel S}{\donoglobalstopcolor}%
- \showmessage{\m!colors}{3}{#1}}}}}
+ % {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
+ \global\@EA\let\csname\@@currentcolorstop\endcsname\dodoglobalstopcolor
+ \startcolormode\@@askedcolor}
+ {\global\@EA\let\csname\@@currentcolorstop\endcsname\donoglobalstopcolor
+ \showmessage\m!colors3\@@askedcolor}%
+ \fi\fi}
\def\doglobalstartcolor[#1]%
- {\ifnum\colorlevel=0
- \doifelsenothing{#1}
- {\setgvalue{\??cl\the\colorlevel S}{}}
- {\dodoglobalstartcolor[#1]}%
+ {\edef\@@askedcolor{#1}%
+ \ifcase\colorlevel\relax
+ \ifx\@@askedcolor\empty
+ \global\@EA\let\csname\@@currentcolorstop\endcsname\empty
+ \else
+ \dodoglobalstartcolor
+ \fi
\else
- \dodoglobalstartcolor[#1]%
+ \dodoglobalstartcolor
\fi
\ignorespaces}
-\def\donoglobalstopcolor%
- {\ifnum\colorlevel=0 \else
- \xdef\currentcolor{\getvalue{\??cl\the\colorlevel C}}%
- %\debuggerinfo{\m!colors}
- % {stop \currentcolor\normalspace at level \the\colorlevel}%
- \global\advance\colorlevel by \@@colorminus1
- \fi}
+\def\noglobalstartcolor[#1]%
+ {}
-\def\dodoglobalstopcolor%
- {\ifnum\colorlevel=0 \else
+\def\dodoglobalstopcolor
+ {\ifcase\colorlevel \else
\donoglobalstopcolor
- \xdef\previouscolor{\getvalue{\??cl\the\colorlevel C}}%
- \ifnum\colorlevel=0
- \docolormark{}%
- \stopcolormode
+ \global\@EA\let\@EA\previouscolor\csname\@@currentcolorname\endcsname
+ \ifcase\colorlevel\relax
+ \docolormark\empty
+ \dostoptransparency
+ \dostopcolormode
\else % let's do a bit redundant testing here
- \docolormark{\previouscolor}%
- \doifelsenothing{\previouscolor}
- {\dostopcolormode}
- {\doifcolorelse{\previouscolor}
- {\doifnot{\currentcolor}{\previouscolor}
- {\startcolormode{\previouscolor}}}
- {\dostopcolormode}}%
+ \docolormark\previouscolor
+ \ifx\previouscolor\empty
+ \dostoptransparency
+ \dostopcolormode
+ \else
+ \doifcolorelse\previouscolor
+ {\ifx\currentcolor\previouscolor\else
+ \startcolormode\previouscolor
+ \fi}
+ {\dostoptransparency
+ \dostopcolormode}%
+ \fi
\fi
\fi}
-\def\doglobalstopcolor%
- {\getvalue{\??cl\the\colorlevel S}}
+\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
%D We don't use grouping and save each stop alternative. This
%D permits be especially useful in for instance local color
@@ -856,7 +1037,7 @@
\doifdefinedelse{newmark}
{\newmark\colormark}
- {\def\colormark#1{}}
+ {\let\colormark\gobbleoneargument}
%D Using this mark mechanism with lots of colors has one
%D major drawback: \TEX's memory tends to overflow when
@@ -864,16 +1045,16 @@
%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 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 This macro uses the boolean \type {\ifinpagebody}, which can
%D be defined and set in the module that handles the pagebody.
\def\docolormark#1%
@@ -884,9 +1065,11 @@
\let\lastcolormark=\empty
\def\dodocolormark#1%
- {\doifnot{#1}{\lastcolormark}
- {\xdef\lastcolormark{#1}%
- \expandafter\setmark\expandafter\colormark\expandafter{\lastcolormark}}}
+ {\edef\newcolormark{#1}%
+ \ifx\newcolormark\lastcolormark\else
+ \global\let\lastcolormark\newcolormark
+ \@EA\setmark\@EA\colormark\@EA{\lastcolormark}%
+ \fi}
%D \macros
%D {pushcolor, popcolor}
@@ -895,10 +1078,12 @@
%D to resetting the color to black, while popping restores the
%D color state to that of before the break.
-\def\pushcolor%
+\def\topofpagecolor{\getbotmark\colormark} % see postponing
+
+\def\pushcolor
{\stopcolormode}
-\def\popcolor%
+\def\popcolor
{\doifsomething{\getbotmark\colormark}
{%\debuggerinfo{\m!colors}{popping \getbotmark\colormark}%
\startcolormode{\getbotmark\colormark}}}
@@ -914,38 +1099,23 @@
%D
%D Local use can be forced with the next two macros. Nesting
%D is still supported but colors are no longer marked.
-
-%D \starttypen
-%D \def\startcolorpage%
-%D {\bgroup
-%D \let\docolormark=\gobbleoneargument
-%D \edef\savedcolorlevel{\the\colorlevel}%
-%D \ifnum\colorlevel>0
-%D \stopcolormode
-%D \fi
-%D \global\colorlevel=1000\relax} % a save offset
-%D
-%D \def\stopcolorpage%
-%D {\global\colorlevel=\savedcolorlevel\relax
-%D \egroup}
-%D \stoptypen
-
-%D The next alternative makes (simple) color separation more
+%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
- \def\@@colorplus{-}%
- \def\@@colorminus{+}%
- \let\docolormark=\gobbleoneargument
+ \let\@@colorplus \minusone
+ \let\@@colorminus\plusone
+ \let\docolormark\gobbleoneargument
\edef\savedcolorlevel{\the\colorlevel}%
- \global\colorlevel=0 % before \localstartcolor of
- \localstartcolor[black]} % course, ugly bug removed
+ \global\colorlevel\zerocount % before \localstartcolor of
+ \localstartcolor[black]} % course, ugly bug removed
\def\stopcolorpage%
{\localstopcolor
- \global\colorlevel=\savedcolorlevel\relax
+ \global\colorlevel\savedcolorlevel
\egroup}
%D \macros
@@ -962,13 +1132,11 @@
\unexpanded\def\color[#1]%
{\groupedcommand
- {\startcolor[#1]}
- {\stopcolor}}
+ {\startcolor[#1]}\stopcolor}
\unexpanded\def\graycolor[#1]% not \gray because this is a color
{\groupedcommand
- {\RGBsupportedfalse\CMYKsupportedfalse\startcolor[#1]}
- {\stopcolor}}
+ {\RGBsupportedfalse\CMYKsupportedfalse\startcolor[#1]}\stopcolor}
\let\grey\graycolor
@@ -997,68 +1165,65 @@
%D \startvoorbeeld
%D \haalbuffer
%D \stopvoorbeeld
+%D
+%D We can speed the following macros a bit up, but this
+%D hardly pays off; they are only used in the manual.
\def\realcolorformat#1%
- {\ifnum#1<10 0.00\the#1%
- \else\ifnum#1<100 0.0\the#1%
- \else\ifnum#1<1000 0.\the#1%
- \else 1.000\fi\fi\fi}
+ {\ifnum#1<10 0.00\the#1\else
+ \ifnum#1<100 0.0\the#1\else
+ \ifnum#1<1000 0.\the#1\else
+ 1.000\fi\fi\fi}
\def\colorformatseparator{ }
\def\dodoformatcolor#1%
- {\scratchdimen=#1\s!pt\relax
- \ifdim\scratchdimen>1\s!pt
- \scratchdimen=1\s!pt
+ {\colordimen#1\s!pt\relax
+ \ifdim\colordimen>1\s!pt
+ \colordimen1\s!pt
\fi
- \multiply\scratchdimen by 1000
- \scratchcounter=\scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard \relax
- \realcolorformat\scratchcounter}
+ \multiply\colordimen 1000
+ \colorcount\colordimen
+ \advance\colorcount \medcard
+ \divide\colorcount \maxcard \relax
+ \realcolorformat\colorcount}
-\def\doformatcolorR#1:#2:#3\od%
+\def\doformatcolorR#1:#2:#3:#4:#5\od
{\dodoformatcolor{#1}\colorformatseparator
\dodoformatcolor{#2}\colorformatseparator
\dodoformatcolor{#3}}
-\def\doformatcolorC#1:#2:#3:#4\od%
+\def\doformatcolorC#1:#2:#3:#4:#5:#6\od
{\dodoformatcolor{#1}\colorformatseparator
\dodoformatcolor{#2}\colorformatseparator
\dodoformatcolor{#3}\colorformatseparator
\dodoformatcolor{#4}}
-\def\doformatcolorS#1\od%
+\def\doformatcolorS#1:#2:#3\od
{\dodoformatcolor{#1}}
\def\doformatcolor#1:%
{\getvalue{doformatcolor#1}}
-\def\colorvalue#1%
- {\doifcolorelse{#1}
- {\getcurrentcolorspecs{#1}%
- \expandafter\doformatcolor\currentcolorspecs\od}
- {}}
+\def\colorvalue
+ {\dowithcolor\doformatcolor}
-\def\doformatgrayR#1:#2:#3\od%
+\def\doformatgrayR#1:#2:#3:#4:#5\od
{\convertRGBtoGRAY{#1}{#2}{#3}%
\dodoformatcolor\@@cl@@s}
-\def\doformatgrayC#1:#2:#3:#4\od%
+\def\doformatgrayC#1:#2:#3:#4:#5:#6\od
{\convertCMYKtoGRAY{#1}{#2}{#3}{#4}%
\dodoformatcolor\@@cl@@s}
-\def\doformatgrayS#1\od%
+\def\doformatgrayS#1:#2:#3\od
{\dodoformatcolor{#1}}
\def\doformatgray#1:%
{\getvalue{doformatgray#1}}
-\def\grayvalue#1%
- {\doifcolorelse{#1}
- {\getcurrentcolorspecs{#1}%
- \expandafter\doformatgray\currentcolorspecs\od}
- {}}
+\def\grayvalue%
+ {\dowithcolor\doformatgray}
%D \macros
%D {localstartraster,localstopraster,
@@ -1073,18 +1238,17 @@
%D color support we offer both 'global' and 'local' commands.
\def\localstartraster[#1]%
- %{\doifinstringelse{.}{#1} % no, we also want 0 and 1
{\doifelsenothing{#1}
{\dostartgraymode{\@@rsraster}}
{\dostartgraymode{#1}}}
-\def\localstopraster%
+\def\localstopraster
{\dostopgraymode}
-\def\startraster%
+\def\startraster
{\localstartraster}
-\def\stopraster%
+\def\stopraster
{\localstopraster}
%D In this documentation we will not go into too much details
@@ -1166,7 +1330,7 @@
\setevalue{\??pa#1}{\getvalue{\??pa#1}##1}%
\doifdefinedelse{\??cr##2}
{\setevalue{\??cr#1:##1}{\getvalue{\??cr##2}}}
- {\setevalue{\??cr#1:##1}{S:0}}}%
+ {\setevalue{\??cr#1:##1}{S:0:0:0}}}%
\def\dododefinepalet##1%
{\dodododefinepalet[##1]}%
\processcommalist[#2]\dododefinepalet}
@@ -1187,12 +1351,18 @@
{\dosingleempty\dosetuppalet}
\def\dosetuppalet[#1]%
- {\doifelsenothing{#1}
- {\let\currentpalet\empty}
- {\doifelsevaluenothing{\??pa#1}
- {\showmessage{\m!colors}{7}{#1}%
- \let\currentpalet\empty}
- {\def\currentpalet{#1:}}}}
+ {\edef\currentpalet{#1}%
+ \ifx\currentpalet\empty
+ % seems to be a reset
+ \else
+ % fast enough for tex and etex
+ \@EA\ifx\csname\??pa\currentpalet\endcsname\relax
+ \showmessage\m!colors7\currentpalet
+ \let\currentpalet\empty
+ \else
+ \def\currentpalet{#1:}%
+ \fi
+ \fi}
%D \macros
%D {showpalet}
@@ -1246,10 +1416,10 @@
\v!gray=>\edef\currentcolorspace{S},
\v!s=>\edef\currentcolorspace{S},
\s!unknown=>\edef\currentcolorspace{R}]%
- \scratchcounter=0
+ \colorcount=0
\def\dododefinecolorgroup##1%
- {\advance\scratchcounter by 1
- \setevalue{\??cr#1:\the\scratchcounter}{\currentcolorspace:##1}}%
+ {\advance\colorcount 1
+ \setevalue{\??cr#1:\the\colorcount}{\currentcolorspace:##1:0:0}}%
\processcommalist[#3]\dododefinecolorgroup
\else
\doifinstringelse{:}{#2}
@@ -1430,7 +1600,7 @@
\csname\??cr\@EA
\ifx\csname\??cr\currentpalet#1\endcsname\relax\else\currentpalet\fi
#1\endcsname
- :::::\end
+ :::::::\end
\else
#1%
\fi}
@@ -1445,29 +1615,66 @@
\csname\??cr
\ifcsname\??cr\currentpalet#1\endcsname\currentpalet\fi
#1\endcsname
- :::::\end
+ :::::::\end
\else
#1%
\fi}
\endETEX
-\def\doMPcolor#1:#2:#3:#4:#5:#6\end
- {\if #1R(#2,#3,#4)%
- \else\if#1C\ifMPcmyk cmyk(#2,#3,#4,#5)\else(1-#2-#5,1-#3-#5,1-#4-#5)\fi
- \else\if#1S(#2,#2,#2)%
- \else (0,0,0)%
+%D Before we had transparancy available, the following
+%D conversion macro was available:
+%D
+%D \starttypen
+%D \def\doMPcolor#1:#2:#3:#4:#5:#6:#7:#8\end
+%D {\if #1R(#2,#3,#4)%
+%D \else\if#1C\ifMPcmyk 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 \stoptypen
+%D
+%D In order to be useful, this macro is to be fully
+%D expandabele. The next alternative also handles transparant
+%D colors. We could have packaged everything in one macro, but
+%D splitting it up is not only more readable, but also faster
+%D (because less arguments have to be skipped)
+
+\def\doMPcolor#1:%
+ {\if#1R%
+ \@EA\doMPrgb
+ \else\if#1C\ifMPcmyk
+ \@EA\@EAEAEA\@EA\doMPcmykY
+ \else
+ \@EA\@EAEAEA\@EA\doMPcmykN
+ \fi\else\if#1S%
+ \@EA\@EAEAEA\@EA\doMPgray
+ \else
+ \@EA\@EAEAEA\@EA\doMPblack
\fi\fi\fi}
+\def\transparentMP{transparent}
+\def\cmykspecialMP{cmyk}
+
+\def\doMPtransparent#1#2:#3:#4\end
+ {\ifcase#2\space(#1)\else\transparentMP(#2,#3,(#1))\fi}
+
+\def\doMPgray #1:{\doMPtransparent{#1,#1,#1}}
+\def\doMPrgb #1:#2:#3:{\doMPtransparent{#1,#2,#3}}
+\def\doMPcmykY#1:#2:#3:#4:{\doMPtransparent{\cmykspecialMP(#1,#2,#3,#4)}}
+\def\doMPcmykN#1:#2:#3:#4:{\doMPtransparent{1-#1-#4,1-#2-#4,1-#3-#4}}
+
+\def\doMPblack#1:#2:#3:#4:#5:#6:#7\end{(0,0,0)}
+
%D \macros
%D {PDFcolor,FDFcolor}
%D
%D Similar alternatives are avaliable for \PDF:
\def\PDFcolor#1%
- {\@EA\@EA\@EA\doPDFcolor\csname\??cr#1\endcsname:::::\end}
+ {\@EA\@EA\@EA\doPDFcolor\csname\??cr#1\endcsname:::::::\end}
-\def\doPDFcolor#1:#2:#3:#4:#5:#6\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%
@@ -1475,9 +1682,9 @@
\fi\fi\fi}
\def\FDFcolor#1%
- {\@EA\@EA\@EA\doFDFcolor\csname\??cr#1\endcsname:::::\end}
+ {\@EA\@EA\@EA\doFDFcolor\csname\??cr#1\endcsname:::::::\end}
-\def\doFDFcolor#1:#2:#3:#4:#5:#6\end%
+\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%
diff --git a/tex/context/base/colo-rgb.tex b/tex/context/base/colo-rgb.tex
index 20e72ff9f..5f5a21638 100644
--- a/tex/context/base/colo-rgb.tex
+++ b/tex/context/base/colo-rgb.tex
@@ -188,8 +188,10 @@
\definecolor [verde] [green]
\definecolor [blu] [blue]
- \definecolor [cyan] [cyan]
- \definecolor [magenta] [magenta]
+ \definecolor [azzurro] [cyan]
+ \definecolor [turchino] [cyan]
+ \definecolor [ciano] [cyan]
+ \definecolor [cremisi] [magenta]
\definecolor [giallo] [yellow]
\definecolor [bianco] [white]
@@ -208,11 +210,11 @@
\definecolor [blumedio] [middleblue]
\definecolor [bluchiaro] [lightblue]
- \definecolor [cyanscuro] [darkcyan]
- \definecolor [cyanchiaro] [middlecyan]
+ \definecolor [azzurroscuro] [darkcyan]
+ \definecolor [azzurrochiaro] [middlecyan]
- \definecolor [magentascuro] [darkmagenta]
- \definecolor [magentachiaro] [middlemagenta]
+ \definecolor [cremisiscuro] [darkmagenta]
+ \definecolor [cremisichiaro] [middlemagenta]
\definecolor [gialloscuro] [darkyellow]
@@ -253,15 +255,15 @@
\definecolor [cianinchis] [darkcyan]
\definecolor [cianmediu] [middlecyan]
- \definecolor [magentainchis] [darkmagenta]
- \definecolor [magentamediu] [middlemagenta]
+ \definecolor [magentainchis] [darkmagenta]
+ \definecolor [magentamediu] [middlemagenta]
\definecolor [galbeninchis] [darkyellow]
- \definecolor [galbenmediu] [middleyellow]
+ \definecolor [galbenmediu] [middleyellow]
- \definecolor [griinchis] [darkgray]
- \definecolor [grimediu] [middlegray]
- \definecolor [grideschis] [lightgray]
+ \definecolor [griinchis] [darkgray]
+ \definecolor [grimediu] [middlegray]
+ \definecolor [grideschis] [lightgray]
\stopinterface
@@ -443,7 +445,10 @@
\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*]
diff --git a/tex/context/base/cont-fil.tex b/tex/context/base/cont-fil.tex
index ccd78f287..c76490924 100644
--- a/tex/context/base/cont-fil.tex
+++ b/tex/context/base/cont-fil.tex
@@ -21,6 +21,14 @@
\definefilesynonym [finance] [financ]
+\definefilesynonym [con-01] [contml] % will go away
+
+%definefilesynonym [sch-base] [sch-00]
+%definefilesynonym [sch-make] [sch-01]
+
+\definefilesynonym [xml-format] [xml-01]
+\definefilesynonym [xml-pretty] [xml-02]
+
\definefilesynonym [fig-base] [fig-00]
\definefilesynonym [fig-make] [fig-01]
\definefilesynonym [fig-fake] [fig-02]
diff --git a/tex/context/base/cont-log.tex b/tex/context/base/cont-log.tex
index deffcd932..a8183398a 100644
--- a/tex/context/base/cont-log.tex
+++ b/tex/context/base/cont-log.tex
@@ -101,7 +101,7 @@
%D The \METAFONT\ and \METAPOST\ logos adapt themselves to the
%D current fontsize, an ugly but usefull hack.
-\def\setMFPfont%
+\unexpanded\def\setMFPfont%
{\font\logofont=logo%
\ifnum\fam=\bffam bf\else
\ifnum\fam=\slfam sl\else
@@ -121,10 +121,10 @@
%
% \def\setMFPfont{\symbolicfont{MetaLogo}}
-\def\symbolicfont#1{\definedfont[\glyphfontfile{#1} sa *]}
+\let\logofont\nullfont
-\def\setMFPfont% more sensitive for low level changes
- {\font\logofont=logo%
+\unexpanded\def\setMFPfont% more sensitive for low level changes
+ {\font\logofont=logo%
\ifx\fontalternative\c!bf\else
\ifx\fontalternative\c!sl\else
\ifx\fontalternative\c!sl\else
@@ -144,13 +144,13 @@
{\discretionary{\vrule\!!height.33em\!!depth-.27em\!!width.33em}{}{}}
\unexpanded\def\MetaFont%
- {{\setMFPfont META\MetaHyphen FONT}}
+ {{\setMFPfont META\MetaHyphen FONT}}
\unexpanded\def\MetaPost%
- {{\setMFPfont META\MetaHyphen POST}}
+ {{\setMFPfont META\MetaHyphen POST}}
\unexpanded\def\MetaFun%
- {MetaFun}
+ {MetaFun}
%D \macros
%D {TEX, METAFONT, METAPOST, METAFUN,
diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex
index 68a2c17a6..91a53f04d 100644
--- a/tex/context/base/cont-new.tex
+++ b/tex/context/base/cont-new.tex
@@ -11,75 +11,118 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% manual : offsetbox alignbox
-
-\unprotect
-
-\def\savefont % do we also need to store the encoding ?
- {\edef\savedfont{\the\font}%
- \pushmacro\savedfont
- \pushmacro\characterregime
- \pushmacro\charactermapping
- \pushmacro\characterencoding}
-
-\def\restorefont%
- {\popmacro\characterencoding
- \popmacro\charactermapping
- \popmacro\characterregime
- \popmacro\savedfont
- \savedfont}
+% manual : offsetbox alignbox
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks and new features.
+\unprotect
+
\writestatus{\m!systems}{beware: some patches loaded from cont-new.tex!}
-\def\setraggedparagraphmode#1#2%
- {\ifinpagebody
- \ifdubbelzijdig
- \ifodd\realfolio#1\else#2\fi
- \else
- #2\relax
- \fi
- \else\ifinner
- \ifdubbelzijdig
- \gettwopassdata{\s!paragraph}%
- \iftwopassdatafound
- \ifodd\twopassdata#1\else#2\fi
- \else
- \ifodd\realfolio#1\else#2\fi
- \fi
- \doparagraphreference
- \else
- #2\relax
+% wrong names
+
+\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
+ \global\letvalue{\s!paragraph:p:#1}\twopassdata
+ \global\let\lastchangedpage\twopassdata
\else
- #2\relax
- \fi\fi}
+ \global\let\lastchangedpage\realfolio
+ \fi
+ \doparagraphreference}
+
+\def\changedpage#1%
+ {\getvalue{\s!paragraph:p:#1}}
-% no, too buggy, leads to top of page crap
+\def\startfixed{\dosingleempty\dostartfixed}
+
+\long\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!hoog=>\bbox{\box\nextbox},
+ \v!laag=>\tbox{\box\nextbox},
+ \v!midden=>\vcenter{\box\nextbox},
+ \v!laho=>\vcenter{\box\nextbox},
+ \s!unknown=>\tbox{\box\nextbox},
+ \s!default=>\tbox{\box\nextbox}]%
+ \else
+ \startbaselinecorrection
+ \noindent\box\nextbox
+ \stopbaselinecorrection
+ \fi}
+
+% \startitemize
%
-%\def\flushsidefloats%
-% {\par
-% \dochecksidefloat
-% \scratchcounter=-\hangafter
-% \dorecurse{\scratchcounter}{\strut\hfill\strut\par}}
-
-\def\flushsidefloats%
- {\par
- \!!heighta=\sidefloatvsize
- \advance\!!heighta by -\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
- \global\sidefloatvsize=\nofloatvsize
- \global\floatflagfalse}
+% \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\docalculatefigurenorm#1#2%
+% {\dodocalculatefigurenorm{#1}[#2\empty\empty]}
+%
+% \def\dodocalculatefigurenorm#1[#2#3#4]#5#6#7%
+% {\ExpandFirstAfter\processaction
+% [#2#3#4]
+% [ \v!max=>\global#1=#6\relax,
+% \v!kolom=>\global#1=#6\relax,
+% \v!tekst=>\global#1=#6\relax,
+% \v!passend=>\global#1=#7\relax,
+% \v!ruim=>\global#1=#7\relax
+% \global\advance #1 -4\@@exkorps\relax,
+% #2*\v!kolom=>\global#1=#6\relax
+% \ifbinnenkolommen
+% \global\advance#1 \intercolumnwidth
+% \global\multiply#1 #2\relax
+% \global\advance#1 -\intercolumnwidth
+% \fi,
+% #2*\v!tekst=>\global#1=\zetbreedte
+% \global\advance#1 \papierbreedte,
+% \s!default=>\doifsomething{#5}{\global#1=#5\relax},
+% \s!unknown=>\global#1=\@@exkorps\relax
+% \global\divide#1 \!!ten\relax
+% \global\multiply#1 #2#3#4\relax]}
\def\thinrule%
{\strut
@@ -87,17 +130,17 @@
\chardef\ruletype=1
\processaction
[\@@dlvariant]
- [ \v!a=>\chardef\ruletype=0,% no line
+ [ \v!a=>\chardef\ruletype=0,% no line
%\v!b=>\chardef\ruletype=1,% height/depth
- \v!c=>\chardef\ruletype=2,% topheight/botdepth
+ \v!c=>\chardef\ruletype=2,% topheight/botdepth
% 11=>\chardef\ruletype=1,% fallback for backgrounds
0=>\chardef\ruletype=0,% compatible with backgrounds
% 1=>\chardef\ruletype=1,% compatible with backgrounds
2=>\chardef\ruletype=2]% compatible with backgrounds
\doifsomething{\@@dllijndikte}
{\linewidth=\@@dllijndikte}%
- \ifdim\linewidth=\zeropoint
- \chardef\ruletype=0
+ \ifdim\linewidth=\zeropoint
+ \chardef\ruletype=0
\else
\doifnot{\@@dlkader}{\v!aan}{\chardef\ruletype=0\relax}%
\fi
@@ -110,19 +153,19 @@
\fi
\freezedimensionwithunit\@@dlhoogte{\ht\strutbox}%
\freezedimensionwithunit\@@dldiepte{\dp\strutbox}%
- \divide\linewidth 2
+ \divide\linewidth 2
\doifelse{\@@dlachtergrond}{\v!kleur}
{\startcolor[\@@dlachtergrondkleur]%
\dimen0=\@@dlhoogte
\dimen2=\@@dldiepte
- \ifnum\ruletype=2 % prevent overshoot due to rounding
+ \ifnum\ruletype=2 % prevent overshoot due to rounding
\advance\dimen0 by -.5\linewidth
\advance\dimen2 by -.5\linewidth
\fi
\leaders\hrule\!!height\dimen0\!!depth\dimen2\hfill
\stopcolor
- \ifcase\ruletype
- % no rule
+ \ifcase\ruletype
+ % no rule
\or
\startcolor[\@@dlkleur]%
\hfillneg
@@ -145,7 +188,7 @@
\carryoverpar\egroup}
\setupthinrules
- [\c!kader=\v!aan, % compatible with textbackgrounds
+ [\c!kader=\v!aan, % compatible with textbackgrounds
\c!variant=\v!b,
\c!achtergrondkleur=,
\c!achtergrond=,
@@ -177,46 +220,13 @@
{\carryoverpar\egroup}
{\@@dlna\egroup}}
-\def\dodousemodules#1#2%
- {\setfalse\moduleisloaded
- \doifelsenothing{#1}
- {\def\next
- {\dododousemodules\f!moduleprefix {#2}%
- \dododousemodules\f!privateprefix{#2}%
- \dododousemodules\f!styleprefix {#2}%
- \dododousemodules\f!xstyleprefix {#2}%
- \dododousemodules\f!thirdprefix {#2}}}
- {\def\next
- {\dododousemodules{#1-}{#2}}}%
- \next
- \ifconditional\moduleisloaded\else
- \showmessage{\m!systems}{6}{#2}%
- \fi}
-
-\def\dousemodules[#1][#2]%
- {\ifsecondargument
- \doifelsenothing{#2}
- {\let\next\relax}
- {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
- \else
- \def\next{\usemodules[][#1]}%
- \fi
- \next}
-
-\def\usemodules%
- {\dodoubleempty\dousemodules}
-
-\let\usemodule\usemodules
-
-% \usemodule[t][speech]
-
\def\complexTableTB[#1]{\TABLEnoalign{\blanko[#1]}}
\def\simpleTableTB {\TABLEnoalign{\blanko}}
\def\TabulateTB
{\complexorsimpleTable{TB}}
-\def\doTableinterline% #1
+\def\doTableinterline% #1
{\ifnum\currentTABLEcolumn>\maxTABLEcolumn
\chuckTABLEautorow
\else\ifnum\currentTABLEcolumn=0
@@ -227,7 +237,7 @@
\setTABLEerror\TABLEmissingcolumn
\handleTABLEerror
\fi\fi
- \complexorsimpleTable} % {#1}
+ \complexorsimpleTable} % {#1}
\def\TableHL{\doTableinterline{HL}}
\def\TableTB{\doTableinterline{TB}}
@@ -236,63 +246,22 @@
\appendtoks\let\TB\TabulateTB\to\everytabulate
% \starttabulate
-% \NC text \NC text \NC \NR
+% \NC text \NC text \NC \NR
% \TB[small]
-% \NC text \NC text \NC \NR
+% \NC text \NC text \NC \NR
% \TB[4*big]
-% \NC text \NC text \NC \NR
+% \NC text \NC text \NC \NR
% \stoptabulate
-%
+%
% \starttable[|||]
-% \VL text \VL text \VL \AR
+% \VL text \VL text \VL \AR
% \TB[small]
-% \VL text \VL text \VL \AR
+% \VL text \VL text \VL \AR
% \TB[4*big]
-% \VL text \VL text \VL \AR
+% \VL text \VL text \VL \AR
% \stoptable
-% 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"
-
-\def\placefloatcaption
- {\dodoubleempty\doplacefloatcaption}
-
-\def\doplacefloatcaption[#1][#2]#3%
- {\setfloatcaption[#1][#2]{#3}%
- \placefloatcaptiontext[#1]%
- \placefloatcaptionreference[#1]}
-
-\def\setfloatcaption
- {\dodoubleempty\dodosetfloatcaption} % beware, name clash
-
-\def\dodosetfloatcaption[#1][#2]#3% to do namespace for number/ascii
- {\doifelsevalue{\??kj#1\c!nummer}{\v!ja} % also handle trialtypesetting
- {\verhoognummer[#1]%
- \maakhetnummer[#1]%
- \global\let\flhetnummer\hetnummer
- \setgvalue{@fl@r@#1}%
- {\dofloatreference
- \redofloatorder{#1}%
- \doschrijfnaarlijst{#1}{\flhetnummer}{#3}{#1}%
- \doglobal\convertargument#3\to\flasciititle % \asciititle is global
- \doifsomething{#2}{\rawreference{\s!flt}{#2}{{\flhetnummer}{\flasciititle}}}%
- \global\letvalue{@fl@r@#1}\relax}% nills
- \setgvalue{@fl@t@#1}%
- {\doattributes{\??kj#1}\c!kopletter\c!kopkleur
- {\labeltexts{#1}{\flhetnummer}}%
- \doattributes{\??kj#1}\c!letter\c!kleur
- {\tfskip#3}}}
- {\global\letvalue{@fl@r@#1}\relax
- \global\letvalue{@fl@t@#1}\relax}}
-
-\def\placefloatcaptiontext [#1]{\getvalue{@fl@t@#1}}
-\def\placefloatcaptionreference[#1]{\getvalue{@fl@r@#1}}
-
-% still needed for uguide
+% still needed for uguide
\let\placefloatlabel \placefloatcaption
\let\placefloatlabeltext \placefloatcaptiontext
@@ -301,7 +270,7 @@
\def\checkframedtext%
{\ifinsidefloat
\localhsize\hsize
- \else\ifdim\sidefloatvsize>\zeropoint % will be proper handle
+ \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
@@ -316,85 +285,11 @@
{\def\currentcol{0}\increment\maximumrow
\setupTABLE[\v!rij][\maximumrow][#1]#3}
-\def\obeyfollowingtoken{{}} % end \cs scanning
+\def\obeyfollowingtoken{{}} % end \cs scanning
\def\gobbleparameters{\doquadrupleempty\dogobbleparameters}
\def\dogobbleparameters[#1][#2][#3][#4]{}
-% faster, and looks okay
-
-\dostepwiserecurse{0}{255}{1}
- {\@EA\chardef\csname-\recurselevel\endcsname=\recurselevel}
-
-\newtoks\withminorcharacters
-\newtoks\withlowercharacters
-\newtoks\withuppercharacters
-
-% \thewithcharacter#1 % self
-
-\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}}
-
-\def\doassigncatcodes#1%
- {\def\withcharacter##1{\catcode##1#1}%
- \the\withminorcharacters
- \the\withlowercharacters
- \ifeightbitcharacters\the\withuppercharacters\fi}
-
-\def\makeallother%
- {\doassigncatcodes\@@other}
-
-\makeallothertoks\emptytoks
-
-\chardef\obeyedlccode=`. % so <32 and >127 chars become .
-
-\def\obeylccodes%
- {\def\withcharacter##1{\lccode##1##1}%
- \the\withlowercharacters
- \def\withcharacter##1{\lccode##1\obeyedlccode}%
- \the\withminorcharacters
- \ifeightbitcharacters\the\withuppercharacters\fi}
-
-\definesystemvariable{en}
-
-\def\setupenv{\dodoubleargument\rawgetparameters[\??en]}
-
-\def\doifenvelse#1{\doifdefinedelse{\??en#1}}
-
-% \def\envvar#1#2{\ifundefined{\??en#1}#2\else\getvalue{\??en}\fi}
-
-\def\env#1{\getvalue{\??en#1}}
-
-\beginTEX
-
-\def\envvar#1#2%
- {\@EA\ifx\csname\??en#1\endcsname\relax
- #2\else\csname\??en#1\endcsname
- \fi}
-
-\endTEX
-
-\beginETEX \ifcsname
-
-\def\envvar#1#2%
- {\ifcsname\??en#1\endcsname
- \csname\??en#1\endcsname\else#2%
- \fi}
-
-\endETEX
-
\def\setvariables%
{\dodoubleargument\dosetvariables}
@@ -407,26 +302,7 @@
\let\currentvariableclass\empty
-% in both (otr) modules !
-
-\def\doifrightpageelse#1#2%
- {\ifdubbelzijdig
- \gettwopassdata{\s!paragraph}%
- \iftwopassdatafound
- \ifodd\twopassdata#1\else#2\fi
- \else
- \ifodd\realfolio#1\else#2\fi
- \fi
- \else
- #1% was #2
- \fi}
-
-\def\signalrightpage%
- {\ifdubbelzijdig
- \doparagraphreference
- \fi}
-
-%D To be documented, \type {\includemenu[menu]}.
+%D To be documented, \type {\includemenu[menu]}.
%D To be documented, \type {\emphbf} cum suis.
%D A prelude to strategies. Note for myself: overloads
@@ -484,10 +360,15 @@
\def\doifstrategyvariable #1#2{\doifstrategyvariableelse{#1}{#2}{}}
\def\doifnotstrategyvariable#1#2{\doifstrategyvariableelse{#1}{}{#2}}
-
-%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.
+
+\let\definieerkolomgroep\definecolumnset
+\let\stelkolomgroepin \setupcolumnset
+\let\startkolomgroep \startcolumnset
+\let\stopkolomgroep \stopcolumnset
+
+%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.
% already taken care of: \definesystemvariable{ks}
@@ -547,23 +428,23 @@
\prevdepth\dp\strutbox
\egroup}
\vbox\bgroup
- %\topskipcorrection % becomes an option !
- \EveryPar{\begstrut\EveryPar{}}} % also !
+ %\topskipcorrection % becomes an option !
+ \EveryPar{\begstrut\EveryPar{}}} % also !
\def\startcolumnspan%
{\dosingleempty\dostartcolumnspan}
\def\stopcolumnspan%
{\egroup}
-
-%D For Ton. Do be documented.
+
+%D For Ton. To be documented.
\def\plaatsexterndocument[#1]%
{\def\doexternaldocument[##1][##2][##3]%
{\readlocfile{##2}{}{}}%
\getvalue{\v!file:::#1}}
-
-%D Far from complete.
+
+%D Far from complete.
\def\startgeheel%
{\startregelcorrectie
@@ -571,12 +452,12 @@
\def\stopgeheel
{\stopregelcorrectie}
-
-%D No more news.
+
+%D No more news.
\protect
-%D A few local optimizations and new features, if defined:
+%D A few local optimizations and new features, if defined:
\readfile {cont-loc} {} {}
diff --git a/tex/context/base/cont-sys.ori b/tex/context/base/cont-sys.ori
index 4da61099c..a571c8c60 100644
--- a/tex/context/base/cont-sys.ori
+++ b/tex/context/base/cont-sys.ori
@@ -71,9 +71,9 @@
%
% Enabling \CONTEXT\ navigation symbols as well as \euro's.
-\usesymbols [nav,eur]
+\usesymbols [nav,mvs]
-\setupsymbolset [navigation 1]
+\setupsymbolset [navigation 1] % not that clever
\setupinteraction [\c!symboolset=navigation 1]
diff --git a/tex/context/base/cont-usr.ori b/tex/context/base/cont-usr.ori
index e11370510..38dbab706 100644
--- a/tex/context/base/cont-usr.ori
+++ b/tex/context/base/cont-usr.ori
@@ -30,10 +30,11 @@
\definefilesynonym [lang-da.pat] [dkhyph.tex]
\definefilesynonym [lang-de.pat] [dehyphn.tex]
\definefilesynonym [lang-en.pat] [ushyph1.tex]
+\definefilesynonym [lang-es.pat] [eshyph.tex]
\definefilesynonym [lang-fi.pat] [fihyph.tex]
\definefilesynonym [lang-fr.pat] [frhyph.tex]
-\definefilesynonym [lang-hu.pat] [huhyph.tex]
\definefilesynonym [lang-hr.pat] [hrhyph.tex]
+\definefilesynonym [lang-hu.pat] [huhyph.tex]
\definefilesynonym [lang-it.pat] [ithyph.tex]
\definefilesynonym [lang-la.pat] [lahyph7.tex]
\definefilesynonym [lang-nl.pat] [nehyph.tex]
@@ -41,10 +42,11 @@
\definefilesynonym [lang-pl.pat] [plhyph.tex]
\definefilesynonym [lang-pt.pat] [pthyph.tex]
\definefilesynonym [lang-ro.pat] [rohyph.tex]
+\definefilesynonym [lang-ru.pat] [ruenhyph.tex]
\definefilesynonym [lang-sk.pat] [skhyph.tex]
-\definefilesynonym [lang-es.pat] [eshyph.tex]
\definefilesynonym [lang-sv.pat] [sehyph.tex]
\definefilesynonym [lang-tr.pat] [trhyph.tex]
+\definefilesynonym [lang-ua.pat] [ukrenhyp.tex]
\definefilesynonym [lang-uk.pat] [ukhyphen.tex]
\definefilesynonym [lang-us.pat] [ushyph1.tex]
@@ -86,9 +88,11 @@
% \installlanguage [\s!da] [\c!status=\v!start] % danish
% \installlanguage [\s!de] [\c!status=\v!start] % german
% \installlanguage [\s!en] [\c!status=\v!start] % english us
+% \installlanguage [\s!es] [\c!status=\v!start] % spanish
% \installlanguage [\s!fi] [\c!status=\v!start] % finnish
% \installlanguage [\s!fr] [\c!status=\v!start] % french
% \installlanguage [\s!hr] [\c!status=\v!start] % croatian
+% \installlanguage [\s!hu] [\c!status=\v!start] % hungarian
% \installlanguage [\s!it] [\c!status=\v!start] % italian
% \installlanguage [\s!la] [\c!status=\v!start] % latin
% \installlanguage [\s!nl] [\c!status=\v!start] % dutch
@@ -96,11 +100,11 @@
% \installlanguage [\s!pl] [\c!status=\v!start] % polish
% \installlanguage [\s!pt] [\c!status=\v!start] % portuguese
% \installlanguage [\s!ro] [\c!status=\v!start] % romanian
-% \installlanguage [\s!hu] [\c!status=\v!start] % hungarian
+% \installlanguage [\s!ru] [\c!status=\v!start] % russian
% \installlanguage [\s!sk] [\c!status=\v!start] % slovak
-% \installlanguage [\s!es] [\c!status=\v!start] % spanish
% \installlanguage [\s!sv] [\c!status=\v!start] % swedish
% \installlanguage [\s!tr] [\c!status=\v!start] % turkish
+% \installlanguage [\s!ua] [\c!status=\v!start] % ukrainian
% \installlanguage [\s!uk] [\c!status=\v!start] % english uk
% \installlanguage [deo] [\c!status=\v!start] % old german
@@ -114,9 +118,11 @@
% \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]
@@ -124,11 +130,11 @@
% \setupcurrentlanguage[\s!pl]
% \setupcurrentlanguage[\s!pt]
% \setupcurrentlanguage[\s!ro]
-% \setupcurrentlanguage[\s!hu]
+% \setupcurrentlanguage[\s!ru]
% \setupcurrentlanguage[\s!sk]
-% \setupcurrentlanguage[\s!es]
% \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
diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex
index 923836a70..356139e4e 100644
--- a/tex/context/base/context.tex
+++ b/tex/context/base/context.tex
@@ -11,9 +11,11 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% dec 07 2001 : cont-en.efmt : 4,035,912
+
\catcode`\{=1 \catcode`\}=2
-\def\contextversion{2001.8.28}
+\def\contextversion{2002.1.11}
%D Welcome to the main module. When this module is ran through
%D \type{initex} or \type{tex -i} or \type{whatevertex} using
@@ -27,7 +29,13 @@
%D manipulation macros. The first one loads \PLAIN\ \TEX, as
%D minimal as possible.
-\input syst-tex.tex
+%input syst-tex.tex
+
+\input syst-pln.tex % stripped plain
+\input syst-prm.tex % saved primitives (will be extended)
+
+\input math-pln.tex % basic plain math
+
\input syst-etx.tex
\input syst-gen.tex
\input syst-ext.tex
@@ -85,6 +93,10 @@
\input verb-ini.tex % replaces supp-ver
+%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, so next we load:
@@ -121,6 +133,7 @@
\input spec-mis.tex
\input spec-ini.tex
+\input spec-def.tex
%D For the moment we load a lot of languages. In the future
%D we'll have to be more space conservative.
@@ -163,7 +176,7 @@
\input core-tab.tex
\input core-nav.tex
\input core-ref.tex
-\input core-obj.tex
+\input core-obj.tex
\input core-buf.tex
\input core-lst.tex
\input core-num.tex
@@ -251,11 +264,16 @@
\input core-fig.tex % after page body
\input core-par.tex
-%D Only the basic XML parser is part of the core.
+%D Only the basic XML parser and remapper are part of the core.
+%D These macrosa re loaded last since they overload and|/|or
+%D extend previously defined ones.
\input xtag-ini.tex
\input xtag-ext.tex
-%input xtag-map.tex
+\input xtag-map.tex
+\input xtag-exp.tex
+\input xtag-pre.tex
+\input xtag-xsd.tex
%input xtag-ent.tex
%D The next two modules implement some additional
@@ -375,11 +393,7 @@
%D Let's quit this file when doing a \type {cont-..} generation.
-\doifparentfileelse{context}
- {\let\next\relax}
- {\let\next\endinput}
-
-\next
+\doifparentfileelse{context}{\let\next\relax}{\let\next\endinput} \next
%D Unless we're generating a \type {cont-..} format, we also
%D do the following.
diff --git a/tex/context/base/core-buf.tex b/tex/context/base/core-buf.tex
index e68c48f76..ecf42b81f 100644
--- a/tex/context/base/core-buf.tex
+++ b/tex/context/base/core-buf.tex
@@ -129,34 +129,6 @@
\unprotect
-% PAS OP!
-
-\def\checknummer#1%
- {\bgroup
-%\message{\the\blocklevel}\wait
- \ifdoingblocks
- \doifelsevalue{\s!number#1\c!blokwijze}{\v!nee}
- {\dochecknummer{#1}}
- {\setblockcounters % dit kan sneller omdat de waarden
- \dochecknummer{#1}}% % en het type bekend zijn
- \else
- \dochecknummer{#1}%
- \fi
- \egroup}
-
-\def\maakvoorafgaandenummer[#1]%
- {\bgroup
-%\message{\the\blocklevel}\wait
- \ifdoingblocks
- \doifelsevalue{\s!number#1\c!blokwijze}{\v!nee}
- {\domaakvoorafgaandenummer[#1]}%
- {\setblockcounters % dit kan sneller omdat de waarden
- \domaakvoorafgaandenummer[#1]}% % en het type bekend zijn
- \else
- \domaakvoorafgaandenummer[#1]%
- \fi
- \egroup}
-
\def\resetbuffer%
{\dosingleempty\doresetbuffer}
@@ -247,9 +219,9 @@
\getvalue{#4}}%
\doifelsenothing{#2}
{\message{<\TEXbufferfile{\jobname}>}%
- \immediate\openout\tmpblocks=\TEXbufferfile{\jobname}}
+ \immediate\openout\tmpblocks\TEXbufferfile{\jobname}}
{\message{<\TEXbufferfile{#2}>}%
- \immediate\openout\tmpblocks=\TEXbufferfile{#2}}%
+ \immediate\openout\tmpblocks\TEXbufferfile{#2}}%
\ifsegmentatebuffer
\immediate\write\tmpblocks{\string\startbufferparagraph}%
\fi
@@ -280,21 +252,24 @@
{\dodobuffer\jobname}
{\processcommalist[#2]\dodobuffer}}
-\def\haalbuffer%
- {\dodoubleempty\dohaalbuffer}
+\def\processTEXbuffer%
+ {\dodoubleempty\doprocessTEXbuffer}
-\def\dohaalbuffer[#1][#2]%
+\def\doprocessTEXbuffer[#1][#2]%
{\ifsecondargument
- \dodohaalbuffer[#1][#2]%
+ \dodoprocessTEXbuffer[#1][#2]%
\else
- \dodohaalbuffer[][#1]%
+ \dodoprocessTEXbuffer[][#1]%
\fi}
-\def\dodohaalbuffer[#1][#2]%
+\def\dodoprocessTEXbuffer[#1][#2]%
{\getvalue{\??bu#1\c!voor}%
\dobuffer{16}[#2]\readjobfile
\getvalue{\??bu#1\c!na}}
+\let\getbuffer \processTEXbuffer % handy
+\let\haalbuffer\processTEXbuffer % will move to mult-com.tex
+
\def\typebuffer%
{\dodoubleempty\dotypebuffer}
@@ -323,7 +298,7 @@
\setevalue{\e!start#1}%
{\noexpand\dostartbuffer[#1][def-\nofdefinedbuffers][\e!start#1][\e!stop#1]}%
\setevalue{\e!haal#1}%
- {\noexpand\dodohaalbuffer[#1][def-\nofdefinedbuffers]}%
+ {\noexpand\dodoprocessTEXbuffer[#1][def-\nofdefinedbuffers]}%
\setevalue{\e!type#1}%
{\noexpand\dodotypebuffer[#1][def-\nofdefinedbuffers]}%
\fi}
@@ -576,14 +551,32 @@
\def\writeoutblocks%
{\immediate\write\outblocks}
-\def\processnextblocklineAB#1#2#3%
+% readable
+%
+% \def\processnextblocklineAB#1#2#3%
+% {\convertargument#1 \to\next
+% \doifinstringelse{\endofblockA}{\next}
+% {\def\next{#2}}
+% {\doifinstringelse{\endofblockB}{\next}
+% {\def\next{#2}}
+% {\def\next{#3}}}%
+% \next}
+%
+% faster
+%
+% \def\processnextblocklineAB#1#2#3%
+% {\convertargument#1 \to\next % space is essential
+% \doifinstringelse\endofblockA\next
+% {#2}{\doifinstringelse\endofblockB\next{#2}{#3}}}
+%
+% even more
+
+\def\processnextblocklineAB#1% #2#3%
{\convertargument#1 \to\next
- \doifinstringelse{\endofblockA}{\next}
- {\def\next{#2}}
- {\doifinstringelse{\endofblockB}{\next}
- {\def\next{#2}}
- {\def\next{#3}}}%
- \next}
+ \doifinstringelse\endofblockA\next
+ \firstoftwoarguments
+ {\doifinstringelse\endofblockB\next
+ \firstoftwoarguments\secondoftwoarguments}}
\bgroup
\obeylines
@@ -599,18 +592,32 @@
{\skipblocklineAB}}
\egroup
-\def\processnextblockline#1#2#3%
+% \def\processnextblockline#1#2#3%
+% {\convertargument#1 \to\next
+% \ifx\next\emptybufferline
+% \ifsegmentatebuffer \emptybufferlinetrue \fi
+% \def\next{#3}%
+% \else
+% \emptybufferlinefalse
+% \doifinstringelse{\endofblock}{\next}
+% {\def\next{#2}}
+% {\def\next{#3}}%
+% \fi
+% \next}
+%
+% faster
+
+\def\processnextblockline#1% #2#3%
{\convertargument#1 \to\next
\ifx\next\emptybufferline
\ifsegmentatebuffer \emptybufferlinetrue \fi
- \def\next{#3}%
+ \expandafter\secondoftwoarguments% #3%
\else
\emptybufferlinefalse
- \doifinstringelse{\endofblock}{\next}
- {\def\next{#2}}
- {\def\next{#3}}%
- \fi
- \next}
+ \doifinstringelse\endofblock\next
+ {\expandafter\firstoftwoarguments }% #2}
+ {\expandafter\secondoftwoarguments}% #3}%
+ \fi}
\bgroup
\obeylines
diff --git a/tex/context/base/core-con.tex b/tex/context/base/core-con.tex
index 4396e4366..927a94f0f 100644
--- a/tex/context/base/core-con.tex
+++ b/tex/context/base/core-con.tex
@@ -55,8 +55,36 @@
\def\romannumerals#1%
{\romannumeral#1}
+%D For some years we had \unknown
+%D
+%D \starttypen
+%D \def\Romannumerals#1%
+%D {\uppercase\expandafter{\romannumeral#1}}
+%D \stoptypen
+%D
+%D \unknown but we need to be fully expandable in order to get
+%D the utility output file right, so now we have th efollowing
+%D solution. It was Patrick Gundlach who first noticed this
+%D ommision.
+
\def\Romannumerals#1%
- {\uppercase\expandafter{\romannumeral#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}
@@ -185,10 +213,10 @@
%D possible, and because \TEX\ already uses up some of those,
%D we save the original meanings.
-\let\normaltime = \time
-\let\normalyear = \year
-\let\normalmonth = \month
-\let\normalday = \day
+\savenormalmeaning\time
+\savenormalmeaning\year
+\savenormalmeaning\month
+\savenormalmeaning\day
%D \macros
%D {month,MONTH}
@@ -432,7 +460,7 @@
%D We can also typeset arbitrary dates, using the previous
%D command.
%D
-%D \typebyffer
+%D \typebuffer
%D
%D The date is specified by one character keys. When no date
%D is given, we get the current date.
@@ -443,35 +471,75 @@
\def\kenmerkdatumpatroon{j,mm,dd} % jj,mm,dd changed at januari 1-1-2000
+% \def\complexcurrentdate[#1]%
+% {\bgroup
+% \let\labellanguage\currentlanguage
+% \def\betweendates{\let\betweendates\space}%
+% \lowercase{\edef\!!stringa{#1}}% permits usage in \kap
+% \@EA\processallactionsinset\@EA
+% [\!!stringa]
+% [ \v!dag=>\betweendates\the\normalday,
+% \v!maand=>\betweendates\month\normalmonth,
+% \v!jaar=>\betweendates\the\normalyear,
+% \ =>\ , % optimization -)
+% d=>\the\normalday,
+% m=>\the\normalmonth,
+% j=>\the\normalyear,
+% y=>\the\normalyear,
+% w=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
+% dd=>\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!weekdag=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
+% % \v!MAAND=>\betweendates\MONTH\normalmonth,
+% % \v!WEEKDAG=>\betweendates
+% % \bgroup
+% % \let\labeltext=\LABELTEXT
+% % \dayoftheweek\normalday\normalmonth\normalyear
+% % \egroup,
+% \v!kenmerk=>\expanded{\complexcurrentdate[\kenmerkdatumpatroon]},
+% \s!unknown=>\commalistelement
+% \def\betweendates{\let\betweendates\space}]%
+% \egroup}
+
+\newsignal\datesignal
+
+\def\dobetweendates%
+ {\ifdim\lastskip=\datesignal\relax\else
+ \unskip\space
+ \hskip\datesignal\relax
+ \fi}
+
\def\complexcurrentdate[#1]%
{\bgroup
- \let\labellanguage=\currentlanguage
- \def\betweendates{\let\betweendates\space}%
+ \let\labellanguage\currentlanguage
+ \def\betweendates{\let\betweendates\dobetweendates}%
\lowercase{\edef\!!stringa{#1}}% permits usage in \kap
\@EA\processallactionsinset\@EA
[\!!stringa]
- [ dd=>\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!dag=>\betweendates\the\normalday,
+ \v!maand=>\betweendates\month\normalmonth,
+ \v!jaar=>\betweendates\the\normalyear,
+ \ =>\unskip\ \hskip\datesignal,% optimization -)
d=>\the\normalday,
m=>\the\normalmonth,
j=>\the\normalyear,
y=>\the\normalyear,
w=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
- \v!kenmerk=>\expanded{\complexcurrentdate[\kenmerkdatumpatroon]},
- \v!dag=>\betweendates\the\normalday,
- \v!maand=>\betweendates\month\normalmonth,
-% \v!MAAND=>\betweendates\MONTH\normalmonth,
- \v!jaar=>\betweendates\the\normalyear,
+ dd=>\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!weekdag=>\betweendates\dayoftheweek\normalday\normalmonth\normalyear,
-% \v!WEEKDAG=>\betweendates
-% \bgroup
-% \let\labeltext=\LABELTEXT
-% \dayoftheweek\normalday\normalmonth\normalyear
-% \egroup,
- \s!unknown=>\commalistelement
- \def\betweendates{\let\betweendates\space}]%
+ \v!kenmerk=>\expanded{\complexcurrentdate[\kenmerkdatumpatroon]},
+ \s!unknown=>\unskip
+ \commalistelement
+ \hskip\datesignal
+ \def\betweendates{\let\betweendates\dobetweendates}]%
+ \ifdim\lastskip=\datesignal\relax
+ \unskip
+ \fi
\egroup}
\def\simplecurrentdate%
@@ -496,9 +564,34 @@
\fi
\egroup}
-\def\date%
+\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
+ {\DoDiv\time by60to\scratchcounter\edef\currenthour {\the\scratchcounter}%
+ \DoMod\time by60to\scratchcounter\edef\currentminute{\the\scratchcounter}}
+
+\appendtoks \calculatecurrenttime \to \everyjob
+
+\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
@@ -555,17 +648,21 @@
{\advance\scratchcounter by 1
\setvalue{\??cv#1\the\scratchcounter}{##1}}%
\processcommalist[#2]\docommando
- \setvalue{\??cv#1}##1{\getvalue{\??cv#1##1}}}
+ \setvalue{\??cv#1}##1{\csname\??cv#1##1\endcsname}}
{\setvalue{\??cv#1}{#2}}}
\def\defineconversion%
{\dodoubleargument\dodefineconversion}
\def\convertnumber#1%
- {\getvalue{\??cv#1}}
+ {\csname\??cv#1\endcsname}
\def\doifconversiondefinedelse#1%
- {\doifdefinedelse{\??cv#1}}
+ {\ifundefined{\??cv#1}%
+ \@EA\secondoftwoarguments
+ \else
+ \@EA\firstoftwoarguments
+ \fi}
%D As longs as symbols are linked to levels or numbers, we can
%D also use the conversion mechanism, but in for instance the
diff --git a/tex/context/base/core-dat.tex b/tex/context/base/core-dat.tex
index 50aeb3bd9..f1211ad53 100644
--- a/tex/context/base/core-dat.tex
+++ b/tex/context/base/core-dat.tex
@@ -81,55 +81,55 @@
%D A database file |<|in most cases such a base is generated
%D from another one|>| is structured as follows:
%D
-%D \starttyping
+%D \starttypen
%D \startrecord{tag}
%D \memberofgroup{grouplist}
%D \setrecordentry{name}{...}
%D ....
%D \stoprecord
-%D \stoptyping
+%D \stoptypen
%D
%D The interface to such a database is defined as follows:
%D
-%D \starttyping
+%D \starttypen
%D \definerecord[class][settings]
%D \setuprecord[class][settings]
%D \definerecordentry[class][name]
-%D \stoptyping
+%D \stoptypen
%D
%D and processed by
%D
-%D \starttyping
+%D \starttypen
%D \processrecords[file list][tag and/or group list]
-%D \stoptyping
+%D \stoptypen
%D
%D The actual processing is done by a macro assigned to \type
%D {command}:
%D
-%D \starttyping
+%D \starttypen
%D \setuprecord[class][command=\DoWithRecord]
-%D \stoptyping
+%D \stoptypen
%D
%D Given that one can ask for a field with
%D
-%D \starttyping
+%D \starttypen
%D \getrecordentry{name}
-%D \stoptyping
+%D \stoptypen
%D
%D such a command can look like:
%D
-%D \starttyping
+%D \starttypen
%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 \stoptypen
%D
%D The argument passed is the tag. The database can look like:
%D
-%D \starttyping
+%D \starttypen
%D \startrecord{hagenj}
%D \memberofgroup{a,b}
%D \setrecordentry{naam}{Hans}
@@ -143,27 +143,27 @@
%D \setrecordentry{family name}{Otten}
%D \setrecordentry{postal address}{A.F. Otten\\Prinsengracht 17\\Hasselt NL}
%D \stoprecord
-%D \stoptyping
+%D \stoptypen
%D
%D The definition of this database looks like:
%D
-%D \starttyping
+%D \starttypen
%D \definerecord[address][command=\DoWithRecord]
%D
%D \definerecordentry[address][name]
%D \definerecordentry[address][family name]
%D \definerecordentry[address][postal address]
-%D \stoptyping
+%D \stoptypen
%D
%D The actual processing is now done by (for instance):
%D
-%D \starttyping
+%D \starttypen
%D \processrecords[datafile][hagenj]
%D \processrecords[datafile][hagenj,offenaf]
%D \processrecords[datafile][all]
%D \processrecords[datafile][a]
%D \processrecords[datafile][b]
-%D \stoptyping
+%D \stoptypen
%D
%D Of course one can reassing the command used to handle the
%D records in between.
@@ -277,7 +277,7 @@
%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 character can be non standard|>| this is not faster.
%D
%D Although this mechanism could have been combined with the
%D block moving mechaism, the current implementation is
diff --git a/tex/context/base/core-des.tex b/tex/context/base/core-des.tex
index f5d34c0b0..5e88257cf 100644
--- a/tex/context/base/core-des.tex
+++ b/tex/context/base/core-des.tex
@@ -415,8 +415,13 @@
{\ignorespaces}
{\strut\getvalue{\??dd#1\c!tekst}\fixedspace}}
+% \def\showdnnummer#1%
+% {\voorafgaandenummer
+% \nummer[\getvalue{\??dd#1\??dd\c!nummer}]}
+
\def\showdnnummer#1%
- {\voorafgaandenummer%
+ {\preparethenumber{\??dd#1}\voorafgaandenummer\preparednumber
+ \preparednumber
\nummer[\getvalue{\??dd#1\??dd\c!nummer}]}
\def\showdnsubnummer#1%
@@ -483,10 +488,9 @@
{\let\normalkap\relax % sorry, uppercase causes troubles
\doattributes % \nocase primitive needed
{\??dd#1}\c!kopletter\c!kopkleur
-{\getvalue{\??dd#1\c!commando}%
- {\showdntext{#2#1}%
- \domakednnummer{#1}{#2}{#3}}%
-}%
+ {\getvalue{\??dd#1\c!commando}% hook for taco
+ {\showdntext{#2#1}%
+ \domakednnummer{#1}{#2}{#3}}}%
\iflocation\ifcase\definitiekoppeling \else
\edef\localconnection{\getvalue{\??dd#1\c!koppeling}:\internaldoornummer}%
\doifreferencefoundelse{\localconnection}
@@ -498,9 +502,8 @@
\hbox
{\edef\!!stringa{\showdnpuretext{#2#1}}% nog eens testen binnen \expanded
\expanded{\doattributes{\??dd#1}\noexpand\c!kopletter\noexpand\c!kopkleur
-{\noexpand\getvalue{\??dd#1\c!commando}%
- {\!!stringa}}%
-}%
+ {\noexpand\getvalue{\??dd#1\c!commando}%
+ {\!!stringa}}}%
\doifnot{#5}{-}{\rawreference{\s!num}{#5}{}}}%
\fi}
@@ -581,7 +584,8 @@
\c!monster,\c!hang,\c!uitlijnen,\c!voor,\c!tussen,\c!na,
\c!niveaus,\c!wijze,\c!blokwijze,\c!scheider,\c!marge,
\c!springvolgendein,\c!afsluiter,\c!sectienummer,\c!nummer]%
- \ConvertToConstant\doifinstringelse{=}{#4}
+% \ConvertToConstant\doifinstringelse{=}{#4}
+ \doifassignmentelse{#4}
{\getparameters[\??dd#3#1]%
[\c!tekst=#1,\??dd\c!nummer=#1,\c!conversie=,
\c!links=,\c!rechts=,\c!koppeling=,\c!koppelwijze=\v!lokaal,#4]}%
@@ -710,7 +714,7 @@
\def\dodoorlabel[#1][#2]%
{\getvalue{\s!number#1\c!voor}%
\bgroup
- \doif{\getvalue{\s!number#1\c!plaats}}{\v!marge}
+ \doifvalue{\s!number#1\c!plaats}{\v!marge}
{\setvalue{\s!number#1\c!plaats}{\v!inmarge}}%
\doattributes{\s!number#1}\c!kopletter\c!kopkleur
{\getvalue{\e!volgende#1}[#2]}%
@@ -722,22 +726,12 @@
\def\dodoorlabelen[#1][#2]%
{\definieernummer
- [#1]
- [\c!voor=,
- \c!na=,
- \c!kopletter=,
- \c!wijze=\@@nrwijze,
- #2]%
- \setvalue{#1}%
- {\dodoubleempty\dodoorlabel[#1]}%
- \setvalue{\s!reset#1}%
- {\resetnummer[#1]}%
- \setvalue{\e!verhoog#1}%
- {\verhoognummer[#1]}%
- \setvalue{\e!volgende#1}%
- {\dodoubleempty\dovolgendedoorlabel[#1]}%
- \setvalue{\c!huidige#1}%
- {\huidigenummer[#1]}}
+ [#1][\c!voor=,\c!na=,\c!kopletter=,\c!wijze=\@@nrwijze,#2]%
+ \setvalue {#1}{\dodoubleempty\dodoorlabel[#1]}%
+ \setvalue{\s!reset #1}{\resetnummer[#1]}%
+ \setvalue{\e!verhoog #1}{\verhoognummer[#1]}%
+ \setvalue{\e!volgende#1}{\dodoubleempty\dovolgendedoorlabel[#1]}%
+ \setvalue{\c!huidige #1}{\huidigenummer[#1]}}
\def\doorlabelen%
{\dodoubleargumentwithset\dodoorlabelen}
diff --git a/tex/context/base/core-fig.tex b/tex/context/base/core-fig.tex
index 86c22ee9c..dd8e9772d 100644
--- a/tex/context/base/core-fig.tex
+++ b/tex/context/base/core-fig.tex
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% error in calculations : .25% (too much: 1.5pt over full page)
+
\writestatus{loading}{Context Core Macros / Figure Inclusion}
\unprotect
@@ -96,15 +98,15 @@
\startmessages italian library: figures
title: figure
- 1: la figura -- non è stata trovata
+ 1: figura -- non trovata
2: la figura -- non è preimpostata
3: dimensioni della figura -- prese da --
4: dimensioni di -- caricate dal file di immagini stesso
5: dimensioni di -- caricate dal file di immagini --
- 6: dimensioni di -- calcolate TeXUtil
+ 6: dimensioni di -- calcolate da TeXUtil
7: bisogna rigenerare il file di immagini --
8: oggetto-figura -- riutilizzato
- 9: la figura -- non gestito
+ 9: figura -- non gestita
10: la figura -- ha dimensioni nulle
\stopmessages
@@ -212,6 +214,10 @@
\edef\externalfigurelog{\externalfigurelog[#1]\space}%
\fi}
+\let\@@efcurrenttype\empty
+\let\@@efcurrentpath\empty
+\let\@@efcurrentfile\empty
+
\def\analyzefigurefiles%
{\let\externalfigurelog\empty
\let\@@efcurrenttype\empty
@@ -295,8 +301,8 @@
\removelastskip}%
\global\setbox\foundexternalfigure=\hbox
{\raise\dp\foundexternalfigure\box\foundexternalfigure}%
- #3=\!!zeropoint
- #4=\!!zeropoint
+ #3=\zeropoint
+ #4=\zeropoint
#5=\wd\foundexternalfigure
#6=\ht\foundexternalfigure
\else
@@ -314,7 +320,7 @@
\@@eftrace{analyzing \@@efcurrentfile\space
on \@@efcurrentpath\space
as \@@efcurrenttype}%
- \!!widthb=\!!zeropoint % ?
+ \!!widthb=\zeropoint % ?
\doifdefinedelse{\@@dogetfiguresize\@@efcurrenttype}
{\executedtrue
\getvalue{\@@dogetfiguresize\@@efcurrenttype}%
@@ -322,20 +328,32 @@
{\!!widtha}{\!!heighta}{\!!widthb}{\!!heightb}}
{\executedfalse}%
\ifexecuted
- \ifdim\!!widtha=\!!zeropoint\relax\ifdim\!!heighta=\!!zeropoint\relax
- \ifdim\!!widthb=\!!zeropoint\relax\ifdim\!!heightb=\!!zeropoint\relax
+ \donetrue
+ \ifdim\!!widtha=\zeropoint\relax\ifdim\!!heighta=\zeropoint\relax
+ \ifdim\!!widthb=\zeropoint\relax\ifdim\!!heightb=\zeropoint\relax
\showmessage{\m!figures}{10}{\@@efcurrentfile}%
\@@eftrace{zero}%
+ \donefalse
\fi\fi
\fi\fi
- \doif{\@@efcurrenttype}{\c!mps}
- {\ifcase\EPScreator\executedfalse\fi}%
+ \doifelse{\@@efcurrenttype}{\c!mps}
+ {\ifcase\EPScreator
+ \executedfalse
+ \else
+ % zero width mp graphic can be useful -)
+ \fi}
+ {\ifdone
+ % non zero dimensions
+ \else
+ % zero dimensions
+ \executedfalse
+ \fi}%
\fi
\ifexecuted
\chardef\figurestatus=3
\doifelse{\@@efcurrenttype}{\c!eps}
{\ifcase\EPScreator
- \@@eftrace{found}%
+ \@@eftrace{found}%
\else
\let\@@efcurrenttype\c!mps
\@@eftrace{mps found}%
@@ -578,8 +596,8 @@
{\doifsomething{\@@efschaal}
{\doapplyfigurescale\figwid\@@epw\figxsca
\doapplyfigurescale\fighei\@@eph\figysca
- \global\figwid=\!!zeropoint
- \global\fighei=\!!zeropoint
+ \global\figwid=\zeropoint
+ \global\fighei=\zeropoint
\doifelsenothing{\@@efmaxbreedte}
{\doifsomething{\@@efmaxhoogte}
{\ifdim\@@eph>\@@efmaxhoogte
@@ -597,8 +615,8 @@
{\ifdim\fighei>\@@efmaxhoogte \global\fighei=\@@efmaxhoogte #3\relax\fi}}
\def\setdimensionfiguresize%
- {\ifdim\figwid>\!!zeropoint\relax
- \ifdim\fighei>\!!zeropoint\relax
+ {\ifdim\figwid>\zeropoint\relax
+ \ifdim\fighei>\zeropoint\relax
\dosetdimensionfiguresize%
{\docalculatefigurescale\fighei\@@eph\figysca
\docalculatefigurescale\figwid\@@epw\figxsca}%
@@ -613,7 +631,7 @@
{\docalculatefigurescales\figwid\@@epw\fighei\@@eph}%
\fi
\else
- \ifdim\fighei>\!!zeropoint\relax
+ \ifdim\fighei>\zeropoint\relax
\dosetdimensionfiguresize%
{\docalculatefigurescales\fighei\@@eph\figwid\@@epw}%
{\docalculatefigurescales\fighei\@@eph\figwid\@@epw}%
@@ -658,15 +676,36 @@
\chardef\figurefilemode=0
\fi}
+%D The next one is for instance used in symbols:
+
\def\resetexternalfigures%
{\setupexternalfigures
[\c!optie=,\c!maxbreedte=,\c!maxhoogte=,
\c!kader=\v!uit,\c!achtergrond=]}
-% will move:
+%D Since we only need to reset some parameters, we can
+%D better use a faster alternative:
+
+\def\resetexternalfigures%
+ {\getparameters[\??ef]
+ [\c!optie=,\c!maxbreedte=,\c!maxhoogte=,
+ \c!kader=\v!uit,\c!achtergrond=]}
+
+%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\@@efoptie \empty
+ \let\@@efmaxbreedte\empty
+ \let\@@efmaxhoogte \empty
+ \let\@@efkader \v!uit
+ \let\@@efchtergrond\empty}
+
+% The following code will move:
\appendtoks \resetexternalfigures \to \everyoverlay
-\appendtoks \resetexternalfigures \to \everypagebody
+\appendtoks \resetexternalfigures \to \everybeforepagebody % not really needed
%appendtoks \resetexternalfigures \to \everysymbol
@@ -785,7 +824,7 @@
\multiply\scratchdimen by #3\relax
\fi
\scratchdimen=-\scratchdimen % beter hier - dan in driver
- \edef#2{\number\scratchdimen}%
+ \edef#2{\scratchdimen}%
\scratchdimen=#3pt
\divide\scratchdimen by \!!ten
\edef#4{\@EA\withoutpt\@EA{\the\scratchdimen}}}
@@ -822,10 +861,13 @@
% where the second one inherited some characteristics from
% the factor=max one some 30 pages back. Sigh.
+% this macro will be cleaned up when the tuf format has
+% become replaced by its xml counterpart
+
\def\calculateexternalfigure[#1][#2][#3][#4][#5][#6]%
{\mindermeldingen
- \global\figwid=\!!zeropoint \figxsca=1 % see note *
- \global\fighei=\!!zeropoint \figysca=1 % see note *
+ \global\figwid=\zeropoint \figxsca=1 % see note *
+ \global\fighei=\zeropoint \figysca=1 % see note *
\global\setbox\foundexternalfigure=\box\voidb@x
\edef\expandedfigurename{#3}% needed e.g. in [\get...] cases
\expandafter\beforesplitstring\expandedfigurename\at.\to\@@effilename
@@ -847,8 +889,6 @@
[\??ef]
[\c!type=\s!unknown,\c!methode=\@@eftype,\c!symbool=\v!nee,
\c!object=\@@exobject,\c!preset=\v!ja,
-% old \c!achtergrond=,\c!achtergrondkleur=,\c!achtergrondraster=\@@rsraster,
-% old \c!hoek=,\c!straal=.5\korpsgrootte,\c!kader=\v!uit,
\c!pagina=0,\c!sturing=\v!nee,\c!preview=\v!nee,\c!herhaal=\v!nee,
\c!maxbreedte=\@@exmaxbreedte,\c!maxhoogte=\@@exmaxhoogte,
\c!schaal=,\c!breedte=,\c!hoogte=,\c!scherm=,
@@ -867,6 +907,9 @@
\let\@@efextension\c!tmp
\fi
\let\@@eftype\c!tex}%
+%\@EA\doifnumberelse\@EA{\@@efextension} % new, test first
+%{\def\@@eftype{\c!mps}}
+%{%
\processaction
[\@@efextension]
[ \c!tex=>\let\@@eftype\c!tex,
@@ -875,6 +918,7 @@
\edef\@@effilename{\@@effilepref\@@effilename},
\c!avi=>\presetfigureavi,
\c!mov=>\presetfiguremov]%
+%}%
\edef\figuretypes{\figuretypes,\c!tex}%
\ifx\@@eftype\c!tex
% Since tex code can have positional stuff and worse,
@@ -882,12 +926,12 @@
% up in files, therefore:
\let\@@efobject\v!nee
\fi
+ \edef\@@efobjectname{\@@effilename-\@@eftype-\@@efextension-\@@efpagina}%
\doifelse{\@@efobject}{\v!nee}
{\donefalse}
{\doifspecialavailableelse\dostartscaling
{\doifobjectssupportedelse
- {\edef\@@efobjectname{\@@effilename-\@@eftype-\@@efextension-\@@efpagina}%
- \doifobjectfoundelse{FIG}{\@@efobjectname}{\donetrue}{\donefalse}}
+ {\doifobjectfoundelse{FIG}{\@@efobjectname}{\donetrue}{\donefalse}}
{\donefalse}}
{\donefalse}}%
% redo message, only filename
@@ -953,8 +997,8 @@
\analyzefigurefiles}}%
\let\@@epe=\@@eftype
\edef\@@efextension{\figureextension{\@@eftype}}% dirty trick
- \global\figwid=\!!zeropoint \figxsca=1
- \global\fighei=\!!zeropoint \figysca=1
+ \global\figwid=\zeropoint \figxsca=1
+ \global\fighei=\zeropoint \figysca=1
\doif{\v!kader}{\@@exoptie}
{\let\@@efkader=\v!aan}%
\fi
@@ -973,16 +1017,16 @@
\doifnot{\@@efsymbool}{\v!ja}
{\showmessage{\m!figures}{8}{\@@effullname}}%
\fi
- \ifdim\@@epw=\!!zeropoint \chardef\figurestatus=1 \fi
- \ifdim\@@eph=\!!zeropoint \chardef\figurestatus=1 \fi
+ \ifdim\@@epw=\zeropoint \chardef\figurestatus=1 \fi
+ \ifdim\@@eph=\zeropoint \chardef\figurestatus=1 \fi
\ifnum\figurestatus=1 % unknown dimensions, take width or height or scale
\setnaturalfiguresize
-\xdef\naturalfigurewidth{\the\figwid}%
-\xdef\naturalfigureheight{\the\fighei}%
+ \xdef\naturalfigurewidth{\the\figwid}%
+ \xdef\naturalfigureheight{\the\fighei}%
\let\@@efkader=\v!uit
\else
-\global\let\naturalfigurewidth\@@epw
-\global\let\naturalfigureheight\@@eph
+ \global\let\naturalfigurewidth\@@epw
+ \global\let\naturalfigureheight\@@eph
\setfactorfiguresize
\setscalefiguresize
\setdimensionfiguresize
@@ -999,16 +1043,13 @@
\fi
\doif{\v!leeg}{\@@exoptie}
{\skipexternalfigurestrue
- \let\@@efkader=\v!uit}%
+ \let\@@efkader=\v!uit}% ? ?
\doifelsenothing{\@@efpagina} % NIEUW ??
{\let\@@efoptions\empty}
{\let\@@efoptions\@@efpagina}%
- \doif{\@@efpreview}{\v!ja}
- {\addtocommalist\v!preview\@@efoptions}%
- \doif{\@@efsturing}{\v!ja}
- {\addtocommalist\v!sturing\@@efoptions}%
- \doif{\@@efherhaal}{\v!ja}
- {\addtocommalist\v!herhaal\@@efoptions}%
+ \doif{\@@efpreview}{\v!ja}{\addtocommalist\v!preview\@@efoptions}%
+ \doif{\@@efsturing}{\v!ja}{\addtocommalist\v!sturing\@@efoptions}%
+ \doif{\@@efherhaal}{\v!ja}{\addtocommalist\v!herhaal\@@efoptions}%
\doif{\@@eftype}{\c!mps}
{\ifcase\EPSspecial\else\ifinobject\else
\@@eftrace{special mps, object forced}%
@@ -1023,18 +1064,18 @@
\ifdone
\doifobjectfoundelse{FIG}{\@@efobjectname}
{}
- {\bgroup
- \figwid=\@@epw % local ?
- \fighei=\@@eph % local ?
- \scratchdimen=\@@epx\scratchdimen=-\scratchdimen
- \edef\@@epx{\number\scratchdimen}%
- \scratchdimen=\@@epy\scratchdimen=-\scratchdimen
- \edef\@@epy{\number\scratchdimen}%
- \scratchdimen=\@@epw\edef\@@epw{\number\scratchdimen}%
- \scratchdimen=\@@eph\edef\@@eph{\number\scratchdimen}%
+ {\bgroup % to be cleaned up
+ \figwid\@@epw % local ?
+ \fighei\@@eph % local ?
+ \scratchdimen\@@epx\scratchdimen-\scratchdimen
+ \edef\@@epx{\the\scratchdimen}%
+ \scratchdimen\@@epy\scratchdimen-\scratchdimen
+ \edef\@@epy{\the\scratchdimen}%
+ %\scratchdimen\@@epw\edef\@@epw{\the\scratchdimen}%
+ %\scratchdimen\@@eph\edef\@@eph{\the\scratchdimen}%
\setbox0=\vbox to \fighei
{\vfill
- \ifdim\wd\foundexternalfigure=\!!zeropoint
+ \ifdim\wd\foundexternalfigure=\zeropoint
\doinsertfile
{\@@eftype,\@@efmethode}{\@@effullname,\@@eflabel}
{100}{100}
@@ -1042,7 +1083,7 @@
{\@@epw}{\@@eph}
{\@@efoptions}%
\else\ifskipexternalfigures
- \ruledhbox{\fakebox\foundexternalfigure}
+ \ruledhbox{\fakebox\foundexternalfigure}%
\else
\box\foundexternalfigure
\fi\fi}%
@@ -1067,17 +1108,33 @@
{\@@eftype,\@@efmethode}{\@@effullname,\@@eflabel}
{\scax}{\scay}
{\figx}{\figy}
- {\number\figwid}{\number\fighei}
+ {\figwid}{\fighei}
{\@@efoptions}}%
\xdef\noffigurepages{\number\nofinsertpages}%
\else
- \dimen0=\scax pt\divide\dimen0 by 100\edef\scax{\@EA\withoutpt\the\dimen0}%
- \dimen0=\scay pt\divide\dimen0 by 100\edef\scay{\@EA\withoutpt\the\dimen0}%
+ \dimen0=\scax pt\divide\dimen0 100\edef\scax{\@EA\withoutpt\the\dimen0}%
+ \dimen0=\scay pt\divide\dimen0 100\edef\scay{\@EA\withoutpt\the\dimen0}%
\schaal[sx=\scax,sy=\scay]{\dowithfigure{\box\foundexternalfigure}}%
\xdef\noffigurepages{\number\nofinsertpages}%
- \fi\fi}%
- \global\wd\foundexternalfigure=\figwid}
+ \fi\fi
+ \global\let\appliedfigurexscale\scax
+ \global\let\appliedfigureyscale\scay}%
+ \global\wd\foundexternalfigure=\figwid
+ \the\externalfigurepostprocessors}
+
+\newtoks\externalfigurepostprocessors
+
+\gdef\appliedfigurexscale{1}
+\gdef\appliedfigureyscale{1}
+% will go internal
+
+\def\appliedfigurefilename {\@@effilename}
+\def\appliedfigurefilepath {\@@efcurrentpath}
+\def\appliedfigureshortname {\@@efcurrentpath/\@@effilename}
+\def\appliedfigurefullname {\@@efcurrentfile}
+\def\appliedfigureidentifier{\@@efobjectname}
+\def\appliedfigureoptions {\@@efoptie}
%D In \PDF\ one can specify an alternative graphic. This means
%D that for instance a low resolution graphic can be used for
@@ -1114,16 +1171,26 @@
\let\naturalfigurewidth =\!!zeropoint
\let\figureheight =\!!zeropoint
\let\figurewidth =\!!zeropoint
-\def\noffigurepages {1}
-\def\getfiguredimensions%
- {\dodoubleempty\dogetfiguredimensions}
+\def\noffigurepages{\nofinsertpages}
-\gdef\noffigurepages{\nofinsertpages}
+\def\getfiguredimensions
+ {\dodoubleempty\dogetfiguredimensions}
\def\dogetfiguredimensions[#1][#2]%
{{\let\immediate\relax % very dirty but prevents flushing, will change
\setbox0=\hbox{\externalfigure[#1][#2,\c!scherm=,\c!object=\v!nee]}}}
+
+% 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}
\presetlocalframed[\??ef]
@@ -1153,24 +1220,14 @@
\else
\settrue\externalfigurelevel
\ifskipexternalfigures
- \localframed
- [\??ef]
- [\c!breedte=\figurewidth,
- \c!hoogte=\figureheight,
- \c!kader=\v!aan]
- {\ttx name: #2 \\ file: #3 \\ skipped}%
+ \externalfigurereplacement{name: #2 \\ file: #3 \\ skipped}%
\else\ifcase\figurestatus
- \localframed
- [\??ef]
- [\c!breedte=\figurewidth,
- \c!hoogte=\figureheight,
- \c!kader=\v!aan]
- {\ttx name: #2 \\ file: #3 \\ unknown}%
+ \externalfigurereplacement{name: #2 \\ file: #3 \\ unknown}%
\else
\doifelse{\@@efreset}{\v!ja}
- {\ht\foundexternalfigure=\figureheight
- \dp\foundexternalfigure=\!!zeropoint
- \wd\foundexternalfigure=\figurewidth
+ {\ht\foundexternalfigure\figureheight
+ \dp\foundexternalfigure\zeropoint
+ \wd\foundexternalfigure\figurewidth
\box\foundexternalfigure}
{\localframed
[\??ef]
@@ -1184,6 +1241,16 @@
\popmacro\figurewidth
\egroup}
+\def\externalfigurereplacement#1%
+ {\localframed
+ [\??ef]
+ [\c!breedte=\figurewidth,
+ \c!hoogte=\figureheight,
+ \c!achtergrond=\v!raster,
+ \c!achtergrondraster=.5,
+ \c!kader=\ifincolor\v!uit\else\v!aan\fi]
+ {\ttx#1}}
+
\def\getexternalfigure#1%
{\getvalue{\??ef\??ef#1}}
@@ -1220,7 +1287,8 @@
{\dosetuseexternalfigure[#1][#2][#3][#4]}}}
\def\dosetuseexternalfigure[#1][#2][#3][#4]%
- {\doifinstringelse{=}{#3}
+% {\doifinstringelse{=}{#3}
+ {\doifassignmentelse{#3}
{\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[\dopresetfigure][#1][#2][#3][#4]}}
{\doifelsenothing{#3} % catch [1][2][leeg][leeg]
{\setvalue{\??ef\??ef#1}{\doplaceexternalfigure[\dopresetfigure][#1][#2][#3][#4]}}
@@ -1249,13 +1317,14 @@
{\bgroup
\mindermeldingen
\def\presetfigure[##1][##2]%
- {\useexternalfigure
- [\s!figurepreset][##1]
- [\c!kader=\v!aan,\c!breedte=6cm][##2]%
+ {%\useexternalfigure
+ % [\s!figurepreset][##1]
+ % [\c!kader=\v!aan,\c!breedte=6cm][##2]%
\getvalue{\e!start\v!figuur\e!tekst}[\v!links][]
{\v!geen}
{\hbox
- {\getvalue{\s!figurepreset}%
+% {\getvalue{\s!figurepreset}%
+{\externalfigure[##1][\c!kader=\v!aan,\c!breedte=6cm][##2]%
\tfskip
\framed[\c!breedte=\figurewidth,\c!hoogte=\figureheight]{}}}%
{\tfa ##1}%
@@ -1294,12 +1363,15 @@
{\vbox
{\divide\hsize by \total
\advance\hsize by -1em
- \useexternalfigure
- [\s!figurepreset][##1]
+ %\useexternalfigure
+ % [\s!figurepreset][##1]
+ % [\c!kader=\v!aan,\c!factor=\v!max,\c!breedte=\hsize][##2]%
+ \externalfigure
+ [##1]
[\c!kader=\v!aan,\c!factor=\v!max,\c!breedte=\hsize][##2]%
- \getvalue{\s!figurepreset}}%
+ }%\getvalue{\s!figurepreset}}%
\doglobal\addtocommalist{##1}\allfigures
- \getvalue{\s!figurepreset}%
+ %\getvalue{\s!figurepreset}%
\doglobal\increment\figurecounter
\ifnum\figurecounter=\total
\doglobal\newcounter\figurecounter
@@ -1309,7 +1381,7 @@
\fi
\next}%
\pushendofline
- \tabskip=\!!zeropoint \!!plus 1fill
+ \tabskip\zeropoint \!!plus 1fill
\halign to \hsize
{&\hss##\hss\cr\readjobfile{\@@exfile}{}{}\crcr % was \readlocfile
\figurecaptions}
@@ -1330,8 +1402,7 @@
\def\dopagefigure[#1][#2]%
{\bgroup
\pagina
- \getfiguredimensions
- [#1][#2]
+ \setbox\scratchbox=\hbox{\externalfigure[#1][#2]}%
\getparameters
[\??ex][\c!offset=\!!zeropoint,#2]
\scratchdimen=\@@exoffset
@@ -1347,9 +1418,7 @@
[\c!kopwit=\@@exoffset, \c!rugwit=\@@exoffset,
\c!hoofd=\!!zeropoint, \c!voet=\!!zeropoint,
\c!hoogte=\v!midden, \c!breedte=\v!midden]
- \externalfigure
- [#1]
- [#2,\c!breedte=\textwidth,\c!hoogte=\textheight]
+ \box\scratchbox
\pagina
\egroup}
@@ -1471,7 +1540,7 @@
\processcommalist[#1]\docommando}%
\global\setbox\colorbarbox=\vbox
{\hskip2em\box\colorbarbox}%
- \global\wd\colorbarbox=\!!zeropoint}
+ \global\wd\colorbarbox\zeropoint}
\def\placestartfigure[#1][#2][#3]#4\placestopfigure[#5]%
{\hbox
@@ -1636,7 +1705,7 @@
{\bgroup
\getparameters[\??cp][#1]%
\dowithnextbox
- {\ifdim\@@cpbreedte>\!!zeropoint
+ {\ifdim\@@cpbreedte>\zeropoint
\dimen0=\@@cpbreedte
\dimen4=\@@cphoffset
\else
@@ -1647,7 +1716,7 @@
\dimen0=\@@cpsx\dimen0
\fi
\relax % sure
- \ifdim\@@cphoogte>\!!zeropoint
+ \ifdim\@@cphoogte>\zeropoint
\dimen2=\@@cphoogte
\dimen6=\ht\nextbox
\advance\dimen6 by -\@@cpvoffset
@@ -1663,16 +1732,16 @@
\fi
\setbox\nextbox=\hbox
{\hskip-\dimen4\lower\dimen6\box\nextbox}%
- \wd\nextbox=\!!zeropoint
- \ht\nextbox=\!!zeropoint
- \dp\nextbox=\!!zeropoint
+ \wd\nextbox\zeropoint
+ \ht\nextbox\zeropoint
+ \dp\nextbox\zeropoint
\setbox\nextbox=\hbox
- {\dostartclipping{\@@cpmp}{\number\dimen0}{\number\dimen2}%
+ {\dostartclipping{\@@cpmp}{\dimen0}{\dimen2}%
\box\nextbox
\dostopclipping}%
\wd\nextbox=\dimen0
\ht\nextbox=\dimen2
- \dp\nextbox=\!!zeropoint
+ \dp\nextbox=\zeropoint
\box\nextbox
\egroup}%
\hbox}
diff --git a/tex/context/base/core-fil.tex b/tex/context/base/core-fil.tex
index 279e8f3f2..012772586 100644
--- a/tex/context/base/core-fil.tex
+++ b/tex/context/base/core-fil.tex
@@ -146,40 +146,49 @@
\let\next\relax
\else
\makeshortfilename[#1\truefilename{#2}]%
- \doifundefinedelse{\shortfilename\v!aan}
- {\setgvalue{\shortfilename\v!aan}{}%
+ \doifelseflagged\shortfilename
+ {\showmessage\m!systems7{#2}%
+ \settrue\moduleisloaded
+ \let\next\relax}
+ {\doglobal\setflag\shortfilename
\def\next
{\startreadingfile
- \readsysfile{\shortfilename}%
- {\showmessage{\m!systems}{5}{#2}%
- \settrue\moduleisloaded}%
- {}%
- \stopreadingfile}}
- {\showmessage{\m!systems}{7}{#2}%
- \settrue\moduleisloaded
- \let\next\relax}%
+ \readsysfile\shortfilename
+ {\showmessage\m!systems5{#2}\settrue\moduleisloaded}
+ \donothing
+ \stopreadingfile}}%
\fi
\next}
-
-\def\dodousemodules#1%
- {\setfalse\moduleisloaded
- \dododousemodules\f!moduleprefix {#1}%
- \dododousemodules\f!privateprefix{#1}%
- \dododousemodules\f!styleprefix {#1}%
- \dododousemodules\f!xstyleprefix {#1}%
- \dododousemodules\f!thirdprefix {#1}%
+
+\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{#1-}{#2}}%
\ifconditional\moduleisloaded\else
- \showmessage{\m!systems}{6}{#1}%
+ \showmessage{\m!systems}{6}{#2}%
\fi}
-\def\dousemodules[#1]%
- {\doifelsenothing{#1}
- {\let\next\relax}
- {\def\next{\processcommalist[#1]\dodousemodules}}
+\def\dousemodules[#1][#2]%
+ {\ifsecondargument
+ \doifelsenothing{#2}
+ {\let\next\relax}
+ {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
+ \else
+ \def\next{\usemodules[][#1]}%
+ \fi
\next}
-\def\usemodules%
- {\dosingleargument\dousemodules}
+\def\usemodules
+ {\dodoubleempty\dousemodules}
+
+\let\usemodule\usemodules
+
+% \usemodule[t][speech]
%D We also support a singular call, which saves us for
%D frustrations when we do a typo.
@@ -199,34 +208,22 @@
\newif\ifprotectbuffers
-\def\bufferprefix%
- {\ifprotectbuffers\jobname-\fi}
-
-% also
-
-\def\TEXbufferfile#1%
- {\bufferprefix#1.\f!temporaryextension}
-
-%D We also redefine:
+\def\bufferprefix{\ifprotectbuffers\jobname-\fi}
-\def\MPgraphicfile%
- {\bufferprefix mp\ifMPrun run\else graph\fi}
+% The following filenames are defined here:
-\def\convertMPcolorfile%
- {\bufferprefix metacmyk.tmp}
+\def\TEXbufferfile #1{\bufferprefix#1.\f!temporaryextension}
+\def\MPgraphicfile {\bufferprefix mp\ifMPrun run\else graph\fi}
+\def\convertMPcolorfile{\bufferprefix metacmyk.tmp}
-%D Temporarilly here:
+%D The next few macros ar eused for some internal (rather
+%D old already) extensions.
-\def\definieerfilegroep%
+\def\definieerfilegroep
{\dodoubleargument\dodefinieerfilegroep}
\def\dodefinieerfilegroep[#1][#2]%
- {\getparameters
- [\??fp#1]
- [\c!file=#1,
- \c!voor=,
- \c!na=,
- #2]%
+ {\getparameters[\??fp#1][\c!file=#1,\c!voor=,\c!na=,#2]%
\setvalue{\e!start#1}{\dostartfilegroep[#1]}}
\def\dostartfilegroep%
@@ -235,34 +232,38 @@
\def\dodostartfilegroep[#1][#2]%
{\getvalue{\??fp#1\c!voor}%
\setvalue{\e!stop#1}{\dostopfilegroep[#1][#2]}%
- \edef\!!stringa{\getvalue{\??fp#1\c!file}-#2}%
- \@EA\dolaadfilegroep\@EA[\!!stringa]%
+ \expanded{\dolaadfilegroep[\getvalue{\??fp#1\c!file}-#2]}%
\getvalue{\e!start#1#2}}
\def\dolaadfilegroep[#1-#2#3#4#5]%
- {\readsysfile{#1-#2#3#4}{}{}}
+ {\readsysfile{#1-#2#3#4}\donothing\donothing}
\def\dostopfilegroep[#1][#2]%
{\getvalue{\e!stop#1#2}%
\getvalue{\??fp#1\c!na}}
-% usage:
-%
-% \fetchruntimecommand\showaccents{\f!encodingprefix ...}
+%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 \starttypen
+%D \fetchruntimecommand\showaccents{\f!encodingprefix ...}
+%D \stoptypen
\def\fetchruntimecommand#1#2%
{\def#1{\dofetchruntimecommand#1{#2}}}
\def\dofetchruntimecommand#1#2%
- {\doifundefined{@@@#2@@@}{\let#1\undefined\doinputonce{#2}}%
+ {\doifnotflagged{#2}
+ {\let#1\undefined
+ \readfile{#2}\donothing\donothing
+ \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 This will be perfected / changed / weeded.
+%D This module will be perfected / changed / weeded.
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/core-fld.tex b/tex/context/base/core-fld.tex
index f57b835bc..806f6af44 100644
--- a/tex/context/base/core-fld.tex
+++ b/tex/context/base/core-fld.tex
@@ -12,6 +12,8 @@
%C details.
% \appendtocommalist versus \addtocommalist
+%
+% * as default trigger in radiofields ?
\writestatus{loading}{Context Field Macros}
@@ -140,6 +142,7 @@
{\@@FieldName}
{\@@FieldWidth}
{\@@FieldHeight}
+ {\@@FieldDefault}
{\@@fdoptie}
{\@@FieldRoot}
{\@@FieldValues}
@@ -197,7 +200,7 @@
\let\tracefields\tracefieldstrue
-\def\doshowfields[#1]%
+\def\doshowfields[#1]% todo: tabulate van maken
{\bgroup
\switchtobodyfont[8pt,tt]
\doifsomething{#1}{\def\collectedfields{#1}}
@@ -438,16 +441,35 @@
\let\definepopupfield=\definechoicefield
\let\definecombofield=\definechoicefield
+%\def\definecheckfield#1#2#3#4#5%
+% {\doifelsenothing{#4}
+% {\definedefaultsymbols
+% \def\@@FieldValues{defaultyes}}
+% {\def\@@FieldValues{#4}}%
+% \doifelsenothing{#5}
+% {\dogetcommacommandelement2\from\@@FieldValues\to\@@FieldDefault
+% \dogetcommacommandelement1\from\@@FieldDefault\to\@@FieldDefault}
+% {\def\@@FieldDefault{#5}}%
+% \setfield{#1}{#2}{}{}{\@@FieldKids}{#3}{\@@FieldMode\@@FieldFree\@@FieldAuto}{\@@FieldValues}{\@@FieldDefault}}
+
+%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\@@FieldValues{defaultyes}}
{\def\@@FieldValues{#4}}%
\doifelsenothing{#5}
- {\dogetcommacommandelement2\from\@@FieldValues\to\@@FieldDefault
- \dogetcommacommandelement1\from\@@FieldDefault\to\@@FieldDefault}
- {\def\@@FieldDefault{#5}}%
- \setfield{#1}{#2}{}{}{\@@FieldKids}{#3}{\@@FieldMode\@@FieldFree\@@FieldAuto}{\@@FieldValues}{\@@FieldDefault}}
+ {\def\@@FieldDefault{2}}
+ {\dogetcommacommandelement1\from\@@FieldValues\to\@@FieldDefault
+ \doifinstringelse{#5}{\@@FieldDefault}
+ {\def\@@FieldDefault{1}}
+ {\def\@@FieldDefault{0}}}%
+ \setfield
+ {#1}{#2}{}{}{\@@FieldKids}{#3}%
+ {\@@FieldMode\@@FieldFree\@@FieldAuto}%
+ {\@@FieldValues}{\@@FieldDefault}}
\let\definepushfield=\definecheckfield
@@ -464,8 +486,8 @@
\fi
\def\docommando##1%
{\doifelse{##1}{\SavedFieldDefault}
- {\def\@@FieldDefault{*}}
- {\let\@@FieldDefault=\empty}%
+ {\def\@@FieldDefault{##1}}%
+ {\let\@@FieldDefault\empty}%
\setfield{##1}{#2}{#1}{}{}{#3}{\@@FieldMode\@@FieldFree\@@FieldAuto}{}{\@@FieldDefault}}%
\processcommalist[#4]\docommando
\else
@@ -488,10 +510,6 @@
{\definedefaultsymbols
\def\@@FieldValues{defaultyes}}
{\def\@@FieldValues{#3}}%
- \doifelse{\@@FieldDefault}{*}
- {\@EA\dogetcommalistelement\@EA1\@EA\from\@@FieldValues\to\@@FieldDefault}
- {\@EA\dogetcommalistelement\@EA2\@EA\from\@@FieldValues\to\@@FieldDefault}%
- \@EA\dogetcommalistelement\@EA1\@EA\from\@@FieldDefault\to\@@FieldDefault
\changefield{##1}%
\fi}%
\processcommalist[#1]\docommando
@@ -582,13 +600,13 @@
\fi
\ifx\@@FieldType\empty
\writestatus{\m!fields}{unknown field #2}%
- \else\ifcase\@@FieldFree
+ \else\ifcase\@@FieldFree\relax
\doifdefinedelse{\strippedcsname\setupfield\@@FieldGroup}
{\let\dosetupfield=#1\getvalue{\strippedcsname\setupfield\@@FieldGroup}}
{#1[\@@FieldName][\v!label,\v!kader,\v!horizontaal][][][]}%
\def\@@FieldFree{1}%
\changefield{#2}%
- \else\ifcase\@@FieldAuto
+ \else\ifcase\@@FieldAuto\relax
\writestatus{\m!fields}{field #2 already typeset}%
\else
\writestatus{\m!fields}{field #2 automatically copied}%
@@ -604,9 +622,9 @@
\ifx\@@FieldRoot\empty \else
\let\@@SavedFieldName=\@@FieldName
\getfield\@@FieldRoot
- \ifcase\@@FieldFree
+ \ifcase\@@FieldFree\relax
\dosetfieldstatus\@@FieldMode\@@FieldParent\@@FieldKids\@@FieldRoot
- \iflocation\getvalue{preset\@@FieldType record}\fi
+ \dopresetrecord
\def\@@FieldFree{1}%
\changefield\@@FieldName
\fi
@@ -622,11 +640,14 @@
%\addtocommalist\@@FieldParent\@@FieldKids
\appendtocommalist\@@FieldParent\@@FieldKids
\dosetfieldstatus\@@FieldMode\@@FieldParent\@@FieldKids\@@FieldRoot
- \iflocation\getvalue{preset\@@FieldType field}\fi
+ \dopresetfield
\let\@@FieldMode=\fieldchildmode
\fi
\dosetfieldstatus\@@FieldMode\@@FieldParent\@@FieldKids\@@FieldRoot
- \iflocation\getvalue{preset\@@FieldType field}\fi}
+ \dopresetfield}
+
+\def\dopresetfield {\iflocation\getvalue{preset\@@FieldType field}\fi}
+\def\dopresetrecord{\iflocation\getvalue{preset\@@FieldType record}\fi}
\def\dodefinethefieldset[#1][#2]%
{\dodefinefieldset{#1}{#2}}
@@ -753,8 +774,8 @@
\c!focusin=,\c!focusuit=,
\c!veldoffset=\!!zeropoint,\c!veldachtergrondkleur=,
\c!veldkaderkleur=,#5]%
- \dimen0=\framedwidth \edef\@@FieldWidth {\number\dimen0}%
- \dimen0=\framedheight\edef\@@FieldHeight{\number\dimen0}%
+ \dimen0=\framedwidth \edef\@@FieldWidth {\the\dimen0}%
+ \dimen0=\framedheight\edef\@@FieldHeight{\the\dimen0}%
\vfill
\hbox{\lower\@@fdveldoffset\hbox{\typesetfield}}
\vss}}%
@@ -785,7 +806,7 @@
{\presetlocalframed[\??fd]%
\localframed
[\??fd]
- [\c!n=1,\c!strut=\v!nee,\c!kleur=,\c!letter=,\c!optie=,
+ [\c!n=12,\c!strut=\v!nee,\c!kleur=,\c!letter=,\c!optie=,
\c!klikin=,\c!klikuit=,\c!gebiedin=,\c!gebieduit=,
\c!focusin=,\c!focusuit=,
\c!natoets=,\c!formatteer=,\c!valideer=,\c!bereken=,
@@ -797,8 +818,8 @@
\fi
\dopresetfieldsymbol\@@FieldValue
\setbox0=\hbox{\dogetfieldsymbol{\@@FieldValue}}%
- \dimen0=\wd0 \edef\@@FieldWidth {\number\dimen0}%
- \dimen0=\ht0 \edef\@@FieldHeight{\number\dimen0}%
+ \dimen0=\wd0 \edef\@@FieldWidth {\the\dimen0}%
+ \dimen0=\ht0 \edef\@@FieldHeight{\the\dimen0}%
\vbox to \ht0
{\vfill\hbox to \wd0{\typesetfield\hfill}\vss}}}
diff --git a/tex/context/base/core-fnt.tex b/tex/context/base/core-fnt.tex
index cec75eb9e..da173f0cd 100644
--- a/tex/context/base/core-fnt.tex
+++ b/tex/context/base/core-fnt.tex
@@ -16,6 +16,19 @@
\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 \starttypen
+%D so test\compound{}test can be used instead of test||test
+%D \stoptypen
+
+\bgroup \catcode`\|=\@@active \gdef\compound#1{|#1|} \egroup
+
+%D \macros
%D {kap,KAP,Kap,Kaps,nokap,userealcaps,usepseudocaps}
%D
%D We already introduced \type{\kap} as way to capitalize
@@ -155,6 +168,17 @@
\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}
+
\setupcapitals
[\c!titel=\v!ja,
\c!sc=\v!nee]
@@ -289,7 +313,7 @@
% {\bgroup
% \the\everyuppercase
% \uppercase{\def\textstring{#1}}%
-% \ifdim\stretchedspaceamount>\!!zeropoint
+% \ifdim\stretchedspaceamount>\zeropoint
% \def\textkern%
% {\kern\stretchedspaceamount}%
% \def\textskip%
@@ -318,7 +342,7 @@
\def\stretchedsomecase#1#2%
{\bgroup
#1{\def\textstring{#2}}%
- \ifdim\stretchedspaceamount>\!!zeropoint
+ \ifdim\stretchedspaceamount>\zeropoint
\def\textkern##1%
{\determinemidwordbreak{##1}{\stretchedbreaktokens}%
\kern\stretchedspaceamount##1\domidwordbreak}%
@@ -430,8 +454,8 @@
\def\dododounderbar#1#2#3%
{\startmathmode
\setbox0=\hbox{#3}%
- \setbox2=\getvalue{underbarmethod\@@onvariant}{\wd0}{#1}{#2}%
- \wd0=\!!zeropoint
+ \setbox2=\hbox{\color[\@@onlijnkleur]{\getvalue{underbarmethod\@@onvariant}{\wd0}{#1}{#2}}}%
+ \wd0=\zeropoint
\ht2=\ht0
\dp2=\dp0
\box0\box2
@@ -455,7 +479,7 @@
\setbox0=\hbox
{\dodounderbar{\hskip\fontdimen2\font}}%
\nobreak
- \hskip\!!zeropoint\!!minus\fontdimen4\font
+ \hskip\zeropoint\!!minus\fontdimen4\font
\discretionary{}{}{\box0}%
\egroup}
@@ -504,7 +528,7 @@
\setbox0=\hbox
{\dooverstrike{\hskip\fontdimen2\font}}%
\nobreak
- \hskip\!!zeropoint\!!minus\fontdimen4\font
+ \hskip\zeropoint\!!minus\fontdimen4\font
\discretionary{}{}{\box0}%
\egroup}
@@ -569,17 +593,53 @@
\unexpanded\def\high{\dohighlow\raise{14}{.86}{0}}
\unexpanded\def\low {\dohighlow\lower{16}{.48}{0}}
-\unexpanded\def\lohi#1#2%
+% \unexpanded\def\lohi#1#2%
+% {\dontleavehmode
+% \hbox
+% {\setbox4=\hbox{\dohighlow\lower{16}{.48}{.1}{#1}}%
+% \setbox6=\hbox{\dohighlow\raise{14}{.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{16}{.48}{.1}{#1}}%
- \setbox6=\hbox{\dohighlow\raise{14}{.86}{.1}{#2}}%
+ {\setbox4=\hbox{\dohighlow\lower{16}{.48}{.1}{#2}}%
+ \setbox6=\hbox{\dohighlow\raise{14}{.86}{.1}{#3}}%
+ \doif{#1}{\v!links}
+ {\ifdim\wd4<\wd6
+ \setbox4\hbox to \wd6{\hss\box4}%
+ \else
+ \setbox6\hbox to \wd4{\hss\box6}%
+ \fi}%
\ifdim\wd4<\wd6
- \wd4=\!!zeropoint\box4\box6
+ \wd4=\zeropoint\box4\box6
\else
- \wd6=\!!zeropoint\box6\box4
+ \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[links]{aha}{ah} test \lohi[links]{aha}{ah} test
+%D \lohi{aha}{ah} test\lohi{aha}{ah} test
+%D \lohi[links]{aha}{ah}test \lohi[links]{aha}{ah}test
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \haalbuffer
+
%D \macros
%D {setupinitial,placeinitial,checkinitial}
%D
@@ -621,7 +681,8 @@
[\c!variant=a,
\c!lijndikte=\linewidth,
\c!onderoffset=1.5pt,
- \c!bovenoffset=2.5pt]
+ \c!bovenoffset=2.5pt,
+ \c!lijnkleur=]
%D ? ? ?
diff --git a/tex/context/base/core-gen.tex b/tex/context/base/core-gen.tex
index 0c411a621..f9866284a 100644
--- a/tex/context/base/core-gen.tex
+++ b/tex/context/base/core-gen.tex
@@ -115,24 +115,43 @@
\edef\negv!middel{-\v!middel}
\edef\negv!klein {-\v!klein }
+%\def\assigndimension#1#2#3#4#5%
+% {\edef\!!stringa{#1}%
+% \ifx\!!stringa\nopv!geen #2=\zeropoint\else
+% \ifx\!!stringa\posv!groot #2=#5\else
+% \ifx\!!stringa\posv!middel#2=#4\else
+% \ifx\!!stringa\posv!klein #2=#3\else
+% \ifx\!!stringa\negv!groot #2=-#5\else
+% \ifx\!!stringa\negv!middel#2=-#4\else
+% \ifx\!!stringa\negv!klein #2=-#3\else
+% #2=#1\fi\fi\fi\fi\fi\fi\fi}
+%
+%\def\assignalfadimension#1#2#3#4#5%
+% {\edef\!!stringa{#1}%
+% \ifx\!!stringa\posv!groot \edef#2{#5}\else
+% \ifx\!!stringa\posv!middel\edef#2{#4}\else
+% \ifx\!!stringa\posv!klein \edef#2{#3}\else
+% \ifx\!!stringa\nopv!geen \edef#2{0}\else
+% \edef#2{#1}\fi\fi\fi\fi}
+
\def\assigndimension#1#2#3#4#5%
{\edef\!!stringa{#1}%
- \ifx\!!stringa\nopv!geen #2=\zeropoint\else
- \ifx\!!stringa\posv!groot #2=#5\else
- \ifx\!!stringa\posv!middel#2=#4\else
- \ifx\!!stringa\posv!klein #2=#3\else
- \ifx\!!stringa\negv!groot #2=-#5\else
- \ifx\!!stringa\negv!middel#2=-#4\else
- \ifx\!!stringa\negv!klein #2=-#3\else
- #2=#1\fi\fi\fi\fi\fi\fi\fi}
+ #2=\ifx\!!stringa\nopv!geen \zeropoint\else
+ \ifx\!!stringa\posv!groot #5\else
+ \ifx\!!stringa\posv!middel #4\else
+ \ifx\!!stringa\posv!klein #3\else
+ \ifx\!!stringa\negv!groot -#5\else
+ \ifx\!!stringa\negv!middel-#4\else
+ \ifx\!!stringa\negv!klein -#3\else
+ #1\fi\fi\fi\fi\fi\fi\fi}
\def\assignalfadimension#1#2#3#4#5%
{\edef\!!stringa{#1}%
- \ifx\!!stringa\posv!groot \edef#2{#5}\else
- \ifx\!!stringa\posv!middel\edef#2{#4}\else
- \ifx\!!stringa\posv!klein \edef#2{#3}\else
- \ifx\!!stringa\nopv!geen \edef#2{0}\else
- \edef#2{#1}\fi\fi\fi\fi}
+ \edef#2{\ifx\!!stringa\posv!groot #5\else
+ \ifx\!!stringa\posv!middel#4\else
+ \ifx\!!stringa\posv!klein #3\else
+ \ifx\!!stringa\nopv!geen 0\else
+ #1\fi\fi\fi\fi}}
%D \macros
%D {assignvalue}
@@ -172,12 +191,19 @@
%D Or faster:
+%\def\assignvalue#1#2#3#4#5%
+% {\edef\!!stringa{#1}%
+% \ifx\!!stringa\posv!groot \edef#2{#5}\else
+% \ifx\!!stringa\posv!middel\edef#2{#4}\else
+% \ifx\!!stringa\posv!klein \edef#2{#3}\else
+% \edef#2{#1}\fi\fi\fi}
+
\def\assignvalue#1#2#3#4#5%
{\edef\!!stringa{#1}%
- \ifx\!!stringa\posv!groot \edef#2{#5}\else
- \ifx\!!stringa\posv!middel\edef#2{#4}\else
- \ifx\!!stringa\posv!klein \edef#2{#3}\else
- \edef#2{#1}\fi\fi\fi}
+ \edef#2{\ifx\!!stringa\posv!groot #5\else
+ \ifx\!!stringa\posv!middel#4\else
+ \ifx\!!stringa\posv!klein #3\else
+ #1\fi\fi\fi}}
%D \macros
%D {assignwidth}
diff --git a/tex/context/base/core-grd.tex b/tex/context/base/core-grd.tex
index b5868d718..0d179ed7a 100644
--- a/tex/context/base/core-grd.tex
+++ b/tex/context/base/core-grd.tex
@@ -69,20 +69,21 @@
\definecolor[GridTextColor][blue]
\def\setbaselinecorrections%
- {\setbox0=\hbox{\setstrut\strut}%
- \setbox2=\hbox{(}%
- \dimen0=\ht0\advance\dimen0 by -\ht2
- \ifdim\dimen0<\zeropoint\dimen0=\zeropoint\fi
- \dimen2=\dp0\advance\dimen2 by -\dp2
- \ifdim\dimen2<\zeropoint\dimen2=\zeropoint\fi
- \edef\thetopbaselinecorrection{\the\dimen0}%
- \edef\thebotbaselinecorrection{\the\dimen2}}
-
-\def\dotopbaselinecorrection%
- {\kern\thetopbaselinecorrection}
-
-\def\dobotbaselinecorrection%
- {\kern\thebotbaselinecorrection}
+ {\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!
@@ -533,20 +534,42 @@
\newbox\fuzzysnapbox
\newbox\fuzzysnapsplit
+%\def\dosyncfuzzyvskip%
+% {\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint
+% \bgroup
+% \endgraf
+% \forgetall
+% \vbox{\strut}
+% \kern-2\lineheight
+% \nobreak
+% \vskip\lineheight
+% \egroup
+% \fi\fi\fi}
+
+%\def\fuzzyvskip#1%
+% {\iffuzzysnapdone
+% \endfuzzysnapping
+% \vskip#1\relax
+% \dosyncfuzzyvskip % NEW
+% \global\fuzzysnapdonefalse
+% \else
+% \vskip#1\relax
+% \beginfuzzysnapping
+% \global\fuzzysnapdonetrue
+% \fi}
+
\def\dosyncfuzzyvskip%
{\ifvmode\ifdim\lastskip<\lineheight\ifdim\lastskip>\zeropoint
- \hbox{\strut}
-% \nobreak
- \kern-2\lineheight
- \nobreak
- \vskip\lineheight % on behalf of testing
+ \bgroup
+ \endgraf\forgetall\vbox{\strut}\nobreak\vskip\lineheight
+ \egroup
\fi\fi\fi}
\def\fuzzyvskip#1%
{\iffuzzysnapdone
+ \dosyncfuzzyvskip % NEWER
\endfuzzysnapping
\vskip#1\relax
- \dosyncfuzzyvskip % NEW
\global\fuzzysnapdonefalse
\else
\vskip#1\relax
@@ -657,11 +680,11 @@
\def\adaptfuzzypagegoal%
{\ifgridsnapping\iffuzzysnapping\ifcase\fuzzysnappedleft\or % see dopagecontents
- \scratchdimen=\pagegoal
- \advance\scratchdimen by -.5\openlineheight
- \global\pagegoal=\scratchdimen
- \global\advance\vsize by -.5\openlineheight
- \global\chardef\fuzzysnappedleft=0
+ \scratchdimen\pagegoal
+ \advance\scratchdimen -.5\openlineheight
+ \global\pagegoal\scratchdimen
+ \global\advance\vsize -.5\openlineheight
+ \global\chardef\fuzzysnappedleft0
\fi\fi\fi}
\protect
diff --git a/tex/context/base/core-hlp.tex b/tex/context/base/core-hlp.tex
index afede5acd..7347f40ab 100644
--- a/tex/context/base/core-hlp.tex
+++ b/tex/context/base/core-hlp.tex
@@ -43,14 +43,18 @@
{\let\synchronizepagehelpdata\relax}
\def\resetpagehelpdata%
- {\let\synchronizepagehelpdata\resetpagehelpdata
- \global\let\pagehelpdata\empty
- \definereference[HideHelp][]} % hm
+ {\iflocation
+ \let\synchronizepagehelpdata\resetpagehelpdata
+ \global\let\pagehelpdata\empty
+ \resetreference[HideHelp]%
+ \fi}
\let\synchronizepagehelpdata\resetpagehelpdata
+\resetreference[HideHelp]
+
\def\getpagehelpdata%
- {\iflocation
+ {\iflocation\ifcase\nofhelpdataentries\else
\let\pagehelpdata\empty
\ifconditional\somehelpdatadefined
\definetwopasslist{hlp:\realfolio}%
@@ -66,10 +70,12 @@
\useJSscripts[fld]%
\definereference[HideHelp][JS(Hide_Fields)]% for the moment
\fi
- \fi}
+ \fi\fi}
\def\setpagehelpdata[#1]%
- {\iflocation\expanded{\dosetpagehelpdata{#1}}\fi}
+ {\iflocation\ifcase\nofhelpdataentries\else
+ \expanded{\dosetpagehelpdata{#1}}%
+ \fi\fi}
\def\dosetpagehelpdata#1%
{\doglobal\increment\nofhelpdataentries
diff --git a/tex/context/base/core-int.tex b/tex/context/base/core-int.tex
index 2ff563e1f..eeb0a44b2 100644
--- a/tex/context/base/core-int.tex
+++ b/tex/context/base/core-int.tex
@@ -179,7 +179,8 @@
\fi
\iflocation
\hbox
- {\setupinteraction[\c!breedte=\!!zeropoint]%
+ {%\setupinteraction[\c!breedte=\!!zeropoint]%
+ \setinteractionparameter\c!breedte\!!zeropoint
\doganaareenpagina\??lk\gotobegincharacter\firstlink\hss
\ifnum\noflinks>2
\hskip\@@lkafstand
@@ -240,22 +241,8 @@
\fi
\iflocation
\hbox
- {\setupinteraction[\c!breedte=\!!zeropoint]%
-%
-% \doganaareenpagina\??lk\gotobegincharacter\firstlink\hss
-% \ifnum\noflinks>2
-% \hskip\@@lkafstand
-% \doganaareenpagina\??lk\gobackwardcharacter\prevlink\hss
-% \fi
-% \hskip\@@lkafstand
-% #2\relax
-% \hskip\@@lkafstand
-% \ifnum\noflinks>2
-% \doganaareenpagina\??lk\goforwardcharacter\nextlink\hss
-% \hskip\@@lkafstand
-% \fi
-% \doganaareenpagina\??lk\gotoendcharacter\lastlink}%
-%
+ {%\setupinteraction[\c!breedte=\!!zeropoint]%
+ \setinteractionparameter\c!breedte\!!zeropoint
#2\relax
\hskip\@@lkafstand
\doganaareenpagina\??lk\gotobegincharacter\firstlink\hss
@@ -267,7 +254,6 @@
\hskip\@@lkafstand
\fi
\doganaareenpagina\??lk\gotoendcharacter\lastlink}%
-%
\else
\hbox{#2}%
\fi
@@ -276,43 +262,41 @@
\let\setupinteractionscreens\empty
\def\berekeninteractiescherm%
- {\doifelse{\@@scbreedte}{\v!passend}
- {\!!widtha=\linkerrandbreedte
- \advance\!!widtha by \linkerrandafstand
-% \advance\!!widtha by \paginascheiding
- \advance\!!widtha by \linkermargebreedte
- \advance\!!widtha by \linkermargeafstand
- \ifdim\rugwit>\!!widtha\ifdim\rugwit>\!!zeropoint\relax
- \advance\rugwit by -\!!widtha
+ {\doifelse\@@scbreedte\v!passend
+ {\!!widtha\linkerrandbreedte
+ \advance\!!widtha \linkerrandafstand
+ \advance\!!widtha \linkermargebreedte
+ \advance\!!widtha \linkermargeafstand
+ \ifdim\rugwit>\!!widtha\ifdim\rugwit>\zeropoint\relax
+ \advance\rugwit -\!!widtha
\fi\fi
- \advance\!!widtha by \zetbreedte
- \advance\!!widtha by \rechtermargeafstand
- \advance\!!widtha by \rechtermargebreedte
-% \advance\!!widtha by \paginascheiding
- \advance\!!widtha by \rechterrandafstand
- \advance\!!widtha by \rechterrandbreedte
- \scratchdimen=\@@scrugwit
- \advance\scratchdimen by \@@scrugoffset
- \advance\!!widtha by 2\scratchdimen}
- {\doifelse{\@@scbreedte}{\v!max}
- {\!!widtha=\printpapierbreedte}
- {\!!widtha=\@@scbreedte}}%
- \doifelse{\@@schoogte}{\v!passend}
- {\!!heighta=\bovenhoogte
- \advance\!!heighta by \bovenafstand
- \ifdim\kopwit>\!!heighta\ifdim\kopwit>\!!zeropoint\relax
- \advance\kopwit by -\!!heighta
+ \advance\!!widtha \zetbreedte
+ \advance\!!widtha \rechtermargeafstand
+ \advance\!!widtha \rechtermargebreedte
+ \advance\!!widtha \rechterrandafstand
+ \advance\!!widtha \rechterrandbreedte
+ \scratchdimen\@@scrugwit
+ \advance\scratchdimen \@@scrugoffset
+ \advance\!!widtha 2\scratchdimen}
+ {\doifelse\@@scbreedte\v!max
+ {\!!widtha\printpapierbreedte}
+ {\!!widtha\@@scbreedte}}%
+ \doifelse\@@schoogte\v!passend
+ {\!!heighta\bovenhoogte
+ \advance\!!heighta \bovenafstand
+ \ifdim\kopwit>\!!heighta\ifdim\kopwit>\zeropoint\relax
+ \advance\kopwit -\!!heighta
\fi\fi
- \advance\!!heighta by \zethoogte
- \advance\!!heighta by \onderafstand
- \advance\!!heighta by \onderhoogte
- \scratchdimen=\@@sckopwit
- \advance\scratchdimen by \@@sckopoffset
- \advance\!!heighta by 2\scratchdimen}
- {\doifelse{\@@schoogte}{\v!max}
- {\!!heighta=\printpapierhoogte}
- {\!!heighta=\@@schoogte}}%
- \doif{\@@scwachttijd}{\v!geen}{\def\@@scwachttijd{0}}}
+ \advance\!!heighta \zethoogte
+ \advance\!!heighta \onderafstand
+ \advance\!!heighta \onderhoogte
+ \scratchdimen\@@sckopwit
+ \advance\scratchdimen \@@sckopoffset
+ \advance\!!heighta 2\scratchdimen}
+ {\doifelse\@@schoogte\v!max
+ {\!!heighta\printpapierhoogte}
+ {\!!heighta\@@schoogte}}%
+ \doif\@@scwachttijd\v!geen{\let\@@scwachttijd\zerocountervalue}}
\def\initializeidentity% The macro is not to be changed;
{\iflocation % only the \@@ia-variables may be set!
@@ -346,26 +330,22 @@
\def\initializepaper%
{\bgroup
- %\doif\@@pcstatus\v!start\locationfalse
- %\doifsomething
- % {\@@pplinks\@@pprechts\@@ppboven\@@pponder}\locationfalse
- \ifx\@@pplinks \empty \else\locationfalse\fi
- \ifx\@@pprechts\empty \else\locationfalse\fi
- \ifx\@@ppboven \empty \else\locationfalse\fi
- \ifx\@@pponder \empty \else\locationfalse\fi
- \ifx\@@pcstatus\v!start \locationfalse\fi
+ \ifx\@@pplinks \empty
+ \ifx\@@pprechts\empty
+ \ifx\@@ppboven \empty
+ \ifx\@@pponder \empty
+ \ifx\@@pcstatus\v!start
+ \locationfalse\fi\else
+ \locationfalse\fi\else
+ \locationfalse\fi\else
+ \locationfalse\fi\else
+ \locationfalse\fi
\iflocation % without screen settings
\egroup
- \dosetuppaper
- {\papersize}
- {\the\papierbreedte}
- {\the\papierhoogte}%
+ \dosetuppaper\papersize\papierbreedte\papierhoogte
\else
\egroup
- \dosetuppaper
- {\printpapersize}
- {\the\printpapierbreedte}
- {\the\printpapierhoogte}%
+ \dosetuppaper\printpapersize\printpapierbreedte\printpapierhoogte
\fi}
\appendtoks \initializepaper \to \everyshipout
@@ -373,11 +353,11 @@
\def\doinitializepaper%
{\bgroup
\berekeninteractiescherm
- \ifdim\!!widtha>\papierbreedte\ifdim\!!widtha>\!!zeropoint
- \papierbreedte=\!!widtha
+ \ifdim\!!widtha>\papierbreedte\ifdim\!!widtha>\zeropoint
+ \papierbreedte\!!widtha
\fi\fi
- \ifdim\!!heighta>\papierhoogte\ifdim\!!heighta>\!!zeropoint
- \papierhoogte=\!!heighta
+ \ifdim\!!heighta>\papierhoogte\ifdim\!!heighta>\zeropoint
+ \papierhoogte\!!heighta
\fi\fi
\dosetuppaper
{\printpapersize}
@@ -387,31 +367,59 @@
\let\@@pcscreendata\empty
+% \def\dosetupinteractionscreens% met a, b en \number
+% {\doifnot{\@@pcstatus}{\v!start}
+% {\bgroup
+% \berekeninteractiescherm
+% \processaction
+% [\@@scoptie]
+% [ \v!max=>\!!counte=1,
+% \v!bookmark=>\!!counte=2,
+% \s!unknown=>\!!counte=0,
+% \s!default=>\!!counte=0]%
+% \edef\temp%
+% {{\number\rugoffset}{\number\kopoffset}%
+% {\number\!!widtha}{\number\!!heighta}%
+% {\the\!!counte}}%
+% \doifnot{\the\!!widtha\the\!!heighta}{\@@pcscreendata}
+% {\xdef\@@pcscreendata{\the\!!widtha\the\!!heighta}%
+% \showmessage{\m!interactions}{1} % niet waterdicht
+% {\@EA\withoutpt\the\!!widtha,\@EA\withoutpt\the\!!heighta}}%
+% % need to be split: dimensions for each page
+% % and mode per document and only once !
+% \dosetupscreen
+% {\rugoffset}{\kopoffset}
+% {\!!widtha}{\!!heighta}
+% {\the\!!counte}%
+% \egroup}}
+
\def\dosetupinteractionscreens% met a, b en \number
- {\doifnot{\@@pcstatus}{\v!start}
- {\bgroup
- \berekeninteractiescherm
- \processaction
- [\@@scoptie]
- [ \v!max=>\!!counte=1,
- \v!bookmark=>\!!counte=2,
- \s!unknown=>\!!counte=0,
- \s!default=>\!!counte=0]%
- \edef\temp%
- {{\number\rugoffset}{\number\kopoffset}%
- {\number\!!widtha}{\number\!!heighta}%
- {\the\!!counte}}%
- \doifnot{\the\!!widtha\the\!!heighta}{\@@pcscreendata}
- {\xdef\@@pcscreendata{\the\!!widtha\the\!!heighta}%
- \showmessage{\m!interactions}{1} % niet waterdicht
- {\@EA\withoutpt\the\!!widtha,\@EA\withoutpt\the\!!heighta}}%
- % need to be split: dimensions for each page
- % and mode per document and only once !
- \dosetupscreen
- {\number\rugoffset}{\number\kopoffset}
- {\number\!!widtha}{\number\!!heighta}
- {\the\!!counte}%
- \egroup}}
+ {\doifnot\@@pcstatus\v!start\dodosetupinteractionscreens}
+
+\setvalue{\??sc\c!optie\v!max }{1} % tzt share with driver
+\setvalue{\??sc\c!optie\v!bookmark}{2} % tzt share with driver
+
+\def\dodosetupinteractionscreens% met a, b en \number
+ {\bgroup
+ \berekeninteractiescherm
+ % slow, called each page
+ % \processaction
+ % [\@@scoptie]
+ % [ \v!max=>\!!counte=1,
+ % \v!bookmark=>\!!counte=2,
+ % \s!unknown=>\!!counte=0,
+ % \s!default=>\!!counte=0]%
+ % fast, tzt installable
+ \!!counte=0\getvalue{\??sc\c!optie\@@scoptie}\relax
+ %
+ \doifnot{\the\!!widtha\the\!!heighta}\@@pcscreendata
+ {\xdef\@@pcscreendata{\the\!!widtha\the\!!heighta}%
+ \showmessage{\m!interactions}{1} % niet waterdicht
+ {\@EA\withoutpt\the\!!widtha,\@EA\withoutpt\the\!!heighta}}%
+ % need to be split: dimensions for each page
+ % and mode per document and only once !
+ \dosetupscreen\rugoffset\kopoffset\!!widtha\!!heighta{\the\!!counte}%
+ \egroup}
\def\dostelinteractieschermin[#1]%
{\getparameters[\??sc][#1]%
@@ -435,7 +443,7 @@
% \hoofdstuk{het eerste hoofdstuk}
%
-% \bookmark {de eerste bookmark} % optional overuled hoofdstuk
+% \bookmark {de eerste bookmark} % optional overruled hoofdstuk
%
% .... text ....
%
@@ -453,7 +461,13 @@
\appendtoks\flushpostponedbookmark\to\everypar
\appendtoks\flushpostponedbookmark\to\neverypar
-\let\flushpostponedbookmark\relax
+\newtoks\postponedbookmarks
+
+%\let\flushpostponedbookmark\relax
+
+\def\flushpostponedbookmark%
+ {\the\postponedbookmarks
+ \global\postponedbookmarks\emptytoks}
\def\simplebookmark#1%
{\ifx\flushpostponedbookmark\relax \else
@@ -462,21 +476,25 @@
\writestatus{system}{clashing bookmarks: \ascii}% ECHTE MESSAGE MAKEN
\egroup
\fi
- \gdef\flushpostponedbookmark%
- {\global\let\flushpostponedbookmark\relax
- \schrijfnaarlijst[\@@bookmark]{}{#1}}}
+% \gdef\flushpostponedbookmark%
+% {\global\let\flushpostponedbookmark\relax
+% \schrijfnaarlijst[\@@bookmark]{}{#1}}}
+ \doglobal\prependtoks
+ \schrijfnaarlijst[\@@bookmark]{}{#1}%
+ \to\postponedbookmarks}
\def\complexbookmark[#1]#2%
- {\schrijfnaarlijst[#1]{}{#2}}
+% {\schrijfnaarlijst[#1]{}{#2}}
+ {\doglobal\appendtoks\schrijfnaarlijst[#1]{}{#2}\to\postponedbookmarks}
\definecomplexorsimple\bookmark
-%\def\insertbookmark[#1]#2%
-% {\bgroup
-% \doifreferencefoundelse{#1}
-% {\doinsertbookmark{0}{0}{#2}{\currentrealreference}}{1}
-% {\unknownreference{#1}}%
-% \egroup}
+% \def\insertbookmark[#1]#2%
+% {\bgroup
+% \doifreferencefoundelse{#1}
+% {\doinsertbookmark{0}{0}{#2}{\currentrealreference}}{1}
+% {\unknownreference{#1}}%
+% \egroup}
\newif\iftracebookmarks \tracebookmarksfalse
@@ -654,7 +672,7 @@
\def\doblokkeerinteractiemenu[#1][#2][#3]%
{\def\dodoblokkeerinteractiemenu##1%
{\doifelse{#3}{}
- {\setevalue{\??am##1\c!blokkade}{}}
+ {\letvalue{\??am##1\c!blokkade}\empty}
{\edef\interactieblokkade{\getvalue{\??am##1\c!blokkade}}
\def\docommando####1%
{#1{####1}{\interactieblokkade}}% #1 = \remove or \add
@@ -676,82 +694,169 @@
\newif\iflocationdummy
\newif\ifskippedmenuitem
-\def\dosetlocationbox#1[#2]#3#4%
+% \def\dosetlocationbox#1[#2]#3#4%
+% {\global\skippedmenuitemfalse
+% \setbox\locationbox=\hbox
+% {% anders cyclische aanroep !
+% \resetgoto
+% \iflocationdummy
+% \edef\locationboxborder{\getvalue{#1\c!kader}}%
+% \edef\locationboxbackground{\getvalue{#1\c!achtergrond}}%
+% \else
+% \edef\locationboxborder{\v!uit}%
+% \edef\locationboxbackground{}%
+% \fi
+% \localframed[#1]
+% [\c!kader=\locationboxborder,
+% \c!achtergrond=\locationboxbackground,
+% #2]
+% {\dolocationattributes{#1}\c!letter\c!kleur{#3}}}%
+% \hbox{#4{\box\locationbox}}}
+%
+% \def\setlocationboxyes#1[#2]#3[#4]%
+% {\ifx\currentouterreference\empty
+% \ifrealreferencepage\!!doneatrue\else\!!doneafalse\fi
+% %\doifelse{\currentrealreference}{\realfolio}
+% % {\!!doneatrue}{\!!doneafalse}%
+% \else
+% \!!doneafalse
+% \fi
+% \if!!donea
+% %\ifcase0\getvalue{#1\c!zelfdepagina}\relax
+% \ifcase0\getvalue{\??am\??am\getvalue{#1\c!zelfdepagina}}\relax
+% \bgroup
+% \locationdummytrue
+% \setevalue{#1\c!kleur}{\getvalue{#1\c!contrastkleur}}%
+% \dosetlocationbox{#1}[#2,\c!leeg=\v!nee]{#3}{\gotolocation{#4}}%
+% \egroup
+% \or
+% \locationdummytrue
+% \dosetlocationbox{#1}[#2,\c!leeg=\v!ja]{#3}{\gotolocation{#4}}%
+% \or
+% \locationdummyfalse
+% \dosetlocationbox{#1}[#2,\c!leeg=\v!ja]{#3}{\gotolocation{#4}}%
+% \or
+% \locationdummyfalse
+% \global\skippedmenuitemtrue
+% \fi
+% \else
+% \locationdummytrue
+% \dosetlocationbox{#1}[#2,\c!leeg=\v!nee]{#3}{\gotolocation{#4}}%
+% \fi}
+%
+% \def\setlocationboxnop#1[#2]#3[#4]%
+% %{\ifcase\getvalue{#1\c!onbekendeverwijzing}\relax
+% {\ifcase\getvalie{\??am\??am\getvalue{#1\c!onbekendeverwijzing}}\relax
+% \locationdummytrue
+% \dosetlocationbox{#1}[#2,\c!leeg=\v!nee]{#3}{}%
+% \or
+% \locationdummytrue
+% \dosetlocationbox{#1}[#2,\c!leeg=\v!ja]{#3}{}%
+% \or
+% \locationdummyfalse
+% \dosetlocationbox{#1}[#2,\c!leeg=\v!ja]{#3}{}%
+% \or
+% \locationdummyfalse
+% \global\skippedmenuitemtrue
+% \fi}
+%
+% \def\setlocationbox#1[#2]#3[#4]%
+% {\doifreferencepermittedelse{#4}{\csname#1\c!blokkade\endcsname}
+% {\setlocationboxyes{#1}[#2]{#3}[#4]}
+% {\setlocationboxnop{#1}[#2]{#3}[#4]}}
+
+\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
- {% anders cyclische aanroep !
- \resetgoto
- \iflocationdummy
- \edef\locationboxborder{\getvalue{#1\c!kader}}%
- \edef\locationboxbackground{\getvalue{#1\c!achtergrond}}%
- \else
- \edef\locationboxborder{\v!uit}%
- \edef\locationboxbackground{}%
- \fi
- \localframed[#1]
- [\c!kader=\locationboxborder,
- \c!achtergrond=\locationboxbackground,
- #2]
+ {\resetgoto % anders cyclische aanroep !
+ \localframed[#1][#2]
{\dolocationattributes{#1}\c!letter\c!kleur{#3}}}%
- \hbox{#4{\box\locationbox}}}
+ \iflocationclick
+ \hbox{\gotolocation{#4}{\box\locationbox}}%
+ \else
+ \hbox{\box\locationbox}%
+ \fi}
+
+\let\dosetlocationboxyes\dosetlocationboxcontent
+
+\def\dosetlocationboxempty#1[%
+ {\dosetlocationboxcontent{#1}[\c!leeg=\v!ja}
+
+\def\dosetlocationboxno#1[%
+ {\dosetlocationboxcontent{#1}[\c!leeg=\v!ja,\c!kader=,\c!achtergrond=,}
-\def\setlocationboxyes#1[#2]#3[#4]%
- {\ifx\currentouterreference\empty
+\def\dosetlocationboxnone#1[#2]#3[#4]%
+ {\global\skippedmenuitemtrue}
+
+\def\setlocationboxyes#1%
+ {\locationclicktrue
+ \ifx\currentouterreference\empty
\ifrealreferencepage\!!doneatrue\else\!!doneafalse\fi
- %\doifelse{\currentrealreference}{\realfolio}
- % {\!!doneatrue}{\!!doneafalse}%
\else
\!!doneafalse
\fi
\if!!donea
- \ifcase0\getvalue{#1\c!zelfdepagina}\relax
- \bgroup
- \locationdummytrue
- \setevalue{#1\c!kleur}{\getvalue{#1\c!contrastkleur}}%
- \dosetlocationbox{#1}[#2,\c!leeg=\v!nee]{#3}{\gotolocation{#4}}%
- \egroup
+ \ifcase\csname\??am\??am\csname#1\c!zelfdepagina\endcsname\endcsname\relax
+ \copycsname#1\c!kleur\endcsname\csname#1\c!contrastkleur\endcsname
+ \@EAEAEA\dosetlocationboxyes
\or
- \locationdummytrue
- \dosetlocationbox{#1}[#2,\c!leeg=\v!ja]{#3}{\gotolocation{#4}}%
+ \@EAEAEA\dosetlocationboxempty
\or
- \locationdummyfalse
- \dosetlocationbox{#1}[#2,\c!leeg=\v!ja]{#3}{\gotolocation{#4}}%
+ \@EAEAEA\dosetlocationboxno
\or
- \locationdummyfalse
- \global\skippedmenuitemtrue
+ \@EAEAEA\dosetlocationboxnone
\fi
\else
- \locationdummytrue
- \dosetlocationbox{#1}[#2,\c!leeg=\v!nee]{#3}{\gotolocation{#4}}%
- \fi}
+ \@EA\dosetlocationboxcontent
+ \fi{#1}}
-\def\setlocationboxnop#1[#2]#3[#4]%
- {\ifcase\getvalue{#1\c!onbekendeverwijzing}\relax
- \locationdummytrue
- \dosetlocationbox{#1}[#2,\c!leeg=\v!nee]{#3}{}%
+\def\setlocationboxnop#1%
+ {\locationclickfalse
+ \ifcase\csname\??am\??am\csname#1\c!onbekendeverwijzing\endcsname\endcsname\relax
+ \@EA\dosetlocationboxyes
\or
- \locationdummytrue
- \dosetlocationbox{#1}[#2,\c!leeg=\v!ja]{#3}{}%
+ \@EA\dosetlocationboxempty
\or
- \locationdummyfalse
- \dosetlocationbox{#1}[#2,\c!leeg=\v!ja]{#3}{}%
+ \@EA\dosetlocationboxno
\or
- \locationdummyfalse
- \global\skippedmenuitemtrue
- \fi}
+ \@EA\dosetlocationboxnone
+ \fi{#1}}
\def\setlocationbox#1[#2]#3[#4]%
- {\doifreferencepermittedelse{#4}{\getvalue{#1\c!blokkade}}
+ {\bgroup % really needed !
+ \edef\permittedreferences{\csname#1\c!blokkade\endcsname}%
+ \doifreferencepermittedelse{#4}
{\setlocationboxyes{#1}[#2]{#3}[#4]}
- {\setlocationboxnop{#1}[#2]{#3}[#4]}}
+ {\setlocationboxnop{#1}[#2]{#3}[#4]}%
+ \egroup}
+\def\setlocationboxraw#1[#2]#3[#4]%
+ {\localframed[#1][#2]{\dolocationattributes{#1}\c!letter\c!kleur{#3}}}
+
\def\dodosetlocationcommanditem#1#2#3[#4]#5\\%
{\bgroup
\leavevmode
\doifelse{#5}{[]}
- {\doifinstringelse{=}{#4}
- {#3}
- {\setlocationbox{\??am#1}[]{#3}[#4]}}
+ {\doifassignmentelse{#4}{#3}{\setlocationbox{\??am#1}[]{#3}[#4]}}
{#3}%
\ifskippedmenuitem \else
\getvalue{\??am#1#2}%
@@ -789,41 +894,93 @@
\newtoks\everysetmenucommands
+% \def\setamboxcommands#1#2%
+% {\def\@@amboxcommand##1\\%
+% {\bgroup
+% \leavevmode\ignorespaces##1\unskip\relax
+% \ifskippedmenuitem \else
+% \getvalue{\??am#1#2}%
+% \fi
+% \egroup
+% \ignorespaces}%
+% \doglobal\newcounter\currentamposition %%% experiment
+% \def\currentmenu{#1}% to be sure
+% % here, but could go into \everysetmenucommands
+% \def\raw[##1]##2\\%
+% {\@@amboxcommand\naarbox{\ignorespaces##2\unskip}[##1]\\}%
+% \def\but[##1]##2\\%
+% {\@@amboxcommand\do@@amposition{#1}{##1}{\setlocationbox{\??am#1}[]{\ignorespaces##2\unskip}[##1]}\\}%
+% \def\got[##1]##2\\% pas op! offset
+% {\@@amboxcommand\setlocationbox{\??am#1}[\c!kader=\v!uit,\c!achtergrond=]{\ignorespaces##2\unskip}[##1]\\}%
+% \def\nop##1\\%
+% {\@@amboxcommand\phantom{\localframed[\??am#1][]{}}\\}%
+% \def\txt##1\\%
+% {\@@amboxcommand\localframed[\??am#1][\c!kader=\v!uit,\c!achtergrond=]{\ignorespaces##1\unskip}\\}%
+% \def\rul##1\\% ook \do@@amposition !
+% {\@@amboxcommand\localframed[\??am#1][]{\ignorespaces##1\unskip}\\}%
+% \def\com##1\\%
+% {\ignorespaces##1\unskip\ignorespaces}%
+% \the\everysetmenucommands}
+
\def\setamboxcommands#1#2%
- {\def\@@amboxcommand##1\\%
- {\bgroup
- \leavevmode\ignorespaces##1\unskip\relax
- \ifskippedmenuitem \else
- \getvalue{\??am#1#2}%
- \fi
- \egroup
- \ignorespaces}%
- \doglobal\newcounter\currentamposition %%% experiment
- \def\currentmenu{#1}% to be sure
- % here, but could go into \everysetmenucommands
- \def\raw[##1]##2\\%
- {\@@amboxcommand\naarbox{\ignorespaces##2\unskip}[##1]\\}%
- \def\but[##1]##2\\%
- {\@@amboxcommand\do@@amposition{#1}{##1}{\setlocationbox{\??am#1}[]{\ignorespaces##2\unskip}[##1]}\\}%
- \def\got[##1]##2\\% pas op! offset
- {\@@amboxcommand\setlocationbox{\??am#1}[\c!kader=\v!uit,\c!achtergrond=]{\ignorespaces##2\unskip}[##1]\\}%
- \def\nop##1\\%
- {\@@amboxcommand\phantom{\localframed[\??am#1][]{}}\\}%
- \def\txt##1\\%
- {\@@amboxcommand\localframed[\??am#1][\c!kader=\v!uit,\c!achtergrond=]{\ignorespaces##1\unskip}\\}%
- \def\rul##1\\% ook \do@@amposition !
- {\@@amboxcommand\localframed[\??am#1][]{\ignorespaces##1\unskip}\\}%
- \def\com##1\\%
- {\ignorespaces##1\unskip\ignorespaces}%
+ {\def\currentmenu{#1}% % kan nog eerder
+ \def\currentsubmenu{#2}% % ? ?
+ \doglobal\newcounter\currentamposition
\the\everysetmenucommands}
+\def\menu@@amboxcommand#1\\%
+ {\bgroup
+ \leavevmode\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\naarbox{\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!kader=\v!uit,\c!achtergrond=]{\ignorespaces#2\unskip}[#1]\\}%
+
+\def\menu@nop#1\\%
+ {\@@amboxcommand\phantom{\localframed[\??am\currentmenu][]{}}\\}%
+
+\def\menu@txt#1\\%
+ {\@@amboxcommand\localframed[\??am\currentmenu][\c!kader=\v!uit,\c!achtergrond=]{\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
-\def\@@amhbox#1#2#3#4%
+% beware : never change the concept of pbgoffset
+
+\def\@@amhbox#1#2#3#4%
{\def\currentmenu{#3}%
\testinteractiemenu{#3}%
\iflocationmenupermitted
@@ -832,10 +989,10 @@
\def\dolocationcommand##1%
{\dosetlocationcommanditem{#3}{##1}}%
\dimen0=\zetbreedte
- \advance\dimen0 by \pagebackgroundhoffset
- \advance\dimen0 by \pagebackgroundhoffset
- \advance\dimen0 by -\getvalue{\??am#3\c!linkeroffset}%
- \advance\dimen0 by -\getvalue{\??am#3\c!rechteroffset}%
+ \advance\dimen0 \pagebackgroundhoffset
+ \advance\dimen0 \pagebackgroundhoffset
+ \advance\dimen0 -\getvalue{\??am#3\c!linkeroffset}%
+ \advance\dimen0 -\getvalue{\??am#3\c!rechteroffset}%
\setbox0=\hbox to \dimen0
{\forgetall
\executeamboxcommands{#3}{#4}\c!links\c!midden\c!rechts}%
@@ -857,21 +1014,22 @@
\bgroup
\showcomposition
\dimen0=\teksthoogte
- \advance\dimen0 by \pagebackgroundvoffset
- \advance\dimen0 by \pagebackgroundvoffset
- \advance\dimen0 by \pagebackgrounddepth
- \advance\dimen0 by -\getvalue{\??am#3\c!bovenoffset}%
- \advance\dimen0 by -\getvalue{\??am#3\c!onderoffset}%
+ \advance\dimen0 \pagebackgroundvoffset
+ \advance\dimen0 \pagebackgroundvoffset
+ \advance\dimen0 \pagebackgrounddepth
+ \advance\dimen0 -\getvalue{\??am#3\c!bovenoffset}%
+ \advance\dimen0 -\getvalue{\??am#3\c!onderoffset}%
\setbox0=\vbox to \dimen0
{\forgetall % Voor't geval de afstand
- \stelblankoin[\v!standaard]% % (tijdelijk) is aangepast.
+ %\stelblankoin[\v!standaard]% % (tijdelijk) is aangepast.
+ \restorestandardblank
\hsize#2\relax
\executeamboxcommands{#3}{#4}\c!voor\c!tussen\c!na}%
\setbox0=\vbox{\hbox{\do@@ammenuposition{#3}{\box0}}}%
\setbox0=\vbox
{\vskip-\pagebackgroundvoffset
\vskip\getvalue{\??am#3\c!bovenoffset}%
- \ht0=\!!zeropoint
+ \ht0=\zeropoint
\box0
\vskip\pagebackgroundvoffset}% overbodig
\ht0=\teksthoogte
@@ -935,7 +1093,7 @@
\setbox2=\vbox to #2
{\getvalue{\??am##1#3}\interactiemenu[##1]\getvalue{\??am##1#4}}%
\doifelsevalue{\??am##1\c!afstand}{\v!overlay}
- {\dimen2=\!!zeropoint
+ {\dimen2=\zeropoint
\offinterlineskip
\dp2=\zeropoint
\ht2=\zeropoint}%
@@ -999,7 +1157,7 @@
\unprotected\def\includemenu[#1]%
{\doifvalue{\??am#1\c!status}{\v!lokaal}
{\bgroup
- \doassign[\??am#1][\c!status=\v!start]%
+ \setvalue{\??am#1\c!status}{\v!start}%
\let\@@amvbox\local@@ambox
\let\@@amhbox\local@@ambox
\getvalue{\??am\c!menu#1}%
@@ -1008,92 +1166,149 @@
%D We also need an explicit position control some day. I'll
%D do that when I need it. [The stacking order.]
+% \newif\ifextendedmenu
+%
+% \def\dodefinieerinteractiemenu[#1][#2][#3]%
+% {\ConvertToConstant\doifelse{#3}{}
+% {\setvalue{\??am\c!menu#1}%
+% {\extendedmenufalse\dointeractiemenu{#1}{#2}}%
+% \setvalue{\@@dodolijstelement#1}%
+% {\def\dosomelijstelement{\dodomenulijstelement{#1}}}} % of #2 ?
+% {\setvalue{\??am\c!menu#1}%
+% {\extendedmenufalse\dointeractiemenu{#1}{}}%
+% \setvalue{\@@dodolijstelement#1}%
+% {\def\dosomelijstelement{\dodomenulijstelement{#1}}}%
+% \presetlocalframed[\??am#1]%
+% \letvalue{\??am#1\c!blokkade}\empty
+% \edef\!!stringe{\getvalue{\??am#2}}%
+% \addtocommalist{#1}\!!stringe
+% \letvalue{\??am#2}=\!!stringe
+% \doifnot{#1}{#2}
+% {\copyparameters[\??am#1][\??am#2]
+% [\c!links,\c!midden,\c!rechts,\c!voor,\c!na,\c!tussen,
+% \c!breedte,\c!hoogte,\c!afstand,\c!offset,\c!kader,
+% \c!achtergrond,\c!achtergrondkleur,\c!achtergrondraster,
+% \c!letter,\c!kleur,\c!contrastkleur,\c!zelfdepagina,\c!onbekendeverwijzing,
+% \c!linkeroffset,\c!rechteroffset,\c!bovenoffset,\c!onderoffset]}%
+% % \ConvertToConstant\doifinstringelse{=}{#3}
+% \doifassignmentelse{#3}
+% {\getparameters[\??am#1][\c!plaats=#2,#3]}%
+% {\doifnot{#2}{#3}
+% {\copyparameters[\??am#1][\??am#3]
+% [\c!links,\c!midden,\c!rechts,\c!voor,\c!na,\c!tussen,
+% \c!breedte,\c!hoogte,\c!afstand,\c!offset,\c!kader,
+% \c!achtergrond,\c!achtergrondkleur,\c!achtergrondraster,
+% \c!letter,\c!kleur,\c!zelfdepagina,\c!onbekendeverwijzing,
+% \c!linkeroffset,\c!rechteroffset,\c!bovenoffset,\c!onderoffset]}%
+% \getparameters[\??am#1][\c!plaats=#2]}}}
+%
+%\def\dodostelinteractiemenuin[#1][#2]%
+% {\def\docommando##1%
+% {\getparameters[\??am##1][#2]%
+% \dododostelinteractiemenuin{\??am##1\c!onbekendeverwijzing}%
+% \dododostelinteractiemenuin{\??am##1\c!zelfdepagina}}%
+% \processcommalist[#1]\docommando}
+%
+%\def\dostelinteractiemenuin[#1][#2]%
+%% {\ConvertToConstant\doifinstringelse{=}{#2}
+% {\doifassignmentelse{#2}
+% {\dodostelinteractiemenuin[#1][#2]}
+% {\dodefinieerinteractiemenu[#1][#2][]}}
+
+% \def\dododostelinteractiemenuin#1%
+% {\processaction
+% [\getvalue{#1}]
+% [ \v!ja=>\setvalue{#1}{0},
+% \v!leeg=>\setvalue{#1}{1},
+% \v!nee=>\setvalue{#1}{2},
+% \v!geen=>\setvalue{#1}{3},
+% \s!default=>\setvalue{#1}{1}]}
+
+% for the moment we will support the old method
+%
+% \stelinteractiemenuin[right][{abc[xyz]},...]
+% \stelinteractiemenuin[right][key=val,...]
+
\newif\ifextendedmenu
-\def\dodefinieerinteractiemenu[#1][#2][#3]%
- {\ConvertToConstant\doifelse{#3}{}
- {\setvalue{\??am\c!menu#1}%
- {\extendedmenufalse\dointeractiemenu{#1}{#2}}%
- \setvalue{\@@dodolijstelement#1}%
- {\def\dosomelijstelement{\dodomenulijstelement{#1}}}} % of #2 ?
- {\setvalue{\??am\c!menu#1}%
- {\extendedmenufalse\dointeractiemenu{#1}{}}%
- \setvalue{\@@dodolijstelement#1}%
- {\def\dosomelijstelement{\dodomenulijstelement{#1}}}%
- \presetlocalframed[\??am#1]%
- \letvalue{\??am#1\c!blokkade}\empty
- \edef\!!stringe{\getvalue{\??am#2}}%
- \addtocommalist{#1}\!!stringe
- \letvalue{\??am#2}=\!!stringe
- \doifnot{#1}{#2}
- {\copyparameters[\??am#1][\??am#2]
- [\c!links,\c!midden,\c!rechts,\c!voor,\c!na,\c!tussen,
- \c!breedte,\c!hoogte,\c!afstand,\c!offset,\c!kader,
- \c!achtergrond,\c!achtergrondkleur,\c!achtergrondraster,
- \c!letter,\c!kleur,\c!contrastkleur,\c!zelfdepagina,\c!onbekendeverwijzing,
- \c!linkeroffset,\c!rechteroffset,\c!bovenoffset,\c!onderoffset]}%
- \ConvertToConstant\doifinstringelse{=}{#3}
- {\getparameters[\??am#1][\c!plaats=#2,#3]}%
- {\doifnot{#2}{#3}
- {\copyparameters[\??am#1][\??am#3]
- [\c!links,\c!midden,\c!rechts,\c!voor,\c!na,\c!tussen,
- \c!breedte,\c!hoogte,\c!afstand,\c!offset,\c!kader,
- \c!achtergrond,\c!achtergrondkleur,\c!achtergrondraster,
- \c!letter,\c!kleur,\c!zelfdepagina,\c!onbekendeverwijzing,
- \c!linkeroffset,\c!rechteroffset,\c!bovenoffset,\c!onderoffset]}%
- \getparameters[\??am#1][\c!plaats=#2]}}}
-
\def\definieerinteractiemenu%
{\dotripleempty\dodefinieerinteractiemenu}
+\def\dodefinieerinteractiemenu[#1][#2]% compatibility hack
+ {\doifinstringelse{[}{#2}
+ {\dodostelinteractielijstmenuinx}
+ {\dododefinieerinteractiemenu }%
+ [#1][#2]}
+
+% [name] [location]
+% [name] [location] [pars]
+
+\def\dododefinieerinteractiemenu[#1][#2][#3]%
+ {% main settings
+ \letvalue{\??am\c!menu#1}\empty
+ % \setvalue{\??am\c!menu#1}%
+ % {\extendedmenufalse\dointeractiemenu{#1}{}}%
+ \setvalue{\@@dodolijstelement#1}%
+ {\def\dosomelijstelement{\dodomenulijstelement{#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!links,\c!midden,\c!rechts,\c!voor,\c!na,\c!tussen,
+ \c!breedte,\c!hoogte,\c!afstand,\c!offset,\c!kader,
+ \c!achtergrond,\c!achtergrondkleur,\c!achtergrondraster,
+ \c!letter,\c!kleur,\c!contrastkleur,\c!zelfdepagina,\c!onbekendeverwijzing,
+ \c!linkeroffset,\c!rechteroffset,\c!bovenoffset,\c!onderoffset]}%
+ % additional settings
+ \getparameters[\??am#1][\c!plaats=#2,\c!blokkade=,#3]}
+
+\def\stelinteractiemenuin
+ {\dodoubleargument\dostelinteractiemenuin}
+
+\def\dostelinteractiemenuin[#1][#2% compatibillity hack
+ {\doifnextcharelse\bgroup
+ {\dodostelinteractielijstmenuiny[#1][#2}
+ {\dodostelinteractiemenuin [#1][#2}}
+
+\def\dodostelinteractielijstmenuinx[#1][#2][#3]% compatibillity hack
+ {\setvalue{\??am\c!menu#1}{\extendedmenufalse\dointeractiemenu{#1}{#2}}}
+
+\def\dodostelinteractielijstmenuiny[#1][#2]% compatibillity hack
+ {\setvalue{\??am\c!menu#1}%
+ {\extendedmenufalse\dointeractiemenu{#1}{#2}}}
+
+\def\dodostelinteractiemenuin[#1][#2]%
+ {\def\docommando##1{\getparameters[\??am##1][#2]}%
+ \processcommalist[#1]\docommando}
+
+\setvalue{\??am\??am\v!ja }{0}
+\setvalue{\??am\??am\v!leeg}{1}
+\setvalue{\??am\??am\v!nee }{2}
+\setvalue{\??am\??am\v!geen}{3}
+\setvalue{\??am\??am }{1} % default
+
+\processbetween{\e!interactiemenu}\dostartinteractiemenu
+
+\def\dostartinteractiemenu#1%
+ {\dodostartinteractiemenu#1\dodostopinteractiemenu}
+
+\def\dodostartinteractiemenu[#1]#2\dodostopinteractiemenu
+ {\setvalue{\??am\c!menu#1}{\extendedmenutrue\dointeractiemenu{#1}{#2}}}
+
\def\dodomenulijstelement#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
- {\doifelsenothing{\??li#2\c!maxbreedte}
- {#5}
- {\limitatetext
- {#5}
- {\getvalue{\??li#2\c!maxbreedte}}
- {\unknown}}}% % needed !
+ {\limitatetext{#5}{\getvalue{\??li#2\c!maxbreedte}}{\unknown}}% % needed !
[]}% normally the destination, catch by gobble
\@@amboxcommand\do@@amposition{#1}{#7}% beware, we pass the pagenumber
{\ignorespaces\linklisttoelement{#2}{#3}{#6}{#7}{\box0}\unskip}\\}
-
-\processbetween{\e!interactiemenu}\dostartinteractiemenu
-
-\def\dostartinteractiemenu#1%
- {\dodostartinteractiemenu#1\dodostopinteractiemenu}
-
-\def\dodostartinteractiemenu[#1]#2\dodostopinteractiemenu%
- {\setvalue{\??am\c!menu#1}{\extendedmenutrue\dointeractiemenu{#1}{#2}}}
-
-\def\dododostelinteractiemenuin#1%
- {\processaction
- [\getvalue{#1}]
- [ \v!ja=>\setvalue{#1}{0},
- \v!leeg=>\setvalue{#1}{1},
- \v!nee=>\setvalue{#1}{2},
- \v!geen=>\setvalue{#1}{3},
- \s!default=>\setvalue{#1}{1}]}
-
-\def\dodostelinteractiemenuin[#1][#2]%
- {\def\docommando##1%
- {\getparameters[\??am##1][#2]%
- \dododostelinteractiemenuin{\??am##1\c!onbekendeverwijzing}%
- \dododostelinteractiemenuin{\??am##1\c!zelfdepagina}}%
- \processcommalist[#1]\docommando}
-
-\def\dostelinteractiemenuin[#1][#2]%
- {\ConvertToConstant\doifinstringelse{=}{#2}
- {\dodostelinteractiemenuin[#1][#2]}
- {\dodefinieerinteractiemenu[#1][#2][]}}
-
-\def\stelinteractiemenuin%
- {\dodoubleargument\dostelinteractiemenuin}
% \scherm moet worden als \pagina
@@ -1109,24 +1324,61 @@
\definecomplexorsimple\scherm
-\def\domenubutton[#1][#2]#3[#4]%
- {\bgroup
- \locationdummytrue
- \iffirstargument
+% \def\domenubutton[#1][#2]#3[#4]%
+% {\bgroup
+% \locationdummytrue
+% \iffirstargument
+% \ifsecondargument
+% \setlocationbox{\??am#1}[#2]{#3}[#4]%
+% \else
+% \doifassignmentelse{#1}
+% {\setlocationbox\??bt[#1]{#3}[#4]}
+% {\setlocationbox{\??am#1}[]{#3}[#4]}%
+% \fi
+% \else
+% \setlocationbox\??bt[]{#3}[#4]%
+% \fi
+% \egroup}
+
+\unexpanded\def\menubutton
+ {\dodoubleempty\domenubutton}
+
+\def\domenubutton[#1]%
+ {\iffirstargument
\ifsecondargument
- \setlocationbox{\??am#1}[#2]{#3}[#4]%
+ \@EAEAEA\domenubuttonB
\else
- \ConvertToConstant\doifinstringelse{=}{#1}
- {\setlocationbox{\??bt}[#1]{#3}[#4]}
- {\setlocationbox{\??am#1}[]{#3}[#4]}%
+ \doifassignmentelse{#1}
+ {\@EAEAEA\domenubuttonC}
+ {\@EAEAEA\domenubuttonD}%
\fi
\else
- \setlocationbox{\??bt}[]{#3}[#4]%
- \fi
+ \@EA\domenubuttonA
+ \fi[#1]}
+
+\def\domenubuttonA[#1][#2]#3[#4]% normal button, no parameters
+ {\bgroup
+ %\locationdummytrue
+ \setlocationbox\??bt[]{#3}[#4]%
\egroup}
-\unexpanded\def\menubutton%
- {\dodoubleempty\domenubutton}
+\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\domenubox[#1][#2]#3%
{\bgroup
@@ -1136,8 +1388,14 @@
\domenubutton[#1][#2]#3[]%
\egroup}
-\def\menubox%
+\def\menubox
{\dodoubleempty\domenubox}
+
+\def\domenubox[#1][#2]#3%
+ {\bgroup
+ \let\setlocationbox\setlocationboxraw
+ \domenubutton[#1][#2]#3[]%
+ \egroup}
% Hier volgen de synchronisatiemacro's:
@@ -1192,7 +1450,8 @@
\setvalue{synchronisatie\v!pagina}[#1]%
{\bgroup
- \setupinteraction[\c!breedte=\!!zeropoint]%
+ %\setupinteraction[\c!breedte=\!!zeropoint]%
+ \setinteractionparameter\c!breedte\!!zeropoint
\setbox0=\hbox
{\localframed[\??ba][]%
{\dolocationattributes\??ba\c!letter\c!kleur{\strut\@@batekst}}}%
@@ -1232,13 +1491,14 @@
\boven\top11\hss\boven\first11\hss\boven\bot11\relax
\fi
\fi}%
- \wd2=\!!zeropoint\box2
+ \wd2=\zeropoint\box2
\box0\relax}%
\egroup}
\setvalue{synchronisatie\v!lokaal}[#1]%
{\bgroup
- \setupinteraction[\c!breedte=\!!zeropoint]%
+ %\setupinteraction[\c!breedte=\!!zeropoint]%
+ \setinteractionparameter\c!breedte\!!zeropoint
\def\blackrule{\hbox{\vrule\!!height.5em\!!width.5em}}%
%\gotodestination
% {}{##1}{\syncprefix:#1}{0}
@@ -1282,7 +1542,8 @@
\def\interactiebalka%
{\iflocation
\bgroup
- \setupinteraction[\c!breedte=\!!zeropoint]%
+ %\setupinteraction[\c!breedte=\!!zeropoint]%
+ \setinteractionparameter\c!breedte\!!zeropoint
\setupblackrules[\c!hoogte=\v!max,\c!diepte=\v!max]% maten ??
\!!widthb=\@@ibbreedte\relax
\advance\!!widthb by -2.75em\relax
@@ -1312,7 +1573,7 @@
\for \teller=1 \to \lastpage \step \!!counta \do
{\gotorealpage{}{}{\teller}{\copy0}}%
\hss}%
- \global\wd\meterbox=\!!zeropoint\relax
+ \global\wd\meterbox=\zeropoint\relax
\egroup
\fi
\egroup
@@ -1332,7 +1593,7 @@
\ifnum\realpageno>1\relax
\!!counta=\realpageno
\advance\!!counta by -2\relax
- \hskip\!!zeropoint\!!plus\!!counta sp\relax % cm gives overflow
+ \hskip\zeropoint\!!plus\!!counta sp\relax % cm gives overflow
\doganaareenpagina\??ib\blackrule\prevpage
\fi
\color[\@@ibcontrastkleur]{\blackrule[\c!breedte=.5em]}%
@@ -1341,7 +1602,7 @@
\!!counta=\lastpage\relax
\advance\!!counta by -\realpageno
\advance\!!counta by -1\relax
- \hskip\!!zeropoint\!!plus\!!counta sp\relax % cm gives overflow
+ \hskip\zeropoint\!!plus\!!counta sp\relax % cm gives overflow
\fi}%
\hss
\doganaareenpagina\??ib\blackrule\lastpage}%
@@ -1385,7 +1646,8 @@
\ifnum\nofsubpages>1
\hbox
\bgroup
- \setupinteraction[\c!breedte=\!!zeropoint]%
+ %\setupinteraction[\c!breedte=\!!zeropoint]%
+ \setinteractionparameter\c!breedte\!!zeropoint
\ifbalksymbool % beter: 3 chars assign en 3*box
\setupsymbolset[\@@iasymboolset]%
\setbox0=\hbox{\symbol[\v!vorige]}%
@@ -1435,7 +1697,8 @@
\ifdim\!!widtha<\@@ibafstand\relax
\interactiebalkf
\else
- \setupinteraction[\c!breedte=\!!zeropoint]%
+ %\setupinteraction[\c!breedte=\!!zeropoint]%
+ \setinteractionparameter\c!breedte\!!zeropoint
\noindent
\hbox to \@@ibbreedte
\bgroup
@@ -1480,7 +1743,8 @@
\def\interactiebalkf% !! KAN WORDEN GECOMBINEERD MET D !!
{\iflocation\ifshowingsubpage
\ifnum\nofsubpages>1
- \setupinteraction[\c!breedte=\!!zeropoint]%
+ %\setupinteraction[\c!breedte=\!!zeropoint]%
+ \setinteractionparameter\c!breedte\!!zeropoint
\noindent
\hbox to \@@ibbreedte
\bgroup
@@ -1590,7 +1854,7 @@
\fi}
\def\checkinteractiebalk#1#2#3%
- {\ifdim\@@ibbreedte=\!!zeropoint\def\@@ibbreedte{#1}\fi
+ {\ifdim\@@ibbreedte=\zeropoint\def\@@ibbreedte{#1}\fi
\doifnothing{\@@ibhoogte}{\def\@@ibhoogte{#2}}%
\doifnothing{\@@ibdiepte}{\def\@@ibdiepte{#3}}}
@@ -1665,10 +1929,7 @@
{\addtocommalist{##2}\processedprofiles
##1\relax
\ifcase#1\relax
- \dobeginofprofile
- {##2}
- {\number\papierbreedte}{\number\papierhoogte}
- {\profilepage}%
+ \dobeginofprofile{##2}\papierbreedte\papierhoogte\profilepage
\else
\doendofprofile
\fi}}%
@@ -1719,9 +1980,7 @@
\data
{\dolocationattributes\??ia\c!letter\c!kleur{#1\presetgoto}}%
\start
- \dostartgotoprofile
- {\number\buttonwidth}{\number\buttonheight}
- {#2}%
+ \dostartgotoprofile\buttonwidth\buttonheight{#2}%
\stop
\dostopgotoprofile
\dostopgoto}%
@@ -2003,46 +2262,47 @@
\def\horizontalpositionbar\pos#1\min#2\max#3\token#4\\%
{\hbox to \hsize
- {\hskip\!!zeropoint\!!plus #1\!!fill
- \hskip\!!zeropoint\!!plus-#2\!!fill
+ {\hskip\zeropoint\!!plus #1\!!fill
+ \hskip\zeropoint\!!plus-#2\!!fill
#4\relax
- \hskip\!!zeropoint\!!plus #3\!!fill
- \hskip\!!zeropoint\!!plus-#1\!!fill}}
+ \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
+ {\vskip\zeropoint\!!plus #1\!!fill
+ \vskip\zeropoint\!!plus-#2\!!fill
\hbox{#4}\relax
- \vskip\!!zeropoint\!!plus #3\!!fill
- \vskip\!!zeropoint\!!plus-#1\!!fill}}
+ \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\relax
\advance\scratchcounter by -#2\relax
\advance\scratchcounter by 1\relax
- \leaders\vrule\hskip\!!zeropoint\!!plus \scratchcounter\!!fill
- \vrule\!!width\!!zeropoint\!!height#4\!!depth#5\relax
- \hskip\!!zeropoint\!!plus #3\!!fill
- \hskip\!!zeropoint\!!plus-#1\!!fill}}
+ \leaders\vrule\hskip\zeropoint\!!plus \scratchcounter\!!fill
+ \vrule\!!width\zeropoint\!!height#4\!!depth#5\relax
+ \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\relax
\advance\scratchcounter by -#2\relax
\advance\scratchcounter by 1\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}}
+ \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\flushcomments%
- {\ifvoid\commentbox\else
- \inmarge{\hbox{\raise\ht\strutbox\box\commentbox}}%
- \fi}
+\def\doflushcomments%
+ {\inmarge{\hbox{\raise\ht\strutbox\box\commentbox}}}
+
+\def\flushcomments% in everypar so indirect
+ {\ifvoid\commentbox\else \doflushcomments \fi}
\def\stelcommentaarin%
{\dodoubleargument\getparameters[\??cc]}
@@ -2054,13 +2314,13 @@
{\dodoubleempty\docommentaar}
\def\dodocommentaar#1%
- {\!!widtha=\@@ccbreedte
- \!!heighta=\@@cchoogte
+ {\!!widtha\@@ccbreedte
+ \!!heighta\@@cchoogte
\doifelse{\@@ccoptie}{\v!max}
{\def\@@ccoptie{1}}{\def\@@ccoptie{0}}%
- \doPDFinsertcomment
- {\@@cctitel}{\number\!!widtha}{\number\!!heighta}
- {\@@cckleur}{\@@ccoptie}{\@@ccsymbool}{#1}}
+ \doinsertcomment
+ \@@cctitel\!!widtha\!!heighta
+ \@@cckleur\@@ccoptie\@@ccsymbool{#1}}
%\def\dopreparecommentaar#1#2%
% {\doifassignmentelse{#1}
@@ -2085,7 +2345,7 @@
%\def\docommentaar[#1][#2]#3%
% {\bgroup
% \dopreparecommentaar{#1}{#2}%
-% \hbox to \!!zeropoint
+% \hbox to \zeropoint
% {\hskip-\@@ccmarge
% \raise\ht\strutbox\hbox{\dodocommentaar{#3}}}%
% \egroup
diff --git a/tex/context/base/core-itm.tex b/tex/context/base/core-itm.tex
index ba1e65a4a..6eb40f6c5 100644
--- a/tex/context/base/core-itm.tex
+++ b/tex/context/base/core-itm.tex
@@ -1,19 +1,20 @@
-% todo : start=2
-
%D \module
-%D [ file=core-itm,
+%D [ file=core-itm, % updated
%D version=1997.03.31,
%D title=\CONTEXT\ Core Macros,
-%D subtitle=Itemize,
+%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.
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% new: text + lefttext=(,righttext=)
+% start=
-\writestatus{loading}{Context Core Macros / Itemize}
+\writestatus{loading}{Context Core Macros / itemgroup}
\startmessages dutch library: layouts
9: momenteel maximaal -- niveaus in opsommingen
@@ -43,394 +44,327 @@
9: acum nu se supota mai mult de -- nivele de adancime la iteratii
\stopmessages
-\unprotect
+\unprotect
-% - meerdere niveaus (moet niet moeilijk zijn)
% - instellingen in macro
-% - \defineitemize
% - [0] voor start op 0
+% - start=2
-\newif\ifsubsom \subsomfalse
-\newif\ifsymsom \symsomfalse
-\newif\ifkopsom \kopsomfalse
-\newif\ifsomintro \somintrofalse
-\newif\ifsomautointro \somautointrofalse
+\newif\ifsubitem \subitemfalse
+\newif\ifsymbolitem \symbolitemfalse
+\newif\ifheaditem \headitemfalse
+\newif\ifitemintro \itemintrofalse
+\newif\ifautoitemintro \autoitemintrofalse
\newif\ifoptimizeitems \optimizeitemstrue
\newif\ifpackeditems \packeditemsfalse
\newif\iffirstlist \firstlistfalse
\newif\ifparagraphitems \paragraphitemsfalse
-
-\newcounter \itemcolumndepth
-
-\definetwopasslist{\s!list}
+\newif\iftextitems \textitemsfalse
\newcounter\noflists
\newcounter\itemlevel
+\newcounter\itemcolumndepth
+\newcounter\maxitemlevel
+
+\definetwopasslist\s!list
+
+\let\currentitemgroup\empty
+
+\def\itemreferences{0}
+
+% #1=level #2=parameter
-\def\dolistreference%
- {\immediatewriteutilitycommand%
+\def\getitemparameter #1#2{\csname\??op\currentitemgroup#1#2\endcsname}
+\def\setitemparameter #1#2{\@EA\def\csname\??op\currentitemgroup#1#2\endcsname}
+\def\letitemparameter #1#2{\@EA\let\csname\??op\currentitemgroup#1#2\endcsname}
+
+\def\doitemattributes #1{\doattributes{\??op\currentitemgroup#1}}
+
+\def\@@globalitemsymbol #1{\??op\currentitemgroup\c!symbool\s!global#1}
+\def\@@localitemsymbol #1{\??op\currentitemgroup\c!symbool\s!local #1}
+\def\@@currentitemsymbol#1{\??op\currentitemgroup\c!symbool #1}
+
+\def\@@itemcounter {\s!itemcount} % {\s!itemcount\currentitemgroup}
+
+\def\doitembreak#1{\iftextitems\else\dosomebreak#1\fi}
+
+\def\dolistreference
+ {\immediatewriteutilitycommand
{\twopassentry%
{\s!list}%
{\currentlist}%
{\currentlist:\noflistelements}}}
-\def\setnextitemlevel#1%
- {\doifundefined{\??op#1\c!breedte}
- {\edef\itemreferences{\itemreferences,#1}%
- \copyparameters
- [\??op#1][\??oo]
- [\c!breedte,\c!factor,\c!afstand,
- \c!letter,\c!marletter,\c!symletter,\c!kopletter,
- \c!kleur,\c!markleur,\c!symkleur,\c!kopkleur,
- \c!kopvoor,\c!kopna,\c!voor,\c!tussen,\c!na,
- \c!afsluiter,\c!plaatsafsluiter,\c!inspringen,
- \c!n,\c!binnen,\c!symbool,\c!marge]%
- \makecounter{\s!itemcount#1}%
- \setvalue{\??op\c!symbool\s!global#1}{#1}}}
-
-\def\maxitemlevel{0}
-\def\itemreferences{0}
+\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!breedte}%
+ \doinitializeitemgrouplevel{#1}%
+ \fi}
-\def\dostelopsommingenin[#1]% % still undocumented
+\def\doinitializeitemgrouplevel#1%
+ {\copyparameters
+ [\??op\currentitemgroup#1][\??oo]
+ [\c!breedte,\c!factor,\c!afstand,\c!uitlijnen,
+ \c!letter,\c!marletter,\c!symletter,\c!kopletter,
+ \c!kleur,\c!markleur,\c!symkleur,\c!kopkleur,
+ \c!kopvoor,\c!kopna,\c!voor,\c!tussen,\c!na,
+ \c!afsluiter,\c!plaatsafsluiter,\c!inspringen,
+ \c!n,\c!binnen,\c!symbool,\c!marge,\c!items,
+ \c!start,\c!linkertekst,\c!rechtertekst]}
+
+\def\setupitemgroups
+ {\dosingleargument\dosetupitemgroups}
+
+\def\dosetupitemgroups[#1]% still undocumented
{\getparameters[\??oo][\c!niveaus=4,#1]%
+ % will change (remove)
\ifnum\@@ooniveaus>\maxitemlevel
\edef\maxitemlevel{\@@ooniveaus}%
- \dorecurse{\maxitemlevel}{\setnextitemlevel\recurselevel}%
+ \dorecurse\maxitemlevel{\initializeitemgroupslevel\recurselevel}%
\fi}
-\def\stelopsommingenin%
- {\dosingleargument\dostelopsommingenin}
-
\def\doitemreference#1,#2,#3\\%
{\ifnum\itemlevel>#1
- \ifnum#1>0
- \tempsymbool
- \fi
- \getvalue{\??op\c!symbool#2}%
+ \ifnum#1>0 \tempsymbol \fi
+ \getvalue{\@@currentitemsymbol{#2}}%
\doitemreference#2,#3\\%
\fi}
-\def\itemreference%
+\def\itemreference
{\expandafter\doitemreference\itemreferences,,\\}
-\def\itemuse#1%
- {\getvalue{\??op\itemlevel#1}}%
-
-\def\packitems%
- {\ifnum\itemlevel=0 \else\packeditemstrue\fi}
+\def\packitems
+ {\ifnum\itemlevel=0 \else \packeditemstrue \fi}
-\def\dostelopsomminginvariable[#1][#2]% niveau instellingen
+\def\dosetupitemgroupvariable[#1]% [#2]% niveau instellingen
{\doifelsenothing{#1}
- {\getparameters[\??op\itemlevel][#2]}%
- {\getparameters[\??op#1][#2]}}
+ {\getparameters[\??op\currentitemgroup\itemlevel]}% [#2]}%
+ {\getparameters[\??op\currentitemgroup#1]}}% [#2]}}
\newconditional\inlinelistitem \setfalse\inlinelistitem
-\def\dododostelopsomminginconstant[#1][#2#3#4]% * permits [2]
+\def\dododosetupitemgroupconstant[#1][#2#3#4]% * permits [2]
{\processaction
[#2#3#4]
[ \v!opelkaar*=>\packitems,
- \v!vanelkaar*=>\packeditemsfalse,
- \v!intro*=>\somintrotrue,
- \v!autointro*=>\somautointrotrue,
- \v!ruim*=>{\doassign[\??op#1][\c!factor=1]},
- #2#3*\v!ruim*=>{\doassign[\??op#1][\c!factor=#2#3]},
- #2*\v!ruim*=>{\doassign[\??op#1][\c!factor=#2]},
- \v!marge*=>{\doassign[\??op#1][\c!breedte=-2em]}, % signal
- \v!inmarge*=>{\doassign[\??op#1][\c!breedte=-2em]}, % signal
- \v!opmarge*=>\doifnot{#1}{1}{\doassign[\??op#1][\c!breedte=0em]}, % signal
+ \v!intro*=>\itemintrotrue,
+ \v!autointro*=>\autoitemintrotrue,
+ \v!ruim*=>\setitemparameter{#1}\c!factor{1},
+ #2#3*\v!ruim*=>\setitemparameter{#1}\c!factor{#2#3},
+ #2*\v!ruim*=>\setitemparameter{#1}\c!factor{#2},
+ \v!tekst*=>\textitemstrue
+ \settrue\inlinelistitem
+ \dosetuppackeditemgroup{#1}%
+ \packitems,
\v!kolommen*=>\packitems,
-\v!intekst*=>\settrue\inlinelistitem, % new
+ \v!marge*=>\setitemparameter{#1}\c!breedte{-2em}, % signal
+ \v!inmarge*=>\setitemparameter{#1}\c!breedte{-2em}, % signal
+ \v!opmarge*=>\doifnot{#1}{1}{\setitemparameter{#1}\c!breedte{0em}}, % signal
+ \v!intekst*=>\settrue\inlinelistitem, % new
\v!los*=>\optimizeitemsfalse,
- \v!alinea*=>{\paragraphitemstrue
- \packitems},
- \v!aansluitend*=>{\getparameters[\??op#1]
- [\c!kopvoor=,\c!kopna=,
- \c!voor=,\c!tussen=,\c!na=]%
- \packitems},
- \v!aanelkaar*=>{\doassign[\??op#1][\c!factor=-1]},
- #2#3*\v!aanelkaar*=>{\doassign[\??op#1][\c!factor=-#2#3]},
- #2*\v!aanelkaar*=>{\doassign[\??op#1][\c!factor=-#2]},
- \v!afsluiter*=>{\doassign[\??op#1][\c!plaatsafsluiter=\v!ja]},
- \v!standaard*=>{\getparameters[\??op#1]
- [\c!breedte=1.5em,
- \c!factor=0,
- \c!afstand=.5em,
- \c!kopvoor=,
- \c!kopna=\blanko,
- \c!voor=\blanko,
- \c!tussen=\blanko,
- \c!na=\blanko,
- \c!binnen=]}]}
-
-\def\dostelopsomminginconstant[#1][#2]%
- {\def\dodostelopsomminginconstant##1%
- {\dododostelopsomminginconstant[#1][##1*]}%
-% \processcommalist[#2]\dodostelopsomminginconstant}
- \processcommacommand[#2]\dodostelopsomminginconstant} % expansion of #2 is handy for xml
-
-\def\dodododostelopsommingin[#1][#2]%
- {\ConvertToConstant\doifinstringelse{=}{#2}
- {\dostelopsomminginvariable[#1][#2]}
- {\setvalue{\??op#1}{\dostelopsomminginconstant[#1][#2]}}}%
-
-\def\dododostelopsommingin[#1][#2]%
+ \v!alinea*=>\paragraphitemstrue
+ \packitems,
+ \v!aansluitend*=>\dosetuppackeditemgroup{#1}%
+ \packitems,
+ \v!aanelkaar*=>\setitemparameter{#1}\c!factor{-1},
+ #2#3*\v!aanelkaar*=>\setitemparameter{#1}\c!factor{-#2#3},
+ #2*\v!aanelkaar*=>\setitemparameter{#1}\c!factor{-#2},
+ \v!afsluiter*=>\setitemparameter{#1}\c!plaatsafsluiter\v!ja,
+ \v!vanelkaar*=>\packeditemsfalse,
+ \v!standaard*=>\dosetupstandarditemgroup{#1}]}
+
+\def\dosetupstandarditemgroup#1%
+ {\getparameters
+ [\??op\currentitemgroup#1]
+ [\c!breedte=1.5em,
+ \c!factor=0,
+ \c!afstand=.5em,
+ \c!kopvoor=,
+ \c!kopna=\blanko,
+ \c!voor=\blanko,
+ \c!tussen=\blanko,
+ \c!na=\blanko,
+ \c!binnen=]}
+
+\def\dosetuppackeditemgroup#1%
+ {\letitemparameter{#1}\c!kopvoor\empty
+ \letitemparameter{#1}\c!kopna \empty
+ \letitemparameter{#1}\c!voor \empty
+ \letitemparameter{#1}\c!na \empty
+ \letitemparameter{#1}\c!tussen \empty}
+
+\def\dosetupitemgroupconstant[#1][#2]%
+ {\def\dodosetupitemgroupconstant##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}\empty{\dosetupitemgroupconstant[#1][#2]}}}%
+
+\def\dodododosetupitemgroup[#1][#2]%
{\ConvertToConstant\doifnot{#2}{}
- {\doifelse{#1}{\v!elk}
- {\dorecurse{\maxitemlevel}{\ExpandFirstAfter\dodododostelopsommingin[\recurselevel][#2]}}
- {\ExpandFirstAfter\dodododostelopsommingin[#1][#2]}}}
+ {\doifelse{#1}\v!elk
+ {\dorecurse\maxitemlevel{\ExpandFirstAfter\dododododosetupitemgroup[\recurselevel][#2]}}
+ {\ExpandFirstAfter\dododododosetupitemgroup[#1][#2]}}}
-\def\dodostelopsommingin[#1][#2]%
+\def\dododosetupitemgroup[#1][#2]%
{\ConvertToConstant\doifelse{#2}{}
- {\ifnum\itemlevel=0\relax
- \dododostelopsommingin[\v!elk][#1]%
+ {\ifcase\itemlevel\relax
+ \dodododosetupitemgroup[\v!elk][#1]%
\else
- \dododostelopsommingin[\itemlevel][#1]%
+ \dodododosetupitemgroup[\itemlevel][#1]%
\fi}
{\doifelsenothing{#1}
- {\dododostelopsommingin[\itemlevel][#2]}
- {\dododostelopsommingin[#1][#2]}}}
-
-\def\dostelopsommingin[#1][#2][#3]%
- {\dodostelopsommingin[#1][#2]%
- \ConvertToConstant\doifnot{#3}{} % anders wordt #2 overruled
- {\dodostelopsommingin[#1][#3]}}
-
-\def\stelopsommingin%
- {\dotripleempty\dostelopsommingin}
-
-%\def\doadvanceitem%
-% {\ifsubsom\else\ifsymsom\else
-% \pluscounter{\s!itemcount\itemlevel}%
-% \fi\fi}
-
-\def\doadvanceitem%
- {\ifsubsom\else\ifsymsom\else
- \scratchcounter=0\getvalue{\??op\itemlevel\c!start}\relax
- \ifcase\scratchcounter
- \pluscounter{\s!itemcount\itemlevel}%
- \else
- \setcounter{\s!itemcount1}{\scratchcounter}%
- \setvalue{\??op\itemlevel\c!start}{0}%
- \fi
+ {\dodododosetupitemgroup[\itemlevel][#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\docommando##1{\dodosetupitemgroup[##1][#2][#3][#4]}%
+ \processcommalist[#1]\docommando}
+
+\def\setupitemgroup
+ {\doquadrupleempty\dosetupitemgroup}
+
+\def\doadvanceitem
+ {\ifsubitem\else\ifsymbolitem\else
+ \pluscounter{\@@itemcounter\itemlevel}%
\fi\fi}
+% \def\setitemlevel#1%
+% {\ifnum\itemlevel>0\relax
+% \firstlisttrue
+% \doifnotinset\v!verder{#1}
+% {\resetcounter{\@@itemcounter\itemlevel}}%
+% \def\tempnumber%
+% {\countervalue{\@@itemcounter\itemlevel}}%
+% \doifelse{\getitemparameter\itemlevel\c!plaatsafsluiter}\v!ja
+% {\def\tempsymbol{\getitemparameter\itemlevel\c!afsluiter}}
+% {\let\tempsymbol\empty}%
+% \fi}
+
\def\setitemlevel#1%
{\ifnum\itemlevel>0\relax
\firstlisttrue
- \doifnotinset{\v!verder}{#1}
- {\resetcounter{\s!itemcount\itemlevel}}%
+ \doifnotinset\v!verder{#1}
+ {\doifinset{0}{#1}{\setitemparameter\itemlevel\c!start{0}}%
+ \doifsomething{\getitemparameter\itemlevel\c!start}
+ {\setcounter{\@@itemcounter\itemlevel}{\getitemparameter\itemlevel\c!start}%
+ \minuscounter{\@@itemcounter\itemlevel}%
+ \letitemparameter\itemlevel\c!start\empty}}%
\def\tempnumber%
- {\countervalue{\s!itemcount\itemlevel}}%
- \doifelsevalue{\??op\itemlevel\c!plaatsafsluiter}{\v!ja}
- {\def\tempsymbool{\getvalue{\??op\itemlevel\c!afsluiter}}}
- {\def\tempsymbool{}}%
- \fi}
+ {\countervalue{\@@itemcounter\itemlevel}}%
+ \doifelse{\getitemparameter\itemlevel\c!plaatsafsluiter}\v!ja
+ {\def\tempsymbol{\getitemparameter\itemlevel\c!afsluiter}}
+ {\let\tempsymbol\empty}%
+ \fi}
% PAS OP: ook 'opelkaar' en zo worden getest, nog eens afvangen!
+\def\unknownitemsymbol{?}
+
\def\setitemmark#1% % en pas op: resets \docommando
- {\doifsymboldefinedelse{#1}
- {\setxvalue{\??op\c!symbool\s!global\itemlevel}{#1}%
- \setgvalue{\??op\c!symbool\s!local\itemlevel}{?}%
- \def\listitem{\symbol[#1]}%
+ {\doifelsenothing{#1}
+ {\edef\currentitemsymbol{\itemlevel}}
+ {\edef\currentitemsymbol{#1}}%
+ \doifsymboldefinedelse\currentitemsymbol
+ {\setxvalue{\@@globalitemsymbol\itemlevel}{\currentitemsymbol}%
+ \setgvalue{\@@localitemsymbol \itemlevel}{\unknownitemsymbol}%
+ \def\listitem{\symbol[\currentitemsymbol]}%
\let\docommando\gobbleoneargument}
- {\doifconversiondefinedelse{#1}
- {\setxvalue{\??op\c!symbool\s!global\itemlevel}{#1}%
- \setgvalue{\??op\c!symbool\s!local\itemlevel}%
- {\convertnumber{#1}{\countervalue{\s!itemcount\itemlevel}}}%
+ {\doifconversiondefinedelse\currentitemsymbol
+ {\setxvalue{\@@globalitemsymbol\itemlevel}{\currentitemsymbol}%
+ \setgvalue{\@@localitemsymbol \itemlevel}%
+ {\convertnumber{\currentitemsymbol}{\countervalue{\@@itemcounter\itemlevel}}}%
+ \iftextitems
+ \doifsomething{\getitemparameter\itemlevel\c!linkertekst}
+ {\let\tempsymbol\empty}%
+ \fi
\def\listitem%
- {\getvalue{\??op\itemlevel\c!links}% new
- \getvalue{\??op\c!symbool\s!local\itemlevel}\tempsymbool
- \getvalue{\??op\itemlevel\c!rechts}}% new
+ {\getitemparameter\itemlevel
+ {\iftextitems\c!linkertekst\else\c!links\fi}%
+ \getvalue{\@@localitemsymbol\itemlevel}\tempsymbol
+ \getitemparameter\itemlevel
+ {\iftextitems\c!rechtertekst\else\c!rechts\fi}}%
\let\docommando\gobbleoneargument}
{\let\listitem\empty}}}
-%\def\calculatelistwidth#1#2%
-% {#2=\getvalue{\??op#1\c!afstand}\relax
-% \multiply#2 by \getvalue{\??op#1\c!factor}\relax
-% \advance#2 by \getvalue{\??op#1\c!breedte}\relax}
-
\def\calculatelistwidth#1#2%
- {#2=\getvalue{\??op#1\c!afstand}\relax
- \ifnum\getvalue{\??op#1\c!factor}>0
- \ifdim#2=\!!zeropoint #2=.5em\fi
+ {#2=\getitemparameter{#1}\c!afstand\relax
+ \ifnum\getitemparameter{#1}\c!factor>0
+ \ifdim#2=\zeropoint #2=.5em\fi
\fi
- \multiply#2 by \getvalue{\??op#1\c!factor}\relax
- \advance#2 by \getvalue{\??op#1\c!breedte}\relax}
+ \multiply#2 \getitemparameter{#1}\c!factor
+ \advance #2 \getitemparameter{#1}\c!breedte\relax}
-% The next conditionals deal with \item \startitemize. It
-% looks like a hack to skip back, but that way we preserve
-% the indentation and bullet placement. It's a rather
-% untested feature.
+% 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\dodostartopsomming[#1][#2]%
-% {\setfalse\inlinelistitem % new, no indent (leftskip)
-% \setfalse\concatnextitem % new, concat
-% \ifhmode
-% \ifconditional\autoconcatnextitem % new, concat
-% \ifdim\lastskip=\itemsignal % new, concat
-% \settrue\concatnextitem % new, concat
-% \fi % new, concat
-% \fi % new, concat
-% \par
-% \fi
-% \ifnum\itemlevel=\maxitemlevel\relax
-% \showmessage{\m!layouts}{9}{\maxitemlevel}%
-% \def\itemincrement{0}%
-% \else
-% \def\itemincrement{1}%
-% \fi
-% \doglobal\increment(\itemlevel,\itemincrement)%
-% \begingroup
-% \ifnum\itemlevel=1 % NIEUW
-% \doadaptleftskip{\getvalue{\??op1\c!marge}}%
-% \dosetraggedcommand{\@@oouitlijnen}\raggedcommand
-% \fi
-% \dosetraggedcommand{\getvalue{\??op\itemlevel\c!uitlijnen}}\raggedcommand
-% \doifvaluesomething{\??op\itemlevel\c!inspringen}
-% {\expanded{\stelinspringenin[\getvalue{\??op\itemlevel\c!inspringen}]}}%
-% \doifinset{\v!kolommen}{#1}%
-% {\ifbinnenkolommen\else\ifnum\itemcolumndepth=0
-% \global\let\itemcolumndepth\itemlevel
-% \getvalue{\??op\itemlevel\c!voor}%
-% \processfirstactioninset
-% [#1]
-% [ \v!een=>\!!counta=1\relax,
-% \v!twee=>\!!counta=2\relax,
-% \v!drie=>\!!counta=3\relax,
-% \v!vier=>\!!counta=4\relax,
-% \v!vijf=>\!!counta=5\relax,
-% \s!unknown=>\@EA\!!counta\getvalue{\??op\itemlevel\c!n}]%
-% \startkolommen
-% [\c!n=\!!counta, % netter \??op\itemlevel\c!n
-% \c!hoogte=,
-% \c!lijn=\v!uit,
-% \c!balanceren=\v!ja,
-% \c!uitlijnen=\v!nee]%
-% \fi\fi}%
-% \doifinsetelse{\v!intro}{#1}
-% {\somintrotrue}
-% {\somintrofalse}%
-% \doglobal\increment\noflists
-% \let\currentlist=\noflists
-% \newcounter\noflistelements
-% \kopsomfalse
-% \subsomfalse
-% \symsomfalse
-% \let\marsymbol=\relax
-% \global\let\somdestination=\empty
-% \def\symsymbol{}%
-% \def\som%
-% {\dosom}%
-% \def\but[##1]%
-% {\gdef\somdestination{##1}%
-% \dosom}%
-% \def\nop%
-% {\sym{\strut}\strut}%
-% \definecomplexorsimple\its
-% \setvalue{\v!mar}##1%
-% {\def\marsymbol%
-% {\llap
-% {\doattributes{\??op\itemlevel}\c!marletter\c!markleur{##1}%
-% \hskip\leftskip\hskip\linkermargeafstand}}%
-% \dosom}%
-% \setvalue{\v!kop}%
-% {\kopsomtrue\dokop}%
-% \setvalue{\v!sub}%
-% {\subsomtrue\dosom}%
-% \setvalue{\v!sym}##1%
-% {\def\symsymbol%
-% {\doattributes{\??op\itemlevel}\c!symletter\c!symkleur{##1}}%
-% \symsomtrue
-% \dosom}%
-% % \setvalue{\v!its}%
-% % {\getvalue{\v!sym}%
-% % {\calculatelistwidth{\itemlevel}{\dimen0}%
-% % \hbox to \dimen0
-% % {\dorecurse{\getvalue{\??op\itemlevel\c!items}}
-% % {\listitem\hss}%
-% % \unskip
-% % \hskip\getvalue{\??op\itemlevel\c!afstand}}}}%
-% \setvalue{\v!its}%
-% {\getvalue{\v!ran}%
-% {\dorecurse{\getvalue{\??op\itemlevel\c!items}}{\listitem\hss}%
-% \unskip}}%
-% \setvalue{\v!ran}##1%
-% {\getvalue{\v!sym}%
-% {\calculatelistwidth{\itemlevel}{\dimen0}%
-% \hbox to \dimen0
-% {##1\hskip\getvalue{\??op\itemlevel\c!afstand}}}}%
-% \setitemlevel{#1}%
-% \getvalue{\??op\itemlevel}%
-% \doifelsenothing{#1} % iffirstargument
-% {\edef\@@opsymbool{\getvalue{\??op\itemlevel\c!symbool}}%
-% \setgvalue{\??op\c!symbool\s!global\itemlevel}{}%
-% \setgvalue{\??op\v!verder\itemlevel}{}%
-% \setitemmark{\@@opsymbool}%
-% \dostelopsomminginvariable[\itemlevel][#2]}
-% {\dostelopsomminginconstant[\itemlevel][#1]%
-% \dostelopsomminginvariable[\itemlevel][#2]%
-% \doifinsetelse{\v!verder}{#1}% \noexpand, else problems in non-etex with chinese
-% %{\edef\@@opsymbool{\getvalue{\??op\c!symbool\s!global\itemlevel}}%
-% {\edef\@@opsymbool{\noexpand\getvalue{\??op\c!symbool\s!global\itemlevel}}%
-% \getvalue{\??op\v!verder\itemlevel}}
-% %{\edef\@@opsymbool{\getvalue{\??op\itemlevel\c!symbool}}%
-% {\edef\@@opsymbool{\noexpand\getvalue{\??op\itemlevel\c!symbool}}%
-% \setgvalue{\??op\v!verder\itemlevel}%
-% {\dostelopsomminginconstant[\itemlevel][#1]%
-% \dostelopsomminginvariable[\itemlevel][#2]}}%
-% \def\docommando{\setitemmark}% \setitemmark resets \docommando
-% \processcommalist[#1,\@@opsymbool]\docommando}%
-% \ifsomautointro\ifnum\prevgraf<3
-% \somintrotrue
-% \fi\fi
-% \ifparagraphitems
-% \ifnum\itemlevel>1 \doassign[\??op\itemlevel][\c!tussen=]\fi
-% \else\ifpackeditems
-% \doassign[\??op\itemlevel][\c!tussen=]%
-% \fi\fi
-% \calculatelistwidth{\itemlevel}{\dimen0}%
-% \ifdim\dimen0>\!!zeropoint\relax
-% \ifconditional\inlinelistitem\else
-% \advance\leftskip by \dimen0\relax
-% \fi
-% \fi}
-
-\def\dodostartopsomming[#1][#2]%
+\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\dodostartitemgroup[#1][#2]%
{\setfalse\inlinelistitem % new, no indent (leftskip)
\setfalse\concatnextitem % new, concat
- \ifhmode
- \ifconditional\autoconcatnextitem % new, concat
- \ifdim\lastskip=\itemsignal % new, concat
- \settrue\concatnextitem % new, concat
- \fi % new, concat
- \fi % new, concat
- \par
+ \ifhmode
+ \ifconditional\autoconcatnextitem % new, concat
+ \ifdim\lastskip=\itemsignal % new, concat
+ \settrue\concatnextitem % new, concat
+ \fi % new, concat
+ \fi % new, concat
+ \iftextitems\else\doifnotinset\v!tekst{#1}\par\fi % suboptimal
\fi
\ifnum\itemlevel=\maxitemlevel\relax
- \showmessage{\m!layouts}{9}{\maxitemlevel}%
+ \showmessage\m!layouts9\maxitemlevel
\def\itemincrement{0}%
\else
\def\itemincrement{1}%
\fi
\doglobal\increment(\itemlevel,\itemincrement)%
+ \initializeitemgrouplevel\itemlevel % safeguard
\begingroup
\ifnum\itemlevel=1 % NIEUW
- \doadaptleftskip{\getvalue{\??op1\c!marge}}%
-% \dosetraggedcommand{\@@oouitlijnen}\raggedcommand
+ \doadaptleftskip{\getitemparameter1\c!marge}%
\fi
- \dosetraggedcommand{\getvalue{\??op\itemlevel\c!uitlijnen}}\raggedcommand
- \doifvaluesomething{\??op\itemlevel\c!inspringen}
- {\expanded{\stelinspringenin[\getvalue{\??op\itemlevel\c!inspringen}]}}%
- \doifinset{\v!kolommen}{#1}%
+ \dosetraggedcommand{\getitemparameter\itemlevel\c!uitlijnen}\raggedcommand
+ \doifsomething{\getitemparameter\itemlevel\c!inspringen}
+ {\expanded{\stelinspringenin[\getitemparameter\itemlevel\c!inspringen]}}%
+ \doifinset\v!kolommen{#1}%
{\ifbinnenkolommen\else\ifnum\itemcolumndepth=0
\global\let\itemcolumndepth\itemlevel
- \getvalue{\??op\itemlevel\c!voor}%
+ \getitemparameter\itemlevel\c!voor
\processfirstactioninset
[#1]
[ \v!een=>\!!counta=1\relax,
@@ -438,234 +372,250 @@
\v!drie=>\!!counta=3\relax,
\v!vier=>\!!counta=4\relax,
\v!vijf=>\!!counta=5\relax,
- \s!unknown=>\@EA\!!counta\getvalue{\??op\itemlevel\c!n}]%
-% new
-\edef\columneditemleftskip{\the\leftskip}%
-\def\postprocesscolumnbox##1%
- {\scratchdimen=\columneditemleftskip
- \divide\scratchdimen by \nofcolumns
- \hbox{\hskip\columneditemleftskip\hbox{\box##1}}}%
-\scratchdimen=-\columneditemleftskip
-\multiply\scratchdimen by \nofcolumns
-\advance\scratchdimen by \columneditemleftskip
-\advance\scratchdimen by \hsize
-\edef\columntextwidth{\the\scratchdimen}%
-\leftskip\!!zeropoint
-% so far
+ \s!unknown=>\@EA\!!counta\getitemparameter\itemlevel\c!n]%
+ % new
+ \edef\columneditemleftskip{\the\leftskip}%
+ \def\postprocesscolumnbox##1%
+ {\scratchdimen=\columneditemleftskip
+ \divide\scratchdimen \nofcolumns
+ \hbox{\hskip\columneditemleftskip\hbox{\box##1}}}%
+ \scratchdimen=-\columneditemleftskip
+ \multiply\scratchdimen \nofcolumns
+ \advance\scratchdimen \columneditemleftskip
+ \advance\scratchdimen \hsize
+ \edef\columntextwidth{\the\scratchdimen}%
+ \leftskip\zeropoint
+ % so far
\startkolommen
- [\c!n=\!!counta, % netter \??op\itemlevel\c!n
+ [\c!n=\!!counta, % netter \??op\itemlevel\c!n
\c!hoogte=,
\c!lijn=\v!uit,
\c!balanceren=\v!ja,
\c!uitlijnen=\v!nee]%
\fi\fi}%
- \doifinsetelse{\v!intro}{#1}
- {\somintrotrue}
- {\somintrofalse}%
+ \doifinsetelse\v!intro{#1}\itemintrotrue\itemintrofalse
\doglobal\increment\noflists
- \let\currentlist=\noflists
+ \let\currentlist\noflists
\newcounter\noflistelements
- \kopsomfalse
- \subsomfalse
- \symsomfalse
- \let\marsymbol=\relax
- \global\let\somdestination=\empty
- \def\symsymbol{}%
- \def\som%
- {\dosom}%
- \def\but[##1]%
- {\gdef\somdestination{##1}%
- \dosom}%
- \def\nop%
- {\sym{\strut}\strut}%
- \definecomplexorsimple\its
- \setvalue{\v!mar}##1%
- {\def\marsymbol%
- {\llap
- {\doattributes{\??op\itemlevel}\c!marletter\c!markleur{##1}%
- \hskip\leftskip\hskip\linkermargeafstand}}%
- \dosom}%
- \setvalue{\v!kop}%
- {\kopsomtrue\dokop}%
- \setvalue{\v!sub}%
- {\subsomtrue\dosom}%
- \setvalue{\v!sym}##1%
- {\def\symsymbol%
- {\doattributes{\??op\itemlevel}\c!symletter\c!symkleur{##1}}%
- \symsomtrue
- \dosom}%
-% \setvalue{\v!its}%
-% {\getvalue{\v!sym}%
-% {\calculatelistwidth{\itemlevel}{\dimen0}%
-% \hbox to \dimen0
-% {\dorecurse{\getvalue{\??op\itemlevel\c!items}}
-% {\listitem\hss}%
-% \unskip
-% \hskip\getvalue{\??op\itemlevel\c!afstand}}}}%
- \setvalue{\v!its}%
- {\getvalue{\v!ran}%
- {\dorecurse{\getvalue{\??op\itemlevel\c!items}}{\listitem\hss}%
- \unskip}}%
- \setvalue{\v!ran}##1%
- {\getvalue{\v!sym}%
- {\calculatelistwidth{\itemlevel}{\dimen0}%
- \hbox to \dimen0
- {##1\hskip\getvalue{\??op\itemlevel\c!afstand}}}}%
+ \headitemfalse
+ \subitemfalse
+ \symbolitemfalse
+ \let\marsymbol\relax
+ \global\let\somdestination\empty
+ \let\symsymbol\empty
+ \the\itemgroupcommands
\setitemlevel{#1}%
- \getvalue{\??op\itemlevel}%
+ \getitemparameter\itemlevel\empty
\doifelsenothing{#1} % iffirstargument
- {\edef\@@opsymbool{\getvalue{\??op\itemlevel\c!symbool}}%
- \setgvalue{\??op\c!symbool\s!global\itemlevel}{}%
- \setgvalue{\??op\v!verder\itemlevel}{}%
- \setitemmark{\@@opsymbool}%
- \dostelopsomminginvariable[\itemlevel][#2]}
- {\dostelopsomminginconstant[\itemlevel][#1]%
- \dostelopsomminginvariable[\itemlevel][#2]%
- \doifinsetelse{\v!verder}{#1}% \noexpand, else problems in non-etex with chinese
- %{\edef\@@opsymbool{\getvalue{\??op\c!symbool\s!global\itemlevel}}%
- {\edef\@@opsymbool{\noexpand\getvalue{\??op\c!symbool\s!global\itemlevel}}%
- \getvalue{\??op\v!verder\itemlevel}}
- %{\edef\@@opsymbool{\getvalue{\??op\itemlevel\c!symbool}}%
- {\edef\@@opsymbool{\noexpand\getvalue{\??op\itemlevel\c!symbool}}%
- \setgvalue{\??op\v!verder\itemlevel}%
- {\dostelopsomminginconstant[\itemlevel][#1]%
- \dostelopsomminginvariable[\itemlevel][#2]}}%
- \def\docommando{\setitemmark}% \setitemmark resets \docommando
+ {\edef\@@opsymbool{\getitemparameter\itemlevel\c!symbool}%
+ \global\letvalue{\@@globalitemsymbol\itemlevel}\empty
+ \global\letitemparameter\itemlevel\v!verder\empty
+ \setitemmark\@@opsymbool
+ \dosetupitemgroupvariable[\itemlevel][#2]}
+ {\dosetupitemgroupconstant[\itemlevel][#1]%
+ \dosetupitemgroupvariable[\itemlevel][#2]%
+ \doifinsetelse\v!verder{#1}% \noexpand, else problems in non-etex with chinese
+ {\edef\@@opsymbool{\noexpand\getvalue{\@@globalitemsymbol\itemlevel}}%
+ \getitemparameter\itemlevel\v!verder}
+ {\edef\@@opsymbool{\noexpand\getitemparameter{\itemlevel}{\c!symbool}}%
+ \global\setitemparameter\itemlevel\v!verder
+ {\dosetupitemgroupconstant[\itemlevel][#1]%
+ \dosetupitemgroupvariable[\itemlevel][#2]}}%
+ \def\docommando##1% \setitemmark resets \docommando
+ {\doifnot{##1}{0}{\setitemmark{##1}}}%
\processcommalist[#1,\@@opsymbool]\docommando}%
- \ifsomautointro\ifnum\prevgraf<3
- \somintrotrue
+ \ifautoitemintro\ifnum\prevgraf<3
+ \itemintrotrue
\fi\fi
- \ifparagraphitems
- \ifnum\itemlevel>1 \doassign[\??op\itemlevel][\c!tussen=]\fi
- \else\ifpackeditems
- \doassign[\??op\itemlevel][\c!tussen=]%
+ \ifparagraphitems
+ \ifnum\itemlevel>1
+ \letitemparameter\itemlevel\c!tussen\empty
+ \fi
+ \else\ifpackeditems
+ \letitemparameter\itemlevel\c!tussen\empty
\fi\fi
- \calculatelistwidth{\itemlevel}{\dimen0}%
- \ifdim\dimen0>\!!zeropoint\relax
-\ifconditional\inlinelistitem\else
- \advance\leftskip by \dimen0\relax
-\fi
+ \calculatelistwidth\itemlevel{\dimen0}%
+ \ifdim\dimen0>\zeropoint\relax
+ \ifconditional\inlinelistitem\else
+ \advance\leftskip \dimen0\relax
+ \fi
\fi}
-\def\dostartopsomming[#1][#2]%
- {\ifsecondargument
- \dodostartopsomming[#1][#2]%
+\def\stopitemgroup
+ {\iftextitems
+ \removeunwantedspaces\space\ignorespaces
\else
- \doifassignmentelse{#1}
- {\dodostartopsomming[][#1]}
- {\dodostartopsomming[#1][]}%
- \fi}
-
-\def\startopsomming%
- {\bgroup
- \dodoubleempty\dostartopsomming}
-
-\def\stopopsomming%
- {\par
+ \par
+ \fi
\ifnum\itemcolumndepth=0 \dolistreference \fi % beware !
\iffirstlist \else \endgroup \fi % toegevoegd, eerste \som opent groep
\ifnum\itemcolumndepth=\itemlevel\relax
\stopkolommen
\doglobal\newcounter\itemcolumndepth
- \getvalue{\??op\itemlevel\c!na}%
+ \getitemparameter\itemlevel\c!na
\else
\ifnum\itemlevel=1
- \dosomebreak\allowbreak % toegevoegd
- \getvalue{\??op1\c!na}%
- \doif{\@@oospringvolgendein}{\v!nee}{\noindentation}%
+ \doitembreak\allowbreak % toegevoegd
+ \getitemparameter1\c!na
+ \doif\@@oospringvolgendein\v!nee\noindentation
\fi
\fi
\endgroup
\doglobal\decrement(\itemlevel,\itemincrement)%
\egroup}
+
+\newtoks\itemgroupcommands
+
+\def\itemgroupitem
+ {\doitemgroupitem}
+
+\def\itemgroupbutton[#1]%
+ {\gdef\somdestination{#1}%
+ \itemgroupitem}
+
+\def\itemgroupdummy
+ {\itemgroupsymbol{\strut}\strut}
+
+\def\itemgroupsubitem
+ {\subitemtrue\itemgroupitem}
+
+\def\itemgroupsymbol#1%
+ {\def\symsymbol{\doitemattributes\itemlevel\c!symletter\c!symkleur{#1}}%
+ \symbolitemtrue
+ \itemgroupitem}
+
+\def\itemgroupedge#1%
+ {\itemgroupsymbol
+ {\calculatelistwidth\itemlevel{\dimen0}%
+ \hbox to \dimen0
+ {#1\hskip\getitemparameter\itemlevel\c!afstand}}}
+
+\def\itemgrouphead
+ {\headitemtrue\doitemgrouphead}
+
+\def\itemgroupitems
+ {\dosingleempty\doitemgroupitems}
+
+\def\doitemgroupitems[#1]%
+ {\itemgroupedge
+ {\dorecurse{0\getitemparameter\itemlevel\c!items}{\listitem\hss}%
+ \unskip}}
+
+\def\itemgroupmargin#1%
+ {\def\marsymbol%
+ {\llap
+ {\doitemattributes\itemlevel\c!marletter\c!markleur{#1}%
+ \hskip\leftskip\hskip\linkermargeafstand}}%
+ \itemgroupitem}
+
+\appendtoks \let\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!kop \itemgrouphead \to \itemgroupcommands
+\appendtoks \letvalue\v!its \itemgroupitems \to \itemgroupcommands
+\appendtoks \letvalue\v!mar \itemgroupmargin \to \itemgroupcommands
+
+\def\itembreak % -10
+ {\flushfootnotes\penalty-5\relax}
-\def\sombreak%
- {\flushfootnotes\penalty-5\relax} % -10
-
-\def\somnobreak%
- {\flushfootnotes\penalty+5\ifbinnenkolommen\else00\fi\relax} % +5
+\def\itemnobreak % +5
+ {\flushfootnotes\penalty+5\ifbinnenkolommen\else00\fi\relax}
-\def\dolistitem% evt aantal items opslaan per niveau, scheelt zoeken
- {\par
+\def\dolistitem % evt aantal items opslaan per niveau, scheelt zoeken
+ {\iftextitems
+ % begin of item
+ \else
+ \par
+ \fi
\ignorespaces
\increment\noflistelements
- \ifnum\itemcolumndepth=0\relax\ifoptimizeitems
- \ifnum\noflistelements=1 % tgv bv kolommen/nesting
- \findtwopassdata{\s!list}{\noflists:}% % wordt soms de volgorde
- \fi % verstoord, vandaar \find
+ \ifnum\itemcolumndepth=0 \ifoptimizeitems
+ \ifnum\noflistelements=1 % tgv bv kolommen/nesting
+ \findtwopassdata\s!list{\noflists:}% % wordt soms de volgorde
+ \fi % verstoord, vandaar \find
\iftwopassdatafound
\ifnum\twopassdata=3
\ifnum\noflistelements>1
- \dosomebreak\somnobreak
+ \doitembreak\itemnobreak
\fi
\else\ifnum\twopassdata>3
\ifnum\noflistelements=2
- \ifsomintro
- \dosomebreak\nobreak
+ \ifitemintro
+ \doitembreak\nobreak
\else
- \dosomebreak\somnobreak
+ \doitembreak\itemnobreak
\fi
\else\ifnum\twopassdata=\noflistelements\relax
- \dosomebreak\somnobreak
+ \doitembreak\itemnobreak
\else\ifnum\noflistelements>2
- \dosomebreak\sombreak
+ \doitembreak\itembreak
\else
- \ifsomintro\else\dosomebreak\sombreak\fi
+ \ifitemintro\else\doitembreak\itembreak\fi
\fi\fi\fi
\fi\fi
\fi
\fi\fi
\noindent
- \ifkopsom
- \setbox8=\hbox
- {\doattributes{\??op\itemlevel}\c!kopletter\c!kopkleur{\listitem}}%
- \else\ifsymsom
- \setbox8=\hbox{\symsymbol}%
- \else
- \setbox8=\hbox
- {\doattributes{\??op\itemlevel}\c!letter\c!kleur{\listitem}}%
- \fi\fi
- \doifsomething{\somdestination}
- %{\setbox8=\hbox{\naar{\copy8}[\somdestination]}}%
- {\setbox8=\hbox{\naar{\box8}[\somdestination]}}%
- \global\let\somdestination=\empty
- \dimen2=\getvalue{\??op\itemlevel\c!breedte}\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)
- \ifdim\dimen2<\!!zeropoint\relax
- \llap{\ifsubsom\llap{+}\fi\box8\hskip\linkermargeafstand}%
+ \setbox8=\hbox
+ {\ifheaditem
+ \doitemattributes\itemlevel\c!kopletter\c!kopkleur{\listitem}%
+ \else\ifsymbolitem
+ \symsymbol
+ \else
+ \doitemattributes\itemlevel\c!letter\c!kleur{\listitem}%
+ \fi\fi}%
+ \doifsomething\somdestination
+ {\setbox8=\hbox{\naar{\box8}[\somdestination]}}%
+ \global\let\somdestination\empty
+ \dimen2=\getitemparameter\itemlevel\c!breedte\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)
+ \ifdim\dimen2<\zeropoint\relax
+ \llap{\ifsubitem\llap{+}\fi\box8\hskip\linkermargeafstand}%
\else
- \ifdim\dimen2=\!!zeropoint\relax
+ \ifdim\dimen2=\zeropoint\relax
\calculatelistwidth{1}{\dimen0}%
\else
\calculatelistwidth{\itemlevel}{\dimen0}%
\fi
-\ifconditional\inlinelistitem
- \hbox to \dimen0{\ifsubsom\llap{+}\fi\box8\hfill}%
-\else
- \llap{\hbox to \dimen0{\ifsubsom\llap{+}\fi\box8\hfill}}%
-\fi
+ \iftextitems
+ \hbox{\ifsubitem+\fi\box8\hskip\fontdimen2\font}\nobreak
+ \else
+ \ifconditional\inlinelistitem
+ \hbox to \dimen0{\ifsubitem\llap{+}\fi\box8\hfill}%
+ \else
+ \llap{\hbox to \dimen0{\ifsubitem\llap{+}\fi\box8\hfill}}%
+ \fi
+ \fi
\fi
- \setevalue{\??op\c!symbool\itemlevel}%
- {\getvalue{\??op\c!symbool\s!local\itemlevel}}% still problems with \uchar ?
- %{\noexpand\getvalue{\??op\c!symbool\s!local\itemlevel}}% no, spoils subrefs
- \kopsomfalse
- \subsomfalse
- \symsomfalse
+ \setevalue{\@@currentitemsymbol\itemlevel}%
+ {\getvalue{\@@localitemsymbol\itemlevel}}% still problems with \uchar ?
+ %{\noexpand\getvalue{\@@localitemsymbol\itemlevel}}% no, spoils subrefs
+ \headitemfalse
+ \subitemfalse
+ \symbolitemfalse
\EveryPar{\ignorespaces}%
\ignorespaces}
-\def\complexdosom[#1]%
- {\par
+\def\complexdoitemgroupitem[#1]%
+ {\iftextitems
+ % begin of item
+ \else
+ \par
+ \fi
\ignorespaces
- \ifconditional\concatnextitem % new, concat
- \dosomebreak\nobreak % new, concat
- \fi % new, concat
+ \ifconditional\concatnextitem % new, concat
+ \doitembreak\nobreak % new, concat
+ \fi % new, concat
\doadvanceitem
\ifnum\itemcolumndepth=0\relax\ifnum\noflistelements>0\relax
- \dosomebreak\nobreak
+ \doitembreak\nobreak
\fi\fi
\iffirstlist
\firstlistfalse
@@ -673,96 +623,87 @@
\ifcase\itemlevel
\or % 1
\ifnum\itemcolumndepth=0\relax
- \ifsomintro\dosomebreak\nobreak\fi
- \getvalue{\??op1\c!voor}%
- \ifsomintro\dosomebreak\nobreak\fi
+ \ifitemintro\doitembreak\nobreak\fi
+ \getitemparameter1\c!voor
+ \ifitemintro\doitembreak\nobreak\fi
\fi
\else % 2 en hoger
\ifparagraphitems \else
\let\previtemlevel=\itemlevel
\decrement\previtemlevel
- \getvalue{\??op\previtemlevel\c!tussen}% = itemlevel-1
+ \getitemparameter\previtemlevel\c!tussen % = itemlevel-1
\fi
\fi
\else
- \itemuse\c!tussen
+ \getitemparameter\itemlevel\c!tussen
\fi
- \ifconditional\concatnextitem % new, concat
- \vskip-\lastskip % new, concat
- \vskip-\lineheight % new, concat
- \nobreak % new, concat
- \fi % new, concat
+ \ifconditional\concatnextitem % new, concat
+ \vskip-\lastskip % new, concat
+ \vskip-\lineheight % new, concat
+ \nobreak % new, concat
+ \fi % new, concat
\ignorespaces
\dolistitem
\ifpackeditems
\stelwitruimtein[\v!geen]%
\fi
- \itemuse\c!binnen
+ \getitemparameter\itemlevel\c!binnen
\marsymbol
- \let\marsymbol=\relax
+ \let\marsymbol\relax
\doifsomething{#1}
- {\doifnot{\itemreference}{?}
+ {\doifnot\itemreference\unknownitemreference
{\bgroup
\protectconversion
- \rawreference{\s!lst}{#1}{\itemreference}%
+ \rawreference\s!lst{#1}\itemreference
\egroup}}%
- \strut % added 11-08-99
- \setfalse\concatnextitem % new, concat
- \hskip\itemsignal % new, concat
+ \strut % added 11-08-99
+ \setfalse\concatnextitem % new, concat
+ \hskip\itemsignal % new, concat
\ignorespaces}
-\def\complexsom[#1]#2\par% todo: no two pass data
- {\startopsomming[#1]
- \complexdosom[]\ignorespaces\begstrut#2\unskip\endstrut\par
- \stopopsomming}
-
-\definecomplexorsimpleempty\som
-\definecomplexorsimpleempty\dosom
-
-% \def\complexdokop[#1]#2\par%
-% {\ifpackeditems\else\itemuse\c!kopvoor\fi
-% \dosomebreak{\pagina[\v!voorkeur]}% geen \goodbreak ! \allowbreak testen
-% \complexdosom[#1]{\doattributes{\??op\itemlevel}\c!kopletter\c!kopkleur
-% {\ignorespaces#2}}\par
-% \ifpackeditems\else\itemuse\c!kopna\fi
-% \dosomebreak\nobreak
-% \noindentation}
-
-\def\complexdokop[#1]#2\par% % beter in \complexdosom hangen met een if
- {\iffirstlist\else\dosomebreak\allowbreak\fi
- \ifpackeditems\else\itemuse\c!kopvoor\fi
- \iffirstlist\ifsomintro\else\ifcase\itemlevel % incr in \complexdosom
- %\dosomebreak{\pagina[\v!voorkeur]}% geen \goodbreak ! \allowbreak testen
- \dosomebreak\allowbreak
+\def\complexitem[#1]#2\par% todo: no two pass data
+ {\startitemgroup[#1]
+ \complexdoitemgroupitem[]\ignorespaces\begstrut#2\unskip\endstrut\par
+ \stopitemgroup}
+
+\definecomplexorsimpleempty\item
+\definecomplexorsimpleempty\doitemgroupitem
+
+\def\complexdoitemgrouphead[#1]#2\par% % beter in \complexdosom hangen met een if
+ {\iffirstlist\else\doitembreak\allowbreak\fi
+ \ifpackeditems\else\getitemparameter\itemlevel\c!kopvoor\fi
+ \iffirstlist\ifitemintro\else\ifcase\itemlevel % incr in \complexdosom
+ \doitembreak\allowbreak
\fi\fi\fi
- \complexdosom[#1]{\doattributes{\??op\itemlevel}\c!kopletter\c!kopkleur
- {\ignorespaces#2}}\par
- \dosomebreak\nobreak
- \ifpackeditems\else\itemuse\c!kopna\fi
- \dosomebreak\nobreak
+ \complexdoitemgroupitem[#1]{\doitemattributes\itemlevel\c!kopletter\c!kopkleur
+ {\ignorespaces#2}}%
+ \iftextitems
+ \removeunwantedspaces\space\ignorespaces
+ \else
+ \par
+ \fi
+ \doitembreak\nobreak
+ \ifpackeditems\else\getitemparameter\itemlevel\c!kopna\fi
+ \doitembreak\nobreak
\noindentation}
-\def\complexkop[#1]#2\par#3\par%
- {\startopsomming[#1]%
- \complexdokop[]\ignorespaces#2\par#3\par
- \stopopsomming}
+\def\complexhead[#1]#2\par#3\par
+ {\startitemgroup[#1]%
+ \complexdoitemgrouphead[]\ignorespaces#2\par#3\par
+ \stopitemgroup}
-\definecomplexorsimpleempty\kop
-\definecomplexorsimpleempty\dokop
+\definecomplexorsimpleempty\head
+\definecomplexorsimpleempty\doitemgrouphead
\def\sym#1%
{\noindent
- \setbox0=\hbox{#1}%
- \ifdim\wd0<1em\relax
- \setbox0=\hbox to 1.5em{#1\hfil}%
- \else
- \setbox0=\hbox spread 1em{#1\hfil}%
- \fi
- \hangindent=\wd0\relax
+ \setbox0\hbox{#1}%
+ \setbox0\hbox\ifdim\wd0<1em to 1.5\else spread 1\fi em{#1\hfil}%
+ \hangindent\wd0\relax
\box0
\ignorespaces}
-\stelopsommingenin % undocumented
+\setupitemgroups % undocumented
[\c!niveaus=6,
\c!marge=\!!zeropoint,
\c!springvolgendein=\v!ja,
@@ -770,7 +711,7 @@
\c!factor=0,
\c!afstand=.5em,
\c!uitlijnen=\v!normaal,
- \c!inspringen=, % untouched if empty
+ \c!inspringen=, % untouched if empty
\c!kleur=,
\c!letter=, % kan tzt weg
\c!marletter=\c!type, % \c! ???
@@ -789,6 +730,34 @@
\c!binnen=,
\c!n=2,
\c!items=4,
- \c!symbool=\itemlevel]
+ \c!linkertekst=(,
+ \c!rechtertekst=),
+ \c!start=1,
+ \c!symbool=\itemlevel] % \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!stel#1\e!in}{\setupitemgroup[#1]}%
+\getparameters[\??ig#1][\c!niveaus=3,#2]%
+\ifnum\getvalue{\??ig#1\c!niveaus}<\maxitemlevel\relax
+ \letvalue{\??ig#1\c!niveaus}\maxitemlevel
+\fi
+ \dorecurse{\getvalue{\??ig#1\c!niveaus}}{\initializeitemgrouplevel\recurselevel}%
+ \popmacro\currentitemgroup}}
+
+% efficient default itemize as well as upward compatible definition
+
+% \def\startitemize {\startitemgroup[]}
+% \def\stopitemize {\stopitemgroup}
+% \def\setupitemize {\setupitemgroup[]}
+
+\defineitemgroup [\e!itemize] [\c!niveaus=6]
-\protect \endinput
+\protect \endinput
diff --git a/tex/context/base/core-job.tex b/tex/context/base/core-job.tex
index c942e4f44..0e0b13532 100644
--- a/tex/context/base/core-job.tex
+++ b/tex/context/base/core-job.tex
@@ -218,8 +218,8 @@
\def\doexecutefileonce#1%
{\beforesplitstring#1\at.\to\currentfile
- \ExpandBothAfter\doifnotinset{\currentfile}{\loadedfiles}%
- {\ExpandFirstAfter\addtocommalist{\currentfile}\loadedfiles
+ \fullexpandtwoargsafter\doifnotinset{\currentfile}{\loadedfiles}%
+ {\fullexpandoneargafter\addtocommalist{\currentfile}\loadedfiles
\doexecutefile{#1}}}
\def\doexecutefile#1%
@@ -235,18 +235,18 @@
\def\omgeving #1 % at outermost level only
{\def\startomgeving ##1 {}%
- \let\stopomgeving=\relax
+ \let\stopomgeving\relax
\startreadingfile
\processfile{#1}% \readlocfile{#1}{}{}%
\stopreadingfile}
-\let\environment\omgeving % for the moment
+\def\environment{\omgeving} % for the moment, no \let !
\newcounter\filelevel
\def\!!donextlevel#1#2#3#4#5#6\\%
{\beforesplitstring#6\at.\to#1
- \ifnum\filelevel=0
+ \ifcase\filelevel\relax
\starttekst
\def\projekt ##1 {#2{##1}}%
\def\omgeving ##1 {#3{##1}}%
@@ -254,7 +254,7 @@
\def\onderdeel ##1 {#5{##1}}%
\fi
\increment\filelevel\relax
- \ExpandFirstAfter\addtocommalist{#1}\loadedfiles}
+ \fullexpandoneargafter\addtocommalist{#1}\loadedfiles}
\def\doprevlevel%
{\ifnum\filelevel=1
@@ -305,15 +305,15 @@
{\def\partialenvironments{}%
\def\docommando##1%
{\beforesplitstring##1\at.\to\someevironment
- \ExpandFirstAfter\addtocommalist{\someevironment}\partialenvironments}%
+ \fullexpandoneargafter\addtocommalist{\someevironment}\partialenvironments}%
\processcommalist[#1]\docommando
- \ExpandBothAfter\doifcommonelse
+ \fullexpandtwoargsafter\doifcommonelse % no longer next needed
{\currentproject,\currentproduct,
\currentcomponent,\currentenvironment}
{\partialenvironments}
- {\let\stopdeelomgeving=\relax
- \let\next=\relax}
- {\let\next=\skipdeelomgeving}%
+ {\let\stopdeelomgeving\relax
+ \let\next\relax}
+ {\let\next\skipdeelomgeving}%
\next}
\def\startproduct{\startprodukt}
diff --git a/tex/context/base/core-lst.tex b/tex/context/base/core-lst.tex
index dd399e460..03cd5bfbe 100644
--- a/tex/context/base/core-lst.tex
+++ b/tex/context/base/core-lst.tex
@@ -17,6 +17,8 @@
% \getlistlevel[hoofdstuk]\test{0} \test
+% can be made faster if needed
+
\def\getlistlevel[#1]#2#3% [list] \variable \default
{\doifdefinedelse{\??ko#1\c!sectie}
{\edef#2{\getvalue{\??ko#1\c!sectie}}%
@@ -160,7 +162,9 @@
\@@livariantb
-\def\dostellijstin[#1][#2]%
+\def\setlistparameter#1#2{\@EA\def\csname\??li#1#2\endcsname}
+
+\def\dostellijstin[#1][#2]% slow -)
{\def\docommando##1%
{\getparameters[\??li##1][#2]%
\preparepaginaprefix{\??li##1}}%
@@ -217,8 +221,11 @@
\v!deel\v!nummer=\v!ja, % nodig ? % v
\c!label=\v!nee,
\c!afstand=\!!zeropoint,
- \c!scheider=]%
- \ConvertToConstant\doifinstringelse{=}{#2}
+ \c!scheider=\@@koscheider,
+ \c!afsluiter=,
+ \c!expansie=]%
+% \ConvertToConstant\doifinstringelse{=}{#2}
+ \doifassignmentelse{#2}
{\getparameters[\??li#1][#2]}
{\ConvertToConstant\doifnot{#2}{}
{\copyparameters % interactie ?
@@ -261,14 +268,14 @@
\doendoflist
\dosetlistmode}
-\def\dosetlistmode%
+\def\dosetlistmode
{\iflijstgeplaatst
- \expandafter \enablemode
+ \setsystemmode \v!lijst
\else
- \expandafter \disablemode
- \fi [\systemmodeprefix\v!lijst]}
+ \resetsystemmode\v!lijst
+ \fi}
-\def\plaatslijst%
+\def\plaatslijst
{\dodoubleempty\doplaatslijst}
\def\dodovolledigelijst[#1][#2][#3]% enkelvoud, meervoud, instellingen
@@ -291,6 +298,12 @@
{#1=#3\relax}
{#1=#2\relax}}
+% \let\dohandlelistnumber\firstofoneargument
+%
+% can be anything, so no \expanded{\separatednumber{#1}} !
+
+\def\dohandlelistnumber#1{\separatednumber{#1}}
+
\def\dosetlistsymbol#1#2% kan sneller, default case afvangen
{\processaction
[\getvalue{\??li#1\c!symbool}]
@@ -300,19 +313,24 @@
1=>\def\listsymbol%
{\strut$\bullet$},
2=>\def\listsymbol%
- {\vrule\!!width1em\!!height1ex\!!depth\!!zeropoint},
+ {\vrule\!!width1em\!!height1ex\!!depth\zeropoint},
3=>\def\listsymbol% very slow
{{\doassigndimen{\dimen0}{\getvalue{\??li#1\c!breedte}}{1.5em}%
\doassigndimen{\dimen2}{\getvalue{\??li#1\c!hoogte}}{1ex}%
\doassigndimen{\dimen4}{\getvalue{\??li#1\c!diepte}}{0pt}%
\vrule\!!width\dimen0\!!height\dimen2\!!depth\dimen4}},
\s!unknown=>\def\listsymbol{\getvalue{\??li#1\c!symbool}},
- \s!default=>\doifelsevalue{\??li#1\c!prefix}{\v!nee}
- {\aftersplitstring#2\at.\to\splitlistsymbol}
- {\def\splitlistsymbol{#2}}% geen \edef ivm enz
+ \s!default=>\doifelsevalue{\??li#1\c!prefix}{\v!nee} % ook nog eerste
+ {\edef\splitlistsymbol{\removefirstprefix{#2}}}
+ {\doifelsevalue{\??li#1\c!prefix}{\v!geen}
+ {\edef\splitlistsymbol{\removeallprefixes{#2}}}%
+ {\def\splitlistsymbol{#2}}}% geen \edef ivm enz
\def\listsymbol% kan iets efficienter met \ifdone
{\doifvalue{\??li#1\c!label}{\v!ja}{\leftlabeltext{#1}}%
- \strut\splitlistsymbol\getvalue{\??li#1\c!scheider}%
+ \strut
+ \def\numberseparator{\getvalue{\??li#1\c!scheider}}%
+ \@EA\dohandlelistnumber\@EA{\splitlistsymbol}%
+ \getvalue{\??li#1\c!afsluiter}%
\doifvalue{\??li#1\c!label}{\v!ja}{\rightlabeltext{#1}}}]}
\def\@@dodolijstelement{dodolijstelement}
@@ -356,11 +374,11 @@
\def\dodolijstelement#1#2#3#4#5#6%
{\getvalue{\@@dodolijstelement\getvalue{\??li#1\c!variant}}%
%\showcomposition
- \let\@@iabreedte=\!!zeropoint % moet boolean worden
+ \let\@@iabreedte\!!zeropoint % moet boolean worden
\bgroup
\edef\lijstelementen%
{\getvalue{\??li#1\c!paginaovergangen}}%
- \ExpandSecondAfter\doifinset{#3}{\lijstelementen}%
+ \ExpandBothAfter\doifinset{#3}{\lijstelementen}%
{\showmessage{\m!systems}{14}{#3}%
\pagina}%
\egroup
@@ -372,7 +390,9 @@
\def\dolistattributes#1#2#3%
{\doifvaluesomething{\??li#1#3}
- {\setupinteraction[\c!kleur=,\c!contrastkleur=]}%
+ %{\setupinteraction[\c!kleur=,\c!contrastkleur=]}%
+ {\resetinteractionparameter\c!kleur
+ \resetinteractionparameter\c!contrastkleur}%
\doattributes{\??li#1}{#2}{#3}}
\def\dodocommandlijstelement#1#2#3#4#5#6%
@@ -430,17 +450,17 @@
\def\dodofixdlijstelementABC#1#2#3#4#5#6% weeden
{\endgraf
- \leftskip=\getvalue{\??li#1\c!marge}% na de \endgraf !
+ \leftskip\getvalue{\??li#1\c!marge}% na de \endgraf !
\getvalue{\??li#1\c!voor}%
- \!!widthc=\getvalue{\??li#1\c!afstand}%
+ \!!widthc\getvalue{\??li#1\c!afstand}%
\doifelsevalue{\??li#1\c!breedte}{\v!passend}
- {\!!widtha=\!!zeropoint}
+ {\!!widtha\zeropoint}
{\doifelsenothing{#3}
{\doifelsevalue{\??li#1\c!titeluitlijnen}{\v!ja}
- {\!!widtha=\!!zeropoint
- \!!widthc=\!!zeropoint}
- {\!!widtha=\getvalue{\??li#1\c!breedte}}}
- {\!!widtha=\getvalue{\??li#1\c!breedte}}}%
+ {\!!widtha\zeropoint
+ \!!widthc\zeropoint}
+ {\!!widtha\getvalue{\??li#1\c!breedte}}}
+ {\!!widtha\getvalue{\??li#1\c!breedte}}}%
\getvalue{\??li\c!variant\getvalue{\??li#1\c!variant}}%
\endgraf
\def\makelijstelement##1##2%
@@ -449,12 +469,12 @@
\linklisttoelement{#1}{#2}{#5}{#6}{\box0}}%{\copy0}}%
{\hbox{##2}}}%
\doifvalue{\??li#1\c!interactie}{\v!tekst} % not supported
- {\doassign[\??li#1][\c!interactie=\v!alles]}%
+ {\setlistparameter{#1}\c!interactie\v!alles}%
\makelijstelement\v!alles
{\hbox to \hsize
{\dostartattributes{\??li#1}\c!letter\c!kleur{}% new
- \!!widthb=\hsize
- \setbox2=\hbox \ifdim\!!widtha>\!!zeropoint to \!!widtha \fi
+ \!!widthb\hsize
+ \setbox2=\hbox \ifdim\!!widtha>\zeropoint to \!!widtha \fi
{\makelijstelement\v!sectienummer
{\dolistattributes{#1}\c!nummerletter\c!nummerkleur
{\getvalue{\??li#1\c!nummercommando}{\listsymbol}}%
@@ -462,7 +482,7 @@
\setbox4=\hbox
{\doifvalue{\??li#1\c!paginanummer}{\v!ja}
{\doifsomething{#5} % \lijstwidth is new ; temp hack
- {\hbox \ifdim\lijstwidth>\!!zeropoint to \lijstwidth\fi
+ {\hbox \ifdim\lijstwidth>\zeropoint to \lijstwidth\fi
{\hfill
\makelijstelement\v!paginanummer
{\dolistattributes{#1}\c!paginaletter\c!paginakleur
@@ -479,15 +499,15 @@
\ifvoid4
% we kunnen gewoon afbreken aan het eind
\else
- \ifdim\lijstskip>\!!zeropoint\relax
+ \ifdim\lijstskip>\zeropoint\relax
\rightskip=\lijstskip\!!plus10em\relax
\parfillskip=-\rightskip
\fi
\fi
\else
- \dimen2=\!!zeropoint
+ \dimen2=\zeropoint
\fi
- \parindent=\!!zeropoint\relax
+ \parindent\zeropoint\relax
\leavevmode
\box2\relax
\hskip\dimen2
@@ -496,6 +516,7 @@
{\let\\=\newlineinlist
\dontconvertfont
\getvalue{\??li#1\c!tekstcommando}{#4}}%
+%\carryoverpar % new otherwise wrong linespacing
\egroup
\ifvoid4
\ifdim\!!widtha<\hsize
@@ -526,9 +547,9 @@
\noindent\leavevmode % leavevmode ? ? ?
\fi
\doifvalue{\??li#1\c!interactie}{\v!tekst} % not supported
- {\doassign[\??li#1][\c!interactie=\v!sectienummer]}%
+ {\setlistparameter{#1}\c!interactie\v!sectienummer}%
\doifvalue{\??li#1\c!interactie}{\v!alles} % not supported
- {\doassign[\??li#1][\c!interactie=\v!sectienummer]}%
+ {\setlistparameter{#1}\c!interactie\v!sectienummer}%
\def\makelijstelement##1##2%
{\doifelsevalue{\??li#1\c!interactie}{##1}
{\setbox0=\hbox{\showcontrastlocation{\??ia}{#6}{##2}}%
@@ -626,9 +647,7 @@
\@EA\doschrijfnaarlijst\@EA{#1}{\firstlistelement}{#3}{\v!kop}}}
\def\dotussenlijst#1#2#3#4% pas op: wordt ook elders gedefinieerd
- {\doiftoclevelelse[#3]
- {#2}
- {}}
+ {\doiftoclevelelse[#3]{#2}{}}
\def\schrijftussenlijst[#1]#2%
{\@EA\doschrijftussenlijst\@EA{#1}{#2}} % #2 weg en \expanded
@@ -643,20 +662,22 @@
\def\utilitylistwidth {0pt}
\def\utilitylistheight {0pt}
+\def\dolijstelementX#1#2#3#4#5#6%
+ {\doiftoclevelelse[#5]
+ {\doglobal\increment\utilitylistlength
+ \hbox
+ {\doattributes
+ {\??li#1}\c!tekstletter\c!tekstkleur
+ {\let\\=\newlineinlist
+ \dontconvertfont
+ \getvalue{\??li#1\c!tekstcommando}{#4}}}%
+ \global\utilitydonetrue}
+ {}}
+
\def\dobepaallijstkenmerken[#1][#2]%
{\begingroup
\doglobal\newcounter\utilitylistlength
- \def\dolijstelement##1##2##3##4##5##6%
- {\doiftoclevelelse[##5]
- {\doglobal\increment\utilitylistlength
- \hbox
- {\doattributes
- {\??li##1}\c!tekstletter\c!tekstkleur
- {\let\\=\newlineinlist
- \dontconvertfont
- \getvalue{\??li##1\c!tekstcommando}{##4}}}%
- \global\utilitydonetrue}
- {}}%
+ \let\dolijstelement\dolijstelementX
\dostellijstin[#1][#2]%
\dogetcommalistelement1\from#1\to\commalistelement
\dosettoclevel{\getvalue{\??li\commalistelement\c!criterium}}%
@@ -817,7 +838,7 @@
\def\dostelsamengesteldelijstin[#1][#2]%
{\getparameters[\??ih#1][#2]%
- \ExpandFirstAfter\stellijstin[\getvalue{\??ih#1\c!lijst}][#2]}
+ \expanded{\stellijstin[\getvalue{\??ih#1\c!lijst}]}[#2]}
\def\stelsamengesteldelijstin%
{\dodoubleargument\dostelsamengesteldelijstin}
@@ -854,18 +875,18 @@
\getparameters[\??ih#1][#2]%
\dosettoclevel{\getvalue{\??ih#1\c!criterium}}%
\edef\samengesteldelijst{\getvalue{\??ih#1\c!lijst}}%
- \stripspaces\from\samengesteldelijst\to\samengesteldelijst
+ %\stripspaces\from\samengesteldelijst\to\samengesteldelijst
\doifelsevalue{\??ih#1\c!niveau}{\v!huidige} % criterium=vorige,niveau=huidige
{\!!counta=0\@@koniveau} % hm: \@@koniveau
- {\ExpandFirstAfter\doifnumberelse{\getvalue{\??ih#1\c!niveau}}% in verband
+ {\fullexpandoneargafter\doifnumberelse{\getvalue{\??ih#1\c!niveau}}% in verband
{\!!counta=\getvalue{\??ih#1\c!niveau}% met de vorige implementatie
\advance\!!counta by 1 % accepteren we ook nummers (0==deel)
\getfromcommacommand[\samengesteldelijst][\!!counta]%
\edef\maximumlijst{\commalistelement}}%
{\edef\maximumlijst{\getvalue{\??ih#1\c!niveau}}}%
\!!counta=\getvalue{\??se\getvalue{\??ko\maximumlijst\c!sectie}\c!niveau}}%
- \let\!!stringa=\samengesteldelijst
- \let\samengesteldelijst=\empty
+ \let\!!stringa\samengesteldelijst
+ \let\samengesteldelijst\empty
\def\docommando##1%
{\ifnum\getvalue{\??se\getvalue{\??ko##1\c!sectie}\c!niveau}>\!!counta
\else
@@ -890,14 +911,14 @@
\doplaatssamengesteldelijst[#1][#2]}
\def\dodefinieersamengesteldelijst[#1][#2][#3]%
- {\setvalue{\??ih#1\c!lijst}{#2}%
+ {\makerawcommalist[#2]\samengesteldelijst % for fast processing
+ \letvalue{\??ih#1\c!lijst}\samengesteldelijst
\getcommalistsize[#2]%
\getfromcommalist[#2][\commalistsize]%
\doeassign[\??ih#1][\c!niveau=\commalistelement]%
\getparameters
[\??ih#1]
- [\c!criterium=\v!lokaal,
- #3]%
+ [\c!criterium=\v!lokaal,#3]%
\setvalue{\e!stel#1\e!in}%
{\dodoubleempty\dostelsamengesteldelijstin[#1]}%
\setvalue{\e!plaats#1}%
diff --git a/tex/context/base/core-mak.tex b/tex/context/base/core-mak.tex
index 63f69a90e..56d4cdb23 100644
--- a/tex/context/base/core-mak.tex
+++ b/tex/context/base/core-mak.tex
@@ -40,7 +40,7 @@
\def\doplaats%
{\dodoubleempty\dodoplaats}
-\def\dodoplaats[#1][#2]%
+\def\dodoplaats[#1][#2]% correctie moet mooier
{\bgroup
\dowithnextbox
{\setlocalhsize
diff --git a/tex/context/base/core-mar.tex b/tex/context/base/core-mar.tex
index e7f497f89..ab1207c42 100644
--- a/tex/context/base/core-mar.tex
+++ b/tex/context/base/core-mar.tex
@@ -15,6 +15,9 @@
\unprotect
+\prependtoks \getallmarks \to \everybeforepagebody % TEX
+\prependtoks \setallmarks \to \everyafterpagebody % ETEX
+
% voor 'interne' doeleinden zijn beschikbaar:
%
% \fetchmark[naam][plaats]
@@ -23,15 +26,46 @@
% ook nog reset koppelen aan sectie
+%\def\hoofdmarkering#1%
+% {\csname\??mk#1\c!koppeling\endcsname}
+%
+%\def\fastresetmarker#1%
+% {\doifdefined{\??mk\hoofdmarkering{#1}}
+% {\expandafter\resetmark\csname\??mk\hoofdmarkering{#1}\endcsname}}
+
+\beginTEX
+
+\def\hoofdmarkering#1%
+ {\@EA\ifx\csname\??mk#1\c!koppeling\endcsname\else
+ \csname\??mk#1\c!koppeling\endcsname
+ \fi}
+
+\def\fastresetmarker#1%
+ {\@EA\ifx\csname\??mk#1\c!koppeling\endcsname\else
+ \@EA\resetmark\csname\??mk\csname\??mk#1\c!koppeling\endcsname\endcsname
+ \fi}
+
+\endTEX
+
+\beginETEX \ifcsname
+
\def\hoofdmarkering#1%
- {\getvalue{\??mk#1\c!koppeling}}
+ {\ifcsname\??mk#1\c!koppeling\endcsname
+ \csname\??mk#1\c!koppeling\endcsname
+ \fi}
-\def\dodoresetmarkering#1%
- {\doifdefined{\??mk\hoofdmarkering{#1}}
- {\expandafter\resetmark\csname\??mk\hoofdmarkering{#1}\endcsname}}
+\def\fastresetmarker#1%
+ {\ifcsname\??mk#1\c!koppeling\endcsname
+ \@EA\resetmark\csname\??mk\csname\??mk#1\c!koppeling\endcsname\endcsname
+ \fi}
+
+\endETEX
+
+\def\fastresetmarkerlist[#1]%
+ {\expanded{\rawprocesscommalist[#1]}\fastresetmarker}
\def\doresetmarkering[#1]%
- {\processcommalist[#1]\dodoresetmarkering}
+ {\processcommalist[#1]\fastresetmarker}
\def\resetmarkering%
{\dosingleargument\doresetmarkering}
@@ -50,9 +84,9 @@
\def\dododefinieermarkering[#1][#2]%
{\stelmarkeringin[#1]
- [% \c!expansie=\v!nee, % saves a macro
- \c!scheider={ --- }, % watch the spaces
- \c!status=\v!start]%
+ [\c!expansie=\v!nee, % saves a macro
+ \c!scheider={ --- }, % watch the spaces
+ \c!status=\v!start]%
\ontkoppelmarkering[#1]% % no coupling with sections
\setevalue{\??mk#1\c!koppeling}{#2}%
\expandafter\newmark\csname\??mk#2\endcsname
@@ -69,15 +103,38 @@
\let\geenmarkering=\relax
%\def\fetchmark[#1][#2]% geen \def, anders problemen in \doif...
-% {\def\dofetchmark{\getvalue{\??mk#2}}%
+% {\def\dofetchmark{\csname\??mk#2\endcsname}%
% \expandafter\dofetchmark\csname\??mk\hoofdmarkering{#1}\endcsname}
-\def\dofetchmark#1#2% needed because we need to expand
- {\getvalue{\??mk#2}#1}
+%\def\dofetchmark#1#2% needed because we need to expand
+% {\csname\??mk#2\endcsname#1}
+%
+%\def\fetchmark[#1][#2]% never \unexpanded
+% {\expandafter\dofetchmark\csname\??mk\hoofdmarkering{#1}\endcsname{#2}}
+
+\def\fetchmark[#1][#2]% never \unexpanded
+ {\@EA\@EA\csname\??mk#2\endcsname
+ \csname\??mk\hoofdmarkering{#1}\endcsname}
+
+\beginTEX
+
+\def\fetchmark[#1][#2]% never \unexpanded
+ {\@EA\ifx\csname\??mk#1\c!koppeling\endcsname\else
+ \@EA\@EA\csname\??mk#2\endcsname
+ \csname\??mk\csname\??mk#1\c!koppeling\endcsname\endcsname
+ \fi}
+
+\endTEX
+
+\beginETEX \ifcsname
\def\fetchmark[#1][#2]% never \unexpanded
- %{\getvalue{\getvalue{\??mk#2}\??mk\hoofdmarkering{#1}}}
- {\expandafter\dofetchmark\csname\??mk\hoofdmarkering{#1}\endcsname{#2}}
+ {\ifcsname\??mk#1\c!koppeling\endcsname
+ \@EA\@EA\csname\??mk#2\endcsname
+ \csname\??mk\csname\??mk#1\c!koppeling\endcsname\endcsname
+ \fi}
+
+\endETEX
\def\fetchtwomarks[#1]%
{\doifsomething{\fetchmark[#1][\v!eerste]}
@@ -98,7 +155,7 @@
{\bgroup
\def\geenmarkering##1{\unknown\ }%
\setfullsectionnumber{\??mk#1}%
- \processaction
+ \processaction % slow
[#2]
[ \v!beide=>{\fetchtwomarks[#1]},
\v!alles=>{\fetchallmarks[#1]},
@@ -112,17 +169,60 @@
\unexpanded\def\haalmarkering%
{\dodoubleargument\dohaalmarkering}
+\let\setsomemark\setmark
+
+\beginTEX
+
+\def\domarking[#1]#2%
+ {\@EA\ifx\csname\??mk#1\c!koppeling\endcsname\else
+ \bgroup
+ \doifelsevalue{\??mk#1\c!expansie}\v!ja
+ \expandmarkstrue\expandmarksfalse
+ \@EA\setsomemark\csname\??mk\csname\??mk#1\c!koppeling\endcsname\endcsname{#2}%
+ \egroup
+ \fi}
+
+\endTEX
+
+\beginETEX \ifcsname
+
\def\domarking[#1]#2%
- {\bgroup
- \doifelsevalue{\??mk#1\c!expansie}{\v!ja}
- {\expandmarkstrue}
- {\expandmarksfalse}%
-% \honorunexpanded
-% \getvalue{\??mk\hoofdmarkering{#1}}{#2}%
- \expandafter\setmark\csname\??mk\hoofdmarkering{#1}\endcsname{#2}%
- \egroup}
+ {\ifcsname\??mk#1\c!koppeling\endcsname
+ \bgroup
+ \doifelsevalue{\??mk#1\c!expansie}\v!ja
+ \expandmarkstrue\expandmarksfalse
+ \@EA\setsomemark\csname\??mk\csname\??mk#1\c!koppeling\endcsname\endcsname{#2}%
+ \egroup
+ \fi}
+
+\endETEX
\def\marking%
{\dosingleargument\domarking}
+%D Used in placing text lines.
+
+\def\doifelsemarking#1%
+ {\ifundefined{\??mk#1\c!koppeling}%
+ \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
diff --git a/tex/context/base/core-mat.tex b/tex/context/base/core-mat.tex
index 0a5807c30..ef197eb20 100644
--- a/tex/context/base/core-mat.tex
+++ b/tex/context/base/core-mat.tex
@@ -122,14 +122,14 @@
\fi
\maakhetnummer[\v!formule]%
\setbox0=\hbox{\ignorespaces#2\unskip}%
- \ifdim\wd0>\!!zeropoint
+ \ifdim\wd0>\zeropoint
\edef\hetsubnummer{#2}%
\else
\let\hetsubnummer\empty
\fi
\doifsomething{#1}{\rawreference{\s!for}{#1}{\hetnummer\hetsubnummer}}%
\setbox0=\hbox{\ignorespaces#4\unskip}%
- \ifdim\wd0>\!!zeropoint
+ \ifdim\wd0>\zeropoint
\edef\hetsubnummer{#4}%
\fi
\doifsomething{#3}{\rawreference{\s!for}{#3}{\hetnummer\hetsubnummer}}%
@@ -138,8 +138,9 @@
{\dostartattributes\??fm\c!nummerletter\c!nummerkleur
\strut
\@@fmlinks
+ \preparethenumber\??fm\hetnummer\preparednumber
\labeltexts\v!formule
- {\ignorespaces\hetnummer\ignorespaces\hetsubnummer\unskip}%
+ {\ignorespaces\preparednumber\ignorespaces\hetsubnummer\unskip}%
\@@fmrechts
\dostopattributes}%
\fi
@@ -197,6 +198,7 @@
\c!variant=\s!default,
\c!uitlijnen=,
\c!strut=\v!nee,
+ \c!scheider=\@@koscheider,
\c!afstand=1em]
\def\currentformula {}
@@ -453,7 +455,10 @@
\def\dispplaatsformule[#1]#2$$#3$$%
{\dodoplaatsformule[#1]{#2}\dostartformula{}#3\dostopformula}
-\def\dodoplaatsformule[#1]#2%
+\let\normalreqno\eqno
+\let\normalleqno\leqno
+
+\def\dodoplaatsformule[#1]#2% messy, needs a clean up
{\doifelse{#1}{-}
{\setfalse\handleformulanumber}
{\doifelse{#2}{-}
@@ -461,7 +466,7 @@
{\settrue\handleformulanumber}}%
\ifconditional\handleformulanumber
\def\formulenummer%
- {\global\let\subformulenummer\doformulenummer
+ {%\global\let\subformulenummer\doformulenummer % no, bug
\doformulenummer[#1][#2]}%
\def\subformulenummer%
{\setfalse\incrementformulanumber
@@ -469,14 +474,33 @@
\gdef\doplaceformulanumber%
{\global\let\doplaceformulanumber\empty
\doifelse{\@@fmplaats}{\v!links}
- {\leqno{\doformulenummer[#1][#2][]{}}}
- {\eqno {\doformulenummer[#1][#2][]{}}}}%
+ {\normalleqno{\doformulenummer[#1][#2][]{}}}
+ {\normalreqno{\doformulenummer[#1][#2][]{}}}}%
\else
\def\formulenummer{\doformulenummer[#1][#2]}%
\global\let\subformulenummer\doformulenummer
\global\let\doplaceformulanumber\empty
\fi}
+%D We need a hook into the plain math alignment macros
+%D
+%D \starttypen
+%D \displaylines
+%D \eqalignno
+%D \eqalignno
+%D \stoptypen
+%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\relax}
+
+\let\normaldispl@y\displ@y
+
+\def\displ@y{\resetdisplaymatheq\normaldispl@y}
+
%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
@@ -504,6 +528,10 @@
{\hsize\displaywidth
\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
\mathhbox to \displaywidth\bgroup
\mathinnerstrut
diff --git a/tex/context/base/core-mis.tex b/tex/context/base/core-mis.tex
index 7f22ee895..3b27f592c 100644
--- a/tex/context/base/core-mis.tex
+++ b/tex/context/base/core-mis.tex
@@ -1,5 +1,5 @@
%D \module
-%D [ file=core-01a,
+%D [ file=core-mis,
%D version=1998.01.29,
%D title=\CONTEXT\ Core Macros,
%D subtitle=Miscelaneous,
@@ -728,20 +728,34 @@
{\bgroup
\dosingleempty\dostartcitaat}
+\def\leftquotation {\getvalue{\??la\currentlanguage\c!leftquotation }}
+\def\rightquotation{\getvalue{\??la\currentlanguage\c!rightquotation}}
+
+\def\leftquote {\getvalue{\??la\currentlanguage\c!leftquote }}
+\def\rightquote {\getvalue{\??la\currentlanguage\c!rightquote}}
+
+\def\leftquotationmark%
+ {\setbox\scratchbox=\hbox{\leftquotation}%
+ \doif{\@@ciplaats}{\v!marge}{\hskip-\wd\scratchbox}%
+ \box\scratchbox}
+
+\def\rightquotationmark%
+ {\hsmash{\rightquotation}}
+
\def\dostartcitaat[#1]%
{\@@civoor
\doifelsenothing{#1}
- {\let\dostopcitaat=\relax}
- {\startsmaller[#1]
- \let\dostopcitaat=\stopsmaller}%
+ {\let\dostopcitaat\relax}
+ {\startsmaller[#1]%
+ \let\dostopcitaat\stopsmaller}%
\dostartattributes\??ci\c!letter\c!kleur{}%
- \setbox0=\hbox{\getvalue{\??la\currentlanguage\c!leftquotation}}%
- \hskip-\wd0
- \box0\relax
+ \leftquotationmark
\ignorespaces}
\def\stopcitaat%
- {\unskip\hsmash{\getvalue{\??la\currentlanguage\c!rightquotation}}%
+ {\removeunwantedspaces
+ \removelastskip
+ \rightquotationmark
\dostopattributes
\dostopcitaat
\@@cina
@@ -754,7 +768,7 @@
#2%
\fi
\ifhmode % else funny pagebeaks
- \penalty\!!tenthousand\hskip\!!zeropoint % == \prewordbreak
+ \penalty\!!tenthousand\hskip\zeropoint % == \prewordbreak
\fi
\strut % new, needed below
\getvalue{\??la\currentlanguage#1}%
@@ -763,18 +777,18 @@
\unexpanded\def\citaat%
{\groupedcommand
{\dohandlequotation\c!leftquotation\relax}
- {\dohandlequotation\c!rightquotation\unskip}}
+ {\dohandlequotation\c!rightquotation\removelastskip}}
\unexpanded\def\citeer%
{\doifelse{\@@ciletter}{\v!normaal}
- {\let\next=\doquotedcite}
- {\let\next=\doattributedcite}%
+ {\let\next\doquotedcite}
+ {\let\next\doattributedcite}%
\next}
\def\doquotedcite%
{\groupedcommand
- {\dohandlequotation\c!leftquote\relax}
- {\dohandlequotation\c!rightquote\unskip}}
+ {\dohandlequotation\c!leftquote \relax}
+ {\dohandlequotation\c!rightquote\removelastskip}}
\def\doattributedcite%
{\groupedcommand
@@ -787,14 +801,15 @@
\unexpanded\def\citaat%
{\dohandlequotation\c!leftquotation\relax
- \groupedcommand{}{\dohandlequotation\c!rightquotation\unskip}}
+ \groupedcommand{}{\dohandlequotation\c!rightquotation\removelastskip}}
\def\doquotedcite%
{\dohandlequotation\c!leftquote\relax
- \groupedcommand{}{\dohandlequotation\c!rightquote\unskip}}
+ \groupedcommand{}{\dohandlequotation\c!rightquote\removelastskip}}
\stelciterenin
- [\c!letter=\v!normaal,
+ [\c!plaats=\v!marge,
+ \c!letter=\v!normaal,
\c!kleur=,
\c!voor=\startsmaller,
\c!na=\stopsmaller]
@@ -816,24 +831,27 @@
\ignorespaces}
\def\stopspeech
- {\dohandlequotation\c!rightspeech\unskip
+ {\dohandlequotation\c!rightspeech\removelastskip
\doglobal\decrement\speechlevel\relax
\ifcase\speechlevel\relax \global\setfalse\insidespeech \fi}
-\def\dohandlespeech%
- {\relax \ifcase\speechlevel
- \or\ifconditional\insidespeech
+\def\dohandlespeech% indirect since called in everypar
+ {\relax % still needed?
+ \ifcase\speechlevel\or\dodohandlespeech\fi}
+
+\def\dodohandlespeech%
+ {\ifconditional\insidespeech
\dohandlequotation\c!middlespeech\relax
\else
\global\settrue\insidespeech
- \fi\fi}
+ \fi}
\unexpanded\def\speech%
{\doglobal\increment\speechlevel\relax
\dohandlequotation\c!leftspeech\relax
\groupedcommand
{\ignorespaces}
- {\dohandlequotation\c!rightspeech\unskip
+ {\dohandlequotation\c!rightspeech\removelastskip
\doglobal\decrement\speechlevel\relax}}
\appendtoks \dohandlespeech \to \everypar
@@ -876,7 +894,6 @@
\definecomplexorsimpleempty\toevoegen
-
\def\dorooster[#1]%
{\begingroup
\getparameters[\??rt]
@@ -1427,6 +1444,8 @@
[\??ld#1]
[\c!n=1,
\c!afstand=\bodyfontsize,
+ \c!voor=,
+ \c!na=,
\c!tussen={\blanko[\v!middel]},
\c!breedte=\hsize,
\c!hoogte=\vsize,
@@ -1452,14 +1471,16 @@
{\setuppairedbox[#1][#2]% % and don't change them
\copyparameters
[\??ld][\??ld#1]
- [\c!n,\c!afstand,\c!tussen,
+ [\c!n,\c!afstand,\c!tussen,\c!voor,\c!na,
\c!breedte,\c!hoogte,\c!maxbreedte,\c!maxhoogte,
\c!korps,\c!uitlijnen,\c!plaats]%
+ \@@ldvoor\bgroup
\beforefirstpairedbox
\dowithnextbox
{\betweenbothpairedboxes
\dowithnextbox
{\afterbothpairedboxes
+ \egroup\@@ldna
\egroup}
\vbox\bgroup
\insidesecondpairedbox
@@ -1593,7 +1614,7 @@
\global\totcombinatie=#2\relax
\xdef\maxhorcombinatie{\the\horcombinatie}%
\multiply\totcombinatie by \horcombinatie
- \tabskip=\!!zeropoint
+ \tabskip\zeropoint
\doifelse{\@@cobreedte}{\v!passend}
{\halign}
{\halign to \@@cobreedte}%
@@ -1874,8 +1895,8 @@
\dimen4=\@@xysx\wd\nextbox
\dimen6=\dimen0\advance\dimen6 by \dimen2
\setbox\nextbox=\vbox to \dimen6
- {\ht\nextbox=\!!zeropoint
- \dp\nextbox=\!!zeropoint
+ {\ht\nextbox=\zeropoint
+ \dp\nextbox=\zeropoint
\vfill % erbij
\dostartscaling\@@xysx\@@xysy\box\nextbox\dostopscaling}%
\ht\nextbox=\dimen0
diff --git a/tex/context/base/core-nav.tex b/tex/context/base/core-nav.tex
index 6e5e1f97d..e1ecb0322 100644
--- a/tex/context/base/core-nav.tex
+++ b/tex/context/base/core-nav.tex
@@ -46,58 +46,64 @@
%D forces page destinations (instead of named ones). We set
%D this switch here.
-\def\setupinteraction%
+\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\setupinteraction
{\dosingleargument\dodosetupinteraction}
\def\dodosetupinteraction[#1]% % \dosetupinteraction == special
{\getparameters[\??ia][#1]%
- \doifelse{\@@iastatus}{\v!start}
+ \doifelse\@@iastatus\v!start
{\iflocation\else
- \showmessage{\m!interactions}{2}{\ifusepagedestinations\space(PAGE)\fi}%
+ \showmessage\m!interactions2{\ifusepagedestinations\space(PAGE)\fi}%
\global\locationtrue
\fi}
{\iflocation
- \showmessage{\m!interactions}{3}{\ifusepagedestinations\space(PAGE)\fi}%
+ \showmessage\m!interactions3{\ifusepagedestinations\space(PAGE)\fi}%
\global\locationfalse
\fi}%
\iflocation
- \enablemode [\systemmodeprefix\v!interactie]%
+ \setsystemmode \v!interactie
\else
- \disablemode[\systemmodeprefix\v!interactie]%
+ \resetsystemmode\v!interactie
\fi
- \dosetuppageview{\@@iafocus}%
- \doifsomething{\@@iabereken}
+ \dosetuppageview\@@iafocus
+ \doifsomething\@@iabereken
{\doregistercalculationset\@@iabereken}%
- \doifelse{\@@iastrut}{\v!ja}
- {\locationstruttrue}
- {\locationstrutfalse}%
- \doifelse{\@@iaklik}{\v!ja}
- {\highlighthyperlinkstrue}
- {\highlighthyperlinksfalse}%
- \doifelse{\@@iasplitsen}{\v!ja}
- {\locationsplittrue}
- {\locationsplitfalse}%
- \doifelse{\@@iascherm}{\v!nieuw}
- {\gotonewwindowtrue}
- {\gotonewwindowfalse}%
- \doifelse{\@@iapagina}{\v!ja}
+ \doifelse\@@iastrut\v!ja
+ \locationstruttrue
+ \locationstrutfalse
+ \doifelse\@@iaklik\v!ja
+ \highlighthyperlinkstrue
+ \highlighthyperlinksfalse
+ \doifelse\@@iasplitsen\v!ja
+ \locationsplittrue
+ \locationsplitfalse
+ \doifelse\@@iascherm\v!nieuw
+ \gotonewwindowtrue
+ \gotonewwindowfalse
+ \doifelse\@@iapagina\v!ja
{\global\usepagedestinationstrue}
{\global\usepagedestinationsfalse}}
%D We have to make sure of some settings:
-\def\dolocationstartup%
+\def\dolocationstartup
{\iflocation
\dosetupinteraction
\handlereferenceactions\@@iaopenactie \dosetupopenaction
\handlereferenceactions\@@iasluitactie\dosetupcloseaction
\setupinteractionscreens
- \global\let\dolocationstartup=\relax
+ \global\let\dolocationstartup\relax
\fi}
\appendtoks \dolocationstartup \to \everyshipout
-\def\dolocationpagecheck%
+\def\dolocationpagecheck
{\iflocation
\handlereferenceactions\@@iaopenpaginaactie \doPDFsetupopenpageaction
\handlereferenceactions\@@iasluitpaginaactie\doPDFsetupclosepageaction
@@ -131,8 +137,8 @@
\newif\iflocationsplit
\def\resetgoto%
- {\global\let\@@ia@@hoogte=\!!zeropoint
- \global\let\@@ia@@diepte=\!!zeropoint}
+ {\global\let\@@ia@@hoogte\!!zeropoint
+ \global\let\@@ia@@diepte\!!zeropoint}
\resetgoto
@@ -142,8 +148,8 @@
\xdef\@@ia@@hoogte{\the\ht\strutbox}%
\xdef\@@ia@@diepte{\the\dp\strutbox}%
\else
- \global\let\@@ia@@hoogte=\@@iahoogte
- \global\let\@@ia@@diepte=\@@iadiepte
+ \global\let\@@ia@@hoogte\@@iahoogte
+ \global\let\@@ia@@diepte\@@iadiepte
\fi}
%D In the macros that deal with making areas into hyperlinks,
diff --git a/tex/context/base/core-new.tex b/tex/context/base/core-new.tex
index 692b5dc4b..69b796925 100644
--- a/tex/context/base/core-new.tex
+++ b/tex/context/base/core-new.tex
@@ -8,22 +8,20 @@
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
\writestatus{loading}{Context Core Macros / New Ones}
\unprotect
-%D To be placed elsewhere.
-
% Some kind of new feature, for the moment a private one.
%
% \enablemode[screen,paper,bound]
%
% \doifmodeelse {paper} {this} {that}
% \doifmode {paper,screen} {this}
-% \doifnotmode {paper,bound} {that}
+% \doifnotmode {paper,bound} {that}
%
% \startmode [list]
% \stopmode
@@ -31,43 +29,145 @@
% \startnotmode [list]
% \stopnotmode
%
-% system modes have a * as prefix
+% system modes have a * as prefix
%
-% to be implemented: mode naar texutil/scherm + message
+% to be implemented: mode naar texutil/scherm + message
% : geen #2 en nesting (\startregels)
-\def\systemmodeprefix{*}
-
-\let\currentmode=\empty
+%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\systemmodeprefix{*}
+%
+% \let\currentmode \empty
+% \let\preventedmodes\empty
+%
+% \def\preventmode[#1]%
+% {\expanded{\addtocommalist{#1}\noexpand\preventedmodes}}
+%
% \def\enablemode[#1]%
-% {\expandafter\addtocommalist\expandafter{#1}\currentmode}
+% {\expanded
+% {\doifnotinset{#1}{\preventedmodes}
+% {\noexpand\addtocommalist{#1}\noexpand\currentmode}}}
%
% \def\disablemode[#1]%
-% {\expandafter\removefromcommalist\expandafter{#1}\currentmode}
+% {\expanded{\removefromcommalist{#1}\noexpand\currentmode}}
+%
+% \def\doifmodeelse{\unprotect\dodoifmodeelse}
+% \def\doifmode {\unprotect\dodoifmode }
+% \def\doifnotmode {\unprotect\dodoifnotmode }
+% \def\startmode {\unprotect\dostartmode }
+% \def\startnotmode{\unprotect\dostartnotmode}
+%
+% \long\def\dodoifmodeelse#1%
+% {\protect\expanded{\doifcommonelse{#1}{\currentmode}}}
+%
+% \long\def\dodoifmode#1%
+% {\protect\expanded{\doifcommon {#1}{\currentmode}}}
%
-% this one fails in removing system modes
+% \long\def\dodoifnotmode#1%
+% {\protect\expanded{\doifnotcommon {#1}{\currentmode}}}
+%
+% \let\stopmode \relax
+% \let\stopnotmode\relax
+%
+% \long\def\dostartmode[#1]%
+% {\protect
+% \expanded{\doifnotcommon{#1}{\currentmode}}{\gobbleuntil\stopmode}}
+%
+% \long\def\dostartnotmode[#1]%
+% {\protect
+% \expanded{\doifcommon {#1}{\currentmode}}{\gobbleuntil\stopnotmode}}
+%
+% \def\doifallmodeselse{\unprotect\dodoifallmodeselse}
+% \def\doifallmodes {\unprotect\dodoifallmodes}
+% \def\doifnotallmodes {\unprotect\dodoifnotallmodes}
+% \def\startallmodes {\unprotect\dostartallmodes}
+% \def\startnotallmodes{\unprotect\dostartnotallmodes}
+%
+% \long\def\dodoifallmodeselse#1%
+% {\protect\expanded{\doifallcommonelse{#1}{\currentmode}}}
+%
+% \long\def\dodoifallmodes#1%
+% {\protect\expanded{\doifallcommon {#1}{\currentmode}}}
+%
+% \long\def\dodoifnotallmodes#1%
+% {\protect\expanded{\doifnotallcommon {#1}{\currentmode}}}
+%
+% \let\stopallmodes \relax
+% \let\stopnotallmodes\relax
+%
+% \long\def\dostartallmodes[#1]%
+% {\protect
+% \expanded{\doifnotallcommon{#1}{\currentmode}}{\gobbleuntil\stopallmodes}}
+%
+% \long\def\dostartnotallmodes[#1]%
+% {\protect
+% \expanded{\doifallcommon {#1}{\currentmode}}{\gobbleuntil\stopnotallmodes}}
-% \def\enablemode[#1]%
-% {\expanded{\addtocommalist{#1}\noexpand\currentmode}}
+% faster
-%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}
-\let\preventedmodes\empty
+\def\dopreventmode[#1]{\protect\rawprocesscommalist[#1]\dodopreventmode}
+\def\doenablemode [#1]{\protect\rawprocesscommalist[#1]\dodoenablemode }
+\def\dodisablemode[#1]{\protect\rawprocesscommalist[#1]\dododisablemode}
-\def\preventmode[#1]%
- {\expanded{\addtocommalist{#1}\noexpand\preventedmodes}}
+\def\dodopreventmode#1%
+ {\@EA\let\csname\@mode@#1\endcsname\preventedmode}
-\def\enablemode[#1]%
- {\expanded
- {\doifnotinset{#1}{\preventedmodes}
- {\noexpand\addtocommalist{#1}\noexpand\currentmode}}}
+\def\dodoenablemode#1%
+ {\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}
+
+% check macros
+
+\newif\ifcheckedmode
+
+\def\dodocheckformode#1%
+ {\ifcase0\csname\@mode@#1\endcsname\or\checkedmodetrue\fi}
-\def\disablemode[#1]%
- {\expanded{\removefromcommalist{#1}\noexpand\currentmode}}
+\def\docheckformode#1#2#3% will be sped up with a quit
+ {\protect\checkedmodefalse\rawprocesscommalist[#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\rawprocesscommalist[#3]\dodocheckforallmodes
+ \ifcheckedmode\@EA#1\else\@EA#2\fi}
+
+% simple ones
\def\doifmodeelse{\unprotect\dodoifmodeelse}
\def\doifmode {\unprotect\dodoifmode}
@@ -75,25 +175,58 @@
\def\startmode {\unprotect\dostartmode}
\def\startnotmode{\unprotect\dostartnotmode}
-\long\def\dodoifmodeelse#1#2#3%
- {\protect\ExpandBothAfter\doifcommonelse{#1}{\currentmode}{#2}{#3}}
+\def\dodoifmodeelse
+ {\docheckformode\firstoftwoarguments\secondoftwoarguments}
+
+\def\dodoifmode
+ {\docheckformode\firstofoneargument\gobbleoneargument}
+
+\def\dodoifnotmode
+ {\docheckformode\gobbleoneargument\firstofoneargument}
-\long\def\dodoifmode#1#2%
- {\protect\ExpandBothAfter\doifcommonelse{#1}{\currentmode}{#2}{}}
+\long\def\dostartmode[#1]%
+ {\docheckformode\donothing\dostopmode{#1}}
-\long\def\dodoifnotmode#1#2%
- {\protect\ExpandBothAfter\doifcommonelse{#1}{\currentmode}{}{#2}}
+\long\def\dostartnotmode[#1]%
+ {\docheckformode\dostopnotmode\donothing{#1}}
-\long\def\dostartmode[#1]#2\stopmode%
- {\dodoifmode{#1}{#2}}
+\let\stopmode \donothing
+\let\stopnotmode\donothing
-\long\def\dostartnotmode[#1]#2\stopnotmode%
- {\dodoifnotmode{#1}{#2}}
+\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\doifallmodeselse
+ {\docheckforallmodes\firstoftwoarguments\secondoftwoarguments}
+
+\def\doifallmodes
+ {\docheckforallmodes\firstofoneargument\gobbleoneargument}
+
+\def\doifnotallmodes
+ {\docheckforallmodes\gobbleoneargument\firstofoneargument}
+
+\long\def\dostartallmodes[#1]%
+ {\docheckallformodes\donothing\dostopallmodes{#1}}
+
+\long\def\dostartnotallmodes[#1]%
+ {\docheckforallmodes\dostopallmodes\donothing{#1}}
+
+\let\stopallmodes \donothing
+\let\stopnotallmodes\donothing
+
+\long\def\dostopallmodes #1\stopallmodes {}
+\long\def\dostopnotallmodes#1\stopnotallmodes{}
-% new
+% new
%
% \startnointerference
-% all kind of code
+% all kind of code
% \stopnointerference
\newbox\nointerferencebox
@@ -106,37 +239,14 @@
{\egroup
\setbox\nointerferencebox\box\voidb@x}
-% new
-
-\def\doifallmodeselse{\unprotect\dodoifallmodeselse}
-\def\doifallmodes {\unprotect\dodoifallmodes}
-\def\doifnotallmodes {\unprotect\dodoifnotallmodes}
-\def\startallmodes {\unprotect\dostartallmodes}
-\def\startnotallmodes{\unprotect\dostartnotallmodes}
-
-\long\def\dodoifallmodeselse#1#2#3%
- {\protect\ExpandBothAfter\doifallcommonelse{#1}{\currentmode}{#2}{#3}}
-
-\long\def\dodoifallmodes#1#2%
- {\protect\ExpandBothAfter\doifallcommonelse{#1}{\currentmode}{#2}{}}
-
-\long\def\dodoifnotallmodes#1#2%
- {\protect\ExpandBothAfter\doifallcommonelse{#1}{\currentmode}{}{#2}}
-
-\long\def\dostartallmodes[#1]#2\stopallmodes
- {\dodoifallmodes{#1}{#2}}
-
-\long\def\dostartnotallmodes[#1]#2\stopnotallmodes
- {\dodoifnotallmodes{#1}{#2}}
-
-% will go to ...
+% will go to ...
\def\alignedbox%
{\dodoubleempty\doalignedbox[]}
\def\doalignedbox[#1][#2]%
{\bgroup
- \let\iftraceboxplacement\iftracelayers
+ %\let\iftraceboxplacement\iftracelayers % ugly
\dowithnextbox
{\let\next\middlebox
\processaction
@@ -173,8 +283,8 @@
{\box\nextbox}
{\alignedbox[\@@oxplaats]\hbox{\box\nextbox}}}}%
\wd\nextbox\@@oxbreedte
- \ht\nextbox\@@oxhoogte
- \dp\nextbox\@@oxdiepte
+ \ht\nextbox\@@oxhoogte
+ \dp\nextbox\@@oxdiepte
\box\nextbox
\egroup}#1}
@@ -184,7 +294,7 @@
%\ruledhbox{\offsetbox[x=-1cm,y=-1cm,location=c]
% {\framed[width=4cm,height=4cm]{x}}}
-% actually this is pretty old, but temporary moved here
+% actually this is pretty old, but temporary moved here
\installdiscretionaries || \@@kpteken
@@ -242,45 +352,45 @@
\enableactivediscretionaries
-%D new and beta
+%D new and beta
% \def\defineshortcut%
% {\dodoubleargument\dodefineshortcut}
-%
+%
% \bgroup
-%
-% \catcode`\<=\@@active
-%
+%
+% \catcode`\<=\@@active
+%
% \gdef\dodefineshortcut[#1][#2]%
% {\ifsecondargument
-% \catcode`\<=\@@active
+% \catcode`\<=\@@active
% \def<{\ifmmode\expandafter\normalless\else\expandafter\doshortcut\fi}%
% \getparameters[\??te#1][\c!commandos=,\c!commando=,\c!letter=,\c!kleur=,#2]%
% \else
-% \defineshortcut[][#1]%
+% \defineshortcut[][#1]%
% \fi}
-%
+%
% \egroup
-%
-% \def\doshortcut%
+%
+% \def\doshortcut%
% {\bgroup
% \catcode`\>=\@@other
% \dodoshortcut}
-%
-% \def\dodoshortcut#1>%
+%
+% \def\dodoshortcut#1>%
% {\def\shortcut{#1}%
% \dododoshortcut#1:\end}
-%
-% \def\dododoshortcut#1:#2\end
+%
+% \def\dododoshortcut#1:#2\end
% {\doifelsenothing{#2}
% {\doifundefinedelse{\??te\c!commandos}
-% {\shortcut}
+% {\shortcut}
% {\@EA\dodododoshortcut\@EA\??te\@EA:\shortcut:\end}}
% {\doifundefinedelse{\??te#1\c!commandos}
-% {\shortcut}
+% {\shortcut}
% {\dodododoshortcut\??te#1:#2\end}}%
% \egroup}
-%
+%
% \def\dodododoshortcut#1:#2:\end
% {\getvalue{#1\c!commandos}%
% \doattributes{#1}\c!letter\c!kleur{\getvalue{#1\c!commando}{#2}}}
@@ -294,9 +404,9 @@
{\dododefineshortcut[<>][#2][#3]}
{\dododefineshortcut[#1][#2][#3]}%
\else\ifsecondargument
- \dododefineshortcut[<>][#1][#2]%
+ \dododefineshortcut[<>][#1][#2]%
\else
- \dododefineshortcut[<>][][#1]%
+ \dododefineshortcut[<>][][#1]%
\fi\fi}
\def\dododefineshortcut[#1#2][#3][#4]% #1 is the trigger, #2 the delimiter/tag
@@ -306,26 +416,26 @@
[\??te\string#2#3]
[\c!commandos=,\c!commando=,\c!letter=,\c!kleur=,#4]}
-\def\doshortcut#1%
+\def\doshortcut#1%
{\ifmmode
\getvalue{\??te\??te#1}%
\else
\bgroup
\catcode`#1=\@@other
- \def\dodoshortcut##1#1%
+ \def\dodoshortcut##1#1%
{\def\shorttag{\??te#1}%
\def\shortcut{##1}%
\dododoshortcut##1:\end}%
\@EA\dodoshortcut
\fi}
-
-\def\dododoshortcut#1:#2\end
+
+\def\dododoshortcut#1:#2\end
{\doifelsenothing{#2}
{\doifundefinedelse{\shorttag\c!commandos}
- {\shortcut}
+ {\shortcut}
{\@EA\dodododoshortcut\@EA\shorttag\@EA:\shortcut:\end}}
{\doifundefinedelse{\shorttag#1\c!commandos}
- {\shortcut}
+ {\shortcut}
{\dodododoshortcut\shorttag#1:#2\end}}%
\egroup}
@@ -335,40 +445,64 @@
%D \defineshortcut [\c!letter=\v!type]
%D \defineshortcut [b] [\c!letter=\v!vet]
-%D \defineshortcut [e] [\c!letter=\em]
+%D \defineshortcut [e] [\c!letter=\em]
%D \defineshortcut [t] [\c!letter=\v!type]
%D \defineshortcut [c] [\c!letter=\v!kap]
%D \defineshortcut [k] [\c!letter=\v!kap]
%D \defineshortcut [u] [\c!letter=\v!type,\c!commando=\hyphenatedurl]
-%D
+%D
%D \startregels
-%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 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 \stopregels
-%D
+%D
%D \defineshortcut [<>] [i] [\c!letter=\it]
%D \defineshortcut [()] [b] [\c!letter=\bf]
%D \defineshortcut [++] [s] [\c!letter=\sl]
%D \defineshortcut [//] [u] [\c!letter=\underbars]
%D \defineshortcut [--] [a] [\c!letter=\overstrike]
-%D
+%D
%D \startregels
-%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 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 \stopregels
-\protect
+\def\setupenv{\dodoubleargument\rawgetparameters[\??en]}
+
+\def\doifenvelse#1{\doifdefinedelse{\??en#1}} % speed up
+
+\def\env#1{\csname\??en#1\endcsname}
+
+\beginTEX
+
+\def\envvar#1#2%
+ {\@EA\ifx\csname\??en#1\endcsname\relax
+ #2\else\csname\??en#1\endcsname
+ \fi}
+
+\endTEX
+
+\beginETEX \ifcsname
+
+\def\envvar#1#2%
+ {\ifcsname\??en#1\endcsname
+ \csname\??en#1\endcsname\else#2%
+ \fi}
+
+\endETEX
+
+\protect
\endinput
diff --git a/tex/context/base/core-not.tex b/tex/context/base/core-not.tex
index 69e62dc5b..e86f8352a 100644
--- a/tex/context/base/core-not.tex
+++ b/tex/context/base/core-not.tex
@@ -202,7 +202,22 @@
\setfootnotehsize
\setrigidcolumnhsize\hsize\@@vnkolomafstand\@@vnn
\setbox0=\vbox\bgroup}
- \def\stoppopfootnotes {\egroup\rigidcolumnbalance0\egroup}}
+ \def\stoppopfootnotes {\egroup
+ \setbox0=\vbox
+ {\unvbox0\setbox0\lastbox
+ \ifvbox0\unvbox\else\box\fi0}%
+ \rigidcolumnbalance0\egroup}}
+
+% \def\settextfootnotes%
+% {\def\startpushfootnote {\startvboxtohbox
+% \dostartattributes\??vn\c!letter\c!kleur{}}%
+% \def\stoppushfootnote {\hskip\@@vnkolomafstand % plus.5em minus.5em
+% \dostopattributes
+% \stopvboxtohbox}%
+% \def\startpopfootnotes {\vbox\bgroup % \doifdimenelse
+% \doifnotinset{\@@vnbreedte}{\v!passend,\v!ruim}
+% {\setfootnotehsize}}%
+% \def\stoppopfootnotes {\convertvboxtohbox\egroup}}
\def\settextfootnotes%
{\def\startpushfootnote {\startvboxtohbox
@@ -210,10 +225,32 @@
\def\stoppushfootnote {\hskip\@@vnkolomafstand % plus.5em minus.5em
\dostopattributes
\stopvboxtohbox}%
- \def\startpopfootnotes {\vbox\bgroup % \doifdimenelse
+ \def\startpopfootnotes {\vbox\bgroup
\doifnotinset{\@@vnbreedte}{\v!passend,\v!ruim}
- {\setfootnotehsize}}%
- \def\stoppopfootnotes {\convertvboxtohbox\egroup}}
+ {\setfootnotehsize}%
+ \beginofshapebox}%
+ \def\stoppopfootnotes {\endofshapebox
+ \reshapebox
+ {\ifhbox\shapebox\unhbox\else\box\fi\shapebox
+ \endgraf}%
+ \flushshapebox
+ \egroup}}
+
+%D The formatting depends on the width of the table, so we
+%D have to set \type {n} to zero.
+%D
+%D \starttypen
+%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 \stoptypen
%D The numbers that accompany a footnote are generated using
%D the standard \CONTEXT\ numbering mechanism, and thereby can
@@ -281,6 +318,24 @@
\unexpanded\def\footnote {\dodoubleempty\dofootnote[1]}
\unexpanded\def\footnotetext{\dodoubleempty\dofootnote[0]}
+%\def\dofootnote[#1][#2]%
+% {\unskip
+% \ifcase#1\relax
+% \global\footnotesymbolfalse
+% \else
+% \global\footnotesymboltrue
+% \fi
+% \ifvisible
+% \ifreshapingbox
+% \let\next\gobbletwoarguments
+% \else
+% \let\next\dodofootnote
+% \fi
+% \else
+% \let\next\gobbletwoarguments
+% \fi
+% \next{#2}}
+
\def\dofootnote[#1][#2]%
{\unskip
\ifcase#1\relax
@@ -290,14 +345,13 @@
\fi
\ifvisible
\ifreshapingbox
- \let\next=\gobbletwoarguments
+ \@EAEAEA\gobbletwoarguments
\else
- \let\next=\dodofootnote
+ \@EAEAEA\dodofootnote
\fi
\else
- \let\next=\gobbletwoarguments
- \fi
- \next{#2}}
+ \@EA\gobbletwoarguments
+ \fi{#2}}
%D \macros
%D {footnotesenabled}
@@ -332,31 +386,67 @@
{}
\fi}
-\def\dodofootnote#1%
+% \def\dodofootnote#1%
+% {\iffootnotesenabled
+% \doglobal\increment\internalfootreference
+% \doifelse{\@@vnwijze}{\v!per\v!pagina}
+% {\settrue\pagewisefootnotes}
+% {\setfalse\pagewisefootnotes}%
+% \doifelse{#1}{-}
+% {\let\footnotenumber\empty}
+% {\ifconditional\pagewisefootnotes
+% \doifreferencefoundelse{\s!fnt:t:\internalfootreference}
+% {\ifnum\currentrealreference>\lastfootnotepage\relax
+% \global\let\lastfootnotepage\currentrealreference
+% \resetnummer[\v!voetnoot]%
+% \fi}
+% {}%
+% \fi
+% \verhoognummer[\v!voetnoot]%
+% \maakhetnummer[\v!voetnoot]%
+% \rawreference{\s!fnt}{#1}{\hetnummer}%
+% \let\footnotenumber\hetnummer}%
+% \expandafter\dostartfootnote
+% \else
+% \expandafter\gobbleoneargument
+% \fi}
+
+\def\dodofootnote%
{\iffootnotesenabled
- \doglobal\increment\internalfootreference
- \doifelse{\@@vnwijze}{\v!per\v!pagina}
- {\settrue\pagewisefootnotes}
- {\setfalse\pagewisefootnotes}%
- \doifelse{#1}{-}
- {\let\footnotenumber=\empty}
- {\ifconditional\pagewisefootnotes
- \doifreferencefoundelse{\s!fnt:t:\internalfootreference}
- {\ifnum\currentrealreference>\lastfootnotepage\relax
- \global\let\lastfootnotepage\currentrealreference
- \resetnummer[\v!voetnoot]%
- \fi}
- {}%
- \fi
- \verhoognummer[\v!voetnoot]%
- \maakhetnummer[\v!voetnoot]%
- \rawreference{\s!fnt}{#1}{\hetnummer}%
- \let\footnotenumber=\hetnummer}%
- \expandafter\dostartfootnote
+ \iftrialtypesetting
+ \@EAEAEA\nododofootnote
+ \else
+ \@EAEAEA\dododofootnote
+ \fi
\else
- \expandafter\gobbleoneargument
+ \@EA\gobbletwoarguments
\fi}
+\def\nododofootnote#1%
+ {\doifnot{#1}{-}{\kern.5em}% quick hack, approximation
+ \gobbleoneargument}
+
+\def\dododofootnote#1%
+ {\doglobal\increment\internalfootreference
+ \doifelse{\@@vnwijze}{\v!per\v!pagina}
+ {\settrue\pagewisefootnotes}
+ {\setfalse\pagewisefootnotes}%
+ \doifelse{#1}{-}
+ {\let\footnotenumber\empty}
+ {\ifconditional\pagewisefootnotes
+ \doifreferencefoundelse{\s!fnt:t:\internalfootreference}
+ {\ifnum\currentrealreference>\lastfootnotepage\relax
+ \global\let\lastfootnotepage\currentrealreference
+ \resetnummer[\v!voetnoot]%
+ \fi}
+ {}%
+ \fi
+ \verhoognummer[\v!voetnoot]%
+ \maakhetnummer[\v!voetnoot]%
+ \rawreference{\s!fnt}{#1}{\hetnummer}%
+ \let\footnotenumber\hetnummer}%
+ \dostartfootnote}
+
%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
@@ -417,13 +507,16 @@
\fi
\startpushfootnote
{\ifx\footnotenumber\empty \else
+\preparethenumber\??vn\footnotenumber\preparednumber
\iflocation
\naarbox{\@@vnnummercommando
- {\footnotenumber\domovednote\v!volgendepagina\v!vorigepagina}}%
+% {\footnotenumber\domovednote\v!volgendepagina\v!vorigepagina}}%
+{\preparednumber\domovednote\v!volgendepagina\v!vorigepagina}}%
[\s!fnt:f:\internalfootreference]%
\else
\@@vnnummercommando
- {\footnotenumber\domovednote\v!volgendepagina\v!vorigepagina}%
+% {\footnotenumber\domovednote\v!volgendepagina\v!vorigepagina}%
+{\preparednumber\domovednote\v!volgendepagina\v!vorigepagina}%
\fi
\fi
\iflocation
@@ -510,12 +603,16 @@
\dofootnoterule % alleen in ..mode
\bgroup
\setfootnotebodyfont
- \setbox0=\hbox
+ \setbox0=\hbox
{\startpopfootnotes
\setfootnotebodyfont
- % this should be checked, smells like a mix-up
- % does not split: \ifcase\@@vnn\unvbox\else\box\fi\footins
- \ifcase\@@vnn\box\else\unvbox\fi\footins
+% % this should be checked, smells like a mix-up
+% % does not split: \ifcase\@@vnn\unvbox\else\box\fi\footins
+% \ifcase\@@vnn
+ \box\footins
+% \else
+% \unvbox\footins
+% \fi
% this is too ugly actually
\stoppopfootnotes}%
\localframed
@@ -524,7 +621,7 @@
\c!hoogte=\v!passend,
\c!strut=\v!nee,
\c!offset=\v!overlay]
- {\ifdim\dp0=\!!zeropoint % this hack is needed because \vadjust
+ {\ifdim\dp0=\zeropoint % this hack is needed because \vadjust
\hbox{\lower\dp\strutbox\box0}% % in margin number placement
\else % hides the (always) present depth
\box0
@@ -570,7 +667,9 @@
{\ifinner
%\message{[postponed footnote]}%
\global\setbox\postponedfootnotes=\vbox\bgroup
- \unvbox\postponedfootnotes
+ \ifvoid\postponedfootnotes\else
+ \unvbox\postponedfootnotes
+ \fi
\let\next=\gobbletwoarguments
\else
%\message{[inserted footnote]}%
@@ -609,14 +708,33 @@
\fi
\fi}
+% \def\flushfootnotes%
+% {\ifinpagebody \else
+% \ifinner \else
+% \ifendnotes \else
+% \ifvoid\postponedfootnotes \else
+% %\ifvmode % less interference, but also less secure
+% \doflushfootnotes
+% %\fi
+% \fi
+% \fi
+% \fi
+% \fi}
+%
+% more efficient
+
\def\flushfootnotes%
- {\ifinpagebody \else \ifinner \else
- \ifendnotes \else \ifvoid\postponedfootnotes \else
- %\ifvmode % less interference, but also less secure
- \doflushfootnotes
- %\fi
- \fi\fi
- \fi\fi}
+ {\ifvoid\postponedfootnotes \else
+ \ifinner \else
+ \ifendnotes \else
+ \ifinpagebody \else
+ %\ifvmode % less interference, but also less secure
+ \doflushfootnotes
+ %\fi
+ \fi
+ \fi
+ \fi
+ \fi}
%D This is a nasty and new secondary footnote flusher. It
%D can be hooked into \type {\everypar} like:
@@ -625,8 +743,11 @@
%D \appendtoks \synchronizefootnotes \to \everypar
%D \stoptypen
-\def\synchronizefootnotes%
- {\ifvoid\footins\else\insert\footins{\unvbox\footins}\fi}
+\def\dosynchronizefootnotes%
+ {\insert\footins{\unvbox\footins}}
+
+\def\synchronizefootnotes% indirect because of everypar
+ {\ifvoid\footins\else\dosynchronizefootnotes\fi}
\def\placefootnotesintext#1%
{\ifdim\ht#1>\zeropoint
@@ -670,10 +791,21 @@
%D \setupfootnotes[location={text,none}]
%D \stoptypen
+%\def\placefootnotesasnone#1% is grouped already
+% {\ifdim\ht#1>\zeropoint
+% \@@vnvoor
+% \setfootnotebodyfont \unvbox#1\endgraf
+% \@@vnna
+% \fi}
+
\def\placefootnotesasnone#1% is grouped already
{\ifdim\ht#1>\zeropoint
\@@vnvoor
- \setfootnotebodyfont \unvbox#1\endgraf
+ \setfootnotebodyfont
+ \startpopfootnotes % make sure that fake height is killed
+ \unvbox#1\endgraf
+ \stoppopfootnotes
+ \setbox0=\lastbox \ifvbox0 \unvbox0\else\box0\fi % enable columns
\@@vnna
\fi}
@@ -694,12 +826,14 @@
{\def\localfootinsert##1% was \gdef, but never reset!
{%\message{[local footnote]}%
\global\setbox\localpostponedfootnotes=\vbox\bgroup
- \unvbox\localpostponedfootnotes
+ \ifvoid\localpostponedfootnotes \else
+ \unvbox\localpostponedfootnotes
+ \fi
\let\next}}
\def\dostartlocalfootnotes[#1]%
- {\let\autopostponefootnotes=\postponefootnotes
- \let\postponefootnotes=\collectlocalfootnotes
+ {\let\autopostponefootnotes\postponefootnotes
+ \let\postponefootnotes\collectlocalfootnotes
\def\defaultfootnotewidth%
{\ifdim\hsize<\zetbreedte\hsize\else\zetbreedte\fi}%
\setupfootnotes[#1]%
@@ -713,13 +847,17 @@
\def\stoplocalfootnotes%
{\restorenumber[\v!voetnoot]%
- \egroup}
+ \egroup
+ \setupfootnotes\relax} % really needed, else wrong main settings
\def\doplacelocalfootnotes[#1]%
{\bgroup
\setupfootnotes[#1]%
- \placefootnotesintext\localpostponedfootnotes
- \egroup}
+ \ExpandBothAfter\doifinsetelse{\v!geen}{\@@vnplaats}
+ {\placefootnotesasnone\localpostponedfootnotes}%
+ {\placefootnotesintext\localpostponedfootnotes}%
+ \egroup
+ \setupfootnotes\relax}
\def\placelocalfootnotes%
{\dosingleempty\doplacelocalfootnotes}
@@ -846,8 +984,7 @@
\c!breedte=\defaultfootnotewidth,
\c!hoogte=\teksthoogte,
\c!nummercommando=\high,
+ \c!scheider=\@@koscheider,
\c!n=1]
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/core-ntb.tex b/tex/context/base/core-ntb.tex
index 995daf146..2ffc6ffae 100644
--- a/tex/context/base/core-ntb.tex
+++ b/tex/context/base/core-ntb.tex
@@ -14,6 +14,8 @@
%D This is an unfinished, preliminary module. At least two
%D runs are needed to get the table fixed.
+% optie=rek beschrijven
+
\writestatus{loading}{Context Core Macros / Natural Tables}
%D As always, this is the nth version. Much time went in
@@ -57,7 +59,7 @@
\endstrut
\else
\par
- \ifdim\prevdepth<\!!zeropoint % =-1000pt ?
+ \ifdim\prevdepth<\zeropoint % =-1000pt ?
\vskip-\dp\strutbox
\else
\removebottomthings
@@ -69,7 +71,7 @@
%\def\@@tbl{tbl} \def\tblcell{m} \def\tblnone{n}
\def\@@tbl{tbl} \def\tblcell{1} \def\tblnone{2}
-\def\@@tblprefix{tbl:}
+\def\@@tblprefix{tbl:} \let\@@rawtblprefix\@@tblprefix
%D This should be done more efficient:
@@ -122,6 +124,7 @@
\newif\ifautoTBLhsize \autoTBLhsizetrue
\newif\ifautoTBLrowspan \autoTBLrowspantrue
\newif\ifautoTBLemptycell \autoTBLemptycelltrue
+\newif\ifautoTBLcheckwidth \autoTBLcheckwidthtrue
\newif\ifappendTBLsetups \appendTBLsetupstrue
\newif\iftraceTABLE \traceTABLEfalse
@@ -143,13 +146,14 @@
{\ifthirdargument
\processaction
[#1]
- [ \v!rij=>{\dosetupTABLExy[\c!y][#2][#3]},
- \v!kolom=>{\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]},
- \s!unknown=>{\dosetupTABLEzz[#1][#2][#3]}]%
+ [ \v!rij=>{\dosetupTABLExy[\c!y][#2][#3]},
+ \v!kolom=>{\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]},
+ \s!unknown=>{\dosetupTABLEzz[#1][#2][#3]}]%
\else\ifsecondargument
\processaction
[#1]
@@ -159,6 +163,7 @@
c=>{\dosetupTABLExy[\c!x][\v!elk][#2]},
y=>{\dosetupTABLExy[\c!y][\v!elk][#2]},
x=>{\dosetupTABLExy[\c!x][\v!elk][#2]},
+ \v!start=>{\dosetupTABLExy[#1][\v!elk][#2]},
\s!unknown=>{\dosetupTABLEzz[\c!x][#1][#2]}]%
\else
\getparameters[\@@tbl\@@tbl][#1]%
@@ -269,7 +274,7 @@
\increment\row}%
% check max column
\decrement\col
- \ifnum\col>\maximumcol
+ \ifnum\col>\maximumcol\relax
\let\maximumcol\col
\fi
% set values
@@ -283,7 +288,8 @@
\long\def\parseTH[#1]#2\eTH%
% {\parseTD[#1,\c!letter=\v!vet,\c!karakteruitlijnen=\v!nee]#2\eTD}
- {\parseTD[#1,\c!kleur=\tbltblkopkleur,\c!letter=\tbltblkopletter,\c!karakteruitlijnen=\v!nee]#2\eTD}
+ {\parseTD[#1,\c!kleur=\tbltblkopkleur,\c!letter=\tbltblkopletter,%
+ \c!karakteruitlijnen=\v!nee]#2\eTD}
\newtoks\TBLhead
\newtoks\TBLbody
@@ -314,6 +320,11 @@
\chardef\TBLpass=0
+\def\presetallTABLEparameters% each odd|even level
+ {\executeifdefined{\@@rawtblprefix\v!start\v!elk}\relax
+ \executeifdefined{\@@rawtblprefix\v!start\v!oddeven\TBLlevel}\relax
+ \executeifdefined{\@@rawtblprefix\v!start\number\TBLlevel}\relax}
+
\def\bTABLE%
{\dosingleempty\dobTABLE}
@@ -324,10 +335,11 @@
\getparameters
[\@@tbl\@@tbl]
[\c!uitlijnen={\v!rechts,\v!ruim,\v!hoog},#1]%
+ \presetallTABLEparameters
\ExpandFirstAfter\processallactionsinset
[\tbltbloptie]
[\v!rek=>\autoTBLspreadtrue]%
- \linewidth=\tbltbllijndikte % needs to be frozen
+ \linewidth=\tbltbllijndikte % needs to be frozen
\dontcomplain
\def\currentcol{0}%
\def\maximumrowspan{1}%
@@ -353,7 +365,7 @@
{\doifelsetbltag\xrow\xcol
{\exitloop}
{\increment\xcol \relax
- \ifnum\xcol>\maximumcol \exitloop \fi}}%
+ \ifnum\xcol>\maximumcol\relax \exitloop \fi}}%
\doifelsetbltag\xrow\xcol
{\exitloop}
{\let\xxrow\xrow \let\xxcol\xcol \increment\xrow \relax
@@ -403,35 +415,24 @@
\expanded{\doTBL{\row}{\col}}}%
\eTBL}%
\endTBL
-\ifnum\TBLlevel>1
- \vskip-\dp\strutbox
-\fi
+% wrong ! ! ! better to have an auto-offset-overlay
+% \ifnum\TBLlevel>1
+% \vskip-\dp\strutbox
+% \fi
\egroup
\popTBL}
\def\spanTBL#1#2%
{\scratchcounter=\gettblcol{#1}{#2}\relax
\ifnum\scratchcounter>0
- \advance\scratchcounter by -1
+ \advance\scratchcounter -1
\dorecurse{\scratchcounter}{\appendtoks\spantblcol\to\tbltoks}%
- \dorecurse{\scratchcounter}
- {\appendtoks
- \skiptblcol
- \to\tbltoks}%
- \appendtoks
- \nexttblcol
- \to\tbltoks
+ \dorecurse{\scratchcounter}{\appendtoks\skiptblcol\to\tbltoks}%
+ \appendtoks\nexttblcol\to\tbltoks
\fi}
-\def\bTBL%
- {\appendtoks
- \begintblrow
- \to\tbltoks}
-
-\def\eTBL%
- {\appendtoks
- \endtblrow
- \to\tbltoks}
+\def\bTBL{\appendtoks\begintblrow\to\tbltoks}
+\def\eTBL{\appendtoks\endtblrow \to\tbltoks}
% We use aligments to handle the empty (skipped) columns, so
% that we don't have to (re|)|calculate these.
@@ -458,7 +459,7 @@
{\doglobal\newcounter\colTBL
\doglobal\newcounter\rowTBL
\doglobal\decrement\rowTBL
- \tabskip\!!zeropoint
+ \tabskip\zeropoint
\halign\bgroup\ignorespaces##\unskip&&\ignorespaces##\unskip\cr}
\def\endtbl%
@@ -497,13 +498,13 @@
\edef\minimalcellheight{\the\ht\scratchbox}%
\dorecurse{\maximumcol}
{\settblaut\recurselevel\!!zeropoint
-% new
-\let\xcol\recurselevel
-\dorecurse{\maximumrow}
- {\settblwd \recurselevel\xcol\!!zeropoint
- \settblht \recurselevel\xcol\!!zeropoint}%
-% till here
- \settblwid\recurselevel\!!zeropoint}%
+ % new
+ \let\xcol\recurselevel
+ \dorecurse{\maximumrow}
+ {\settblwd \recurselevel\xcol\!!zeropoint
+ \settblht \recurselevel\xcol\!!zeropoint}%
+ % till here
+ \settblwid\recurselevel\!!zeropoint}%
\dorecurse{\maximumrow}
{\settblhei\recurselevel\maxdimen}%
\chardef\TBLpass=1
@@ -533,6 +534,10 @@
\setbox\scratchbox=\vbox{\the\tbltoks}%
\fi
\else\ifautoTBLrowspan\ifnum\maximumrowspan>1 % max ?
+% added jan 2002 because nx=* did no longer work
+ \checktblwidthsone % trial run
+ \checktblwidthstwo % real run
+%
\let\handleTBLcell\dohandleTBLcellC
\setbox\scratchbox=\vbox{\the\tbltoks}%
\fi\fi\fi
@@ -540,7 +545,7 @@
\let\handleTBLcell\dohandleTBLcellD
\chardef\TBLpass=2
\def\makeTBL##1##2% meer in cellD
- {\dimen2=\!!zeropoint
+ {\dimen2=\zeropoint
\pushmacro\colTBL
\dorecurse{\gettblcol{##1}{##2}}
{\advance\dimen2 by \gettblwid\colTBL
@@ -561,7 +566,7 @@
\def\makeTBL##1##2%
{% height
\pushmacro\rowTBL
- \scratchdimen=\!!zeropoint
+ \scratchdimen=\zeropoint
\def\rowTBL{##1}%
\ifnum\gettblcol{##1}{##2}=\maximumcol\relax
% case: nc=maxcolumns
@@ -577,7 +582,7 @@
\popmacro\rowTBL
% width
\pushmacro\colTBL
- \scratchdimen=\!!zeropoint
+ \scratchdimen=\zeropoint
\dorecurse{\gettblcol{##1}{##2}}
{\advance\scratchdimen by \gettblwid\colTBL
\increment\colTBL}%
@@ -593,7 +598,7 @@
{\lower\ht\scratchbox\hbox{\raise\scratchdimen\box\scratchbox}}%
\ht\scratchbox=\scratchdimen
\fi
- \dp\scratchbox=\!!zeropoint
+ \dp\scratchbox=\zeropoint
\box\scratchbox}%
\iftraceTABLE\showtbltoks\fi
\vbox{\the\tbltoks}}
@@ -607,7 +612,7 @@
\!!counta=0
\dorecurse{\maximumcol}
{\scratchdimen=\gettblaut\recurselevel\relax
- \ifdim\scratchdimen>\!!zeropoint\relax
+ \ifdim\scratchdimen>\zeropoint\relax
\advance\!!dimena by -\scratchdimen
\else
\scratchdimen=\gettblwid\recurselevel\relax
@@ -615,7 +620,7 @@
\ifcase#1\else\settblwid\recurselevel\!!zeropoint\fi
\advance\!!counta by 1
\else
- \ifdim\scratchdimen>\!!zeropoint\relax
+ \ifdim\scratchdimen>\zeropoint\relax
\advance\!!dimena by -\scratchdimen
\else
% eigenlijk moet dit alleen als de kolom wordt overspannen door een
@@ -627,12 +632,12 @@
\ifcase\!!counta \else \divide\!!dimena by \!!counta \fi
\dorecurse{\maximumcol}
{\scratchdimen=\gettblwid\recurselevel\relax
- \ifcase#1
- \ifdim\scratchdimen<\!!dimena % take natural width
+ \ifcase#1\relax
+ \ifdim\scratchdimen<\!!dimena % take natural width
\settblaut\recurselevel{\the\scratchdimen}%
\fi
\else
- \ifdim\scratchdimen=\!!zeropoint\relax % auto set width
+ \ifdim\scratchdimen=\zeropoint\relax % auto set width
\settblwid\recurselevel{\the\!!dimena}%
\fi
\fi}%
@@ -643,7 +648,7 @@
% \!!counta=0
% \dorecurse{\maximumcol}
% {\scratchdimen=\gettblaut\recurselevel\relax
-% \ifdim\scratchdimen>\!!zeropoint\relax
+% \ifdim\scratchdimen>\zeropoint\relax
% \advance\!!dimena by -\scratchdimen
% \else
% \advance\!!counta by 1
@@ -651,7 +656,7 @@
% \ifcase\!!counta \else \divide\!!dimena by \!!counta \fi
% \dorecurse{\maximumcol}
% {\scratchdimen=\gettblaut\recurselevel\relax
-% \ifdim\scratchdimen=\!!zeropoint\relax
+% \ifdim\scratchdimen=\zeropoint\relax
% \settblaut\recurselevel{\the\!!dimena}%
% \fi
% \settblwid\recurselevel{\the\!!dimena}%
@@ -741,13 +746,45 @@
\setsecondpasscharacteralign\checkalignment{\strut#2\unskip}%
\ignorespaces}
+% \long\def\dohandleTBLcellA#1#2[#3]#4%
+% {\setbox\scratchbox=\hbox
+% {\setupTBLcell{#1}{#2}%
+% \localframed
+% [\@@tbl\@@tbl]
+% [#3,\c!achtergrond=,\c!kader=\v!uit]% 25% faster
+% {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL\inTBLcell{#1}{#2}}}%
+% \scratchdimen=\gettblwid\colTBL\relax
+% \ifdim\wd\scratchbox>\scratchdimen
+% \settblwid\colTBL{\the\wd\scratchbox}% auto set
+% \fi
+% \let\rowTBLx\rowTBL\increment\rowTBLx
+% \scratchdimen=\gettblhei\rowTBLx\relax
+% \ifdim\ht\scratchbox<\scratchdimen
+% \settblhei\rowTBLx{\the\ht\scratchbox}% auto set
+% \fi
+% \settblht{#1}{#2}{\the\ht\scratchbox}%
+% \settblwd{#1}{#2}{\the\wd\scratchbox}%
+% \ifdim\wd\scratchbox<.75\hsize
+% \ifdim\ht\scratchbox>2\openlineheight % honor width since this can be a
+% \scratchdimen=\gettblaut\colTBL\relax % figure or so
+% \ifdim\wd\scratchbox>\scratchdimen
+% \settblaut\colTBL{\the\wd\scratchbox}%
+% %\message{[forcing width of \colTBL\space(\the\wd\scratchbox/\the\hsize)]}%
+% \fi
+% \fi
+% \fi
+% \setbox2=\null
+% \wd2=\wd\scratchbox \ht2=\ht\scratchbox \dp2=\dp\scratchbox
+% \box2}
+
\long\def\dohandleTBLcellA#1#2[#3]#4%
{\setbox\scratchbox=\hbox
{\setupTBLcell{#1}{#2}%
\localframed
[\@@tbl\@@tbl]
[#3,\c!achtergrond=,\c!kader=\v!uit]% 25% faster
- {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL\inTBLcell{#1}{#2}}}%
+ {\trialtypesettingtrue
+ \bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL\inTBLcell{#1}{#2}}}%
\scratchdimen=\gettblwid\colTBL\relax
\ifdim\wd\scratchbox>\scratchdimen
\settblwid\colTBL{\the\wd\scratchbox}% auto set
@@ -759,15 +796,18 @@
\fi
\settblht{#1}{#2}{\the\ht\scratchbox}%
\settblwd{#1}{#2}{\the\wd\scratchbox}%
- \ifdim\wd\scratchbox<.75\hsize
- \ifdim\ht\scratchbox>2\openlineheight % honor width since this can be a
- \scratchdimen=\gettblaut\colTBL\relax % figure or so
- \ifdim\wd\scratchbox>\scratchdimen
- \settblaut\colTBL{\the\wd\scratchbox}%
- %\message{[forcing width of \colTBL\space(\the\wd\scratchbox/\the\hsize)]}%
+ \ifautoTBLcheckwidth
+ \ifdim\wd\scratchbox<.75\hsize
+ \ifdim\ht\scratchbox>2\openlineheight % honor width since this can be a
+ \scratchdimen=\gettblaut\colTBL\relax % figure or so
+ \ifdim\wd\scratchbox>\scratchdimen
+ \settblaut\colTBL{\the\wd\scratchbox}%
+ % to be translated
+ \writestatus{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}
@@ -778,7 +818,8 @@
\localframed
[\@@tbl\@@tbl]
[#4,#1,\c!kader=\v!uit,\c!achtergrond=]
- {\bTBLCELL#5\eTBLCELL}}%
+ {\trialtypesettingtrue
+ \bTBLCELL#5\eTBLCELL}}%
\setbox2=\null
\wd2=\wd\scratchbox \ht2=\ht\scratchbox \dp2=\dp\scratchbox
\ifautoTBLrowspan
@@ -793,11 +834,11 @@
\long\def\dohandleTBLcellB#1#2[#3]#4%
{\scratchdimen=\gettblaut\colTBL\relax
- \ifdim\scratchdimen>\!!zeropoint\relax
+ \ifdim\scratchdimen>\zeropoint\relax
\let\tblwidthkey\c!breedte \edef\tblwidth{\the\scratchdimen}%
\else
\scratchdimen=\gettblwid\colTBL\relax
- \ifdim\scratchdimen>\!!zeropoint\relax
+ \ifdim\scratchdimen>\zeropoint\relax
\ifnum\gettblcol{#1}{#2}=\maximumcol\relax
\scratchdimen=\hsize
\fi
@@ -817,14 +858,15 @@
[\@@tbl\@@tbl]
[#3,\c!breedte=\widthTBL,
\c!achtergrond=,\c!kader=\v!uit]% 25% faster
- {\bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}}
+ {\trialtypesettingtrue
+ \bTBLCELL\TBLcharalign{#2}{#4}\eTBLCELL}}
\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
[\tbltblkleur] % as well as permits local colors to take precedence
- {\ifdim\heightTBL=\!!zeropoint\relax % case: nc=maxcolumns
+ {\ifdim\heightTBL=\zeropoint\relax % case: nc=maxcolumns
\localframed
[\@@tbl\@@tbl]
[\c!kleur=,\c!breedte=\widthTBL]
@@ -904,11 +946,11 @@
\fi
\doglobal\decrement\TBLlevel\relax}
-\chardef\resetTABLEmode=0
+\newconditional\resetTABLEmode \settrue\resetTABLEmode
\def\resetallTABLEparameters% moet genest wel werken
{\ifnum\TBLlevel>1 % in ieder geval
- \ifcase\resetTABLEmode
+ \ifconditional\resetTABLEmode
\presetlocalframed % breedte hoogte diepte offset
[\@@tbl\@@tbl]% % achtergrond, achtergrondraster, achtergrondkleur
% not ok yet
@@ -918,8 +960,8 @@
\c!kaderkleur=black,
\c!kleur=,
\c!letter=,
-\c!kopletter=,
-\c!kopkleur=,
+ \c!kopletter=,
+ \c!kopkleur=,
\c!strut=\v!nee,
\c!karakteruitlijnen=\v!nee,
\c!uitlijnkarakter={,},
diff --git a/tex/context/base/core-num.tex b/tex/context/base/core-num.tex
index 45ce75092..bcab02ef6 100644
--- a/tex/context/base/core-num.tex
+++ b/tex/context/base/core-num.tex
@@ -31,43 +31,49 @@
\newif\ifnummeren
+\def\@@thenumber#1{\s!number\csname\s!number#1\c!nummer\endcsname}
+
\def\dostelnummerin[#1][#2]%
- {\@EA\let\@EA\savedstartnumber\csname\s!number#1\c!start\endcsname
- \getparameters[\s!number#1][\c!start=,#2]%
- \doifelsevaluenothing{\s!number#1\c!start}
- {\letvalue{\s!number#1\c!start}=\savedstartnumber}
- {\setcounter{\s!number#1}{\getvalue{\s!number#1\c!start}}}}
+ {\@EA\let\@EA\savedstartnumber\csname\@@thenumber{#1}\c!start\endcsname
+ \getparameters[\@@thenumber{#1}][\c!start=,#2]%
+ \doifelsevaluenothing{\@@thenumber{#1}\c!start}
+ {\letvalue{\@@thenumber{#1}\c!start}=\savedstartnumber}
+ {\setcounter{\@@thenumber{#1}}{\getvalue{\@@thenumber{#1}\c!start}}}}
-\def\stelnummerin%
+\def\stelnummerin
{\dodoubleargument\dostelnummerin}
\def\dodefinieernummer[#1][#2]% ook overal class als localframed
+ {\doifassignmentelse{#2}
+ {\dododefinieernummer[#1][#2]}
+ {\doifelsenothing{#2} % can break on not yet defined macros in #2
+ {\dododefinieernummer[#1][#2]}
+ {\setvalue{\s!number#1\c!nummer}{#2}}}}
+
+\def\dododefinieernummer[#1][#2]%
{\getparameters
[\s!number#1]
- [\s!check=,
+ [\c!nummer=#1,
+ \s!check=,
\c!wijze=\@@nrwijze,
- \c!wijze\c!lokaal=\getvalue{\s!number#1\c!wijze},
+ \c!wijze\c!lokaal=\getvalue{\@@thenumber{#1}\c!wijze},
\c!sectienummer=\v!ja,
- \c!tekst=,
- \c!plaats=, % was: \c!zetwijze
+ \c!tekst=, % weg hier
+ \c!plaats=, % weg hier, was trouwens \c!zetwijze
\c!conversie=\v!cijfers,
\c!start=0,
#2]%
- \makecounter{\s!number#1}%
- \setcounter{\s!number#1}{\getvalue{\s!number#1\c!start}}}
-
-% \c!nummer=#1 ; nogal veel copieen nodig
-%
-% \def\@@thenumber#1{\s!number\getvalue{\s!number#1\c!nummer}}
+ \makecounter{\@@thenumber{#1}}%
+ \setcounter{\@@thenumber{#1}}{\getvalue{\@@thenumber{#1}\c!start}}}
\def\definieernummer%
{\dodoubleempty\dodefinieernummer}
\def\setnummer[#1]#2%
- {\setcounter{\s!number#1}{#2}}
+ {\setcounter{\@@thenumber{#1}}{#2}}
\def\resetnummer[#1]%
- {\setcounter{\s!number#1}{0\getvalue{\s!number#1\c!start}}}
+ {\setcounter{\@@thenumber{#1}}{0\csname\@@thenumber{#1}\c!start\endcsname}}
\def\dodoreset#1%
{\getvalue{\s!reset#1}}%
@@ -78,40 +84,57 @@
\def\reset%
{\dosingleargument\doreset}
-\def\verhoognummer[#1]%
- {\checknummer{#1}%
- \ifnummeren
- \else
- \resetcounter{\s!number#1}%
- \fi
- \pluscounter{\s!number#1}}
+%\def\verhoognummer[#1]%
+% {\checknummer{#1}%
+% \ifnummeren
+% \else
+% \resetcounter{\@@thenumber{#1}}%
+% \fi
+% \pluscounter{\@@thenumber{#1}}}
\def\savenumber[#1]%
- {\savecounter{\s!number#1}}
+ {\savecounter{\@@thenumber{#1}}}
\def\restorenumber[#1]%
- {\restorecounter{\s!number#1}}
+ {\restorecounter{\@@thenumber{#1}}}
% nieuw, maar kan dit (i.v.m. (sub)page?)
+% \def\verhoognummer[#1]%
+% {\checknummer{#1}%
+% \ifnummeren
+% \pluscounter{\@@thenumber{#1}}%
+% \else
+% \setcounter{\@@thenumber{#1}}{0\csname\@@thenumber{#1}\c!start\endcsname}%
+% \fi}
+
\def\verhoognummer[#1]%
- {\checknummer{#1}%
+ {\doifelsevalue{\@@thenumber{#1}\c!wijze}{\v!per\v!pagina}
+ {\checkpagechange{#1}%
+ \ifpagechanged\resetcounter{\@@thenumber{#1}}\fi}
+ {\checknummer{#1}}%
\ifnummeren
- \pluscounter{\s!number#1}%
+ \pluscounter{\@@thenumber{#1}}%
\else
- \setcounter{\s!number#1}{0\getvalue{\s!number#1\c!start}}%
+ \setcounter{\@@thenumber{#1}}{0\getvalue{\@@thenumber{#1}\c!start}}%
\fi}
+% \defineenumeration [test] [way=bypage,text=\lastchangedpage]
+%
+% \starttext \dorecurse{10}{\test \input tufte \par} \stoptext
+
\def\verlaagnummer[#1]%
- {\minuscounter{\s!number#1}}
+ {\minuscounter{\@@thenumber{#1}}}
\def\nummer[#1]%
{\convertnumber
- {\getvalue{\s!number#1\c!conversie}}
- {\countervalue{\s!number#1}}}
+ {\getvalue{\@@thenumber{#1}\c!conversie}}
+ {\countervalue{\@@thenumber{#1}}}}
\def\ruwenummer[#1]%
- {\countervalue{\s!number#1}}
+ {\countervalue{\@@thenumber{#1}}}
+
+\ifx\checknummer\undefined \let\checknummer\gobbleoneargument \fi
% ook de pag nummers hierheen halen ivm \@@nrwijze
diff --git a/tex/context/base/core-obj.tex b/tex/context/base/core-obj.tex
index ffbd9ad34..c8d978a34 100644
--- a/tex/context/base/core-obj.tex
+++ b/tex/context/base/core-obj.tex
@@ -86,13 +86,16 @@
\newif\ifinobject
+\def\objectplaceholder{NOT YET FLUSHED}%
+
\def\presetobject#1#2%
- {\doifundefined{\r!object#1::#2}
- {\setxvalue{\r!object#1::#2}{NOT YET FLUSHED}}}
+ {\ifundefined{\r!object#1::#2}%
+ \@EA\let\csname\r!object#1::#2\endcsname\objectplaceholder
+ \fi}
-\def\dosetobject#1#2#3% evt \initializepaper naar \everyshipout
- {\initializepaper
- \ifundefined{\r!object#2::#3}%
+\def\dosetobject#1#2#3% \initializepaper this will move to \everyshipout
+ {\initializepaper
+ \ifundefined{\r!object#2::#3}%
\expandafter\dodosetobject
\else
\expandafter\gobblefivearguments
@@ -106,105 +109,62 @@
\def\objectoffset{1cm}
-% \def\dodosetobject#1#2#3%
-% {\bgroup
-% \inobjecttrue
-% \dowithnextbox
-% {\bgroup
-% \dontshowcomposition % rather fuzzy in \setxvalue ... \hbox
-% \setxvalue{\r!object#2::#3}%
-% {\noexpand\dohandleobject{#2}{#3}
-% {\ifhbox\nextbox\hbox\else\vbox\fi}
-% %{\the\wd\nextbox}{\the\ht\nextbox}{\the\dp\nextbox}}%
-% {\number\wd\nextbox}{\number\ht\nextbox}{\number\dp\nextbox}}%
-% \expanded % fix the dimensions since \dostartobject may use \nextbox
-% {\dostartobject
-% {#2}{#3}
-% {\number\wd\nextbox}{\number\ht\nextbox}{\number\dp\nextbox}}%
-% \ifcase#1\relax\else\ifdim\objectoffset>\!!zeropoint\relax
-% \scratchdimen=\objectoffset
-% \edef\next%
-% {\wd\nextbox\the\wd\nextbox
-% \ht\nextbox\the\ht\nextbox
-% \dp\nextbox\the\dp\nextbox}%
-% \setbox\nextbox=\vbox spread 2\scratchdimen
-% {\forgetall
-% \vss
-% \hbox spread 2\scratchdimen{\hss\box\nextbox\hss}%
-% \vss}%
-% \setbox\nextbox=\hbox
-% {\hskip-\scratchdimen\lower\scratchdimen\box\nextbox}%
-% \next
-% \fi\fi
-% \box\nextbox
-% \dostopobject
-% \egroup
-% \egroup}}
-
\def\dodosetobject#1#2#3%
{\bgroup
\inobjecttrue
- \dowithnextbox
- {\bgroup
- \dontshowcomposition % rather fuzzy in \setxvalue ... \hbox
- \setxvalue{\r!object#2::#3}%
- {\noexpand\dohandleobject{#2}{#3}
- {\ifhbox\nextbox\hbox\else\vbox\fi}
- %{\the\wd\nextbox}{\the\ht\nextbox}{\the\dp\nextbox}}%
- {\number\wd\nextbox}{\number\ht\nextbox}{\number\dp\nextbox}}%
- \expanded % fix the dimensions since \dostartobject may use \nextbox
- {\dostartobject
- {#2}{#3}
- {\number\wd\nextbox}{\number\ht\nextbox}{\number\dp\nextbox}}%
- \ifcase#1\relax
- \box\nextbox
- \else\ifdim\objectoffset>\!!zeropoint
- \scratchdimen=\objectoffset
- \edef\width {\the\wd\nextbox}%
- \edef\height{\the\ht\nextbox}%
- \edef\depth {\the\dp\nextbox}%
- \setbox\nextbox=
- \vbox spread 2\scratchdimen
- {\forgetall
- \vss
- \hbox spread 2\scratchdimen{\hss\box\nextbox\hss}%
- \vss}%
- \setbox\nextbox=\hbox
- {\hskip-\scratchdimen\lower\scratchdimen\box\nextbox}%
- \wd\nextbox=\width
- \ht\nextbox=\height
- \dp\nextbox=\depth
- \box\nextbox
- \else
- \box\nextbox
- \fi\fi
- \dostopobject
- \egroup
- \egroup}}
+ \dowithnextbox{\dododosetobject{#1}{#2}{#3}\egroup}}
+
+\def\dododosetobject#1#2#3%
+ {\dontshowcomposition % rather fuzzy in \setxvalue ... \hbox
+ \@EA\xdef\csname\r!object#2::#3\endcsname
+ {\noexpand\dohandleobject{#2}{#3}%
+ {\ifhbox\nextbox\hbox\else\vbox\fi}%
+ %{\the\wd\nextbox}{\the\ht\nextbox}{\the\dp\nextbox}}%
+ {\number\wd\nextbox}{\number\ht\nextbox}{\number\dp\nextbox}}%
+ \expanded % freeze the dimensions since \dostartobject may use \nextbox
+ {\dostartobject
+ {#2}{#3}{\the\wd\nextbox}{\the\ht\nextbox}{\the\dp\nextbox}}%
+ \ifcase#1\relax\else \ifdim\objectoffset>\zeropoint
+ \scratchdimen\objectoffset
+ \edef\width {\the\wd\nextbox}%
+ \edef\height{\the\ht\nextbox}%
+ \edef\depth {\the\dp\nextbox}%
+ \setbox\nextbox\vbox spread 2\scratchdimen
+ {\forgetall
+ \vss\hbox spread 2\scratchdimen{\hss\box\nextbox\hss}\vss}%
+ \setbox\nextbox\hbox
+ {\hskip-\scratchdimen\lower\scratchdimen\box\nextbox}%
+ \wd\nextbox\width
+ \ht\nextbox\height
+ \dp\nextbox\depth
+ \fi \fi
+ \box\nextbox
+ \dostopobject}
\def\dogetobject#1#2#3#4#5#6%
{\initializepaper
\bgroup
\forgetall
\dontshowcomposition
- \setbox0=\vbox
+ \setbox\scratchbox\vbox
{\doinsertobject{#1}{#2}}%
- \setbox0=#3%
+ \setbox\scratchbox#3%
{\vbox to #5\s!sp
- {\ifdim\ht0>#5\s!sp % or \ifdim\wd0>#4\s!sp
- \vss\hbox to #4\s!sp{\hss\box0\hss}\vss
+ {\ifdim\ht\scratchbox>#5\s!sp
+ % or \ifdim\wd\scratchbox>#4\s!sp
+ \vss\hbox to #4\s!sp{\hss\box\scratchbox\hss}\vss
\else
- \vss\box0
+ \vss\box\scratchbox
\fi}}%
- \wd0=#4\s!sp
- \ht0=#5\s!sp
- \dp0=#6\s!sp
- \box0
+ \wd\scratchbox#4\s!sp
+ \ht\scratchbox#5\s!sp
+ \dp\scratchbox#6\s!sp
+ \box\scratchbox
\egroup}
\def\getobject#1#2%
{\let\dohandleobject\dogetobject
- \getvalue{\r!object#1::#2}}
+ \csname\r!object#1::#2\endcsname}
%D If needed one can ask for the dimensions of an object with:
%D
@@ -225,7 +185,7 @@
\let\objectwidth \!!zeropoint
\let\objectheight\!!zeropoint
\let\objectdepth \!!zeropoint
- \getvalue{\r!object#1::#2}}
+ \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
@@ -246,20 +206,27 @@
\newif\ifobjectreferencing \objectreferencingtrue
\def\checkobjectreferences%
- {\bgroup
- \setbox0=\hbox
- {\doutilities{objectreferences}{\jobname}{}{}{}}%
- \global\let\checkobjectreferences=\relax
- \egroup}
-
-\def\setobjectreferences%
+ {\startnointerference
+ \doutilities{objectreferences}\jobname\empty\empty\empty
+ \global\let\checkobjectreferences\relax
+ \stopnointerference}
+
+% \def\setobjectreferences
+% {\def\objectreference##1##2##3%
+% {\doifundefinedelse{\r!driver##1::##2}
+% {\setxvalue{\r!driver##1::##2}{##3}}
+% {\showmessage{\m!references}{31}{[##1 ##2=>##3]}}}}
+
+\def\setobjectreferences
{\def\objectreference##1##2##3%
- {\doifundefinedelse{\r!driver##1::##2}
- {\setxvalue{\r!driver##1::##2}{##3}}
- {\showmessage{\m!references}{31}{[##1 ##2=>##3]}}}}
+ {\ifundefined{\r!driver##1::##2}%
+ \setxvalue{\r!driver##1::##2}{##3}%
+ \else
+ \showmessage{\m!references}{31}{[##1 ##2=>##3]}%
+ \fi}}
-\def\resetobjectreferences%
- {\let\objectreference=\gobblethreearguments}
+\def\resetobjectreferences
+ {\let\objectreference\gobblethreearguments}
\resetobjectreferences
@@ -267,7 +234,7 @@
{\checkobjectreferences
\ifobjectreferencing
\bgroup
- \edef\dowritereference%
+ \edef\dowritereference% why not immediate ?
{\writeutilitycommand{\objectreference{#1}{#2}{#3}}}%
\dowritereference
\egroup
@@ -278,12 +245,21 @@
\def\defaultobjectreference#1#2{0}
+% \def\dogetobjectreference#1#2#3%
+% {\checkobjectreferences
+% \doifdefinedelse{\r!driver#1::#2}
+% {\@EA\xdef\@EA#3\@EA{\csname\r!driver#1::#2\endcsname}}
+% {\showmessage{\m!references}{30}{[#1 #2=>\defaultobjectreference{#1}{#2}]}%
+% \xdef#3{\defaultobjectreference{#1}{#2}}}}
+
\def\dogetobjectreference#1#2#3%
{\checkobjectreferences
- \doifdefinedelse{\r!driver#1::#2}
- {\@EA\xdef\@EA#3\@EA{\csname\r!driver#1::#2\endcsname}}
- {\showmessage{\m!references}{30}{[#1 #2=>\defaultobjectreference{#1}{#2}]}%
- \xdef#3{\defaultobjectreference{#1}{#2}}}}
+ \ifundefined{\r!driver#1::#2}%
+ \showmessage{\m!references}{30}{[#1 #2=>\defaultobjectreference{#1}{#2}]}%
+ \xdef#3{\defaultobjectreference{#1}{#2}}%
+ \else
+ \global\@EA\let\@EA#3\csname\r!driver#1::#2\endcsname
+ \fi}
\def\setobject {\global\objectreferencingfalse\dosetobject1}
\def\settightobject{\global\objectreferencingfalse\dosetobject0}
@@ -299,12 +275,43 @@
%D \doifobjectreferencefoundelse{class}{object}{do then}{do else}
%D \stoptypen
-\def\doifobjectfoundelse#1#2#3#4%
- {\doifundefinedelse{\r!object#1::#2}{#4}{#3}}
+\beginTEX
+
+\def\doifobjectfoundelse#1#2%
+ {\@EA\ifx\csname\r!object#1::#2\endcsname\relax
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\def\doifobjectreferencefoundelse#1#2%
+ {\checkobjectreferences
+ \@EA\ifx\csname\r!driver#1::#2\endcsname\relax
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
+
+\endTEX
+
+\beginETEX
-\def\doifobjectreferencefoundelse#1#2#3#4%
+\def\doifobjectfoundelse#1#2%
+ {\ifcsname\r!object#1::#2\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\def\doifobjectreferencefoundelse#1#2%
{\checkobjectreferences
- \doifundefinedelse{\r!driver#1::#2}{#4}{#3}}
+ \ifcsname\r!driver#1::#2\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
+
+\endETEX
%D \macros
%D {doifobjectssupportedelse}
@@ -322,11 +329,11 @@
\newif\ifobjectssupported \objectssupportedtrue
-\def\doifobjectssupportedelse#1#2%
+\def\doifobjectssupportedelse
{\ifobjectssupported
- \doifspecialavailableelse\doinsertobject{#1}{#2}%
+ \@EA\doifspecialavailableelse\@EA\doinsertobject
\else
- #2%
+ \@EA\secondoftwoarguments
\fi}
%D There is a conceptual problem here. Objects are not possible
@@ -335,6 +342,4 @@
%D support objects while we still want to be able to use the
%D \DVI\ output.
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/core-par.tex b/tex/context/base/core-par.tex
index b6279d7db..b67c1e4e1 100644
--- a/tex/context/base/core-par.tex
+++ b/tex/context/base/core-par.tex
@@ -105,6 +105,10 @@
\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
diff --git a/tex/context/base/core-pos.tex b/tex/context/base/core-pos.tex
index 6d00fb8db..65773bcf4 100644
--- a/tex/context/base/core-pos.tex
+++ b/tex/context/base/core-pos.tex
@@ -101,7 +101,8 @@
{\dosetpositionnm\@@posp{#2}%
\dosetpositionpt\@@posx{#3}%
\dosetpositionpt\@@posy{#4}%
- \setxvalue{\POSprefix#1}{\@@posp,\@@posx,\@@posy}}%
+ %\setxvalue{\POSprefix#1}{\@@posp,\@@posx,\@@posy}}%
+ \@EA\xdef\csname\POSprefix#1\endcsname{\@@posp,\@@posx,\@@posy}}%
\def\setpospxywhd#1#2#3#4#5#6#7%
{\dosetpositionnm\@@posp{#2}%
@@ -110,7 +111,9 @@
\dosetpositionpt\@@posw{#5}%
\dosetpositionpt\@@posh{#6}%
\dosetpositionpt\@@posd{#7}%
- \setxvalue{\POSprefix#1}{\@@posp,\@@posx,\@@posy,\@@posw,\@@posh,\@@posd}}%
+ %\setxvalue{\POSprefix#1}{\@@posp,\@@posx,\@@posy,\@@posw,\@@posh,\@@posd}}%
+ \@EA\xdef\csname\POSprefix#1\endcsname{\@@posp,\@@posx,\@@posy,\@@posw,\@@posh,\@@posd}}%
+
\def\setpospxyplus#1#2#3#4#5#6#7#8%
{\dosetpositionnm\@@posp{#2}%
@@ -119,7 +122,8 @@
\dosetpositionpt\@@posw{#5}%
\dosetpositionpt\@@posh{#6}%
\dosetpositionpt\@@posd{#7}%
- \setxvalue{\POSprefix#1}{\@@posp,\@@posx,\@@posy,\@@posw,\@@posh,\@@posd,#8}}
+ %\setxvalue{\POSprefix#1}{\@@posp,\@@posx,\@@posy,\@@posw,\@@posh,\@@posd,#8}}
+ \@EA\xdef\csname\POSprefix#1\endcsname{\@@posp,\@@posx,\@@posy,\@@posw,\@@posh,\@@posd,#8}}
%D We need to initialize.
@@ -235,6 +239,17 @@
\@EA\@EA\@EA#1\csname\POSprefix#2\endcsname,0,0,0,0\relax
\fi}
+\beginETEX
+
+\def\doMPxyhdwlr#1#2% evt kan \s!unknown leeg zijn
+ {\@EA\@EA\@EA#1\csname\POSprefix
+ \ifcsname\POSprefix#2\endcsname#2\else\s!unknown\fi\endcsname
+ ,0,0,0,0\relax}
+
+\setvalue{\POSprefix\s!unknown}{0,0,0}
+
+\endETEX
+
%D \macros
%D {MPplus, MPrest, MPv, MPvv}
%D
@@ -263,6 +278,17 @@
\@EA\@EA\@EA#1\csname\POSprefix#2\endcsname,,,,,,,,,\relax{#3}%
\fi}
+% \beginETEX
+%
+% \def\MPdoplus#1#2#3#4%
+% {\ifcsname\POSprefix#2\endcsname
+% \@EA\@EA\@EA#1\csname\POSprefix#2\endcsname,,,,,,,,,\relax{#3}%
+% \else
+% #4%
+% \fi}
+%
+% \endETEX
+
\def\doMPplus#1,#2,#3,#4,#5,#6,%
{\dodoMPplus}
@@ -304,7 +330,7 @@
{\ifpositioning \else
\global\positioningtrue
\dosetpositionpapersize
- {\number\printpapierbreedte}
+ {\number\printpapierbreedte}%
{\number\printpapierhoogte }%
\fi
\doglobal\increment\currentpositions}
@@ -320,12 +346,12 @@
{\initializenextposition
\def\currentposition{#1}%
\dosetpositionwhd
- {#1}
- {\number\wd\nextbox}
- {\number\ht\nextbox}
+ {\currentposition}% {#1}%
+ {\number\wd\nextbox}%
+ {\number\ht\nextbox}%
{\number\dp\nextbox}%
\setbox\positionbox=\box\nextbox
- \dopositionaction{#1}%
+ \dopositionaction\currentposition % {#1}%
\box\positionbox
\hss}}}
@@ -335,13 +361,13 @@
{\initializenextposition
\def\currentposition{#1}%
\dosetpositionplus
- {#1}
- {\number\wd\nextbox}
- {\number\ht\nextbox}
- {\number\dp\nextbox}
+ {\currentposition}% {#1}%
+ {\number\wd\nextbox}%
+ {\number\ht\nextbox}%
+ {\number\dp\nextbox}%
{#2}%
\setbox\positionbox=\box\nextbox
- \dopositionaction{#1}%
+ \dopositionaction\currentposition % {#1}%
\box\positionbox
\hss}}}
@@ -402,8 +428,15 @@
%D \doifpositionelse {identifier} {found action} {not found action}
%D \stoptypen
+% \def\doifpositionelse#1%
+% {\doifdefinedelse{\POSprefix#1}}
+
\def\doifpositionelse#1%
- {\doifdefinedelse{\POSprefix#1}}
+ {\ifundefined{\POSprefix#1}%
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
%D We have now arrived at a few macros that would make sense as
%D support macros, but ended up in the core.
@@ -442,14 +475,14 @@
% \rlap{#2\box0}}}
\def\bpos#1{\hpos{b:#1}{\strut}\ignorespaces}
-\def\epos#1{\ifhmode\unskip\fi\hpos{e:#1}{\strut}}
+\def\epos#1{\removelastspace\hpos{e:#1}{\strut}}
\def\fpos#1%
{\setpositionplus{b:#1}{\parposcounter}\hbox{\strut}%
\ignorespaces}
\def\tpos#1%
- {\ifhmode\unskip\fi
+ {\removelastspace
\setpositionplus{e:#1}{\parposcounter}\hbox{\strut}}
\def\ffpos#1%
@@ -457,7 +490,7 @@
\ignorespaces}
\def\ttpos#1%
- {\ifhmode\unskip\fi
+ {\removelastspace
\setpositionbox{e:#1}\hbox{\strut}}
\def\wpos#1%
@@ -486,11 +519,17 @@
% we can check for used entries, and if not, then not add one
\def\registerparoptions%
- {\ifinpagebody \else \ifpositioning \ifpositioningpar
- \ifmmode \else \ifinformula \else
- \doregisterparoptions
- \fi \fi
- \fi \fi \fi}
+ {\ifpositioningpar
+ \ifpositioning
+ \ifinpagebody \else
+ \ifmmode \else
+ \ifinformula \else
+ \doregisterparoptions
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi}
\def\doregisterparoptions%
{\doglobal\increment\parposcounter
@@ -542,13 +581,13 @@
\fi\fi
\fi}%
\dimen 0=\MPx{#1}%
- \dimen 2=\MPx{#1}\advance\dimen 2 by \MPw{#1}%
- \dimen 4=\MPy{#1}\advance\dimen 4 by -\MPd{#1}%
- \dimen 6=\MPy{#1}\advance\dimen 6 by \MPh{#1}%
+ \dimen 2=\MPx{#1}\advance\dimen 2 \MPw{#1}%
+ \dimen 4=\MPy{#1}\advance\dimen 4 -\MPd{#1}%
+ \dimen 6=\MPy{#1}\advance\dimen 6 \MPh{#1}%
\dimen10=\MPx{#2}%
- \dimen12=\MPx{#2}\advance\dimen12 by \MPw{#2}%
- \dimen14=\MPy{#2}\advance\dimen14 by -\MPd{#2}%
- \dimen16=\MPy{#2}\advance\dimen16 by \MPh{#2}%
+ \dimen12=\MPx{#2}\advance\dimen12 \MPw{#2}%
+ \dimen14=\MPy{#2}\advance\dimen14 -\MPd{#2}%
+ \dimen16=\MPy{#2}\advance\dimen16 \MPh{#2}%
%\message{\the\dimen 0-\the\dimen 2,\the\dimen 4-\the\dimen 6}\wait
%\message{\the\dimen10-\the\dimen12,\the\dimen14-\the\dimen16}\wait
\check04\check24\check26\check06\ifdone\egroup#3\else\egroup#4\fi
@@ -600,12 +639,12 @@
\def\placepositionanchors% todo : depth pagebox
{\ifpositioning
- \setbox\scratchbox=\vbox to \teksthoogte
+ \setbox\scratchbox\vbox to \teksthoogte
{\topskipcorrection
\hbox{\strut\dopositionaction\headanchor}%
\vfill
\hbox{\strut\dopositionaction\tailanchor}}%
- \dp\scratchbox=\zeropoint
+ \dp\scratchbox\zeropoint
\hpos\textanchor{\box\scratchbox}%
\else
\vskip\teksthoogte
@@ -618,33 +657,36 @@
\def\headanchor{head:\realfolio} % virtual position
\def\tailanchor{tail:\realfolio} % virtual position
-\def\presetpositionanchors% compatibility hack
+\def\presetpositionanchors% compatibility hack (still needed?)
{\ifpositioning
- \bgroup
- \dimen0=\ifdim\topskip>\ht\strutbox\topskip\else\ht\strutbox\fi
- \dimen2=\MPy\textanchor
- \dimen4=\dimen2
- \advance\dimen2 \MPh\textanchor % space is essential
- \advance\dimen2 -\dimen0
- \advance\dimen4 \dp\strutbox
- \dimen6=\MPx\textanchor
- \dimen8=\MPw\textanchor
- \setxvalue{\POSprefix\headanchor}%
- {\realfolio,\withoutpt{\the\dimen6},\withoutpt{\the\dimen2},%
- \withoutpt{\the\dimen8},\withoutpt{\the\dimen0},\withoutpt{\the\dp\strutbox}}%
- \setxvalue{\POSprefix\tailanchor}%
- {\realfolio,\withoutpt{\the\dimen6},\withoutpt{\the\dimen4},%
- \withoutpt{\the\dimen8},\withoutpt{\the\ht\strutbox},\withoutpt{\the\dp\strutbox}}%
- % \showanchor\textanchor\showanchor\headanchor\showanchor\tailanchor\wait
- \egroup
+ \dopresetpositionanchors
\fi}
+\def\dopresetpositionanchors
+ {\bgroup
+ \dimen0=\ifdim\topskip>\ht\strutbox\topskip\else\ht\strutbox\fi
+ \dimen2=\MPy\textanchor
+ \dimen4=\dimen2
+ \advance\dimen2 \MPh\textanchor % space is essential
+ \advance\dimen2 -\dimen0
+ \advance\dimen4 \dp\strutbox
+ \dimen6=\MPx\textanchor
+ \dimen8=\MPw\textanchor
+ \setxvalue{\POSprefix\headanchor}%
+ {\realfolio,\withoutpt{\the\dimen6},\withoutpt{\the\dimen2},%
+ \withoutpt{\the\dimen8},\withoutpt{\the\dimen0},\withoutpt{\the\dp\strutbox}}%
+ \setxvalue{\POSprefix\tailanchor}%
+ {\realfolio,\withoutpt{\the\dimen6},\withoutpt{\the\dimen4},%
+ \withoutpt{\the\dimen8},\withoutpt{\the\ht\strutbox},\withoutpt{\the\dp\strutbox}}%
+ %\showanchor\textanchor\showanchor\headanchor\showanchor\tailanchor\wait
+ \egroup}
+
\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 befor and after each page.
+%D We set these anchors before and after each page.
\appendtoks \presetpositionanchors \to \beforeeverypage
\appendtoks \presetpositionanchors \to \aftereverypage
@@ -699,7 +741,7 @@
%D
%D \typebuffer[graphic]
-\def\MPanchoridentifier{mp-anchor}
+\def\MPanchoridentifier{mp-anchor} % {MPA} % {mp-anchor}
\def\MPoverlayposprefix{MO::}
\long\def\defineMPpositiongraphic#1%
@@ -772,7 +814,7 @@
{\handlepositionaction\dohandlepositionboxes\with{#1}{#2}{#3}\on{#2}}
\def\doinsertpositionboxes#1#2#3% pos tag setups
- {\ifnum\MPp{#1}=\realpageno
+ {\ifnum\MPp{#1}=\realpageno\relax
% \doifdefined{\MPoverlayposprefix#1}
% {\getvalue{\MPoverlayposprefix#1}{#1}{#2}{#3}}%
\executeifdefined{\MPoverlayposprefix#1}%
@@ -832,7 +874,7 @@
\def\doMPpositiongraphic##1##2{\getvalue{MPG:##1}}% temp hack
\setbox\positiongraphicbox=\hbox
{\doifdefinedelse{MPM:#1} % method
- {\ignorespaces\getvalue{MPM:#1}\unskip}
+ {\ignorespaces\getvalue{MPM:#1}\removelastspace}
{\getvalue{MPG:#1}}}%
\smashbox\positiongraphicbox
\box\positiongraphicbox
@@ -857,7 +899,7 @@
{\handlepositionaction\dohandleMPpositiongraphic\with{#1}{#2}{#3}\on{#2}}
\def\doinsertMPpositiongraphic#1#2#3% pos tag setups
- {\ifnum\MPp{#1}=\realpageno % extra saveguard
+ {\ifnum\MPp{#1}=\realpageno\relax % extra saveguard
\def\currentposition{#1}\MPpositiongraphic{#2}{#3}%
\fi}
@@ -891,9 +933,9 @@
\def\doinsertMPpositiongraphicrange#1#2#3#4% pos tag setups
{\donefalse
- \ifnum\MPp{#1}=\realpageno \donetrue
- \else\ifnum\MPp{#2}=\realpageno \donetrue
- \else\ifnum\MPp{#1}<\realpageno\ifnum\MPp{#2}>\realpageno \donetrue
+ \ifnum\MPp{#1}=\realpageno\relax \donetrue
+ \else\ifnum\MPp{#2}=\realpageno\relax \donetrue
+ \else\ifnum\MPp{#1}<\realpageno\relax\ifnum\MPp{#2}>\realpageno\donetrue
\fi\fi\fi\fi \ifdone
\def\currentposition{#1}\MPpositiongraphic{#3}{#4}%
\fi}
@@ -987,30 +1029,30 @@
boxlineradius := \MPvar{lineradius} ;
\stopuseMPgraphic
-\startMPpositionmethod{mpos:par}
- \doifpositionelse{w:\MPvar{self}}
- {\startMPpositiongraphic{mpos:par}%
- {fillcolor,linecolor,gridcolor,linewidth,gridwidth,lineradius}
- initialize_area_par(\MPpos{b:\MPvar{self}},
- \MPpos{e:\MPvar{self}},
- \MPpos{w:\MPvar{self}}) ;
- \includeMPgraphic{mpos:par:setup} ;
- \includeMPgraphic{\MPvar{mp}} ; % \includeMPgraphic{mpos:par:shape} ;
- anchor_par(\MPanchor{b:\MPvar{self}}) ;
- \stopMPpositiongraphic}
- {\startMPpositiongraphic{mpos:par}%
- {fillcolor,linecolor,gridcolor,linewidth,gridwidth,lineradius}
- initialize_par(\MPpos{b:\MPvar{self}},
- \MPpos{e:\MPvar{self}},
- \MPpos{text:\realfolio},
- \MPpos{p:\parcounter},
- \MPvv {p:\parcounter}{0,0,0,0,0,0}) ;
- \includeMPgraphic{mpos:par:setup} ;
- \includeMPgraphic{\MPvar{mp}} ; % \includeMPgraphic{mpos:par:shape} ;
- anchor_par(\MPanchor{b:\MPvar{self}}) ;
- \stopMPpositiongraphic}%
- \MPpositiongraphic{mpos:par}{}%
-\stopMPpositionmethod
+% \startMPpositionmethod{mpos:par}
+% \doifpositionelse{w:\MPvar{self}}
+% {\startMPpositiongraphic{mpos:par}%
+% {fillcolor,linecolor,gridcolor,linewidth,gridwidth,lineradius}
+% initialize_area_par(\MPpos{b:\MPvar{self}},
+% \MPpos{e:\MPvar{self}},
+% \MPpos{w:\MPvar{self}}) ;
+% \includeMPgraphic{mpos:par:setup} ;
+% \includeMPgraphic{\MPvar{mp}} ; % \includeMPgraphic{mpos:par:shape} ;
+% anchor_par(\MPanchor{b:\MPvar{self}}) ;
+% \stopMPpositiongraphic}
+% {\startMPpositiongraphic{mpos:par}%
+% {fillcolor,linecolor,gridcolor,linewidth,gridwidth,lineradius}
+% initialize_par(\MPpos{b:\MPvar{self}},
+% \MPpos{e:\MPvar{self}},
+% \MPpos{text:\realfolio},
+% \MPpos{p:\parcounter},
+% \MPvv {p:\parcounter}{0,0,0,0,0,0}) ;
+% \includeMPgraphic{mpos:par:setup} ;
+% \includeMPgraphic{\MPvar{mp}} ; % \includeMPgraphic{mpos:par:shape} ;
+% anchor_par(\MPanchor{b:\MPvar{self}}) ;
+% \stopMPpositiongraphic}%
+% \MPpositiongraphic{mpos:par}{}%
+% \stopMPpositionmethod
%D Less readable but shorter.
@@ -1116,7 +1158,7 @@
\dodostarttextbackground}
\def\dopresettextbackground#1%
- {\ExpandFirstAfter\processaction
+ {\ExpandFirstAfter\processaction % \EFA niet echt nodig
[\getvalue{\??td#1\c!plaats}]
[ \v!tekst=>\let\dodostarttextbackground\dostarttextbackgroundtxt
\let\dodostoptextbackground \dostoptextbackgroundtxt,
@@ -1273,15 +1315,29 @@
\def\setuptextbackground%
{\dodoubleargument\dosetuptextbackground}
+%\def\dosetuptextbackground[#1][#2]%
+% {\ifsecondargument
+% \getparameters[\??td#1][#2]%
+% \def\currenttextbackground{#1}%
+% \doifvalue{\??td#1\c!status}{\v!start}{\checktextbackgrounds}%
+% \else
+% \setuptextbackground[][#1]%
+% \fi}
+
\def\dosetuptextbackground[#1][#2]%
{\ifsecondargument
- \getparameters[\??td#1][#2]%
- \def\currenttextbackground{#1}%
- \doifvalue{\??td#1\c!status}{\v!start}{\checktextbackgrounds}%
+ \doifelsenothing{#1}
+ {\dodosetuptextbackground{#2}\empty}
+ {\processcommalist[#1]{\dodosetuptextbackground{#2}}}%
\else
- \setuptextbackground[][#1]%
+ \dodosetuptextbackground{#1}\empty
\fi}
+\def\dodosetuptextbackground#1#2%
+ {\getparameters[\??td#2][#1]%
+ \def\currenttextbackground{#2}%
+ \doifvalue{\??td#2\c!status}{\v!start}{\checktextbackgrounds}}
+
\let\currenttextbackground\empty
\def\checktextbackgrounds
diff --git a/tex/context/base/core-ref.tex b/tex/context/base/core-ref.tex
index 8c17146a7..7fe973205 100644
--- a/tex/context/base/core-ref.tex
+++ b/tex/context/base/core-ref.tex
@@ -8,18 +8,13 @@
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
\writestatus{loading}{Context Core Macros / Cross Referencing}
-% DUE TO NEW/FUTURE FEATURES THIS MODULE IS UNDER RECONSTRUCTION !
-%
-% uitprinten
-% engels maken
-% rommel voorlopig naar core-int/core-nav
-% programma, profiel etc als methode
-% \macro toevoegen
+% 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.
@@ -37,9 +32,9 @@
% 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
+% 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
\unprotect
@@ -150,17 +145,13 @@
\def\textreference {\dosingleargument\dotextreference}
\def\pagereference {\dosingleargument\dopagereference}
-\def\reference {\dosingleargument\doreference}
+\def\reference {\dosingleargument\doreference }
%D These are implemented in a low level form as:
-% \def\dotextreference[#1]#2{\rawtextreference{\s!txt}{#1}{#2}}
-% \def\dopagereference [#1]{\rawpagereference{\s!pag}{#1}}
-% \def\doreference [#1]#2{\rawreference {\s!ref}{#1}{#2}}
-
-\def\dotextreference[#1]{\rawtextreference\s!txt{#1}} % #2
+\def\dotextreference[#1]{\rawtextreference\s!txt{#1}} % #2
\def\dopagereference[#1]{\rawpagereference\s!pag{#1}}
-\def\doreference [#1]{\rawreference \s!ref{#1}} % #2
+\def\doreference [#1]{\rawreference \s!ref{#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
@@ -171,18 +162,14 @@
\the\everyreference
\makesectionformat
\writereference{#2}
- {\sectionformat::\noexpand\pagenumber}
- {\noexpand\realfolio}
- {}%
+ {\sectionformat::\noexpand\pagenumber}{\noexpand\realfolio}{}%
\egroup}
\def\rawtextreference#1#2#3%
{\bgroup
\the\everyreference
\writereference{#2}
- {}
- {\noexpand\realfolio}
- {#3}%
+ {}{\noexpand\realfolio}{#3}%
\egroup}
\def\rawreference#1#2#3%
@@ -190,9 +177,7 @@
\the\everyreference
\makesectionformat
\writereference{#2}
- {\sectionformat::\noexpand\pagenumber}
- {\noexpand\realfolio}
- {#3}%
+ {\sectionformat::\noexpand\pagenumber}{\noexpand\realfolio}{#3}%
\egroup}
%D As we can see, these macros depend on three other ones,
@@ -209,8 +194,8 @@
\newevery \everyreference \relax
-%D This is really needed, since for instance Polish has a
-%D different alphabet and needs accented entries in registers.
+%D This is really needed, since for instance Polish has a
+%D different alphabet and needs accented entries in registers.
\appendtoks
\def\dohandleaccent #1#2{\string#1\string#2}%
@@ -256,21 +241,32 @@
\newcount\crossreferencenumber \crossreferencenumber=1
+% \def\writereference#1#2#3#4%
+% {\ifreferencing
+% \doifsomething{#1}
+% {\def\dowritereference##1%
+% {\xdef\lastreference{##1}%
+% \@EA\dodowritereference\lastreference\empty\empty\end
+% {#2}{#3}{#4}}%
+% \processcommalist[#1]\dowritereference}%
+% \fi}
+
\def\writereference#1#2#3#4%
{\ifreferencing
- \doifsomething{#1}
- {\def\dowritereference##1%
- {\xdef\lastreference{##1}%
- \@EA\dodowritereference\lastreference\empty\empty\end
- {#2}{#3}{#4}}%
- \processcommalist[#1]\dowritereference}%
+ \edef\!!stringa{#1}%
+ \ifx\!!stringa\empty \else
+ \def\dowritereference##1%
+ {\def\lastreference{##1}%
+ \@EA\dodowritereference\lastreference\empty\empty\end{#2}{#3}{#4}}%
+ \rawprocesscommalist[\!!stringa]\dowritereference
+ \fi
\fi}
\def\dodowritereference#1#2#3\end#4#5#6%
{\bgroup
- \global\advance\crossreferencenumber by 1
+ \global\advance\crossreferencenumber 1
\if#1-\if#2:%
- \let\referenceprefix=\empty
+ \let\referenceprefix\empty
\xdef\lastreference{#3}%
\else
\xdef\lastreference{#1#2#3}%
@@ -278,10 +274,10 @@
\xdef\lastreference{#1#2#3}%
\fi
\ifx\lastreference\empty \else
- \doiffirstreferenceoccurance{\lastreference}
+ \doiffirstreferenceoccurance\lastreference
{\thisisdestination{\referenceprefix\lastreference}}%
- \@EA\referentieinfo\@EA>\@EA{\lastreference}%
- \edef\dododowritereference%
+ \referentieinfo>\lastreference
+ \edef\dododowritereference
{\writeutilitycommand
{\mainreference{\referenceprefix}{\lastreference}{#4}{#5}{#6}}}%
\dododowritereference
@@ -315,8 +311,8 @@
%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 case nills the prefix method, thereby saving some memory.
+%D
%D \starttabulatie[||||]
%D \NC filename::tag \NC page(filename::pnum) \NC tag \NC\NR
%D \NC $\star$ \NC \NC \NC\NR
@@ -326,28 +322,51 @@
\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%
+% {\doifundefinedelse{\r!cross\fileprefix##1##2}
+% {\ifcase\autocrossfilereferences
+% \setglobalcrossreference{##1##2}{##3}{##4}{##5}%
+% \or
+% \setglobalcrossreference{##1##2}{##3}{##4}{##5}%
+% \doifundefinedelse{\r!cross##1##2}
+% {\expanded{\definereference[##1##2][\fileprefix##1##2]}}
+% {\showmessage{\m!references}{2}{[##1][##2],##4 (auto \currentutilityfilename)}}%
+% \or
+% \doifundefinedelse{\r!cross##1##2}
+% {\expanded{\definereference[##1##2][\noexpand\v!pagina(\fileprefix##4)]}}
+% {\showmessage{\m!references}{2}{[##1][##2],##4 (auto \currentutilityfilename)}}%
+% \fi}
+% {\ifcase0##4\else
+% \showmessage{\m!references}{2}{[##1][##2],##4 (\currentutilityfilename)}%
+% \fi}}}
+
+% optimizing this one makes sense when we have docs with 10K
+% refs.
+
\def\setreferences% some day, filename will be stored in ref record
{\the\everyreference % we're grouped anyway
- \def\mainreference##1##2##3##4##5%
- {\doifundefinedelse{\r!cross\fileprefix##1##2}
- {\ifcase\autocrossfilereferences
- \setglobalcrossreference{##1##2}{##3}{##4}{##5}%
- \or
- \setglobalcrossreference{##1##2}{##3}{##4}{##5}%
- \doifundefinedelse{\r!cross##1##2}
- {\expanded{\definereference[##1##2][\fileprefix##1##2]}}
- {\showmessage{\m!references}{2}{[##1][##2],##4 (auto \currentutilityfilename)}}%
- \or
- \doifundefinedelse{\r!cross##1##2}
- {\expanded{\definereference[##1##2][\noexpand\v!pagina(\fileprefix##4)]}}
- {\showmessage{\m!references}{2}{[##1][##2],##4 (auto \currentutilityfilename)}}%
- \fi}
- {\ifcase0##4\else
- \showmessage{\m!references}{2}{[##1][##2],##4 (\currentutilityfilename)}%
- \fi}}}
-
-\def\resetreferences%
- {\let\mainreference=\gobblefivearguments}
+ \def\mainreference##1##2##3##4##5% can be made faster by indirect calls
+ {\ifundefined{\r!cross\fileprefix##1##2}% \ifcsname\r!cross\fileprefix##1##2\endcsname
+ \ifcase\autocrossfilereferences
+ \setglobalcrossreference{##1##2}{##3}{##4}{##5}%
+ \or
+ \setglobalcrossreference{##1##2}{##3}{##4}{##5}%
+ \doifundefinedelse{\r!cross##1##2}
+ {\expanded{\definereference[##1##2][\fileprefix##1##2]}}
+ {\showmessage\m!references2{[##1][##2],##4 (auto \currentutilityfilename)}}%
+ \or
+ \doifundefinedelse{\r!cross##1##2}
+ {\expanded{\definereference[##1##2][\noexpand\v!pagina(\fileprefix##4)]}}
+ {\showmessage\m!references2{[##1][##2],##4 (auto \currentutilityfilename)}}%
+ \fi
+ \else\ifcase0##4\else
+ \showmessage\m!references2{[##1][##2],##4 (\currentutilityfilename)}%
+ \fi\fi}}
+
+\def\resetreferences
+ {\let\mainreference\gobblefivearguments}
\resetreferences
@@ -365,12 +384,12 @@
\newtoks\everycheckreferences
-%D When we load references, the file name is stored in a
-%D list.
+%D When we load references, the file name is stored in a
+%D list.
-\let\loadedreferences\empty
+\let\loadedreferences\empty
-%D We only load references ones.
+%D We only load references ones.
\newconditional\jobreferencesloaded
@@ -390,14 +409,14 @@
% \def\usereferences[#1]%
% {\bgroup
-% \checkreferences % Load job ones first!
+% \checkreferences % Load job ones first!
% \setbox0=\hbox
% {\doonlyonce{references:#1}{\doutilities{references}{#1}{}{}{}}}%
% \egroup}
\def\usereferences[#1]%
{\bgroup\setbox\scratchbox=\hbox\bgroup
- \checkreferences
+ \checkreferences
\doifparentfileelse{#1}
{\ifconditional\jobreferencesloaded\else
\doutilities{references}{#1}{}{}{}%
@@ -449,20 +468,24 @@
\newcount\crossreferenceorder
+% these are used often so we sped them up
+
\def\setlocalcrossreference#1#2#3#4%
- {\toks0={#4}%
- \setevalue{\r!cross\fileprefix#1}{\rt!cross{#2}{#3}{\the\toks0}{0}}}
+ {\scratchtoks{#4}%
+ \@EA\edef\csname\r!cross\fileprefix#1\endcsname
+ {\rt!cross{#2}{#3}{\the\scratchtoks}{0}}}
\def\setglobalcrossreference#1#2#3#4%
- {\toks0={#4}%
- \global\advance\crossreferenceorder by 1
- \setxvalue{\r!cross\fileprefix#1}{\rt!cross{#2}{#3}{\the\toks0}{\the\crossreferenceorder}}}
+ {\scratchtoks{#4}%
+ \global\advance\crossreferenceorder 1
+ \@EA\xdef\csname\r!cross\fileprefix#1\endcsname
+ {\rt!cross{#2}{#3}{\the\scratchtoks}{\the\crossreferenceorder}}}
\def\setlocalsystemreference#1#2#3%
- {\setevalue{\r!cross\fileprefix#2}{#1{#3}}}
+ {\@EA\edef\csname\r!cross\fileprefix#2\endcsname{#1{#3}}}
\def\setglobalsystemreference#1#2#3%
- {\setxvalue{\r!cross\fileprefix#2}{#1{#3}}}
+ {\@EA\xdef\csname\r!cross\fileprefix#2\endcsname{#1{#3}}}
% Maybe I need this some day.
@@ -475,7 +498,7 @@
% \getvalue{\r!cross\fileprefix#2}%
% \egroup}
-\def\copycrossreference#1#2#3% file from to
+\def\copycrossreference#1#2#3% file from to / slow
{\bgroup
\doifelse{#1}{}
{\let\fileprefix\empty}
@@ -492,8 +515,8 @@
\def\setoutercrossreference#1#2#3#4%
{\toks0={#4}%
- \setxvalue{\r!cross\fileprefix}{\rt!cross{}{}{1}{0}}%
- \setxvalue{\r!cross\fileprefix#1}{\rt!cross{#2}{#3}{\the\toks0}{0}}}
+ \@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
@@ -514,10 +537,10 @@
%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\currentrealreference =\empty
+\let\currentpagereference =\empty
+\let\currenttextreference =\empty
+\let\currentsubtextreference =\empty
\let\currentsubsubtextreference=\empty
%D System references only have one component:
@@ -531,9 +554,12 @@
%\def\getreferenceelements#1%
% {\edef\referenceelements{\getvalue{\r!cross\referenceprefix#1}}%
% \expandafter\dogetreferenceelements\referenceelements{}{}{}{}}
+%
+%\def\getreferenceelements#1% only one level expansion permitted!
+% {\@EA\@EA\@EA\dogetreferenceelements\csname\r!cross\referenceprefix#1\endcsname{}{}{}{}}
\def\getreferenceelements#1% only one level expansion permitted!
- {\@EA\@EA\@EA\dogetreferenceelements\csname\r!cross\referenceprefix#1\endcsname{}{}{}{}}
+ {\@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
@@ -590,9 +616,9 @@
\ifx\referencepagenumber\undefined
- \def\referencepagenumber[#1]{?}
+ \def\referencepagenumber[#1]{?}
-\fi
+\fi
%D Text references can contain more than one entry and
%D therefore we check for
@@ -644,24 +670,51 @@
%D meaning of the original cross reference. In fact,
%D \type{\rt!cross} is toggled to \type{\rt!done}.
-\def\doiffirstreferenceoccurance#1#2%
- {\ifcheckduplicatereferences
- \doifundefinedelse{\r!cross\referenceprefix#1}
- {#2}
- {\getreferenceelements{#1}%
- \ifnum\currentreferencetype=\rt!cross
- #2%
- \bgroup
- \def\rt!cross##1##2##3##4%
- {\setgvalue{\r!cross\referenceprefix#1}%
- {\rt!done{##1}{##2}{##3}{##4}}}%
- \getvalue{\r!cross\referenceprefix#1}%
- \egroup
- \fi}%
+% \def\doiffirstreferenceoccurance#1#2%
+% {\ifcheckduplicatereferences
+% \doifundefinedelse{\r!cross\referenceprefix#1}
+% {#2}
+% {\getreferenceelements{#1}%
+% \ifnum\currentreferencetype=\rt!cross
+% #2%
+% \bgroup
+% \def\rt!cross##1##2##3##4%
+% {\setgvalue{\r!cross\referenceprefix#1}%
+% {\rt!done{##1}{##2}{##3}{##4}}}%
+% \getvalue{\r!cross\referenceprefix#1}%
+% \egroup
+% \fi}%
+% \else
+% #2%
+% \fi}
+
+\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
+ {\csname\r!cross\referenceprefix#1\endcsname}%
+ \egroup}
+
+\def\checkfirstreferenceoccurance#1#2%
+ {\ifcsname\r!cross\referenceprefix#1\endcsname
+ \getreferenceelements{#1}%
+ \ifnum\currentreferencetype=\rt!cross
+ \dohandleduplicatereference{#1}%
+ #2%
+ \fi
\else
#2%
\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
@@ -873,178 +926,266 @@
\def\dodefinereference[#1][#2]%
{\ifsecondargument
\doifelsenothing{#2}
- {\global\letbeundefined{\specialREFidentifier#1}}
- {\setgvalue{\specialREFidentifier#1}{#2}}%
+ {\resetreference[#1]}%
+ {\@EA\gdef\csname\specialREFidentifier#1\endcsname{#2}}%
\else\iffirstargument
- \global\letbeundefined{\specialREFidentifier#1}%
+ \resetreference[#1]%
\fi\fi}
\def\definereference%
{\dodoubleempty\dodefinereference}
+\def\resetreference[#1]%
+ {\global\letbeundefined{\specialREFidentifier#1}}
+
\beginTEX
-\def\dodoifreferencefoundelse#1#2#3%
- {\checkreferences
- \bgroup
- \let\unharmedreferenceprefix=\referenceprefix
- \bgroup
- \splitofffullreference{#1}%
- \ifx\currentreferencespecial\specialREFidentifier
- \@EA\ifx\csname\specialREFidentifier\currentreferenceoperation\endcsname\relax
- \global\referencefoundfalse
- \else
- \global\referencefoundtrue
- \@EA\@EA\@EA\splitofffullreference\@EA\@EA\@EA % 1 level
- {\csname\specialREFidentifier\currentreferenceoperation\endcsname}%
- \fi
+% \def\dodoifreferencefoundelse#1#2#3%
+% {\checkreferences
+% \bgroup
+% \let\unharmedreferenceprefix=\referenceprefix
+% \bgroup
+% \splitofffullreference{#1}%
+% \ifx\currentreferencespecial\specialREFidentifier
+% \@EA\ifx\csname\specialREFidentifier\currentreferenceoperation\endcsname\relax
+% \global\referencefoundfalse
+% \else
+% \global\referencefoundtrue
+% \@EA\@EA\@EA\splitofffullreference\@EA\@EA\@EA % 1 level
+% {\csname\specialREFidentifier\currentreferenceoperation\endcsname}%
+% \fi
+% \else
+% \global\referencefoundtrue
+% \fi
+% \ifreferencefound
+% \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
+% \fi
+% \ifreferencefound \else
+% \let\referenceprefix=\empty
+% \@EA\ifx\csname\specialREFidentifier#1\endcsname\relax\else
+% \@EA\@EA\@EA\splitofffullreference\@EA\@EA\@EA % 1 level
+% {\csname\specialREFidentifier#1\endcsname}%
+% \ifx\currentreferencespecial\empty
+% \ifx\currentouterreference\empty
+% \docheckinnerreference
+% \ifreferencefound \else
+% \checkglobalfilereferences
+% \fi
+% \else
+% \docheckouterreference
+% \fi
+% \ifreferencefound
+% % \getreferenceelements\currentfullreference
+% \ifx\currentreferencearguments\empty
+% \getreferenceelements\currentfullreference
+% \else
+% \getreferenceelements\currentinnerreference
+% \fi
+% \fi
+% \else
+% \docheckspecialreference
+% \fi
+% \fi
+% \fi
+% \iftracereferences
+% \doshowcurrentreference\space
+% \writestatus{\m!references}{\currentreferenceshow}%
+% \fi
+% \ifreferencefound#2\else#3\fi
+% \egroup
+% \egroup}
+
+\newcount\nofexpandedreferences
+
+\def\dodoexpandreferences#1REF(#2#3)#4\relax
+ {\ifx#2\relax
+ \@EA\ifx\csname\specialREFidentifier#1\endcsname\relax
+ \global\advance\nofexpandedreferences 1
+ \@EA\xdef\csname REF::\number\nofexpandedreferences\endcsname{#1}%
\else
- \global\referencefoundtrue
- \fi
- \ifreferencefound
- \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
+ \edef\expandedreference{\csname\specialREFidentifier#1\endcsname,}%
\fi
- \ifreferencefound \else
- \let\referenceprefix=\empty
- \@EA\ifx\csname\specialREFidentifier#1\endcsname\relax\else
- \@EA\@EA\@EA\splitofffullreference\@EA\@EA\@EA % 1 level
- {\csname\specialREFidentifier#1\endcsname}%
- \ifx\currentreferencespecial\empty
- \ifx\currentouterreference\empty
- \docheckinnerreference
- \ifreferencefound \else
- \checkglobalfilereferences
- \fi
- \else
- \docheckouterreference
- \fi
- \ifreferencefound
- \getreferenceelements\currentfullreference
- \fi
- \else
- \docheckspecialreference
- \fi
- \fi
- \fi
- \iftracereferences
- \doshowcurrentreference\space
- \writestatus{\m!references}{\currentreferenceshow}%
+ \else
+ \@EA\ifx\csname\specialREFidentifier#2#3\endcsname\relax
+ % not set
+ \else
+ \edef\expandedreference{\csname\specialREFidentifier#2#3\endcsname,}%
\fi
- \ifreferencefound#2\else#3\fi
- \egroup
- \egroup}
+ \fi}
\endTEX
\beginETEX \ifcsname
-\def\dodoifreferencefoundelse#1#2#3%
- {\checkreferences
- \bgroup
- \let\unharmedreferenceprefix=\referenceprefix
- \bgroup
- \splitofffullreference{#1}%
- \ifx\currentreferencespecial\specialREFidentifier
- \ifcsname\specialREFidentifier\currentreferenceoperation\endcsname
- \global\referencefoundtrue
- \@EA\@EA\@EA\splitofffullreference\@EA\@EA\@EA % 1 level
- {\csname\specialREFidentifier\currentreferenceoperation\endcsname}%
- \else
- \global\referencefoundfalse
+% \def\dodoifreferencefoundelse#1#2#3%
+% {\checkreferences
+% \bgroup
+% \let\unharmedreferenceprefix=\referenceprefix
+% \bgroup
+% \splitofffullreference{#1}%
+% \ifx\currentreferencespecial\specialREFidentifier
+% \ifcsname\specialREFidentifier\currentreferenceoperation\endcsname
+% \global\referencefoundtrue
+% \@EA\@EA\@EA\splitofffullreference\@EA\@EA\@EA % 1 level
+% {\csname\specialREFidentifier\currentreferenceoperation\endcsname}%
+% \else
+% \global\referencefoundfalse
+% \fi
+% \else
+% \global\referencefoundtrue
+% \fi
+% \ifreferencefound
+% \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
+% \fi
+% \ifreferencefound \else
+% \let\referenceprefix=\empty
+% \ifcsname\specialREFidentifier#1\endcsname
+% \@EA\@EA\@EA\splitofffullreference\@EA\@EA\@EA % 1 level
+% {\csname\specialREFidentifier#1\endcsname}%
+% \ifx\currentreferencespecial\empty
+% \ifx\currentouterreference\empty
+% \docheckinnerreference
+% \ifreferencefound \else
+% \checkglobalfilereferences
+% \fi
+% \else
+% \docheckouterreference
+% \fi
+% \ifreferencefound
+% % \getreferenceelements\currentfullreference
+% \ifx\currentreferencearguments\empty
+% \getreferenceelements\currentfullreference
+% \else
+% \getreferenceelements\currentinnerreference
+% \fi
+% \fi
+% \else
+% \docheckspecialreference
+% \fi
+% \fi
+% \fi
+% \iftracereferences
+% \doshowcurrentreference\space
+% \writestatus{\m!references}{\currentreferenceshow}%
+% \fi
+% \ifreferencefound#2\else#3\fi
+% \egroup
+% \egroup}
+
+\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 1
+ \@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}
+
+\endETEX
+
+\def\doexpandreferences#1,%
+ {\if]#1\else
+ \let\expandedreference\empty
+ \dodoexpandreferences#1REF(\relax)\relax
+ \@EAEAEA\doexpandreferences\@EA\expandedreference
+ \fi}
+
+\def\expandreferences#1%
+ {\global\nofexpandedreferences0
+ \doexpandreferences#1,],}
+
+\def\dodoifreferencefoundelse#1%
+ {\@EA\splitofffullreference\@EA{#1}%
+ \ifx\currentreferencespecial\empty
+ \ifx\currentouterreference\empty
+ \docheckinnerreference
+ \ifreferencefound \else
+ \checkglobalfilereferences
\fi
\else
- \global\referencefoundtrue
+ \docheckouterreference
\fi
\ifreferencefound
- \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
+ \ifx\currentreferencearguments\empty
+ \getreferenceelements\currentfullreference
\else
- \docheckspecialreference
- \fi
- \fi
- \ifreferencefound \else
- \let\referenceprefix=\empty
- \ifcsname\specialREFidentifier#1\endcsname
- \@EA\@EA\@EA\splitofffullreference\@EA\@EA\@EA % 1 level
- {\csname\specialREFidentifier#1\endcsname}%
- \ifx\currentreferencespecial\empty
- \ifx\currentouterreference\empty
- \docheckinnerreference
- \ifreferencefound \else
- \checkglobalfilereferences
- \fi
- \else
- \docheckouterreference
- \fi
- \ifreferencefound
- \getreferenceelements\currentfullreference
- \fi
- \else
- \docheckspecialreference
- \fi
+ \getreferenceelements\currentinnerreference
\fi
\fi
- \iftracereferences
- \doshowcurrentreference\space
- \writestatus{\m!references}{\currentreferenceshow}%
- \fi
- \ifreferencefound#2\else#3\fi
- \egroup
- \egroup}
-
-\endETEX
+ \else
+ \docheckspecialreference
+ \fi
+ \iftracereferences
+ \doshowcurrentreference\space
+ \writestatus\m!references\currentreferenceshow
+ \fi}
-%D Although this can be considered a hack, we provide the
+%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.
+%D This can be dangerous, since there can be conflicting
+%D definitions.
-\newconditional\autoglobalfilereferences
+\newconditional\autoglobalfilereferences
-\def\checkglobalfilereferences%
- {\ifconditional\autoglobalfilereferences
- \processcommacommand[\loadedreferences]\docheckglobalfilereference
+\def\checkglobalfilereferences% sloooow
+ {\ifconditional\autoglobalfilereferences
+% \processcommacommand[\loadedreferences]\docheckglobalfilereference
+ \rawprocesscommalist[\loadedreferences]\docheckglobalfilereference
\fi}
-\def\docheckglobalfilereference#1%
- {\doifdefined{\r!cross#1::\currentinnerreference}
- {\def\currentouterreference{#1}%
- \edef\currentfullreference%
- {\currentouterreference::\currentinnerreference}%
- \global\referencefoundtrue
- \quitcommalist}}
+\def\docheckglobalfilereference#1%
+ {\ifundefined{\r!cross#1::\currentinnerreference}\else
+ \def\currentouterreference{#1}%
+ \edef\currentfullreference%
+ {\currentouterreference::\currentinnerreference}%
+ \global\referencefoundtrue
+ \quitcommalist
+ \fi}
%D For most situations, we could use:
%D
@@ -1078,50 +1219,117 @@
% 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.
-
-\def\doifreferencefoundelse#1#2#3%
- {\doresetgotowhereever
- \global\secondaryreferencefalse
- {\the\everyreference\xdef\primaryreference{#1}}%
- \global\nofsecondaryreferences=0
- \def\dopreprocessreference##1,%
- {\if]##1\else
- \ifsecondaryreference
- \ifenablereferencechains \iflocation
- {\the\everyreference\xdef\secondaryreference{##1}}%
- %\global\advance\nofsecondaryreferences by 1
- \@EA\dodoifreferencefoundelse\@EA{\secondaryreference}
- {\global\advance\nofsecondaryreferences by 1
- #2}
- {%\global\advance\nofsecondaryreferences by -1
- \dostartnoto#3\dostopnoto}%
- \fi \fi
- \else
- {\the\everyreference\xdef\primaryreference{##1}}%
- \global\secondaryreferencetrue
- \fi
- \expandafter\dopreprocessreference
- \fi}%
- \dopreprocessreference#1,],%
+% 'geen' zonder melding. Is wel trager. Dus niet.
+%
+% \def\doifreferencefoundelse#1#2#3% \@EA niet nodig
+% {\doresetgotowhereever
+% \global\secondaryreferencefalse
+% {\the\everyreference\xdef\primaryreference{#1}}%
+% \global\nofsecondaryreferences=0
+% \def\dopreprocessreference##1,%
+% {\if]##1\else
+% \ifsecondaryreference
+% \ifenablereferencechains \iflocation
+% {\the\everyreference\xdef\secondaryreference{##1}}%
+% %\global\advance\nofsecondaryreferences by 1
+% \@EA\dodoifreferencefoundelse\@EA{\secondaryreference}
+% {\global\advance\nofsecondaryreferences by 1
+% #2}
+% {%\global\advance\nofsecondaryreferences by -1
+% \dostartnoto#3\dostopnoto}%
+% \fi \fi
+% \else
+% {\the\everyreference\xdef\primaryreference{##1}}%
+% \global\secondaryreferencetrue
+% \fi
+% \expandafter\dopreprocessreference
+% \fi}%
+% \dopreprocessreference#1,],%
+% \global\secondaryreferencefalse
+% \@EA\dodoifreferencefoundelse\@EA{\primaryreference}{#2}{#3}%
+% \doresetgotowhereever} % to prevent problems with direct goto's
+
+\def\doifreferencefoundelse#1#2#3% REF \cs
+ {\checkreferences
+ \bgroup
+ \the\everyreference
+ \let\referenceprefix\empty
+ \expandreferences{#1}%
+ \egroup
+ \doresetgotowhereever
+ \global\nofsecondaryreferences 0
+ \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}%
+ \bgroup
+ \let\unharmedreferenceprefix\referenceprefix
+ %\bgroup
+ \dodoifreferencefoundelse\secondaryreference
+ \global\nofsecondaryreferences 1
+ \ifreferencefound
+ #2%
+ \else
+ \dostartnoto#3\dostopnoto
+ \fi
+ %\egroup
+ \egroup
+ \fi \fi
+ \else
+ % more than two refs
+ \ifenablereferencechains \iflocation
+ \global\secondaryreferencetrue
+ \scratchcounter2
+ \loop
+ \xdef\secondaryreference{\csname REF::\number\scratchcounter\endcsname}%
+ \bgroup
+ \let\unharmedreferenceprefix\referenceprefix
+ %\bgroup
+ \dodoifreferencefoundelse\secondaryreference
+ \global\advance\nofsecondaryreferences 1
+ \ifreferencefound
+ #2%
+ \else
+ \global\advance\nofsecondaryreferences -1
+ \dostartnoto#3\dostopnoto
+ \fi
+ %\egroup
+ \egroup
+ \ifnum\scratchcounter<\nofexpandedreferences\relax
+ \advance\scratchcounter 1
+ \repeat
+ \fi \fi
+ \fi
\global\secondaryreferencefalse
- \@EA\dodoifreferencefoundelse\@EA{\primaryreference}{#2}{#3}%
+ \xdef\primaryreference{\csname REF::1\endcsname}%
+ \bgroup
+ \let\unharmedreferenceprefix\referenceprefix
+ %\bgroup
+ \dodoifreferencefoundelse\primaryreference
+ \ifreferencefound#2\else#3\fi
+ %\egroup
+ \egroup
\doresetgotowhereever} % to prevent problems with direct goto's
%D Somewhere else we will properly define \type {\dostartgoto};
-%D the noto alternative takes care of undefined references in
+%D the noto alternative takes care of undefined references in
%D a sequence
\ifx\dostartnoto\undefined
- \def\dostartnoto#1\dostopnoto%
+ \def\dostartnoto#1\dostopnoto
{\ifsecondaryreference\else{#1}\fi}
\fi
\ifx\dostartgoto\undefined
- \def\dostartgoto\data#1\start#2\stop#3\dostopgoto%
+ \def\dostartgoto\data#1\start#2\stop#3\dostopgoto
{\ifsecondaryreference\else{#1}\fi}
\fi
@@ -1137,10 +1345,11 @@
{\checkreferences
\bgroup
\edef\currentfullreference{#1}%
- \doifdefinedelse{\r!cross\currentfullreference}
- {\getreferenceelements\currentfullreference
- \global\referencefoundtrue #2}
- {\global\referencefoundfalse #3}%
+ \ifundefined{\r!cross\currentfullreference}%
+ \global\referencefoundfalse #3%
+ \else\getreferenceelements\currentfullreference
+ \global\referencefoundtrue #2%
+ \fi
\egroup}
%D The inner case is simple. Only two cases have to be taken
@@ -1151,22 +1360,76 @@
%D \naar{some text}[prefix:reference]
%D \stoptypen
+%\def\docheckinnerreference%
+% {\global\let\predefinedreference=\currentinnerreference
+% \ifx\currentreferencearguments\empty
+% \doifdefinedelse{\r!cross\referenceprefix\currentfullreference}
+% {\global\referencefoundtrue}
+% {\let\referenceprefix\empty
+% \doifdefinedelse{\r!cross\currentfullreference}
+% {\global\referencefoundtrue}
+% {\global\referencefoundfalse}}%
+% \else % [SomeThing{with,me}]
+% \let\referenceprefix\empty
+% \doifdefinedelse{\r!cross\currentinnerreference}
+% {\global\referencefoundtrue}
+% {\global\referencefoundfalse}%
+% \fi
+% \doifpredefinedreferenceelse{\global\referencefoundfalse}{}}
+
+\beginETEX
+
+\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}
+
+\endETEX
+
+\beginTEX
+
\def\docheckinnerreference%
{\global\let\predefinedreference=\currentinnerreference
\ifx\currentreferencearguments\empty
- \doifdefinedelse{\r!cross\referenceprefix\currentfullreference}
- {\global\referencefoundtrue}
- {\let\referenceprefix\empty
- \doifdefinedelse{\r!cross\currentfullreference}
- {\global\referencefoundtrue}
- {\global\referencefoundfalse}}%
+ \@EA\ifx\csname\r!cross\referenceprefix\currentfullreference\endcsname\relax
+ \let\referenceprefix\empty
+ \ifcsname\r!cross\currentfullreference\endcsname
+ \global\referencefoundtrue
+ \else
+ \global\referencefoundfalse
+ \fi
+ \else
+ \global\referencefoundtrue
+ \fi
\else % [SomeThing{with,me}]
\let\referenceprefix\empty
- \doifdefinedelse{\r!cross\currentinnerreference}
- {\global\referencefoundtrue}
- {\global\referencefoundfalse}%
+ \ifcsname\r!cross\currentinnerreference\endcsname
+ \global\referencefoundtrue
+ \else
+ \global\referencefoundfalse
+ \fi
\fi
- \doifpredefinedreferenceelse{\global\referencefoundfalse}{}}
+ \doifpredefinedreferenceelse{\global\referencefoundfalse}\donothing}
+
+\endTEX
%D References to other files however are treated strict or
%D tolerant, depending on their loading and availability:
@@ -1216,6 +1479,30 @@
\docheckouterreference
\fi}
+\def\docheckouterreference%
+ {\let\referenceprefix\empty
+ \let\unharmedreferenceprefix\empty
+ \xdef\predefinedreference
+ {\currentouterreference::\currentinnerreference}%
+ \ifx\innerreference\empty
+ \global\referencefoundtrue % no checking done
+ \else
+ \@EA\ifx\csname\r!cross\currentouterreference::\endcsname\relax
+ \ifstrictouterreferences
+ \global\referencefoundfalse
+ \else
+ \global\referencefoundtrue % no checking done
+ \fi
+ \else
+ \ifcsname\r!cross\currentfullreference\endcsname
+ \global\referencefoundtrue
+ \else
+ \dodocheckouterreference
+ \fi
+ \fi
+ \fi
+ \doifpredefinedreferenceelse{\global\referencefoundfalse}\donothing}
+
\endTEX
\beginETEX \ifcsname
@@ -1231,42 +1518,55 @@
% already \global\referencefoundtrue % no checking done
\fi\fi}
-\endETEX
-
\def\docheckouterreference%
- {\let\referenceprefix=\empty
- \let\unharmedreferenceprefix=\empty
- \xdef\predefinedreference%
+ {\let\referenceprefix\empty
+ \let\unharmedreferenceprefix\empty
+ \xdef\predefinedreference
{\currentouterreference::\currentinnerreference}%
\ifx\innerreference\empty
\global\referencefoundtrue % no checking done
\else
- \doifdefinedelse{\r!cross\currentouterreference::}
- {\doifdefinedelse{\r!cross\currentfullreference}
- {\global\referencefoundtrue}
- {\dodocheckouterreference}}
- {\ifstrictouterreferences
- \global\referencefoundfalse
- \else
- \global\referencefoundtrue % no checking done
- \fi}%
+ \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}{}}
+ \doifpredefinedreferenceelse{\global\referencefoundfalse}\donothing}
+
+\endETEX
%D Special references are only tested when some test routine is
%D defined.
\def\docheckspecialreference%
- {\let\referenceprefix=\empty
- \let\unharmedreferenceprefix=\empty
+ {\let\referenceprefix\empty
+ \let\unharmedreferenceprefix\empty
\xdef\predefinedreference%
{\currentreferencespecial::\currentreferenceoperation}%
- \doifdefinedelse{\s!do\v!test\currentreferencespecial}
- {\getvalue{\s!do\v!test\currentreferencespecial}
- {\global\referencefoundtrue}
- {\global\referencefoundfalse}}
- {\global\referencefoundtrue}%
- \doifpredefinedreferenceelse{\global\referencefoundfalse}{}}
+% \doifdefinedelse{\s!do\v!test\currentreferencespecial}
+% {\getvalue{\s!do\v!test\currentreferencespecial}%
+% {\global\referencefoundtrue}
+% {\global\referencefoundfalse}}
+% {\global\referencefoundtrue}%
+ \executeifdefined{\s!do\v!test\currentreferencespecial}
+ {\global\referencefoundtrue\gobbletwoarguments}
+ {\global\referencefoundtrue}{\global\referencefoundfalse}%
+% \ifcsname\s!do\v!test\currentreferencespecial\endcsname
+% \csname\s!do\v!test\currentreferencespecial\endcsname
+% {\global\referencefoundtrue}{\global\referencefoundfalse}%
+% \else
+% \global\referencefoundtrue
+% \fi
+ \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.
@@ -1285,11 +1585,8 @@
{\predefinereference
\showmessage{\m!references}{#1}{[\unharmedreferenceprefix][#2]}}}
-\def\unknownreference%
- {\reportreferenceerror1}
-
-\def\illegalreference%
- {\reportreferenceerror4}
+\def\unknownreference{\reportreferenceerror1}
+\def\illegalreference{\reportreferenceerror4}
%D Although not actually needed, we default the unharmed
%D reference prefix to the normal one.
@@ -1308,28 +1605,35 @@
%D being defined, we set such an unknown reference to an empty
%D one after the first encounter.
-\let\predefinedreference=\s!unknown
+\let\predefinedreference\s!unknown
-%\def\predefinereference%
-% {\setgvalue{\r!cross\predefinedreference}{\rt!cross{}{}{}{}}}
+% \def\predefinereference%
+% {\setgvalue{\r!cross\predefinedreference}{\rt!cross{}{}{}{}}%
+% \setgvalue{\r!cross\unharmedreferenceprefix\predefinedreference}{\rt!cross{}{}{}{}}}
-%\def\predefinereference%
-% {\setgvalue{\r!cross\unharmedreferenceprefix\predefinedreference}{\rt!cross{}{}{}{}}}
+\def\dummypredefinedreference{\r!cross{}{}{}{}}
\def\predefinereference%
- {\setgvalue{\r!cross\predefinedreference}{\rt!cross{}{}{}{}}%
- \setgvalue{\r!cross\unharmedreferenceprefix\predefinedreference}{\rt!cross{}{}{}{}}}
+ {\global\@EA\let\csname\r!cross\predefinedreference \endcsname\dummypredefinedreference
+ \global\@EA\let\csname\r!cross\unharmedreferenceprefix\endcsname\dummypredefinedreference}
%D Testing on existance then becomes:
-\def\checkpredefinedreference#1#2#3#4% #3 can expand tricky
- {{#1}{#2}{#4}}
+% \def\checkpredefinedreference#1#2#3#4% #3 can expand tricky
+% {{#1}{#2}{#4}}
+%
+% \def\doifpredefinedreferenceelse#1#2% \referenceprefix added
+% {\bgroup
+% \let\rt!cross\checkpredefinedreference
+% \doifelse{\getvalue{\r!cross\referenceprefix\predefinedreference}}{{}{}{}}
+% {\egroup#1}{\egroup#2}}
-\def\doifpredefinedreferenceelse#1#2% \referenceprefix added
- {\bgroup
- \let\rt!cross\checkpredefinedreference
- \doifelse{\getvalue{\r!cross\referenceprefix\predefinedreference}}{{}{}{}}
- {\egroup#1}{\egroup#2}}
+\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.
@@ -1340,20 +1644,42 @@
%D
%D The second argument can be a comma seperated list.
-\def\doifreferencepermittedelse#1#2#3#4% ref set found notfound
+% \def\doifreferencepermittedelse#1#2#3#4% ref set found notfound
+% {\doifreferencefoundelse{#1}
+% {\ifx\currentinnerreference\empty
+% \ifx\currentouterreference\empty
+% #3%
+% \else
+% \doifinstringelse{\currentouterreference::}{#2}{#4}{#3}%
+% \fi
+% \else\ifx\currentouterreference\empty
+% \doifinstringelse{\currentinnerreference}{#2}{#4}{#3}%
+% \else
+% \doifinstringelse{\currentouterreference::\currentinnerreference}{#2}{#4}{#3}%
+% \fi\fi}
+% {#4\unknownreference{#1}}}
+
+\let\permittedreferences\empty
+
+\def\doifreferencepermittedelse#1#2#3% ref found notfound
{\doifreferencefoundelse{#1}
- {\ifx\currentinnerreference\empty
- \ifx\currentouterreference\empty
- #3%
- \else
- \doifinstringelse{\currentouterreference::}{#2}{#4}{#3}%
- \fi
- \else\ifx\currentouterreference\empty
- \doifinstringelse{\currentinnerreference}{#2}{#4}{#3}%
- \else
- \doifinstringelse{\currentouterreference::\currentinnerreference}{#2}{#4}{#3}%
- \fi\fi}
- {#4\unknownreference{#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
@@ -1393,17 +1719,13 @@
%D \type{\iflocation} signals if we're in interactive mode.
\def\thisisdestination#1% destination
- {\iflocation
- \ifusepagedestinations \else
- \dostartthisislocation{#1}%
- \dostopthisislocation
- \fi
- \fi}
+ {\iflocation \ifusepagedestinations \else
+ \dostartthisislocation{#1}\dostopthisislocation
+ \fi \fi}
\def\thisisrealpage#1% pagenumber
{\iflocation
- \dostartthisisrealpage{#1}%
- \dostopthisisrealpage
+ \dostartthisisrealpage{#1}\dostopthisisrealpage
\fi}
%D The previous tho macros were easy ones, opposite to their
@@ -1436,9 +1758,7 @@
{#5}%
\start
\the\everyreference % we are (have to be) grouped !
- \dostartgotolocation
- {\number\buttonwidth}{\number\buttonheight}
- {#1}{#2}{#3}{#4}%
+ \dostartgotolocation\buttonwidth\buttonheight{#1}{#2}{#3}{#4}%
\stop
\dostopgotolocation
\dostopgoto
@@ -1453,9 +1773,7 @@
\data
{#4}%
\start
- \dostartgotorealpage
- {\number\buttonwidth}{\number\buttonheight}
- {#1}{#2}{#3}%
+ \dostartgotorealpage\buttonwidth\buttonheight{#1}{#2}{#3}%
\stop
\dostopgotorealpage
\dostopgoto
@@ -1463,22 +1781,22 @@
{#4}%
\fi}
-%D \macros
+%D \macros
%D {setreferencefilename}
-%D
+%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 driver. Conversion is taken care of by:
+%D
%D \starttypen
%D \setreferencefilename somefilename\to\SomeFileName
-%D \stoptypen
+%D \stoptypen
% \def\setreferencefilename#1\to#2%
-% {\doifelse{\@@converteerfile}{\v!ja} % boolean is sneller
+% {\doifelse{\@@converteerfile}{\v!ja} % boolean is sneller
% {\uppercasestring#1\to#2}
% {\edef#2{#1}}}
@@ -1486,9 +1804,9 @@
\def\setreferencefilename#1\to#2%
{\ifcase\referencefilecase
- \edef#2{#1}%
+ \edef#2{#1}%
\or
- \uppercasestring#1\to#2%
+ \uppercasestring#1\to#2%
\or
\lowercasestring#1\to#2%
\else
@@ -1507,9 +1825,6 @@
\def\thisissomeinternal#1#2% tag reference
{\doifsomething{#2}{\thisisdestination{#1:#2}}}
-% \def\gotosomeinternal#1#2#3#4%
-% {\gotodestination{}{}{#1:#2}{#3}{#4}}
-
\def\gotosomeinternal#1#2% #3#4
{\gotodestination{}{}{#1:#2}}
@@ -1531,19 +1846,30 @@
\newcount\locationcount
\newif\iftraceinternalreferences
+\newif\ifinternalnamedreferences \internalnamedreferencestrue
\def\nextinternalreference%
{\the\locationcount}
-\def\thisisnextinternal#1%
- {\global\advance\locationcount by 1
- \thisisdestination{\s!aut\iftraceinternalreferences:#1\fi:\nextinternalreference}}
+% \def\thisisnextinternal#1%
+% {\global\advance\locationcount \plusone
+% \thisisdestination{\s!aut\iftraceinternalreferences:#1\fi:\nextinternalreference}}
+%
+% \def\gotonextinternal#1#2% #3#4
+% {\gotodestination{}{}{\s!aut\iftraceinternalreferences:#1\fi:#2}}
-% \def\gotonextinternal#1#2#3#4%
-% {\gotodestination{}{}{\s!aut\iftraceinternalreferences:#1\fi:#2}{#3}{#4}}
+\def\thisisnextinternal#1%
+ {\global\advance\locationcount 1
+ \ifinternalnamedreferences
+ \thisisdestination{\s!aut\iftraceinternalreferences:#1\fi:\nextinternalreference}%
+ \fi}
-\def\gotonextinternal#1#2% #3#4
- {\gotodestination{}{}{\s!aut\iftraceinternalreferences:#1\fi:#2}}
+\def\gotonextinternal#1#2#3#4%
+ {\ifinternalnamedreferences
+ \gotodestination{}{}{\s!aut\iftraceinternalreferences:#1\fi:#2}{#3}{#4}%
+ \else
+ \gotorealpage{}{}{#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
@@ -1552,45 +1878,41 @@
%D already taken care of in the test routine, but we still have
%D to direct the request to the right routine.
-\def\gotolocation#1#2%
+\def\gotolocation% #1#2%
{\ifx\currentreferencespecial\empty
\ifx\currentouterreference\empty
\ifnum\currentreferencetype<2
- \gotoinnerlocation{#1}{#2}%
+ \@EA\@EAEAEA\@EA\gotoinnerlocation
\else
- \gotosystemlocation{#1}{#2}%
+ \@EA\@EAEAEA\@EA\gotosystemlocation
\fi
\else
- \gotoouterlocation{#1}{#2}%
+ \@EAEAEA\gotoouterlocation
\fi
\else
- \gotospeciallocation{#1}{#2}%
- \fi}
+ \@EA\gotospeciallocation
+ \fi} % {#1}{#2}
%D An inner reference refers to some place in the document
%D itself.
-\def\gotoinnerlocation#1#2%
- {\gotodestination
- {}{}
- {\referenceprefix\currentinnerreference}{\currentrealreference}
- {#2}}
+\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}%
+ \let\referenceprefix\empty
+ \setouterlocation\currentouterreference
\ifx\currentinnerreference\empty
\gotorealpage
- {\otherURL}{\otherfile}{1}
- {#2}%
+ \otherURL\otherfile1{#2}%
\else
\gotodestination
- {\otherURL}{\otherfile}{\currentinnerreference}{\currentrealreference}
- {#2}%
+ \otherURL\otherfile\currentinnerreference\currentrealreference{#2}%
\fi
\egroup}
@@ -1625,9 +1947,8 @@
%D \type{summarize}) and \type{\currentreference} (here
%D being \type {10,23,56}) to perform its task.
-\def\gotospeciallocation%
- {\executeifdefined
- {goto\currentreferencespecial location}\gobbleoneargument}
+\def\gotospeciallocation
+ {\executeifdefined{goto\currentreferencespecial location}\gobbleoneargument}
%D Such special macros can be defined by:
@@ -1652,8 +1973,8 @@
%D A system location is not always a location, but for the
%D consistency we also consider actions as such.
-\def\gotosystemlocation%
- {\getvalue{\r!syst\the\currentreferencetype}}
+\def\gotosystemlocation
+ {\csname\r!syst\the\currentreferencetype\endcsname}
\def\definesystemreferencehandler#1#2%
{\setgvalue{\r!syst\the#1}{#2}}
@@ -1670,32 +1991,52 @@
\definesystemreferencehandler \rt!list \handlelistreference
\def\handleexecreference#1%
- {\checkexecutecommand{\currentdatareference}{\currentreferencearguments}%
- \executecommand{\currentdatareference}{\currentreferencearguments}}
+ {\checkexecutecommand\currentdatareference\currentreferencearguments
+ \executecommand\currentdatareference\currentreferencearguments}
\def\handlepagereference#1%
- {\gotorealpage{}{}{\currentdatareference}}
+ {\gotorealpage\empty\empty\currentdatareference}
\def\handlelistreference#1% is deze nog echt nodig?
- {\gotodestination{}{}{\currentdatareference}{\getvalue{\currentdatareference}}}
+ {\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 In case a command action needs to do some checking in
+%D advance, one can assign an check function by:
%D
-%D \starttypen
+%D \starttypen
%D \setexecutecommandcheck{startsound}\checksoundtrack
-%D \stoptypen
+%D \stoptypen
\def\setexecutecommandcheck#1#2% #2 permits \first \second
{\setvalue{\s!do\s!do#1}{#2}}
-\def\checkexecutecommand#1#2%
- {\def\docheckexecutecommand##1%
- {\doifdefined{\s!do\s!do#1}{\getvalue{\s!do\s!do#1}{##1}}}%
- \processcommacommand[#2]\docheckexecutecommand}
+% \def\checkexecutecommand#1#2%
+% {\def\docheckexecutecommand##1%
+% {\doifdefined{\s!do\s!do#1}{\getvalue{\s!do\s!do#1}{##1}}}%
+% \processcommacommand[#2]\docheckexecutecommand}
+
+\beginETEX
+
+\def\checkexecutecommand#1#2% evt geen #1 en #2
+ {\ifx#2\empty \else \ifcsname\s!do\s!do#1\endcsname
+ \@EA\let\@EA\docheckexecutecommand\csname\s!do\s!do#1\endcsname
+ \rawprocesscommalist[#2]\docheckexecutecommand
+ \fi \fi }
+
+\endETEX
+
+\beginTEX
+
+\def\checkexecutecommand#1#2% evt geen #1 en #2
+ {\ifx#2\empty \else \@EA\ifx\csname\s!do\s!do#1\endcsname\relax \else
+ \@EA\let\@EA\docheckexecutecommand\csname\s!do\s!do#1\endcsname
+ \rawprocesscommalist[#2]\docheckexecutecommand
+ \fi \fi }
+
+\endTEX
%D Command references (in dutch, english, german of
%D whatever interface language) are translated into a bit
@@ -1746,9 +2087,7 @@
\data
{#3}%
\start
- \dostartexecutecommand
- {\number\buttonwidth}{\number\buttonheight}
- {#1}{#2}%
+ \dostartexecutecommand\buttonwidth\buttonheight{#1}{#2}%
\stop
\dostopexecutecommand
\dostopgoto
@@ -1781,7 +2120,7 @@
%D document). By setting the \type{interaction} variable, one
%D can influences the way interactive references are set.
-% \newif\ifreferencestrut % some day an option
+% \newif\ifreferencestrut % some day an option
\def\setupreferencing%
{\dosingleargument\dosetupreferencing}
@@ -1796,10 +2135,10 @@
\v!start=>\referencingtrue]%
\processaction
[\@@rfinteractie]
- [ \v!alles=>\let\dowantedreference=\docompletereference,
- \v!label=>\let\dowantedreference=\dolabelonlyreference,
- \v!tekst=>\let\dowantedreference=\dotextonlyreference,
- \v!symbool=>\let\dowantedreference=\dosymbolreference]%
+ [ \v!alles=>\let\dowantedreference\docompletereference,
+ \v!label=>\let\dowantedreference\dolabelonlyreference,
+ \v!tekst=>\let\dowantedreference\dotextonlyreference,
+ \v!symbool=>\let\dowantedreference\dosymbolreference]%
\chardef\autocrossfilereferences=0
\processaction
[\@@rfautofile]
@@ -1807,27 +2146,12 @@
\v!pagina=>\chardef\autocrossfilereferences=2]%
\chardef\referencefilecase=0
\processaction[\@@rfconverteerfile]
- [ \v!ja=>\chardef\referencefilecase=1,
- \v!groot=>\chardef\referencefilecase=1,
+ [ \v!ja=>\chardef\referencefilecase=1,
+ \v!groot=>\chardef\referencefilecase=1,
\v!klein=>\chardef\referencefilecase=2]%
- % \doifelse{\@@rfstrut}{\v!ja} % some day an option
- % {\referencetruttrue}{\referencestrutfalse}%
- %
- % This is a typical example where \ifx\@@rfprefix\s!unknown fails:
- %
- \doifnot{\@@rfprefix}{\s!unknown} % retain the current value
- {\ifx\@@rfprefix\empty
- \let\referenceprefix=\empty
- \else\ifx\@@rfprefix\incrementreferenceprefix
- \advance\prefixcounter by 1
- \edef\referenceprefix{\the\prefixcounter:}%
- \let\@@rfprefix\s!unknown
- \else\ifx\@@rfprefix\decrementreferenceprefix
- \let\referenceprefix=\empty
- \let\@@rfprefix\s!unknown
- \else
- \edef\referenceprefix{\@@rfprefix:}%
- \fi\fi\fi}%
+ %\doifelse{\@@rfstrut}{\v!ja} % some day an option
+ % {\referencetruttrue}{\referencestrutfalse}%
+ \setupreferenceprefix[\@@rfprefix]%
\doifelse{\@@rfglobaal}{\v!ja}
{\settrue \autoglobalfilereferences}
{\setfalse\autoglobalfilereferences}}
@@ -1835,6 +2159,23 @@
\def\incrementreferenceprefix{+}
\def\decrementreferenceprefix{-}
+\def\setupreferenceprefix[#1]%
+ {\edef\@@rfprefix{#1}%
+ \ifx\@@rfprefix\empty
+ \let\referenceprefix\empty
+ \else\ifx\@@rfprefix\incrementreferenceprefix
+ \advance\prefixcounter 1 % 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}
@@ -1930,9 +2271,9 @@
% \expandafter\doinatreference\expandafter\currenttextreference
% \fi}
-% we need to bypass math tokens
+% we need to bypass math tokens
-\let\normalover \over
+% \let\normalover \over
\definecommand in {\doinatreference\currenttextreference}
\definecommand op {\doinatreference\currentpagereference}
@@ -1943,7 +2284,7 @@
\bgroup
\def\thecurrentsubtextreference%
{\limitatetext{\currentsubtextreference}{\@@rfbreedte}{\unknown}}%
- %\leaveoutervmode % no
+ %\leaveoutervmode % no
\@@rflinks
\doifreferencefoundelse{#1}
{\let\crlf\space
@@ -2001,32 +2342,36 @@
{\def\dododoinatreference{\dodododoinatreference{#1}}%
\futurelet\next\dododoinatreference}
-\def\dodododoinatreference#1#2#3[#4]%
- {\ifx\next\bgroup
- \dododododoinatreference{#1\ignorespaces#3}{#2}[#4]%
- \else
- \dododododoinatreference{#1}{#2#3}[#4]%
- \fi}
+% 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.
-\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]}%
- \referentieinfo{<}{#3}%
- \egroup}
+% 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]}%
+% \referentieinfo{<}{#3}%
+% \egroup}
%D The previously discussed setup macro lets us specify the
%D representation of references. A symbol reference does not
@@ -2038,7 +2383,7 @@
\def\dosymbolreference#1#2[#3]%
{\bgroup
\setupsymbolset[\@@iasymboolset]%
- \ifhmode\unskip\fi
+ \removelastskip
\ifx\currentreferencespecial\empty
\ifx\currentouterreference\empty
\ifnum0\currentrealreference=0
@@ -2073,13 +2418,14 @@
% {\doifsomething{#2}{\donaarspace{#2}[#3]~}\donaarfixed{#1}[#3]}
% {\donaarfixed{\dotextprefix{#2}#1}[#3]}}
%
-% better:
+
+% better:
\def\docompletereference#1#2[#3]%
{\iflocationsplit
- \doifsomespaceelse{#2}
- {\donaarspace{\dotextprefix{#2}#1}[#3]}
- {\donaarfixed{\dotextprefix{#2}#1}[#3]}%
+ \doifsomespaceelse{#2}
+ {\donaarspace{\dotextprefix{#2}#1}[#3]}
+ {\donaarfixed{\dotextprefix{#2}#1}[#3]}%
\else
\donaarfixed{\dotextprefix{#2}#1}[#3]%
\fi}
@@ -2098,26 +2444,26 @@
%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 Hoekwater. They can be used for predefining reference
+%D texts, and thereby stimulate efficiency.
%D
%D [more documentation will be added]
%D
-%D \starttypen
+%D \starttypen
%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
+%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 \stoptypen
-%D
-%D Instead of a text, one can specify a label, which should
-%D be defined with \type {\setuplabeltext}.
+%D
+%D Instead of a text, one can specify a label, which should
+%D be defined with \type {\setuplabeltext}.
\def\definereferenceformat%
{\dodoubleargument\dodefinereferenceformat}
@@ -2126,8 +2472,8 @@
{\iffirstargument
\getparameters[\??rf#1]
[\c!links=, % of the number
- \c!rechts=, % of the number
- \c!tekst=, % before the number
+ \c!rechts=, % of the number
+ \c!tekst=, % before the number
\c!label=, % can be {left}{right}
\c!commando=\in,
#2]%
@@ -2137,22 +2483,20 @@
\def\noexecutelabelreferenceformat#1%
{\doifvaluesomething{\??rf#1\c!tekst}
- {\gdef\textofreference{\getvalue{\??rf#1\c!tekst}}}%
- \getvalue{\??rf#1\c!commando}}
+ {\gdef\textofreference{\csname\??rf#1\c!tekst\endcsname}}%
+ \csname\??rf#1\c!commando\endcsname}
\def\doexecutelabelreferenceformat#1%
- {\getvalue{\??rf#1\c!commando}%
- {\leftlabeltext {\getvalue{\??rf#1\c!label}}}%
- {\rightlabeltext{\getvalue{\??rf#1\c!label}}}}
+ {\csname\??rf#1\c!commando\endcsname
+ {\leftlabeltext {\csname\??rf#1\c!label\endcsname}}%
+ {\rightlabeltext{\csname\??rf#1\c!label\endcsname}}}
\def\doexecutereferenceformat#1%
- {\gdef\leftofreference {\getvalue{\??rf#1\c!links }}%
- \gdef\rightofreference{\getvalue{\??rf#1\c!rechts}}%
+ {\gdef\leftofreference {\csname\??rf#1\c!links \endcsname}%
+ \gdef\rightofreference{\csname\??rf#1\c!rechts\endcsname}%
\global\let\textofreference\empty % otherwise ~ added
\doifelsevaluenothing{\??rf#1\c!label}
- {\let\next\noexecutelabelreferenceformat}
- {\let\next\doexecutelabelreferenceformat}%
- \next{#1}}
+ \noexecutelabelreferenceformat\doexecutelabelreferenceformat{#1}}
\let\leftofreference \relax
\let\rightofreference\relax
@@ -2178,16 +2522,24 @@
\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{#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{#1}{#2}[#3]}
+ % {\egroup\dowantedreference{#1}{#2}[#3]}%
+ \doifelsenothing{#1}%
+ {\egroup\dosymbolreference}%
+ {\egroup\dowantedreference}%
+ {#1}{#2}[#3]%
\fi}
{\dounknownreference{#1}{#2}[#3]}%
- \referentieinfo{<}{#3}%
+ \referentieinfo<{#3}%
\global\let\leftofreference \empty
\global\let\rightofreference\empty
\global\let\textofreference \empty
@@ -2236,13 +2588,13 @@
\newcount\similarreference % 0=noppes 1=create/refer 2,3,..=refer
\def\donaarspace#1[#2]%
- {\iflocationsplit
+ {\iflocationsplit
\ifsecondaryreference\setbox0=\hbox\fi % due to space insertion
{\let\donaarspace=\donaarfixed
\iflocation
\def\processisolatedword##1%
{\ifisolatedwords\ifsharesimilarreferences
- \global\advance\similarreference by 1
+ \global\advance\similarreference 1
\fi\fi
\hbox{\gotolocation{#2}{##1\presetgoto}}}%
\doattributes\??ia\c!letter\c!kleur
@@ -2414,20 +2766,18 @@
\def\setupurl%
{\dodoubleargument\getparameters[\??ur]}
-\unexpanded\def\url[#1]%
+\unexpanded\def\url[#1]% slow
{\bgroup
\processaction
-% [\@@rfurlvariant]
[\@@urvariant]
[ \v!geen=>\chardef\urlsplitmode=0,
\v!beide=>\chardef\urlsplitmode=1,
\v!na=>\chardef\urlsplitmode=2,
\v!voor=>\chardef\urlsplitmode=3]%
-% \doifelse{\@@rfurlspatie}{\v!ja}
\doifelse{\@@urspatie}{\v!ja}
{\setbetweenisolatedwords%
{\scratchskip\currentspaceskip
- \hskip\!!zeropoint\!!plus.2\scratchskip}}
+ \hskip\zeropoint\!!plus.2\scratchskip}}
{\setbetweenisolatedwords\allowbreak}%
\def\doexternaldocument[##1][##2][##3]{\hyphenatedurl{##1}}%
\dostartattributes\??ur\c!letter\c!kleur{}%
@@ -2468,30 +2818,34 @@
%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 \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%
- {\doifdefinedelse{\v!file:::#1}
- {\def\doexternaldocument[##1][##2][##3]%
- {\edef\otherURL{##1}%
- \edef\otherfile{##2}}%
- \getvalue{\v!file:::#1}}
- {\ifconditional\forceURLlocation
- \edef\otherURL {#1}%
- \let\otherfile\empty
- \else
- \let\otherURL\empty
- \edef\otherfile{#1}%
- \fi}%
+ {\ifundefined{\v!file:::#1}%
+ \ifconditional\forceURLlocation
+ \edef\otherURL{#1}%
+ \let\otherfile\empty
+ \else
+ \let\otherURL\empty
+ \edef\otherfile{#1}%
+ \fi
+ \else
+ \let\doexternaldocument\setouterfilelocation
+ \csname\v!file:::#1\endcsname
+ \fi
\setfalse\forceURLlocation
- \doifparentfileelse{\otherfile}
- {\let\otherURL=\empty
- \let\otherfile=\empty
- \global\let\otherlabel=\empty
- \let\otherprefix=\empty}
+ \doifparentfileelse\otherfile
+ {\let\otherURL\empty
+ \let\otherfile\empty
+ \global\let\otherlabel\empty
+ \let\otherprefix\empty}
{\xdef\otherlabel{#1}%
\edef\otherprefix{#1::}}}
@@ -2506,36 +2860,27 @@
\definecomplexorsimple\uit
-\def\simpleuit%
+\def\simpleuit
{\bgroup
- \doifdefinedelse{\v!file:::\otherlabel}
- {\def\doexternaldocument[##1][##2][##3]{##3}%
- \getvalue{\v!file:::\otherlabel}}
+ \ifundefined{\v!file:::\otherlabel}%
{\tttf[\otherlabel]}%
+ \else
+ \def\doexternaldocument[##1][##2][##3]{##3}%
+ \csname\v!file:::\otherlabel\endcsname
\egroup}
\def\complexuit[#1]%
- {\doifinstringelse{::}{#1}
- {\docomplexuit[#1]}
- {\docomplexuit[#1::]}}
-
-% \def\docomplexuit[#1::#2]%
-% {\bgroup
-% \doifdefinedelse{\v!file:::#1}
-% {\def\doexternaldocument[##1][##2][##3]%
-% {\naar{##3}[#1::#2]}%
-% \getvalue{\v!file:::#1}}
-% {\tttf[#1]}%
-% \egroup}
+ {\doifinstringelse{::}{#1}{\docomplexuit[#1]}{\docomplexuit[#1::]}}
\def\docomplexuit[#1::#2]%
{\dontleavehmode % added, but probably not needed
\bgroup
- \doifdefinedelse{\v!file:::#1}
- {\def\doexternaldocument[##1][##2][##3]%
- {\naar{##3}[#1::#2]}%
- \getvalue{\v!file:::#1}}
+ \ifundefined{\v!file:::#1}%
{\tttf[#1]}%
+ \else
+ \def\doexternaldocument[##1][##2][##3]{\naar{##3}[#1::#2]}%
+ \csname\v!file:::#1\endcsname
+ \fi
\egroup}
%D We also support:
@@ -2564,11 +2909,11 @@
{\doifreferencefoundelse
{\currentreferenceoperation::\currentreferencearguments}}
-\def\handlespecialallocationFILEandURL%
- {\let\currentouterreference=\currentreferenceoperation
- \let\currentinnerreference=\currentreferencearguments
- \let\currentreferenceoperation=\empty
- \let\currentreferencearguments=\empty
+\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
@@ -2583,7 +2928,7 @@
%D
%D An better alternative, slower but error aware, is
-\definespecialtest\v!actie%
+\definespecialtest\v!actie
{\doifreferencefoundelse\currentreferenceoperation}
\definespeciallocation\v!actie
@@ -2623,16 +2968,16 @@
\def\programma#1[#2]%
{\bgroup
- \doifdefinedelse{\v!programma:::#2}
- {\def\doprogramma##1##2%
- {\doifelsenothing{#1}
- {\naar{##2}[\v!programma(#2)]}
- {\naar{#1}[\v!programma(#2)]}}%
- \getvalue{\v!programma:::#2}}
+ \ifundefined{\v!programma:::#2}%
{\tttf[#2]}%
+ \else
+ \def\doprogramma##1##2%
+ {\naar{\doifelsenothing{#1}{##2}{#1}}[\v!programma(#2)]}%
+ \csname\v!programma:::#2\endcsname
+ \fi
\egroup}
-% needs an update: program(abc{arg})
+% needs an update: program(abc{arg})
\definespeciallocation\v!programma#1#2%
{\bgroup
@@ -2640,16 +2985,14 @@
\doifdefinedelse{\v!programma:::\currentreferenceoperation}
{\def\doprogramma##1##2{\def\@@programfile{##1}}%
\getvalue{\v!programma:::\currentreferenceoperation}}
- {\let\@@programfile=\currentreferenceoperation}%
+ {\let\@@programfile\currentreferenceoperation}%
\convertcommand\@@programfile\to\ascii
\dostartgoto
\data
{#2}%
\start
- \dostartrunprogram
- {\number\buttonwidth}{\number\buttonheight}
- {\@@prgebied\ascii}
- {\currentreferencearguments}%
+ \dostartrunprogram\buttonwidth\buttonheight
+ {\@@prgebied\ascii}\currentreferencearguments
\stop
\dostoprunprogram
\dostopgoto
@@ -2742,35 +3085,35 @@
% {#2}%
% \fi}
-\definespeciallocation\v!pagina#1#2% page(n) page(+n) page(-n)
+\definespeciallocation\v!pagina#1#2% page(n) page(+n) page(-n)
{\iflocation
\ifx\currentouterreference\empty
\splitoffreference\currentreferenceoperation
\else
- \let\currentinnerreference=\currentreferenceoperation
+ \let\currentinnerreference\currentreferenceoperation
\fi
\ifx\currentouterreference\empty
- \doifinstringelse{+}{\currentinnerreference}
- {\scratchcounter=\realpageno
- \advance\scratchcounter by \currentinnerreference
+ \doifinstringelse+\currentinnerreference
+ {\scratchcounter\realpageno
+ \advance\scratchcounter \currentinnerreference
\edef\currentinnerreference{\the\scratchcounter}}
- {\doifinstringelse{-}{\currentinnerreference}
- {\scratchcounter=\realpageno
- \advance\scratchcounter by \currentinnerreference
- \edef\currentinnerreference{\the\scratchcounter}}
- {}}%
- \doifnonzeropositiveelse{\currentinnerreference}
- {}
+ {\doifinstringelse-\currentinnerreference
+ {\scratchcounter\realpageno
+ \advance\scratchcounter \currentinnerreference
+ \edef\currentinnerreference{\the\scratchcounter}}
+ \donothing}%
+ \doifnonzeropositiveelse\currentinnerreference
+ \donothing
{\edef\currentinnerreference{1}}%
- \gotorealpage{}{}{\currentinnerreference}{#2}%
+ \gotorealpage\empty\empty\currentinnerreference{#2}%
\else
\setouterlocation\currentouterreference
- \doifnonzeropositiveelse{\currentinnerreference}
- {}
+ \doifnonzeropositiveelse\currentinnerreference
+ \donothing
{\doifdefinedelse{\v!pagina:::\currentinnerreference}
{\edef\currentinnerreference{\getvalue{\v!pagina:::\currentinnerreference}}}
{\edef\currentinnerreference{1}}}%
- \gotorealpage{\otherURL}{\otherfile}{\currentinnerreference}{#2}%
+ \gotorealpage\otherURL\otherfile\currentinnerreference{#2}%
\fi
\else
{#2}%
@@ -2855,7 +3198,7 @@
\def\docoupledocument[#1][#2][#3][#4]%
{\ifthirdargument
\begingroup
- \def\dolijstelement##1##2##3##4##5##6% 2=aut 6=pag / 2 goes into text ref slot
+ \def\dolijstelement##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::\strippedlistentry[##5]}}{}{##6}{##2}}%
\def\usereferences[##1]%
@@ -2863,7 +3206,7 @@
\dogebruikexterndocument[#1][#2][#4]%
\doglobal\addtocommalist{#1}\crossdocumentreferences
\def\docommando##1%
- {\setxvalue{\??rf##1\c!status}{\v!start}% for fast checking
+ {\setxvalue{\??rf##1\c!status}{\v!start}% for fast checking
\doglobal\addtocommalist{##1}\crossdocumentelements}%
\processcommalist[#3]\docommando
\ifutilitydone
@@ -2883,6 +3226,11 @@
{\setevalue{#1\c!kleur}{\getvalue{#1\c!contrastkleur}}}%
\fi\fi}
+\def\checkcontrastreference#1%
+ {\ifnum\currentreferencetype=\rt!page\relax\ifnum\currentdatareference=\realpageno
+ \copycsname#1\c!kleur\endcsname\csname#1\c!contrastkleur\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.
@@ -2907,23 +3255,23 @@
%D
%D \showsetup{\y!stelbuttonsin}
-\def\dostelbuttonsin[#1]%
- {\getparameters[\??bt][#1]%
- \dododostelinteractiemenuin{\??bt\c!onbekendeverwijzing}%
- \dododostelinteractiemenuin{\??bt\c!zelfdepagina}}
+%\def\dostelbuttonsin[#1]%
+% {\getparameters[\??bt][#1]%
+% \dododostelinteractiemenuin{\??bt\c!onbekendeverwijzing}%
+% \dododostelinteractiemenuin{\??bt\c!zelfdepagina}}
-\def\stelbuttonsin%
- {\dosingleargument\dostelbuttonsin}
+\def\stelbuttonsin
+ {\dodoubleargument\getparameters[\??bt]}
\definecomplexorsimpleempty\button
-\def\complexbutton%
+\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 == [
+ {\dodocomplexbutton#1[#2]{#3}#4} % #4 == [
% \def\dodocomplexbutton#1[#2]#3[#4]%
% {\bgroup
@@ -2952,14 +3300,14 @@
% \fi
% \egroup}
-\long\def\dodocomplexbutton#1[#2]#3[#4]% #3 can contain [] -> {#3} later
+\long\def\dodocomplexbutton#1[#2]#3[#4]% #3 can contain [] -> {#3} later
{\bgroup
\doifvalue{#1\c!status}{\v!stop}{\locationfalse}%
\iflocation
\resetgoto
\ConvertConstantAfter\doifelse{#3}{\v!geen}{\hphantom}{\hbox}
- {\doifelsenothing{#4}
- {\setlocationboxnop#1[#2]{#3}[#4]}
+ {\doifelsenothing{#4}
+ {\setlocationboxnop#1[#2]{#3}[#4]}
{\doifreferencefoundelse{#4}
{\setlocationboxyes#1[#2]{#3}[#4]}
{\unknownreference{#4}%
@@ -2993,36 +3341,36 @@
\def\dointeractiebuttons[#1][#2]% er is een verdeel macro \fractie
{\iflocation
\bgroup
- \doif{\@@ibstatus}{\v!stop}{\locationfalse}%
+ \doif\@@ibstatus\v!stop\locationfalse
\iflocation
\ifsecondargument
\checkinteractiebalk{1.5em}\v!ruim\!!zeropoint % brrrrr
\setbox2=\hbox
{\setupsymbolset[\@@iasymboolset]%
\localframed[\??ib][#1,\c!achtergrond=]{\symbol[\v!vorigepagina]}}%
- \!!heighta=\ht2 % needed because we default to nothing
+ \!!heighta\ht2 % needed because we default to nothing
\stelinteractiebalkin[#1,\c!strut=\v!nee]%
- \setupinteraction[\c!breedte=\!!zeropoint]%
- %\!!counta=1
- \!!counta=0 % new
+ %\setupinteraction[\c!breedte=\!!zeropoint]%
+ \setinteractionparameter\c!breedte\!!zeropoint
+ \!!counta=0 % new, was 1
\processallactionsinset
[#2]
- [ \v!pagina=>\advance\!!counta by 4,
- \v!sub\v!pagina=>\advance\!!counta by 4,
- \s!unknown=>\advance\!!counta by 1]%
+ [ \v!pagina=>\advance\!!counta 4,
+ \v!sub\v!pagina=>\advance\!!counta 4,
+ \s!unknown=>\advance\!!counta 1]%
\ifdim\@@ibbreedte=\!!zeropoint\relax
- \!!widtha=2em
- \advance\!!widtha by \@@ibafstand % new
- \!!widthb=\!!counta\!!widtha
- \advance\!!widthb by -\@@ibafstand % new
+ \!!widtha2em
+ \advance\!!widtha \@@ibafstand % new
+ \!!widthb\!!counta\!!widtha
+ \advance\!!widthb -\@@ibafstand % new
\else
- \!!widtha=\@@ibbreedte
- \!!widthb=\@@ibafstand % new
- \multiply\!!widthb by \!!counta % new
- \advance\!!widthb by -\@@ibafstand % new
- \advance\!!widtha by -\!!widthb % new
- \divide\!!widtha by \!!counta
- \!!widthb=\@@ibbreedte
+ \!!widtha\@@ibbreedte
+ \!!widthb\@@ibafstand % new
+ \multiply\!!widthb \!!counta % new
+ \advance\!!widthb -\@@ibafstand % new
+ \advance\!!widtha -\!!widthb % new
+ \divide\!!widtha \!!counta
+ \!!widthb\@@ibbreedte
\fi
\def\goto##1%
{\setnostrut
@@ -3054,25 +3402,25 @@
\egroup
\fi}
-%D \macros
+%D \macros
%D {overlaybutton}
%D
%D For converience we provide:
%D
-%D \starttypen
+%D \starttypen
%D \overlaybutton[reference]
%D \stoptypen
%D
-%D This command can be used to define overlays an/or can be
-%D used in the whatevertext areas, like:
+%D This command can be used to define overlays an/or can be
+%D used in the whatevertext areas, like:
%D
-%D \starttypen
+%D \starttypen
%D \defineoverlay[PrevPage][\overlaybutton{PrevPage}]
%D \setupbackgrounds[page][background=PrevPage]
%D \setuptexttexts[\overlaybutton{NextPage}]
%D \stoptypen
%D
-%D For practical reasons, this macro accepts square brackets
+%D For practical reasons, this macro accepts square brackets
%D as well as braces.
\definecomplexorsimple\overlaybutton
@@ -3080,29 +3428,44 @@
\def\simpleoverlaybutton#1%
{\complexoverlaybutton[#1]}
-\def\complexoverlaybutton% no text, next argument is [reference]
- {\button
- [\c!kader=\v!uit,\c!achtergrond=,
- \c!breedte=\overlaywidth,\c!hoogte=\overlayheight]%
- {}}
+% \def\complexoverlaybutton% no text, next argument is [reference]
+% {\button
+% [\c!kader=\v!uit,\c!achtergrond=,
+% \c!breedte=\overlaywidth,\c!hoogte=\overlayheight]%
+% {}}
+
+\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 In previous macros we used \type {\dotextprefix} to
+%D generate a space between a label and a number.
%D
-%D \starttypen
+%D \starttypen
%D \dotextprefix{text}
-%D \stoptypen
+%D \stoptypen
%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
+ \global\labeltextdonefalse % this is an ugly dependancy,
+ \setbox\scratchbox=\hbox{#1}% to be solved some day
+ \ifdim\wd\scratchbox>\zeropoint
\unhbox\scratchbox
\iflabeltextdone\else\@@rfscheider\fi
\else
@@ -3124,8 +3487,8 @@
%\c!urlspatie=\v!nee,
%\c!urlletter=,
%\c!urlkleur=,
- \c!converteerfile=\v!nee,
- %\c!strut=\v!nee, % some day an option
+ \c!converteerfile=\v!nee,
+ %\c!strut=\v!nee, % some day an option
\c!prefix=,
\c!breedte=.75\zetbreedte,
\c!links=\citaat\bgroup,
@@ -3157,6 +3520,4 @@
% \c!zelfdepagina=\v!ja,
% \c!onbekendeverwijzing=\v!ja]
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/core-reg.tex b/tex/context/base/core-reg.tex
index d1149426e..31de1741b 100644
--- a/tex/context/base/core-reg.tex
+++ b/tex/context/base/core-reg.tex
@@ -121,21 +121,19 @@
% \GotoPar}
%\def\doregister#1%
-% {\def\currentregister{#1}%
-% \complexorsimpleempty\doregister}
-
-%\def\doregister#1%
% {\chardef\registerpagestatus=1
% \def\currentregister{#1}%
-% \complexorsimpleempty\doregister}
+% \doifelsevalue{\??id\currentregister\c!eigennummer}{\v!ja}
+% {\def\next{\dosingleempty\dodoregister}}
+% {\def\next{\dosingleempty\donoregister}}%
+% \next}
\def\doregister#1%
{\chardef\registerpagestatus=1
\def\currentregister{#1}%
\doifelsevalue{\??id\currentregister\c!eigennummer}{\v!ja}
- {\def\next{\dosingleempty\dodoregister}}
- {\def\next{\dosingleempty\donoregister}}%
- \next}
+ {\dosingleempty\dodoregister}
+ {\dosingleempty\donoregister}}
\def\donoregister[#1]%
{\dodoregister[#1]{}}
@@ -145,6 +143,9 @@
\ifvmode\nobreak\fi
\GotoPar}
+\def\writetoregister[#1]% to be documented
+ {\doregister{#1}}
+
\def\startregister%
{\dodoubleargument\dostartregister}
@@ -439,7 +440,7 @@
\dohandleregisterentry{#2}%
\global\firstsubsubentryfalse}}
-\def\dosetpageregister#1%
+\def\dosetpageregister#1% \currentregister gebruiken
{\dosetreglevel{\getvalue{\??id#1\c!criterium}}%
\global\let\currentregisterentry\empty
\global\firstsubentrytrue
@@ -461,8 +462,8 @@
{\edef\alllistreferences%
{\getvalue{\??id#1\??id\currentregisterentry}}%
\beforesplitstring\alllistreferences\at::\to\internallistreference
- \aftersplitstring\alllistreferences\at::\to\alllistreferences}
- {\let\alllistreferences=\empty
+ \aftersplitstring \alllistreferences\at::\to\alllistreferences}
+ {\let\alllistreferences\empty
\def\internallistreference{0}}}
\def\dosetlinkregister#1% is die page reference echt nodig?
@@ -471,10 +472,8 @@
\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}}}
+ \setvalue{#1\s!entrya}##1{\dosetlinkregisterentrya{#1}{##1}}%
+ \setvalue{#1\s!entry }##1{\dosetpageregisterletter{#1}{##1}}}
\def\dosetlinkregisterentrya#1#2%
{\global\utilitydonetrue
@@ -490,20 +489,20 @@
\getcommacommandsize[\alllistreferences]%
\getfromcommacommand[\alllistreferences][1]%
\ifnum\commalistsize=1
- \let\firstlistreference=\empty
- \let\midlistreference=\commalistelement
- \let\lastlistreference=\empty
+ \let\firstlistreference\empty
+ \let\midlistreference\commalistelement
+ \let\lastlistreference\empty
\else
- \let\firstlistreference=\commalistelement
+ \let\firstlistreference\commalistelement
\getfromcommacommand[\alllistreferences][\commalistsize]%
- \let\lastlistreference=\commalistelement
+ \let\lastlistreference\commalistelement
\ifnum\commalistsize=2
- \let\midlistreference=\empty
+ \let\midlistreference\empty
\else
- \!!counta=\commalistsize
- \divide\!!counta by 2
+ \!!counta\commalistsize
+ \divide\!!counta 2
\getfromcommacommand[\alllistreferences][\!!counta]%
- \let\midlistreference=\commalistelement
+ \let\midlistreference\commalistelement
\fi
\fi
% aangepast
@@ -685,71 +684,212 @@
% [ \v!midden=>\docommando\nextlistreference\v!volgende,
% \v!rechts=>\docommando\prevlistreference\v!vorige
% \docommando\nextlistreference\v!volgende]}}
+%
+% \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}%
+% \doifnot{\alllistreferences}{}
+% {\def\dodocommando[##1-##2]%
+% {\ifx\firstlistreference\empty
+% \def\firstlistreference{##1-##2}%
+% \fi
+% \def\lastlistreference{##1-##2}%
+% \ifnum##1<\nextinternalreference\relax
+% \def\prevlistreference{##1-##2}%
+% \else\ifnum##1>\nextinternalreference\relax
+% \def\nextlistreference{##1-##2}%
+% \def\dodocommando[####1-####2]%
+% {\def\lastlistreference{####1-####2}}%
+% \else
+% \def\selflistreference{##1-##2}%
+% \fi\fi}%
+% \def\docommando##1%
+% {\dodocommando[##1]}%
+% \processcommacommand[\alllistreferences]\docommando}%
+% \ifx\prevlistreference\empty
+% \let\prevlistreference=\lastlistreference
+% \fi
+% \ifx\nextlistreference\empty
+% \let\nextlistreference=\firstlistreference
+% \fi
+% \ifx\prevlistreference\selflistreference
+% \let\prevlistreference=\empty
+% \let\nextlistreference=\empty
+% \fi
+% \def\dodocommando[##1-##2]%
+% {\gotonextinternal{\s!ind}{##1}{##2}{\box0}}%{\copy0}}%
+% \def\docommando##1##2%
+% {\bgroup
+% \ifx##1\empty
+% \doifvalue{\??id#1\c!onbekendeverwijzing}{\v!leeg}
+% {\hskip1em}%
+% \else
+% \setbox0=\hbox to 1em{\hss\showlocation{\symbol[##2]}\hss}%
+% \expandafter\dodocommando\expandafter[##1]%
+% \fi
+% \egroup}%
+% \processaction
+% [\getvalue{\??id#1\c!plaats}]
+% [\v!midden=>\docommando\prevlistreference\v!vorige,
+% \v!links=>\docommando\prevlistreference\v!vorige
+% \docommando\nextlistreference\v!volgende]%
+% \doifreferencefoundelse{\s!lin:\internallistreference}
+% {\gotosomeinternal
+% {\s!lin}{\internallistreference}{\currentrealreference}
+% {\showlocation{\limitedregisterentry{#1}{#3}}}}
+% {\hbox{\limitedregisterentry{#1}{#3}}}%
+% \processaction
+% [\getvalue{\??id#1\c!plaats}]
+% [ \v!midden=>\docommando\nextlistreference\v!volgende,
+% \v!rechts=>\docommando\prevlistreference\v!vorige
+% \docommando\nextlistreference\v!volgende]}}
+%
+% better:
+
+% \def\dodocommandoprolinrefA[#1-#2]%
+% {\ifx\firstlistreference\empty
+% \def\firstlistreference{#1-#2}%
+% \fi
+% \def\lastlistreference{#1-#2}%
+% \ifnum#1<\nextinternalreference\relax
+% \def\prevlistreference{#1-#2}%
+% \else\ifnum#1>\nextinternalreference\relax
+% \def\nextlistreference{#1-#2}%
+% \def\dodocommandoprolinrefA[##1-##2]%
+% {\def\lastlistreference{##1-##2}}%
+% \else
+% \def\selflistreference{#1-#2}%
+% \fi\fi}
+%
+% more efficient :
+
+\def\dodocommandoprolinrefAA[#1-#2]%
+ {\def\lastlistreference{#1-#2}}
+
+\def\dodocommandoprolinrefA[#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\dodocommandoprolinrefA\dodocommandoprolinrefAA
+ \else
+ \let\selflistreference\lastlistreference
+ \fi\fi}
+
+\def\docommandoprolinrefA#1%
+ {\dodocommandoprolinrefA[#1]}
+
+\def\dodocommandoprolinrefB[#1-#2]%
+ {\gotonextinternal{\s!ind}{#1}{#2}{\box0}}
+
+\def\docommandoprolinrefB#1#2#3%
+ {\bgroup
+ \ifx#2\empty
+ \doifvalue{\??id#1\c!onbekendeverwijzing}\v!leeg{\hskip1em}%
+ \else
+ \setbox0=\hbox to 1em{\hss\showlocation{\symbol[#3]}\hss}%
+ \expandafter\dodocommandoprolinrefB\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]}\docommandoprolinrefA
+% \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
+% % can be a bit faster is one proces only
+% % can even be resolved at definition time
+% \processaction
+% [\getvalue{\??id#1\c!plaats}]
+% [\v!midden=>\docommandoprolinrefB{#1}\prevlistreference\v!vorige,
+% \v!links=>\docommandoprolinrefB{#1}\prevlistreference\v!vorige
+% \docommandoprolinrefB{#1}\nextlistreference\v!volgende]%
+% \doifreferencefoundelse{\s!lin:\internallistreference}
+% {\gotosomeinternal
+% {\s!lin}{\internallistreference}{\currentrealreference}
+% {\showlocation{\limitedregisterentry{#1}{#3}}}}
+% {\hbox{\limitedregisterentry{#1}{#3}}}%
+% \processaction
+% [\getvalue{\??id#1\c!plaats}]
+% [ \v!midden=>\docommandoprolinrefB{#1}\nextlistreference\v!volgende,
+% \v!rechts=>\docommandoprolinrefB{#1}\prevlistreference\v!vorige
+% \docommandoprolinrefB{#1}\nextlistreference\v!volgende]}}
\def\doprocesslinkregister[#1][#2]#3%
{\hbox
{\doprocesspageregister[#2]{}{#3}%
- \let\firstlistreference=\empty
- \let\lastlistreference=\empty
- \let\selflistreference=\empty
- \let\prevlistreference=\empty
- \let\nextlistreference=\empty
+ \let\firstlistreference\empty
+ \let\lastlistreference\empty
+ \let\selflistreference\empty
+ \let\prevlistreference\empty
+ \let\nextlistreference\empty
\getalllistreferences{#1}{#3}%
- \doifnot{\alllistreferences}{}
- {\def\dodocommando[##1-##2]%
- {\ifx\firstlistreference\empty
- \def\firstlistreference{##1-##2}%
- \fi
- \def\lastlistreference{##1-##2}%
- \ifnum##1<\nextinternalreference\relax
- \def\prevlistreference{##1-##2}%
- \else\ifnum##1>\nextinternalreference\relax
- \def\nextlistreference{##1-##2}%
- \def\dodocommando[####1-####2]%
- {\def\lastlistreference{####1-####2}}%
- \else
- \def\selflistreference{##1-##2}%
- \fi\fi}%
- \def\docommando##1%
- {\dodocommando[##1]}%
- \processcommacommand[\alllistreferences]\docommando}%
+ \ifx\alllistreferences\empty \else
+ \expanded{\rawprocesscommalist[\alllistreferences]}\docommandoprolinrefA
+ \fi
\ifx\prevlistreference\empty
- \let\prevlistreference=\lastlistreference
+ \let\prevlistreference\lastlistreference
\fi
\ifx\nextlistreference\empty
- \let\nextlistreference=\firstlistreference
+ \let\nextlistreference\firstlistreference
\fi
\ifx\prevlistreference\selflistreference
- \let\prevlistreference=\empty
- \let\nextlistreference=\empty
+ \let\prevlistreference\empty
+ \let\nextlistreference\empty
+ \fi
+ \setalignmentswitch{\getvalue{\??id#1\c!plaats}}%
+ \ifcase\alignmentswitch
+ % links
+ \docommandoprolinrefB{#1}\prevlistreference\v!vorige
+ \docommandoprolinrefB{#1}\nextlistreference\v!volgende
+ \or
+ % midden
+ \docommandoprolinrefB{#1}\prevlistreference\v!vorige
+ \or
+ % rechts
\fi
- \def\dodocommando[##1-##2]%
- {\gotonextinternal{\s!ind}{##1}{##2}{\box0}}%{\copy0}}%
- \def\docommando##1##2%
- {\bgroup
- \ifx##1\empty
- \doifvalue{\??id#1\c!onbekendeverwijzing}{\v!leeg}
- {\hskip1em}%
- \else
- \setbox0=\hbox to 1em{\hss\showlocation{\symbol[##2]}\hss}%
- \expandafter\dodocommando\expandafter[##1]%
- \fi
- \egroup}%
- \processaction
- [\getvalue{\??id#1\c!plaats}]
- [\v!midden=>\docommando\prevlistreference\v!vorige,
- \v!links=>\docommando\prevlistreference\v!vorige
- \docommando\nextlistreference\v!volgende]%
\doifreferencefoundelse{\s!lin:\internallistreference}
{\gotosomeinternal
- {\s!lin}{\internallistreference}{\currentrealreference}
+ \s!lin \internallistreference \currentrealreference
{\showlocation{\limitedregisterentry{#1}{#3}}}}
{\hbox{\limitedregisterentry{#1}{#3}}}%
- \processaction
- [\getvalue{\??id#1\c!plaats}]
- [ \v!midden=>\docommando\nextlistreference\v!volgende,
- \v!rechts=>\docommando\prevlistreference\v!vorige
- \docommando\nextlistreference\v!volgende]}}
+ \ifcase\alignmentswitch
+ % links
+ \or
+ % midden
+ \docommandoprolinrefB{#1}\nextlistreference\v!volgende
+ \or
+ % rechts
+ \docommandoprolinrefB{#1}\prevlistreference\v!vorige
+ \docommandoprolinrefB{#1}\nextlistreference\v!volgende
+ \fi}}
% \def\dodolinkedregister[#1][#2]#3% page auto link
% {\bgroup
@@ -769,20 +909,20 @@
% \ifvmode\nobreak\fi
% \GotoPar}
-\def\dodolinkedregister[#1][#2]#3% page auto link
- {\bgroup
+\def\dodolinkedregister[#1][#2]#3% page auto link
+ {\bgroup
\chardef\registerpagestatus=1
\def\currentregister{#1}%
\iflocation
\ifautoregisterhack
- \def\next{\doprocessautoregister[#1][#2]{#3}}%
+ \def\next{\doprocessautoregister[#1][#2]}%
\else
- \def\next{\doprocesslinkregister[#1][#2]{#3}}%
+ \def\next{\doprocesslinkregister[#1][#2]}%
\fi
\else
- \def\next{\doprocesspageregister[#2]{}{#3}}%
+ \def\next{\doprocesspageregister[#2]{}}%
\fi
- \next
+ \next{#3}%
\egroup
\ifvmode\nobreak\fi
\GotoPar}
@@ -811,7 +951,10 @@
\pagereference[-:\s!lin:\internallistreference]%
\pluscounter{autolink:#1}%
\bgroup
- \setupinteraction[\c!kleur=,\c!contrastkleur=,\c!letter=]% kan sneller
+ %\setupinteraction[\c!kleur=,\c!contrastkleur=,\c!letter=]% kan sneller
+ \resetinteractionparameter\c!kleur
+ \resetinteractionparameter\c!contrastkleur
+ \resetinteractionparameter\c!letterkleur
\naarbox
{\limitedregisterentry{#1}{\begstrut#2}}%
[JS(SetRegisterEntry{\v!register,\countervalue{autolink:#1},#2,{\alllistreferences}})]%
@@ -933,7 +1076,8 @@
\c!plaats=\v!midden,
\c!maxbreedte=,
\c!nummer=\v!nee,
- \c!onbekendeverwijzing=\v!leeg]%
+ \c!onbekendeverwijzing=\v!leeg,
+ \c!expansie=]%
\presetheadtext[#1=\Word{#1}]%
\setvalue{#1}%
{\doregister{#1}}%
@@ -976,12 +1120,12 @@
{\doutilities{#1}{\jobname}{#1}{}{}}%
\endgroup
\ifregistergeplaatst
- \enablemode [\systemmodeprefix\v!register]%
+ \setsystemmode \v!register
\else
- \disablemode[\systemmodeprefix\v!register]%
+ \resetsystemmode\v!register
\fi}
-\def\bepaalregisterkenmerken%
+\def\bepaalregisterkenmerken
{\dodoubleempty\dobepaalregisterkenmerken}
\definieerregister
diff --git a/tex/context/base/core-rul.tex b/tex/context/base/core-rul.tex
index cca5ac4d5..06642fe3f 100644
--- a/tex/context/base/core-rul.tex
+++ b/tex/context/base/core-rul.tex
@@ -13,8 +13,6 @@
\writestatus{loading}{Context Core Macros / Ruled Stuff Handling}
-% to test: [#1]#2[#3] in \startlocalframed
-
\unprotect
%D \macros
@@ -30,7 +28,7 @@
%D preset value of .4pt equals the default hard coded \TEX\
%D rule width.
-\newdimen\linewidth
+\newdimen\linewidth
\def\dosetuplinewidth[#1]%
{\assigndimension{#1}{\linewidth}{0.2pt}{0.4pt}{0.6pt}}
@@ -45,6 +43,15 @@
% \def\setuprules%
% {\dosingleargument\dosetuprules}
+%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
@@ -199,25 +206,22 @@
{\vrule\!!width#1\!!height#2\!!depth#3}%
\def\dofilledroundbox\width#1\height#2\depth#3\radius#4\\%
- {\ovalbox{#1}{#2}{#3}{\linewidth}{#4}{\v!uit}{\v!aan}}
+ {\ovalbox{#1}{#2}{#3}{\ruledlinewidth}{#4}{\v!uit}{\v!aan}}
-\def\ovalbox#1#2#3#4#5#6#7%
+\def\ovalbox#1#2#3#4#5#6#7% direct #1 etc passeren
{\bgroup
- \scratchdimen=#1\edef\ovalwid{\number\scratchdimen}%
- \scratchdimen=#2\edef\ovalhei{\number\scratchdimen}%
- \scratchdimen=#3\edef\ovaldep{\number\scratchdimen}%
- \scratchdimen=#4\edef\ovallin{\number\scratchdimen}%
- \scratchdimen=#5\edef\ovalrad{\number\scratchdimen}%
- \doifelse{#6}{\v!aan} % will be a macro that handles
- {\def\ovalstr{1}} % start, stop, ja, nee, aan, uit
- {\def\ovalstr{0}}% % and something \doif
- \doifelse{#7}{\v!aan}
+ \scratchdimen#1\edef\ovalwid{\the\scratchdimen}%
+ \scratchdimen#2\edef\ovalhei{\the\scratchdimen}%
+ \scratchdimen#3\edef\ovaldep{\the\scratchdimen}%
+ \scratchdimen#4\edef\ovallin{\the\scratchdimen}%
+ \scratchdimen#5\edef\ovalrad{\the\scratchdimen}%
+ \doifelse{#6}\v!aan % will be a macro that handles
+ {\def\ovalstr{1}} % start, stop, ja, nee, aan, uit
+ {\def\ovalstr{0}}% % and something \doif
+ \doifelse{#7}\v!aan
{\def\ovalfil{1}}
{\def\ovalfil{0}}%
- \doovalbox
- {\ovalwid}{\ovalhei}{\ovaldep}
- {\ovallin}{\ovalrad}
- {\ovalstr}{\ovalfil}%
+ \doovalbox\ovalwid\ovalhei\ovaldep\ovallin\ovalrad\ovalstr\ovalfil
\egroup}
%D The oval box is drawn using a special macro, depending on
@@ -226,20 +230,29 @@
%D It won't be a surprise that we not only provide gray boxes,
%D but also colored ones. Here it is:
+% \def\setcolorbox\width#1\height#2\depth#3\color#4\corner#5\radius#6\\%
+% {\ifincolor
+% \doifcolorelse{#4}{\color[#4]%
+% {\dofilledbox \width#1\height#2\depth#3\corner#5\radius#6\\}}
+% {\dophantombox\width#1\height#2\depth#3\corner#5\radius#6\\}%
+% \else
+% \dophantombox\width#1\height#2\depth#3\corner#5\radius#6\\%
+% \fi}
+
\def\setcolorbox\width#1\height#2\depth#3\color#4\corner#5\radius#6\\%
- {\ifincolor
- \doifcolorelse{#4}{\color[#4]%
+ {\hbox{\ifincolor
+ \doifcolorelse{#4}{\localcolortrue\color[#4]%
{\dofilledbox \width#1\height#2\depth#3\corner#5\radius#6\\}}
{\dophantombox\width#1\height#2\depth#3\corner#5\radius#6\\}%
\else
\dophantombox\width#1\height#2\depth#3\corner#5\radius#6\\%
- \fi}
+ \fi}}
\def\colorbox%
{\setcolorbox}
%D \macros
-%D {defineoverlay,doifoverlayelse,
+%D {defineoverlay,doifoverlayelse,overlayoffset,
%D overlaywidth, overlayheight, overlaydepth,
%D overlaycolor, overlaylinecolor, overlaylinewidth}
%D
@@ -299,12 +312,21 @@
\def\overlaywidth {\the\vsize\space} % We preset the variables
\def\overlayheight {\the\hsize\space} % to some reasonable default
\let\overlaydepth \!!zeropoint % values. The attributes
-\let\overlaycolor \empty % of the frame can be (are)
-\let\overlaylinewidth \!!zeropoint % set somewhere else.
+\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}
@@ -313,40 +335,72 @@
{\setvalue{\??ov##1}{\executedefinedoverlay##1\\#2\\}}%
\processcommalist[#1]\docommando}
+% \long\def\executedefinedoverlay#1\\#2\\#3#4#5#6#7#8#9%
+% {\bgroup
+% \scratchdimen=#3%
+% \edef\overlaywidth{\the\scratchdimen\space}%
+% \scratchdimen=#4%
+% \advance\scratchdimen by #5%
+% \edef\overlayheight{\the\scratchdimen\space}%
+% \scratchdimen=#5%
+% \edef\overlaydepth{\the\scratchdimen\space}%
+% \edef\overlaycolor{#6}%
+% \edef\overlayoffset{\backgroundoffset\space}% we steal this one
+% \prependtoks
+% \hsize\overlaywidth
+% \vsize\overlayheight
+% \to\everyoverlay
+% %\writestatus
+% % {overlay}
+% % {#1\space w=\overlaywidth/h+d=\overlayheight/d=\overlaydepth]}%
+% \setbox0=\hbox{\lower\overlaydepth\hbox{\the\everyoverlay#2}}%
+% \dimen0=\wd0 \advance\dimen0 by -\overlaywidth
+% \dimen2=\ht0 \advance\dimen2 by -#4% not \overlayheight
+% \wd0=\overlaywidth
+% \ht0=\overlayheight
+% \dp0=\overlaydepth
+% \setbox0=\hbox{\hskip-.5\dimen0\raise-.5\dimen2\box0}%
+% \wd0=\overlaywidth
+% \ht0=\overlayheight
+% \dp0=\overlaydepth
+% \box0
+% \egroup}
+
+\prependtoks
+ \hsize\overlaywidth
+ \vsize\overlayheight
+\to\everyoverlay
+
\long\def\executedefinedoverlay#1\\#2\\#3#4#5#6#7#8#9%
{\bgroup
- \scratchdimen=#3%
+ \scratchdimen#3%
\edef\overlaywidth{\the\scratchdimen\space}%
- \scratchdimen=#4%
- \advance\scratchdimen by #5%
+ \scratchdimen#4%
+ \advance\scratchdimen #5%
\edef\overlayheight{\the\scratchdimen\space}%
- \scratchdimen=#5%
+ \scratchdimen#5%
\edef\overlaydepth{\the\scratchdimen\space}%
\edef\overlaycolor{#6}%
- \prependtoks
- \hsize\overlaywidth
- \vsize\overlayheight
- \to\everyoverlay
+ \let\overlayoffset\backgroundoffset % we steal this one
%\writestatus
% {overlay}
% {#1\space w=\overlaywidth/h+d=\overlayheight/d=\overlaydepth]}%
- \setbox0=\hbox{\lower\overlaydepth\hbox{\the\everyoverlay#2}}%
- \dimen0=\wd0 \advance\dimen0 by -\overlaywidth
- \dimen2=\ht0 \advance\dimen2 by -#4% not \overlayheight
- \wd0=\overlaywidth
- \ht0=\overlayheight
- \dp0=\overlaydepth
- \setbox0=\hbox{\hskip-.5\dimen0\raise-.5\dimen2\box0}%
- \wd0=\overlaywidth
- \ht0=\overlayheight
- \dp0=\overlaydepth
- \box0
+ \setbox\scratchbox\hbox{\lower\overlaydepth\hbox{\the\everyoverlay#2}}%
+ \dimen0\wd\scratchbox \advance\dimen0 -\overlaywidth
+ \dimen2\ht\scratchbox \advance\dimen2 -#4% not \overlayheight
+ %\wd\scratchbox\overlaywidth
+ %\ht\scratchbox\overlayheight
+ %\dp\scratchbox\overlaydepth
+ \setbox\scratchbox\hbox{\hskip-.5\dimen0\raise-.5\dimen2\box\scratchbox}%
+ \wd\scratchbox\overlaywidth
+ \ht\scratchbox\overlayheight
+ \dp\scratchbox\overlaydepth
+ \box\scratchbox
\egroup}
%D The empty case is:
-\def\executeoverlay#1#2#3#4#5#6#7%
- {}
+\let\executeoverlay\gobblesevenarguments
%D For testing we provide:
@@ -387,25 +441,36 @@
{\bgroup
\def\currentbackground{#1}%
\the\everybackgroundbox
+% \setbox\extraframebox=\hbox
+% {\executeifdefined{\??ov\currentbackground}\gobblesevenarguments
+% {\dimen2}{\dimen4}{\dimen6}{#3}{#4}{#5}{#6}}%
+% \setbox\extraframebox=\hbox
+% {\vbox{\moveleft\dimen0\box\extraframebox}}%
\setbox\extraframebox=\hbox
- {\executeifdefined{\??ov\currentbackground}\gobblesevenarguments
- {\dimen2}{\dimen4}{\dimen6}{#3}{#4}{#5}{#6}}%
- \setbox\extraframebox=\hbox
- {\vbox{\moveleft\dimen0\box\extraframebox}}%
+ {\vbox{\moveleft\dimen0\hbox
+ {\executeifdefined{\??ov\currentbackground}\gobblesevenarguments
+ {\dimen2}{\dimen4}{\dimen6}{#3}{#4}{#5}{#6}}}}%
\wd\extraframebox=\zeropoint % \backgroundwidth
\ht\extraframebox=\backgroundheight
\dp\extraframebox=\backgrounddepth
\box\extraframebox % \hskip-\backgroundwidth
\egroup}
+\let\backgroundoffset\!!zeropoint
+\let\backgrounddepth \!!zeropoint
+\def\backgroundwidth {\the\hsize}
+\def\backgroundheight{\the\vsize}
+
\def\dobackgroundbox#1\background#2\color#3\raster#4\offset#5\corner
#6\radius#7\depth#8\\%
{\vbox
{\forgetall\boxmaxdepth\maxdimen
\dimen0=#5\relax
- \dimen2=\wd#1\advance\dimen2 by 2\dimen0
- \dimen4=\ht#1\advance\dimen4 by \dimen0
- \dimen6=\dp#1\advance\dimen6 by \dimen0\advance\dimen6 by #8\relax
+ \dimen2=\wd#1\advance\dimen2 2\dimen0
+ \dimen4=\ht#1\advance\dimen4 \dimen0
+ \dimen6=\dp#1\advance\dimen6 \dimen0
+ \advance\dimen6 #8\relax
+ \edef\backgroundoffset{\the\dimen0}%
\edef\backgroundwidth {\the\wd#1}%
\edef\backgroundheight{\the\ht#1}%
\edef\backgrounddepth {\the\dp#1}%
@@ -435,9 +500,9 @@
\def\dooutlinebox#1\color#2\offset#3\corner#4\radius#5\depth#6\toggle#7\\%
{\vbox % rules on top of box
{\dimen0=#3\relax
- \dimen2=\wd#1\advance\dimen2 by 2\dimen0
- \dimen4=\ht#1\advance\dimen4 by \dimen0
- \dimen6=\dp#1\advance\dimen6 by \dimen0\advance\dimen6 by #6\relax
+ \dimen2=\wd#1\advance\dimen2 2\dimen0
+ \dimen4=\ht#1\advance\dimen4 \dimen0
+ \dimen6=\dp#1\advance\dimen6 \dimen0\advance\dimen6 by #6\relax
\ifdim\dimen6<\zeropoint
\advance\dimen4 by \dimen6 \dimen8=-\dimen6 \dimen6=\zeropoint
\else
@@ -492,18 +557,18 @@
\def\@@frame@@{@@frame@@}
-\setvalue{t\@@frame@@\v!aan\v!aan}{\hrule\!!height\linewidth\kern-\linewidth}
-\setvalue{t\@@frame@@\v!uit\v!aan}{\hrule\!!height\linewidth\kern-\linewidth}
- \setvalue{t\@@frame@@\v!aan}{\hrule\!!height\linewidth\kern-\linewidth}
-\setvalue{b\@@frame@@\v!aan\v!aan}{\kern-\linewidth\hrule\!!height\linewidth}
-\setvalue{b\@@frame@@\v!uit\v!aan}{\kern-\linewidth\hrule\!!height\linewidth}
- \setvalue{b\@@frame@@\v!aan}{\kern-\linewidth\hrule\!!height\linewidth}
-\setvalue{l\@@frame@@\v!aan\v!aan}{\vrule\!!width\linewidth\kern-\linewidth}
-\setvalue{l\@@frame@@\v!uit\v!aan}{\vrule\!!width\linewidth\kern-\linewidth}
- \setvalue{l\@@frame@@\v!aan}{\vrule\!!width\linewidth\kern-\linewidth}
-\setvalue{r\@@frame@@\v!aan\v!aan}{\kern-\linewidth\vrule\!!width\linewidth}
-\setvalue{r\@@frame@@\v!uit\v!aan}{\kern-\linewidth\vrule\!!width\linewidth}
- \setvalue{r\@@frame@@\v!aan}{\kern-\linewidth\vrule\!!width\linewidth}
+\setvalue{t\@@frame@@\v!aan\v!aan}{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+\setvalue{t\@@frame@@\v!uit\v!aan}{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+ \setvalue{t\@@frame@@\v!aan}{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth}
+\setvalue{b\@@frame@@\v!aan\v!aan}{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+\setvalue{b\@@frame@@\v!uit\v!aan}{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+ \setvalue{b\@@frame@@\v!aan}{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth}
+\setvalue{l\@@frame@@\v!aan\v!aan}{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+\setvalue{l\@@frame@@\v!uit\v!aan}{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+ \setvalue{l\@@frame@@\v!aan}{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth}
+\setvalue{r\@@frame@@\v!aan\v!aan}{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
+\setvalue{r\@@frame@@\v!uit\v!aan}{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
+ \setvalue{r\@@frame@@\v!aan}{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth}
%D I condidered using the low level support command
%D \type{\ruledhbox}, but this would slow down processing by a
@@ -515,7 +580,7 @@
%D {\ovalbox}.
\def\dostrokedroundbox\width#1\height#2\depth#3\radius#4\toggle#5\left#6\\%
- {\doif{#5}{\v!aan}{\ovalbox{#1}{#2}{#3}{\linewidth}{#4}{\v!aan}{\v!uit}}}
+ {\doif{#5}{\v!aan}{\ovalbox{#1}{#2}{#3}{\ruledlinewidth}{#4}{\v!aan}{\v!uit}}}
%D The next few macros are probably the most misused ones in
%D \CONTEXT. They deal with putting rules around boxes, provide
@@ -572,16 +637,16 @@
{\copylocalframed[#1][\??oi]}
\def\copylocalframed[#1]#2[#3]%
- {\copyparameters[#1][#3]
- [\c!breedte,\c!hoogte,\c!offset,\c!leeg,
- \c!straal,\c!hoek,\c!diepte,\c!kader,\c!kaderkleur,
- \c!bovenkader,\c!onderkader,\c!linkerkader,\c!rechterkader,
- \c!lijndikte,\c!kaderoffset,\c!voorgrondkleur,\c!achtergrond,
- \c!achtergrondoffset,\c!achtergrondraster,\c!achtergrondkleur,
+ {\copyparameters[#1][#3]%
+ [\c!breedte,\c!hoogte,\c!offset,\c!leeg,\c!lijndikte,%
+ \c!straal,\c!hoek,\c!diepte,\c!kader,\c!kaderkleur,%
+ \c!bovenkader,\c!onderkader,\c!linkerkader,\c!rechterkader,%
+ \c!lijndikte,\c!kaderoffset,\c!voorgrondkleur,\c!achtergrond,%
+ \c!achtergrondoffset,\c!achtergrondraster,\c!achtergrondkleur,%
\c!uitlijnen,\c!onder,\c!boven,\c!strut,\c!plaats]%
- \copyparameters[#1\c!achtergrond][#1]
+ \copyparameters[#1\c!achtergrond][#1]%
[\c!straal,\c!hoek,\c!diepte]%
- \copyparameters[#1\c!kader][#1]
+ \copyparameters[#1\c!kader][#1]%
[\c!straal,\c!hoek,\c!diepte]}
\def\setupframed%
@@ -601,7 +666,7 @@
\newif\ifinframed
-\def\localframed%
+\def\localframed
{\bgroup
\dodoubleempty\startlocalframed}
@@ -617,6 +682,9 @@
%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\startlocalframed[#1][#2]%
{\bgroup
@@ -624,11 +692,11 @@
\edef\@@framed{#1}%
% % this piece of pre expansion is needed (sometimes used in frameoffset)
% \doifvaluesomething{\@@framed\c!lijndikte}
-% {\linewidth=\getvalue{\@@framed\c!lijndikte}}%
+% {\ruledlinewidth\getvalue{\@@framed\c!lijndikte}}%
% this piece of pre expansion is needed (sometimes used circular)
\scratchdimen\getvalue{\@@framed\c!kaderoffset}%
\setevalue{\@@framed\c!kaderoffset}{\the\scratchdimen}%
- \doifnotvalue{\@@framed\c!achtergrondoffset}{\v!kader}
+ \doifnotvalue{\@@framed\c!achtergrondoffset}\v!kader
{\scratchdimen\getvalue{\@@framed\c!achtergrondoffset}%
\setevalue{\@@framed\c!achtergrondoffset}{\the\scratchdimen}}%
% we need to register the (outer) color
@@ -644,12 +712,13 @@
\edef\localformat{\getvalue{\@@framed\c!uitlijnen}}%
\edef\localstrut{\getvalue{\@@framed\c!strut}}%
\doifvaluesomething{\@@framed\c!lijndikte}
- {\linewidth=\getvalue{\@@framed\c!lijndikte}}%
+ {\ruledlinewidth\getvalue{\@@framed\c!lijndikte}\relax
+ \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi}%
\ifx\localformat\empty
\boxhasformatfalse
\else
\boxhasformattrue
- \dosetraggedcommand{\localformat}%
+ \dosetraggedcommand\localformat
\edef\beforeframedbox{\raggedtopcommand\getvalue{\@@framed\c!boven}}%
\edef\afterframedbox {\getvalue{\@@framed\c!onder}\raggedbottomcommand}%
\fi
@@ -657,12 +726,12 @@
\boxhasoffsetfalse
\boxhasstrutfalse
\boxisoverlaidfalse
- \@@localoffset=\linewidth
+ \@@localoffset\ruledlinewidth
\else\ifx\localoffset\v!overlay
\boxhasoffsetfalse
\boxhasstrutfalse
\boxisoverlaidtrue
- \@@localoffset=\zeropoint
+ \@@localoffset\zeropoint
\else
\boxhasoffsettrue
\boxhasstruttrue
@@ -673,22 +742,22 @@
\else
\let\defaultframeoffset\localoffset
\fi
- \@@localoffset=\localoffset
- \advance\@@localoffset by \linewidth
+ \@@localoffset\localoffset
+ \advance\@@localoffset by \ruledlinewidth
\fi\fi
\ifx\localwidth\v!passend
\ifboxhasformat
\boxhaswidthtrue
- \!!widtha=\hsize
+ \!!widtha\hsize
\else
\boxhaswidthfalse
\fi
\else\ifx\localwidth\v!ruim
\boxhaswidthtrue
- \!!widtha=\hsize
+ \!!widtha\hsize
\else
\boxhaswidthtrue
- \!!widtha=\localwidth
+ \!!widtha\localwidth
\fi\fi
\ifx\localheight\v!passend
\boxhasheightfalse % no longer: \boxhasstrutfalse
@@ -696,12 +765,12 @@
\boxhasheightfalse
\else
\boxhasheighttrue
- \!!heighta=\localheight
+ \!!heighta\localheight
\fi\fi
\ifdim\!!widtha=\hsize
- \parindent=\zeropoint
+ \parindent\zeropoint
\setlocalhsize
- \!!widtha=\localhsize
+ \!!widtha\localhsize
\fi
\advance\!!widtha -2\@@localoffset
\advance\!!heighta -2\@@localoffset
@@ -710,61 +779,78 @@
\fi
\ifboxhasstrut
\setstrut
- \let\localbegstrut=\begstrut
- \let\localendstrut=\endstrut
- \let\localstrut =\strut
+ \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
+ \let\localbegstrut\pseudobegstrut % was: \relax
+ \let\localendstrut\pseudoendstrut % was: \relax
+ \let\localstrut \pseudostrut % was: \relax
%\ifboxhasheight\ifdim\!!heighta<\ht\strutbox % saveguard
- % \let\localbegstrut=\relax % but not that
- % \let\localstrut =\relax % save afterall
+ % \let\localbegstrut\relax % but not that
+ % \let\localstrut \relax % save afterall
%\fi\fi
\fi
\ifboxhasheight
- \let\\=\vboxednewline
+ \let\\\vboxednewline
\ifboxhaswidth
- \let\hairline=\vboxedhairline
+ \let\hairline\vboxedhairline
\ifboxhasformat
- \let\next=\doformatboxSomeFormat
+ \let\next\doformatboxSomeFormat
\else
- \let\next=\doformatboxNoFormat
+ \let\next\doformatboxNoFormat
\fi
\else
- \let\hairline=\hboxedhairline
+ \let\hairline\hboxedhairline
\ifboxhasformat
- \let\next=\doformatboxHeight
+ \let\next\doformatboxHeight
\else
- \let\next=\doformatboxVSize
+ \let\next\doformatboxVSize
\fi
\fi
\else
\ifboxhaswidth
\ifboxhasformat
- \let\hairline=\vboxedhairline
- \let\\=\vboxednewline
- \let\next=\doformatboxWidth
+ \let\hairline\vboxedhairline
+ \let\\\vboxednewline
+ \let\next\doformatboxWidth
\else
- \let\hairline=\hboxedhairline
- \let\\=\hboxednewline
- \let\next=\doformatboxHSize
+ \let\hairline\hboxedhairline
+ \let\\\hboxednewline
+ \let\next\doformatboxHSize
\fi
\else
- \let\hairline=\hboxedhairline
- \let\\=\hboxednewline
- \let\next=\doformatboxNoSize
+ \let\hairline\hboxedhairline
+ \let\\\hboxednewline
+ \let\next\doformatboxNoSize
\fi
\fi
- \def\dowithframedbox%
- {\let\postprocessframebox\undefined %new
- \aftergroup\stoplocalframed}%
\edef\framedwidth % a new feature
{\ifdim\!!widtha >\zeropoint\the\!!widtha \else\zeropoint\fi}%
\edef\framedheight% a new feature
{\ifdim\!!heighta>\zeropoint\the\!!heighta\else\zeropoint\fi}%
- \afterassignment\dowithframedbox
- \setbox\framebox=\next}
+ % first alternative
+ %\def\dowithframedbox%
+ % {\let\postprocessframebox\undefined %new
+ % \aftergroup\stoplocalframed}%
+ % \afterassignment\dowithframedbox
+ % \setbox\framebox=\next}
+ % second alternative
+ %\dowithnextbox
+ % {\setbox\framebox=\box\nextbox
+ % \let\postprocessframebox\undefined %new
+ % \stoplocalframed}
+ % \next}
+ % third alternative
+ \afterassignment\dodowithframebox
+ \setbox\framebox\next}
+
+\def\dowithframebox
+ {\let\postprocessframebox\undefined
+ \stoplocalframed}
+
+\def\dodowithframebox
+ {\aftergroup\dowithframebox}
\let\afterframedbox \relax
\let\beforeframedbox\relax
@@ -803,15 +889,17 @@
\resetshapeframebox
\fi
\ifboxhaswidth
- \wd\framebox=\!!widtha
+ \wd\framebox\!!widtha
\fi
\ifboxhasheight
- \ht\framebox=\!!heighta
+ \ht\framebox\!!heighta
\fi
- \doifvalue{\@@framed\c!leeg}{\v!ja}
- {\setbox0=\null
- \wd0=\wd\framebox \ht0=\ht\framebox \dp0=\dp\framebox
- \setbox\framebox=\box0\relax}%
+ \doifvalue{\@@framed\c!leeg}\v!ja
+ {\setbox\scratchbox\null
+ \wd\scratchbox\wd\framebox
+ \ht\scratchbox\ht\framebox
+ \dp\scratchbox\dp\framebox
+ \setbox\framebox\box\scratchbox}%
\stopregistercolor
\docolorframebox
\ifboxhasoffset
@@ -824,15 +912,12 @@
\postprocessframebox\framebox
\fi
\edef\overlaylinecolor{\getvalue{\@@framed\c!kaderkleur}}%
- \edef\overlaylinewidth{\the\linewidth}%
- \doifnotvalue{\@@framed\c!kader}{\v!overlay} % faster -)
- {\doframedbox}%
- \doifvaluesomething{\@@framed\c!achtergrond}
- {\dobackedbox}%
- \doifelsevalue{\@@framed\c!plaats}{\v!laag}
+ \edef\overlaylinewidth{\the\ruledlinewidth}%
+ \doifnotvalue {\@@framed\c!kader }\v!overlay\doframedbox
+ \doifvaluesomething{\@@framed\c!achtergrond}\dobackedbox
+ \doifelsevalue{\@@framed\c!plaats}\v!laag
{\doinlineframedbox}
- {\doifvalue{\@@framed\c!plaats}{\v!diepte}
- {\doloweredframedbox}}%
+ {\doifvalue{\@@framed\c!plaats}\v!diepte\doloweredframedbox}%
\box\framebox
\egroup
\egroup}
@@ -1027,7 +1112,7 @@
{\kern#1\hbox{\kern#1\box\framebox\kern#1}\kern#1}}
\def\dooffsetframebox{\dowidenframebox\localoffset}
-\def\dolocateframebox{\dowidenframebox\linewidth }
+\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.
@@ -1426,15 +1511,26 @@
%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%
+% {\getboxheight\dimen2\of\box\framebox
+% \advance\dimen2 by -\ht\strutbox
+% \dimen0=.5\dimen2
+% \ifboxhasoffset
+% \advance\dimen0 by \getvalue{\@@framed\c!offset}%
+% \fi
+% \advance\dimen0 by 2\ruledlinewidth
+% \setbox\framebox=\hbox{\lower\dimen0\box\framebox}%
+% \ht\framebox\ht\strutbox
+% \dp\framebox\dp\strutbox
+% \box\framebox}
+
\def\doinlineframedbox%
- {\getboxheight\dimen2\of\box\framebox
- \advance\dimen2 by -\ht\strutbox
- \dimen0=.5\dimen2
+ {\scratchdimen\dp\strutbox
+ \advance\scratchdimen \ruledlinewidth
\ifboxhasoffset
- \advance\dimen0 by \getvalue{\@@framed\c!offset}%
+ \advance\scratchdimen \getvalue{\@@framed\c!offset}%
\fi
- \advance\dimen0 by 2\linewidth
- \setbox\framebox=\hbox{\lower\dimen0\box\framebox}%
+ \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}%
\ht\framebox\ht\strutbox
\dp\framebox\dp\strutbox
\box\framebox}
@@ -1443,9 +1539,9 @@
%D line.
\def\doloweredframedbox%
- {\getboxheight\dimen2\of\box\framebox
- \advance\dimen2 by -\dp\strutbox
- \ht\framebox\dimen2
+ {\getboxheight\scratchdimen\of\box\framebox
+ \advance\scratchdimen -\dp\strutbox
+ \ht\framebox\scratchdimen
\dp\framebox\dp\strutbox
\box\framebox}
@@ -1473,12 +1569,12 @@
{\bgroup
\dimen2=\ifboxhasoffset \localoffset \else \zeropoint \fi
\dimen4=\dimen2
- \advance\dimen4 by \linewidth
+ \advance\dimen4 \ruledlinewidth
\setbox0=\vbox
- {\advance\hsize by 2\dimen4
+ {\advance\hsize 2\dimen4
\vskip\dimen2
\hrule
- \!!height\linewidth
+ \!!height\ruledlinewidth
\!!depth\zeropoint
\!!width\hsize
\vskip\dimen2}%
@@ -1494,15 +1590,15 @@
\ifboxhasheight
\dimen4=\localheight \divide\dimen4 by 2
\dimen6=\dimen4
- \advance\dimen4 by \dp\strutbox
- \advance\dimen6 by -\dp\strutbox
- \advance\dimen4 by -2\linewidth
- \advance\dimen6 by 2\linewidth
+ \advance\dimen4 \dp\strutbox
+ \advance\dimen6 -\dp\strutbox
+ \advance\dimen4 -2\ruledlinewidth
+ \advance\dimen6 2\ruledlinewidth
\else
\dimen4=\ht\strutbox
- \advance\dimen4 by \dimen2
+ \advance\dimen4 \dimen2
\dimen6=\dp\strutbox
- \advance\dimen6 by \dimen2
+ \advance\dimen6 \dimen2
\fi
\unskip
\setbox0=\hbox
@@ -1510,7 +1606,7 @@
\vrule
\!!height\dimen4
\!!depth\dimen6
- \!!width\linewidth
+ \!!width\ruledlinewidth
\hskip\dimen2}%
\ht0=\ht\strutbox
\dp0=\dp\strutbox
@@ -1594,16 +1690,18 @@
%D \showsetup{\y!blackrule}
\def\doblackrule[#1]%
- {\bgroup
+ {\hbox\bgroup
\getparameters[\??bj][#1]%
\setstrut
- \doif{\@@bjbreedte}{\v!max}{\def\@@bjbreedte{1em}}%
- \doif{\@@bjhoogte} {\v!max}{\def\@@bjhoogte{\ht\strutbox}}%
- \doif{\@@bjdiepte} {\v!max}{\def\@@bjdiepte{\dp\strutbox}}%
- \vrule
- \!!width\@@bjbreedte
- \!!height\@@bjhoogte
- \!!depth\@@bjdiepte
+ \doif\@@bjbreedte\v!max{\def\@@bjbreedte{1em}}%
+ \doif\@@bjhoogte \v!max{\def\@@bjhoogte{\ht\strutbox}}%
+ \doif\@@bjdiepte \v!max{\def\@@bjdiepte{\dp\strutbox}}%
+ \localstartcolor[\@@bjkleur]%
+ \vrule
+ \!!width \@@bjbreedte
+ \!!height\@@bjhoogte
+ \!!depth \@@bjdiepte
+ \localstopcolor
\egroup}
\unexpanded\def\blackrule%
@@ -1639,26 +1737,28 @@
%D tokens.
\def\doblackrules[#1]%
- {\bgroup
+ {\hbox\bgroup
\getparameters[\??bj][#1]%
- \!!widtha=\@@bjbreedte
- \!!widthb=\@@bjafstand
- \doif{\@@bjvariant}{\c!b}
- {\scratchcounter=\@@bjn
+ \!!widtha\@@bjbreedte
+ \!!widthb\@@bjafstand
+ \doif\@@bjvariant\c!b
+ {\scratchcounter\@@bjn
\ifnum\scratchcounter=1
- \!!widthb=\zeropoint
+ \!!widthb\zeropoint
\else
- \advance\scratchcounter by -1
- \advance\!!widtha by -\scratchcounter\!!widthb
- \divide\!!widtha by \@@bjn
+ \advance\scratchcounter -1
+ \advance\!!widtha -\scratchcounter\!!widthb
+ \divide \!!widtha \@@bjn
\fi}%
- \dorecurse{\@@bjn}
- {\vrule
- \!!width\!!widtha
- \!!height\@@bjhoogte
- \!!depth\@@bjdiepte
- \hskip\!!widthb}%
- \unskip
+ \localstartcolor[\@@bjkleur]%
+ \dorecurse\@@bjn
+ {\vrule
+ \!!width \!!widtha
+ \!!height\@@bjhoogte
+ \!!depth \@@bjdiepte
+ \hskip\!!widthb}%
+ \unskip
+ \localstopcolor
\egroup}
\unexpanded\def\blackrules%
@@ -2114,7 +2214,7 @@
\def\dosetupframedtexts[#1][#2]%
{\ifsecondargument
\def\docommando##1{\getparameters[\??kd##1][#2]}%
- \processcommalist[#1]\docommando % new
+ \processcommacommand[#1]\docommando % new, #1 may be macro
\else
\getparameters[\??kd\v!framedtext][#1]%
\fi}
@@ -2126,7 +2226,8 @@
{\bgroup\dotripleempty\dodostartframedtext}
\def\dodostartframedtext[#1][#2][#3]%
- {\doifinstringelse{=}{#2}
+% {\doifinstringelse{=}{#2}
+ {\doifassignmentelse{#2}
{\dododostartframedtext[#1][][#2]}
{\dododostartframedtext[#1][#2][#3]}}
@@ -2522,8 +2623,9 @@
\setupfillinlines[#1]%
\advance\rightskip by \@@ivmarge
\parfillskip\zeropoint
- \def\par%
- {\unskip\hfill
+ \def\par % very dangerous
+ {\let\par\endgraf % -)
+ \unskip\hfill
\dimen0=\@@ivbreedte
\advance\dimen0 by -\@@ivafstand
\ifdim\dimen0>\@@ivmarge\else\expandafter\rlap\fi
@@ -2756,7 +2858,8 @@
\c!hoogte=1ex,
\c!diepte=\!!zeropoint,
\c!variant=\c!a,
- \c!afstand=.25ex]
+ \c!afstand=.25ex,
+ \c!kleur=]
\setupmarginrules
[\c!niveau=0,
diff --git a/tex/context/base/core-sec.tex b/tex/context/base/core-sec.tex
index c2c43d8d6..d12c2ab02 100644
--- a/tex/context/base/core-sec.tex
+++ b/tex/context/base/core-sec.tex
@@ -11,6 +11,9 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% this module needs a clean up, currently some manipulations
+% take place multiple times
+
\writestatus{loading}{Context Core Macros / Sectioning}
\startmessages dutch library: structures
@@ -57,54 +60,93 @@
\unprotect
-\def\dodochecknummer#1#2#3%
+% from now on, internaly numbers are separated by a period
+% and postprocessed on demand
+
+\def\numberseparator{.} % reasonable default
+
+\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\dodochecknummer#1#2#3% will become ugly after speed up
{\bgroup
- \doifinstringelse{.0}{.#2} % waarom \instring en \@koscheider
- {\doifnot{#3}{\v!per}
+ \doifinstringelse{.0}{.#2}
+ {\doifnot{#3}\v!per
{%\debuggerinfo{\m!systems}{number #1 #3 becomes \getnumbervariable{#1\c!wijze}}%
- \setevalue{\s!number#1\c!wijze}{#3}% geen \xdef, gaat mis met \subpage
+ \setevalue{\@@thenumber{#1}\c!wijze}{#3}% geen \xdef, gaat mis met \subpage
\dochecknummer{#1}}} % tricky and ugly
- {\doifnotvalue{\s!number#1\s!check}{#2}
- {\setcounter{\s!number#1}{0\getvalue{\s!number#1\c!start}}%
- \setxvalue{\s!number#1\c!wijze\c!lokaal}%
- {\getvalue{\s!number#1\c!wijze}}%
- \setxvalue{\s!number#1\s!check}%
+ {\doifnotvalue{\@@thenumber{#1}\s!check}{#2}
+ {\setcounter{\@@thenumber{#1}}{0\getvalue{\@@thenumber{#1}\c!start}}%
+ \setxvalue{\@@thenumber{#1}\c!wijze\c!lokaal}%
+ {\getvalue{\@@thenumber{#1}\c!wijze}}%
+ \setxvalue{\@@thenumber{#1}\s!check}%
{#2}}}%
\egroup}
\def\dochecknummer#1%
- {\edef\currentsection{\getvalue{\??by\getvalue{\s!number#1\c!wijze}}}%
- \doifsomething{\currentsection}
- {\dodochecknummer
- {#1}
- {\getvalue{\currentsection\c!nummer}}
- {\v!per\previoussection{\currentsection}}}}
+ {\edef\currentsection{\csname\??by\csname\@@thenumber{#1}\c!wijze\endcsname\endcsname}%
+ \ifx\currentsection\empty\else
+ \dodochecknummer
+ {#1}%
+ {\csname\currentsection\c!nummer\endcsname}%
+ {\v!per\previoussection\currentsection}%
+ \fi}
\def\checknummer#1%
{\bgroup
- \ifnum\blocklevel>0
- \doifelsevalue{\s!number#1\c!blokwijze}{\v!nee}
- {\dochecknummer{#1}}
- {\setblockcounters % dit kan sneller omdat de waarden
- \dochecknummer{#1}}% % en het type bekend zijn
- \else
- \dochecknummer{#1}%
+ %\ifcase\blocklevel\else
+ \ifdoingblocks
+ \doifnotvalue{\@@thenumber{#1}\c!blokwijze}\v!nee\setblockcounters
\fi
+ \dochecknummer{#1}%
\egroup}
-\def\domaakvoorafgaandenummer[#1]%
+\def\domaakvoorafgaandenummer[#1]% will become ugly after speed up
{\bgroup % added
\global\let\voorafgaandenummer\empty
\ifsectienummer
- \doifvalue{\??sb\@@sectieblok\c!nummer}{\v!ja} % added
- {\doifelsevalue{\s!number#1\c!sectienummer}{\v!ja}
- {\donetrue}{\donefalse}%
- \doifvalue{\s!number#1\c!sectienummer}{\v!nummer}
+ \doifvalue{\??sb\@@sectieblok\c!nummer}\v!ja % added
+ {\doifelsevalue{\@@thenumber{#1}\c!sectienummer}\v!ja
+ \donetrue\donefalse
+ \doifvalue{\@@thenumber{#1}\c!sectienummer}\v!nummer
{\donetrue\let\@@sectionconversion\gobbleoneargument}%
\ifdone
\edef\currentsection%
- {\getvalue{\??by\getvalue{\s!number#1\c!wijze\c!lokaal}}}%
- \doifnot{\currentsection}{\zerosection}
+ {\getvalue{\??by\getvalue{\@@thenumber{#1}\c!wijze\c!lokaal}}}%
+ \doifnot{\currentsection}\zerosection
{\doifnot{\@@sectionvalue{\currentsection}}{0}
{\xdef\voorafgaandenummer%
{\getvalue{\currentsection\c!nummer}.}}}%
@@ -114,22 +156,20 @@
\def\maakvoorafgaandenummer[#1]%
{\bgroup
- \ifnum\blocklevel>0
- \doifelsevalue{\s!number#1\c!blokwijze}{\v!nee}
- {\domaakvoorafgaandenummer[#1]}%
- {\setblockcounters % dit kan sneller omdat de waarden
- \domaakvoorafgaandenummer[#1]}% % en het type bekend zijn
- \else
- \domaakvoorafgaandenummer[#1]%
+ %\ifnum\blocklevel>0
+ %\ifcase\blocklevel\else
+ \ifdoingblocks
+ \doifnotvalue{\@@thenumber{#1}\c!blokwijze}\v!nee\setblockcounters
\fi
+ \domaakvoorafgaandenummer[#1]%
\egroup}
% \def\maakhetnummer[#1]%
% {\maakvoorafgaandenummer[#1]%
% \xdef\hetnummer%
% {\voorafgaandenummer\nummer[#1]}}%
-%
-% hack needed for chinese and oldstyle in normal tex, will change
+%
+% hack needed for chinese and oldstyle in normal tex, will change
\def\maakhetnummer[#1]%
{\bgroup
@@ -139,14 +179,21 @@
{\voorafgaandenummer\nummer[#1]}%
\egroup}
+\def\preparethenumber#1#2#3% {\??id#1} \number \result
+ {\doifelsevaluenothing{#1\c!scheider}
+ {\let\numberseparator\empty
+ \let#3#2}
+ {\unexpanded\def\numberseparator{\getvalue{#1\c!scheider}}%
+ \edef#3{\@EA\separatednumber\@EA{#2}}}}
+
\def\lossenummer[#1]%
{\maakhetnummer[#1]%
\hetnummer}
\def\huidigenummer[#1]%
- {%\getvalue{\getvalue{\s!number#1\c!zetwijze}}%
- \getvalue{\getvalue{\s!number#1\c!plaats}}%
- {\dotextprefix{\getvalue{\s!number#1\c!tekst}}\lossenummer[#1]}}
+ {%\getvalue{\getvalue{\@@thenumber{#1}\c!zetwijze}}%
+ \getvalue{\getvalue{\@@thenumber{#1}\c!plaats}}%
+ {\dotextprefix{\getvalue{\@@thenumber{#1}\c!tekst}}\lossenummer[#1]}}
\def\volgendenummer[#1][#2][#3]%
{\verhoognummer[#1]%
@@ -157,30 +204,30 @@
\newcount\nofsections
-\def\zerosection{\v!tekst}
-\def\firstsection{}
-\def\lastsection{}
-\let\@@sectie\empty
-\let\@@koppeling\empty
+\let\zerosection \v!tekst
+\let\firstsection\empty
+\let\lastsection \empty
+\let\@@sectie \empty
+\let\@@koppeling \empty
\makecounter{\??se\v!tekst}
-\setevalue{\??se\v!tekst\c!voor}{}
-\setevalue{\??se\v!tekst\c!na }{}
+\letvalue{\??se\v!tekst\c!voor}\empty
+\letvalue{\??se\v!tekst\c!na }\empty
-\setevalue{\v!tekst\c!nummer}{0}
-\setevalue{\v!tekst\s!format}{}
+\setvalue{\v!tekst\c!nummer}{0}
+\letvalue{\v!tekst\s!format}\empty
-\setevalue{\??sk\v!tekst}{}
-\setevalue{\??sk }{}
+\letvalue{\??sk\v!tekst}\empty
+\letvalue{\??sk }\empty
-\setvalue{\??by }{\v!tekst}
-\setvalue{\??by\v!tekst }{\v!tekst}
-\setvalue{\??by\v!alles }{\v!tekst}
-\setvalue{\??by\v!per }{\v!tekst}
-\setvalue{\??by\v!per\v!tekst }{\v!tekst}
-\setvalue{\??by\v!per\v!alles }{\v!tekst}
-\setvalue{\??by\v!per\v!pagina}{\v!tekst} % see footnotes
+\letvalue{\??by }\v!tekst
+\letvalue{\??by\v!tekst }\v!tekst
+\letvalue{\??by\v!alles }\v!tekst
+\letvalue{\??by\v!per }\v!tekst
+\letvalue{\??by\v!per\v!tekst }\v!tekst
+\letvalue{\??by\v!per\v!alles }\v!tekst
+\letvalue{\??by\v!per\v!pagina}\v!tekst % see footnotes
%%%%%%%%% old
@@ -202,7 +249,7 @@
\getparameters[\??se#1][#2]%
\fi
\doifelsevalue{\??se#1\c!vorigenummer}{\v!ja}
- {\setvalue{#1\c!nummer}{\@@longsectionnumber{#1}}}
+ {\setvalue{#1\c!nummer}{\@@longsectionnumber {#1}}}
{\setvalue{#1\c!nummer}{\@@shortsectionnumber{#1}}}}
\def\stelsectiein%
@@ -251,7 +298,7 @@
\setevalue{\??by#1}{#1}%
\setevalue{\??by\v!per#1}{#1}%
\makecounter{\??se#1}%
- \def\lastsection{#1}%
+ \edef\lastsection{#1}%
\setvalue{\??sk#1}%
{#1}%
\setvalue{\??se#1\c!markering}%
@@ -259,22 +306,19 @@
\stelsectiein[#1]
[\c!vorigenummer=\v!ja]}}%
-\def\previoussection#1%
- {\getvalue{\??se#1\c!voor}}
-
-\def\nextsection#1%
- {\getvalue{\??se#1\c!na}}
+\def\previoussection#1{\csname\??se#1\c!voor\endcsname}
+\def\nextsection #1{\csname\??se#1\c!na \endcsname}
\def\@@setsectionnumber#1#2%
{\setgvalue{\??se#1\s!start}{}% % signal i.p.v. boolean
\setcounter{\??se#1}{#2}%
- \resetsectioncounters[#1]%
+ \resetsectioncounters{#1}%
\checkpagecounter}
\def\@@nextsectionnumber#1%
{\setgvalue{\??se#1\s!start}{}% % signal i.p.v. boolean
\pluscounter{\??se#1}%
- \resetsectioncounters[#1]%
+ \resetsectioncounters{#1}%
\checkpagecounter}
\def\@@sectionvalue#1% % nog niet overal doorgevoerd
@@ -304,25 +348,49 @@
% Omdat een markering kan worden herdefinieerd moeten we
% eerst testen of er wel een keten||afhankelijkheid is.
-% we het huidge (eigen) nummer kunnen ophalen
+% \def\doresetsectionmarks#1%
+% {\doifdefined{\??se#1\c!markering} % skip zero level
+% {\fastresetmarkerlist[\getvalue{\??se#1\c!markering}]}%
+% \donexttracklevel{#1}}
+%
+% \def\resetsectionmarks#1%
+% {\doifdefinedelse{\??se#1}
+% {\let\donexttrackcommando\doresetsectionmarks
+% \donexttracklevel{#1}}%
+% {\fastresetmarker[\hoofdmarkering{#1}]}} % redundant \hoofdmarkering
+
+\def\doresetsectionmarks#1%
+ {\ifundefined{\??se#1\c!markering}\else % skip zero level
+ \fastresetmarkerlist[\csname\??se#1\c!markering\endcsname]%
+ \fi
+ \donexttracklevel{#1}}
+
+\def\resetsectionmarks#1%
+ {\ifundefined{\??se#1}%
+ \fastresetmarker[\hoofdmarkering{#1}]% % redundant \hoofdmarkering
+ \else
+ \let\donexttrackcommando\doresetsectionmarks
+ \donexttracklevel{#1}%
+ \fi}
-\def\resetsectionmarks[#1]%
- {\doifdefinedelse{\??se#1}
- {\def\donexttrackcommando##1%
- {\doifdefined{\??se##1\c!markering} % skip zero level
- {\def\docommando####1%
- {\ExpandFirstAfter\resetmarkering[####1]}%
- \processcommacommand[\getvalue{\??se##1\c!markering}]\docommando}%
- \donexttracklevel{##1}}%
- \donexttracklevel{#1}}%
- {\ExpandFirstAfter\resetmarkering[\hoofdmarkering{#1}]}}
+% packaged:
+%
+% \def\resetsectioncounters#1%
+% {\def\donexttrackcommando##1%
+% {\resetcounter{\??se##1}%
+% \donexttracklevel{##1}}%
+% \donexttracklevel{#1}}
+%
+% nicer
-\def\resetsectioncounters[#1]%
- {\def\donexttrackcommando##1%
- {\resetcounter{\??se##1}%
- \donexttracklevel{##1}}%
+\def\doresetsectioncounters#1%
+ {\resetcounter{\??se#1}%
\donexttracklevel{#1}}
+\def\resetsectioncounters % #1
+ {\let\donexttrackcommando\doresetsectioncounters
+ \donexttracklevel} % #1
+
% bij checken kan geen prefix worden bekeken, anders vallen
% er titels buiten de inhoudsopgave
@@ -333,7 +401,7 @@
{\@@sectiontype:\getvalue{\lastsection\s!format}}}
\def\dobacktracklevel#1%
- {\doifnot{\previoussection{#1}}{\zerosection}
+ {\doifnot{\previoussection{#1}}\zerosection
{\dobacktrackcommando{\previoussection{#1}}}}
\def\donexttracklevel#1%
@@ -385,63 +453,139 @@
\def\dontsetlevel#1%
{\let\currentlevel\somesavedlevel
\alllevelsfalse}
-
-\def\dosetlevel#1% opvoeren met \ifcsname
- {\let\dosetlevel\dontsetlevel % local lists will be real local
- \bgroup
- \doifelse{#1}{\v!vorige}
+
+% \def\dosetlevel#1% opvoeren met \ifcsname
+% {\let\dosetlevel\dontsetlevel % local lists will be real local
+% \bgroup
+% \doifelse{#1}{\v!vorige}
+% {\global\alllevelstrue
+% \global\let\currentlevel\empty
+% \def\dobacktrackcommando##1%
+% {\ifnum\countervalue{\??se##1}>0
+% \global\alllevelsfalse
+% \xdef\currentlevel{\getvalue{\previoussection{##1}\s!format}}%
+% \else
+% \dobacktracklevel{##1}%
+% \fi}%
+% \dobacktrackcommando\lastsection}
+% {\doifelse{\getvalue{\??by#1}}{\v!tekst}
+% {\global\alllevelstrue
+% \global\let\currentlevel\empty}
+% {\doifdefinedelse{\??ko#1\c!sectie} % beter alteratief: ook
+% {\edef\@@sectie{\getvalue{\??ko#1\c!sectie}}} % hoofdstuk\c!format
+% {\edef\@@sectie{#1}}%
+% \doifdefinedelse{\??se\@@sectie}
+% {\global\alllevelsfalse
+% \xdef\currentlevel{\getvalue{\@@sectie\s!format}}}
+% {\global\alllevelstrue
+% \global\let\currentlevel\empty
+% \def\dobacktrackcommando##1%
+% {\@EA\ifx\csname\??se##1\c!start\endcsname\relax
+% \dobacktracklevel{##1}%
+% \else
+% \ifnum\countervalue{\??se##1}>0
+% \global\alllevelsfalse
+% \xdef\currentlevel{\getvalue{##1\s!format}}%
+% \else
+% \dobacktracklevel{##1}%
+% \fi
+% \fi}%
+% \dobacktrackcommando\lastsection}}}%
+% \egroup}
+
+\def\dosetcurrentlevel#1%
+ {\global\alllevelsfalse
+ \xdef\currentlevel{\getvalue{\lastsection\s!format}}}
+
+\def\dosetpreviouslevel#1%
+ {\global\alllevelstrue
+ \global\let\currentlevel\empty
+ \def\dobacktrackcommando##1%
+ {\ifnum\countervalue{\??se##1}>0
+ \global\alllevelsfalse
+ \xdef\currentlevel{\getvalue{\previoussection{##1}\s!format}}%
+ \else
+ \dobacktracklevel{##1}%
+ \fi}%
+ \dobacktrackcommando\lastsection}
+
+\def\dosettextlevel#1%
+ {\global\alllevelstrue
+ \global\let\currentlevel\empty}
+
+\def\dosetotherlevel#1%
+ {\doifdefinedelse{\??ko#1\c!sectie} % beter alteratief: ook
+ {\edef\@@sectie{\getvalue{\??ko#1\c!sectie}}} % hoofdstuk\c!format
+ {\edef\@@sectie{#1}}%
+ \doifdefinedelse{\??se\@@sectie}
+ {\global\alllevelsfalse
+ \xdef\currentlevel{\getvalue{\@@sectie\s!format}}}
{\global\alllevelstrue
\global\let\currentlevel\empty
\def\dobacktrackcommando##1%
- {\ifnum\countervalue{\??se##1}>0
- \global\alllevelsfalse
- \xdef\currentlevel{\getvalue{\previoussection{##1}\s!format}}%
- \else
+ {\@EA\ifx\csname\??se##1\c!start\endcsname\relax
\dobacktracklevel{##1}%
+ \else
+ \ifnum\countervalue{\??se##1}>0
+ \global\alllevelsfalse
+ \xdef\currentlevel{\getvalue{##1\s!format}}%
+ \else
+ \dobacktracklevel{##1}%
+ \fi
\fi}%
- \dobacktrackcommando\lastsection}
- {\doifelse{\getvalue{\??by#1}}{\v!tekst}
- {\global\alllevelstrue
- \global\let\currentlevel\empty}
- {\doifdefinedelse{\??ko#1\c!sectie} % beter alteratief: ook
- {\edef\@@sectie{\getvalue{\??ko#1\c!sectie}}} % hoofdstuk\c!format
- {\edef\@@sectie{#1}}%
- \doifdefinedelse{\??se\@@sectie}
- {\global\alllevelsfalse
- \xdef\currentlevel{\getvalue{\@@sectie\s!format}}}
- {\global\alllevelstrue
- \global\let\currentlevel\empty
- \def\dobacktrackcommando##1%
- {\@EA\ifx\csname\??se##1\c!start\endcsname\relax
- \dobacktracklevel{##1}%
- \else
- \ifnum\countervalue{\??se##1}>0
- \global\alllevelsfalse
- \xdef\currentlevel{\getvalue{##1\s!format}}%
- \else
- \dobacktracklevel{##1}%
- \fi
- \fi}%
- \dobacktrackcommando\lastsection}}}%
+ \dobacktrackcommando\lastsection}}
+
+% \def\dosetlevel#1% opvoeren met \ifcsname
+% {\let\dosetlevel\dontsetlevel % local lists will be real local
+% \bgroup
+% \doifelse{#1}{\v!huidige}
+% {\dosetcurrentlevel{#1}}
+% {\doifelse{#1}{\v!vorige}
+% {\dosetpreviouslevel{#1}}
+% {\doifelsevalue{\??by#1}{\v!tekst}
+% {\dosettextlevel{#1}}
+% {\dosetotherlevel{#1}}}}%
+% \egroup}
+
+\def\dosetlevel#1% beware: this one is \let
+ {\let\dosetlevel\dontsetlevel % local lists will be real local
+ \bgroup
+ \edef\askedlevel{#1}%
+ \ifx\askedlevel\v!huidige
+ \dosetcurrentlevel\askedlevel
+ \else\ifx\askedlevel\v!vorige
+ \dosetpreviouslevel\askedlevel
+ \else
+ \edef\byaskedlevel{\csname\??by\askedlevel\endcsname}%
+ \ifx\byaskedlevel\v!tekst
+ \dosettextlevel\askedlevel
+ \else
+ \dosetotherlevel\askedlevel
+ \fi
+ \fi\fi
\egroup}
-\def\dosettoclevel{\dosetlevel}
-\def\dosetreglevel{\dosetlevel}
-\def\dosetblklevel{\dosetlevel}
+% \def\dosettoclevel{\dosetlevel}
+% \def\dosetreglevel{\dosetlevel}
+% \def\dosetblklevel{\dosetlevel}
-% cleaner
+\let\dosettoclevel\dosetlevel
+\let\dosetreglevel\dosetlevel
+\let\dosetblklevel\dosetlevel
+
+% cleaner
%
% \def\doifnextlevelelse[#1::#2]#3#4%
% {\ifalllevels
% #3%
% \else
-% \doifelse{\@@sectiontype}{#1}
+% \doifelse{\@@sectiontype}{#1}
% {\doifinstringelse{=\currentlevel:}{=:#2:}
% {\doifinstringelse{=\currentlevel:0}{=:#2:}{#4}{#3}}
% {#4}}
% {#4}%
% \fi}
-%
+%
% \def\doifprevlevelelse[#1::#2]#3#4%
% {\ifalllevels
% #3%
@@ -451,13 +595,13 @@
% {#4}%
% \fi}
%
-% faster
-%
+% faster
+%
% \def\doifnextlevelelse[#1::#2]%
-% {\ifalllevels
-% \donetrue
+% {\ifalllevels
+% \donetrue
% \else
-% \doifelse{\@@sectiontype}{#1}
+% \doifelse{\@@sectiontype}{#1}
% {\doifinstringelse{=\currentlevel:}{=:#2:}
% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
% \donefalse}
@@ -468,7 +612,7 @@
% \else
% \expandafter\secondoftwoarguments
% \fi}
-%
+%
% \def\doifprevlevelelse[#1::#2]%
% {\ifalllevels
% \donetrue
@@ -482,7 +626,7 @@
% \else
% \expandafter\secondoftwoarguments
% \fi}
-%
+%
% meaner
%
% \stellijstin
@@ -494,48 +638,91 @@
\def\dosavesomelevel[#1:0:0:0:#2]%
{\def\somesavedlevel{:#1}}
-\def\doifnextlevelelse[#1::#2]%
+% \def\doifnextlevelelse[#1::#2]%
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifalllevels
+% \donetrue
+% \else
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
+% \donefalse}
+% \donefalse
+% \fi
+% \ifdone
+% \expandafter\firstoftwoarguments
+% \else
+% \expandafter\secondoftwoarguments
+% \fi}
+%
+% \def\doifprevlevelelse[#1::#2]%
+% {\dosavesomelevel[#2:0:0:0:0]%
+% \ifalllevels
+% \donetrue
+% \else
+% \doifelse{\@@sectiontype}{#1}
+% {\doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse}
+% \donefalse
+% \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]%
- \ifalllevels
- \donetrue
- \else
- \doifelse{\@@sectiontype}{#1}
- {\doifinstringelse{=\currentlevel:}{=:#2:}
- {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
- \donefalse}
+ \ifalllevels
+ \donetrue
+ \else\ifnum\@@sectiontype=#1
+% \doifinstringelse{=\currentlevel:}{=:#2:}
+% {\doifinstringelse{=\currentlevel:0}{=:#2:}\donefalse\donetrue}
+% \donefalse
+ \def\levelstring{=:#2:}%
+ \doifincsnameelse{=\currentlevel:}\levelstring
+ {\doifincsnameelse{=\currentlevel:0}\levelstring\donefalse\donetrue}
\donefalse
- \fi
+ \else
+ \donefalse
+ \fi\fi
\ifdone
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
-\def\doifprevlevelelse[#1::#2]%
+\def\doifprevlevelelse[#1::#2]% beware: this one is \let
{\dosavesomelevel[#2:0:0:0:0]%
\ifalllevels
\donetrue
+ \else\ifnum\@@sectiontype=#1
+ \doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse
\else
- \doifelse{\@@sectiontype}{#1}
- {\doifinstringelse{=\currentlevel:}{=:#2:}\donetrue\donefalse}
- \donefalse
- \fi
+ \donefalse
+ \fi\fi
\ifdone
\expandafter\firstoftwoarguments
\else
\expandafter\secondoftwoarguments
\fi}
-\def\doiftoclevelelse{\doifnextlevelelse}
-\def\doifreglevelelse{\doifprevlevelelse}
-\def\doifblklevelelse{\doifprevlevelelse}
+% \def\doiftoclevelelse{\doifnextlevelelse}
+% \def\doifreglevelelse{\doifprevlevelelse}
+% \def\doifblklevelelse{\doifprevlevelelse}
+
+\let\doiftoclevelelse\doifnextlevelelse
+\let\doifreglevelelse\doifprevlevelelse
+\let\doifblklevelelse\doifprevlevelelse
\def\@@longformatnumber#1%
{\getvalue{\previoussection{#1}\s!format}:\@@shortsectionnumber{#1}}
\def\@@longsectionnumber#1%
{\ifnum\countervalue{\??se\previoussection{#1}}>0
- \getvalue{\previoussection{#1}\c!nummer}\@@koscheider
+ %\getvalue{\previoussection{#1}\c!nummer}\@@koscheider
+ \getvalue{\previoussection{#1}\c!nummer}.%
\fi
\@@shortsectionnumber{#1}}
@@ -567,8 +754,8 @@
\def\doaroundsectieblok#1%
{\doifvaluesomething{\??sb#1\c!pagina}
{\ExpandFirstAfter\pagina[\getvalue{\??sb#1\c!pagina}]}%
- \resetsectioncounters[\zerosection]% was firstsection
- \resetsectionmarks[\zerosection]}
+ \resetsectioncounters\zerosection % was firstsection
+ \resetsectionmarks\zerosection}
\def\dostartsectieblok#1#2%
{\begingroup
@@ -576,20 +763,20 @@
\getvalue{\??sb#1}% % set name of section block
\getsectieblokomgeving{#1}% % special settings, grouped
%\expandafter\csname#2true\endcsname % obsolete
- \enablemode[\systemmodeprefix#1]% % can be used in conditionals
+ \setsystemmode{#1}% % can be used in conditionals
\getvalue{\??sb\@@sectieblok\c!voor}% this one is not to be moved!
- \showmessage{\m!structures}{1}{\@@sectieblokken}}
+ \showmessage\m!structures1\@@sectieblokken}
-\def\dostopsectieblok%
- {\showmessage{\m!structures}{2}{\@@sectieblokken}%
+\def\dostopsectieblok
+ {\showmessage\m!structures2\@@sectieblokken
\getvalue{\??sb\@@sectieblok\c!na}% don't move
- \doaroundsectieblok{\@@sectieblok}%
+ \doaroundsectieblok\@@sectieblok
\endgroup}
-\def\dostelsectieblokin[#1][#2]%
- {\getparameters[\??sb#1][#2]}
+\def\dostelsectieblokin[#1]% [#2]
+ {\getparameters[\??sb#1]}
-\def\stelsectieblokin%
+\def\stelsectieblokin
{\dodoubleargument\dostelsectieblokin}
\long\def\setsectieblokomgeving#1#2%
@@ -706,7 +893,7 @@
\def\dohandelpaginaafB#1%
{\doifinset{\getvalue{\??ko#1\c!pagina}}{\v!ja,\v!rechts,\v!links}
{\def\resetcurrentsectionmarks% toegevoegd, zie \pagina
- {\resetsectionmarks[\previoussection{\@@sectie}]}%
+ {\resetsectionmarks{\previoussection\@@sectie}}%
\pagina[\getvalue{\??ko#1\c!pagina}]%
\dohandelpaginaafBB{#1}\v!hoofd\c!hoofd
\dohandelpaginaafBB{#1}\v!tekst\c!tekst
@@ -724,7 +911,7 @@
\def\handelpaginaaf#1%
{\dohandelpaginaafAA{#1}%
- \ifnum\countervalue{\??se\previoussection{\@@sectie}}>0
+ \ifnum\countervalue{\??se\previoussection\@@sectie}>0
\ifnum\countervalue{\??se\@@sectie}>0
\dohandelpaginaafB{#1}%
\else
@@ -749,10 +936,10 @@
% \def\\{\crlf\strut\ignorespaces}}
\def\dolocalkopsetup#1% koppeling met standaard kopcommando / engels
- {\forgetall
- \doifvaluesomething{\??ko#1\c!uitlijnen}
+ {\forgetall % traag dus ...
+ \doifvaluesomething{\??ko#1\c!uitlijnen} % wordt al expanded in spa
{\expanded{\steluitlijnenin[\getvalue{\??ko#1\c!uitlijnen}]}}%
- \doifvaluesomething{\??ko#1\c!tolerantie}
+ \doifvaluesomething{\??ko#1\c!tolerantie} % wordt al expanded in spa
{\expanded{\steltolerantiein[\getvalue{\??ko#1\c!tolerantie}]}}%
\def\\{\crlf\strut\ignorespaces}}
@@ -780,12 +967,6 @@
% \hoofdstuk tekst
% \hoofdstuk <niets>
-\def\dodosomekop#1[#2]#3%
- {\doifelsevalue{\??ko#1\c!eigennummer}{\v!ja}
- {\def\next{\doquadruplegroupempty\dododosomekop{#1}{#2}{#3}}}
- {\def\next{\fourthargumentfalse \dododosomekop{#1}{#2}{#3}{}}}%
- \next}
-
\def\finalsectionnumber%
{\ifundefined{\@@sectie\c!nummer}\else
\ifsomeheadconversion
@@ -795,16 +976,6 @@
\fi
\fi}
-\def\dododosomekop#1#2#3#4%
- {\iffourthargument
- \def\next%
- {\dodododosomekop{#1}[#2]{#1}{#3}{#4}}%
- \else
- \def\next%
- {\dodododosomekop{#1}[#2]{#1}{\finalsectionnumber}{#3}}%
- \fi
- \next}
-
\def\findsectionnumber#1#2#3% class file title
{\begingroup
\setsectieenkoppeling{#1}%
@@ -861,11 +1032,16 @@
\fi
\fi}}
- \def\writtenfullsectionnumber {\string\fullsectionnumber}
- \def\ignoredfullsectionnumber#1#2#3{#3}
- \let \storedfullsectionnumber \relax
-\unexpanded\def\naturalfullsectionnumber#1#2#3{\sectiebloklabel{#1}{\getvalue{\??cv#2}{#3}}}
-\unexpanded\def\limitedfullsectionnumber#1#2#3{\getvalue{\??cv#2}{#3}}
+ \def \writtenfullsectionnumber {\string\fullsectionnumber}
+ \def \ignoredfullsectionnumber#1#2#3{#3}
+ \let \storedfullsectionnumber \relax
+\unexpanded\def \naturalfullsectionnumber#1#2#3{\sectiebloklabel{#1}{\getvalue{\??cv#2}{#3}}}
+ \def\expandablefullsectionnumber#1#2#3{#3}
+\unexpanded\def \limitedfullsectionnumber#1#2#3{\getvalue{\??cv#2}{#3}}
+
+% under test:
+%
+% \def\expandablefullsectionnumber#1#2#3{\getvalue{\??cv#2}{#3}}
\def\setfullsectionnumber#1%
{\doifelsevalue{#1\c!kopconversie}{\v!ja}
@@ -874,18 +1050,59 @@
{\let\fullsectionnumber\limitedfullsectionnumber}}
{\let\fullsectionnumber\ignoredfullsectionnumber}}
-%\let\fullsectionnumber\naturalfullsectionnumber
\let\fullsectionnumber\limitedfullsectionnumber
% \dodododosomekop IS NON GROUPED, SO WE NEED TO RESTORE !!!!
%
% dit kan dus beter \everyaroundhead zijn
-\def\dodododosomekop#1[#2]#3#4#5% % pas met \ExpandFirstAfter op bij twee||taligheid
- {\flushingcolumnfloatsfalse % #3=#1=redundant
+\let\currentheadnumber\empty
+\let\currentheadtext \empty
+
+\def\dodosomekop#1[#2]#3% [ref] {title}
+ {\doifelsevalue{\??ko#1\c!eigennummer}{\v!ja}
+ {\doquadruplegroupempty\dododosomekop{#1}{#2}{#3}}
+ {\fourthargumentfalse \dododosomekop{#1}{#2}{#3}{}}}
+
+\def\dododosomekop#1#2#3#4% [ref] {own} {title}
+ {\iffourthargument
+ \def\next{\dodododosomekop{#1}[#2]{#3}{#4}}%
+ \else
+ \def\next{\dodododosomekop{#1}[#2]{\finalsectionnumber}{#3}}%
+ \fi
+ \next}
+
+% clearer
+
+\def\dodosomekop#1[#2]#3% [ref] {title}
+ {\doifelsevalue{\??ko#1\c!eigennummer}{\v!ja}
+ {\doquadruplegroupempty\dododosomekop{#1}[#2]{#3}}
+ %{\fourthargumentfalse \dododosomekop{#1}[#2]{#3}{}}}
+ {\dodododosomekop{#1}[#2]{\finalsectionnumber}{#3}}}
+
+\def\dododosomekop#1[#2]#3#4% [ref] {own} {title}
+ {\iffourthargument
+ \def\next{\dodododosomekop{#1}[#2]{#3}{#4}}%
+ \else % normal head or no own number given
+ \def\next{\dodododosomekop{#1}[#2]{\finalsectionnumber}{#3}}%
+ \fi
+ \next}
+
+% pas met \ExpandFirstAfter op bij twee||taligheid
+
+\ifx\dohandleheadnumber\undefined
+ \let\dohandleheadnumber\firstofoneargument
+\fi
+
+\unexpanded\def\\{\space}
+
+\def\dodododosomekop#1[#2]#3#4% [ref] {number} {title}
+ {\def\currenthead{#1}%
+ \unexpanded\def\\{\space}%
+ \def\numberseparator{\getvalue{\??ko\currenthead\c!scheider}}%
+ \flushingcolumnfloatsfalse % {number} can be \finalsectionnumber
\someheadconversionfalse
-% \let\fullsectionnumber\naturalfullsectionnumber
-\let\fullsectionnumber\limitedfullsectionnumber
+ \let\fullsectionnumber\limitedfullsectionnumber
\setsectieenkoppeling{#1}%
\doifelsevalue{\??ko#1\c!prefix}{}
{\kopprefixfalse}
@@ -905,7 +1122,7 @@
[ \v!ja=>\verhoognummertrue,
\v!nee=>\verhoognummerfalse,
\s!unknown=>{\ifx\currentproduct\empty
- \findsectionnumber{#1}\commalistelement{#5}%
+ \findsectionnumber{#1}\commalistelement{#4}%
\fi
\verhoognummertrue}]%
\edef\numberheaddistance {\getvalue{\??ko#1\c!afstand}}%
@@ -919,75 +1136,82 @@
\else
\kopnummerfalse
\fi
- \convertexpanded{\??ko#1}{#5}\asciititle
+ \convertexpanded{\??ko#1}{#4}\asciititle
+ %
+ \gdef\currentheadtext{#4}% scheelt args
+ \global\let\currentheadnumber\empty
+ %
\ifverhoognummer
\ifplaatskop
\checknexthead\handelpaginaaf{#1}%
\setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
\ifkopprefix
- \setupreferencing[\c!prefix=-]%
+ %\setupreferencing[\c!prefix=-]%
+ \setupreferenceprefix[-]%
\fi
\getvalue{\e!volgende\@@sectie}%
- \getvalue{\??ko#1\c!tussen}%
\ifkopnummer
-\setsomeheadconversion{#1}{#4}%
-\ifsomeheadconversion
- \let\fullsectionnumber\naturalfullsectionnumber
- \doplaatskopnummertekst
- {#1}
- {\setsectionlistreference{\@@sectie}{#1}%
- \ExpandFirstAfter\soortpagina[\@@koppeling]%
-% \let\fullsectionnumber\storedfullsectionnumber
- \let\fullsectionnumber\writtenfullsectionnumber
- \rawreference{\s!sec}{#2}{{\someheadconversion}{\asciititle}}%
- \resetsectionmarks[\@@sectie]%
- \stellijstin[\@@koppeling][\c!expansie=\getvalue{\??ko#1\c!expansie}]%
- \let\fullsectionnumber\writtenfullsectionnumber
- \doschrijfnaarlijst{\@@koppeling}{\someheadconversion}{#5}{\v!kop}}%
- {\someheadconversion}
- {#5}
- {\marking[#1]{#5}%
- \let\fullsectionnumber\storedfullsectionnumber
- \expanded{\marking[#1\v!nummer]{\someheadconversion}}}%
- \let\fullsectionnumber\ignoredfullsectionnumber
- \writesection{#1}{\someheadconversion}{#5}%
-\else
- \doplaatskopnummertekst
- {#1}
- {\setsectionlistreference{\@@sectie}{#1}%
- \ExpandFirstAfter\soortpagina[\@@koppeling]%
- \rawreference{\s!sec}{#2}{{#4}{\asciititle}}%
- \resetsectionmarks[\@@sectie]%
- \stellijstin[\@@koppeling][\c!expansie=\getvalue{\??ko#1\c!expansie}]%
- \doschrijfnaarlijst{\@@koppeling}{#4}{#5}{\v!kop}}
- {\sectiebloklabel{#3}{#4}}
- {#5}
- {\marking[#1]{#5}%
- \doifelsevalue{\??ko#1\c!eigennummer}{\v!ja} % rommelig omdat
- {\edef\finalsectionnumber{#4}} % #4 al is toegekend
- {\bepaalkopnummer[#1]}% migreert naar 3e argument
- \expanded{\marking[#1\v!nummer]{\finalsectionnumber}}}%
- \writesection{#1}{#4}{#5}%
- \fi
+ \setsomeheadconversion{#1}{#3}%
+ \let\fullsectionnumber\expandablefullsectionnumber
+ \xdef\currentheadnumber{\someheadconversion}%
+ \getvalue{\??ko#1\c!tussen}%
+ \ifsomeheadconversion
+ \let\fullsectionnumber\naturalfullsectionnumber
+ \doplaatskopnummertekst
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \soortpagina[\@@koppeling]%
+ \let\fullsectionnumber\writtenfullsectionnumber
+ \rawreference{\s!sec}{#2}{{\someheadconversion}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansie{\getvalue{\??ko#1\c!expansie}}%
+ \let\fullsectionnumber\writtenfullsectionnumber
+ \doschrijfnaarlijst{\@@koppeling}{\someheadconversion}{#4}{\v!kop}}%
+ {\dohandleheadnumber\someheadconversion}% handle is new
+ {#4}
+ {\marking[#1]{#4}%
+ \let\fullsectionnumber\storedfullsectionnumber
+ \expanded{\marking[#1\v!nummer]{\someheadconversion}}}%
+ \let\fullsectionnumber\ignoredfullsectionnumber
+ \writesection{#1}{\someheadconversion}{#4}%
+ \else
+ \doplaatskopnummertekst
+ {#1}
+ {\setsectionlistreference{\@@sectie}{#1}%
+ \soortpagina[\@@koppeling]%
+ \rawreference{\s!sec}{#2}{{#3}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansie{\getvalue{\??ko#1\c!expansie}}%
+ \doschrijfnaarlijst{\@@koppeling}{#3}{#4}{\v!kop}}
+ {\sectiebloklabel{#1}{\dohandleheadnumber{#3}}}% handle is new
+ {#4}
+ {\marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!eigennummer}{\v!ja} % rommelig omdat
+ {\edef\finalsectionnumber{#3}} % #3 al is toegekend
+ {\bepaalkopnummer[#1]}% migreert naar 3e argument
+ \expanded{\marking[#1\v!nummer]{\finalsectionnumber}}}%
+ \writesection{#1}{#3}{#4}%
+ \fi
\else
+ \getvalue{\??ko#1\c!tussen}%
\doplaatskoptekst
{#1}
{\setsectionlistreference{\@@sectie}{#1}%
- \ExpandFirstAfter\soortpagina[\@@koppeling]%
- \rawreference{\s!sec}{#2}{{#4}{\asciititle}}%
- \resetsectionmarks[\@@sectie]%
- \stellijstin[\@@koppeling][\c!expansie=\getvalue{\??ko#1\c!expansie}]%
- \doschrijfnaarlijst{\@@koppeling}{}{#5}{\v!kop}}
- {#5}
- {\marking[#1]{#5}%
- \doifelsevalue{\??ko#1\c!eigennummer}{\v!ja}
- {\edef\finalsectionnumber{#4}}
+ \soortpagina[\@@koppeling]%
+ \rawreference{\s!sec}{#2}{{#3}{\asciititle}}%
+ \resetsectionmarks\@@sectie
+ \setlistparameter\@@koppeling\c!expansie{\getvalue{\??ko#1\c!expansie}}%
+ \doschrijfnaarlijst{\@@koppeling}{}{#4}{\v!kop}}
+ {#4}
+ {\marking[#1]{#4}%
+ \doifelsevalue{\??ko#1\c!eigennummer}{\v!ja} % brrr
+ {\edef\finalsectionnumber{#3}}
{\bepaalkopnummer[#1]}%
\expanded{\marking[#1\v!nummer]{\finalsectionnumber}}}%
- \writesection{#1}{-}{#5}%
+ \writesection{#1}{-}{#4}%
\fi
\ifkopprefix
- \ExpandFirstAfter\setupreferencing[\c!prefix=\localkopprefix]%
+ \setupreferenceprefix[\localkopprefix]%
\fi
\dosomebreak\nobreak
\ifdisplaysectionhead\getvalue{\??ko#1\c!na}\fi
@@ -995,32 +1219,37 @@
\checknexthead\dohandelpaginaafB{#1}% toegevoegd ivm subpaginanr / tug sheets
\setsectieenkoppeling{#1}% can be changed when [voor=\somehead{..}...]
\ifkopprefix
- \setupreferencing[\c!prefix=-]%
+ \setupreferenceprefix[-]%
\fi
\getvalue{\e!volgende\@@sectie}%
+ \ifkopnummer
+ \setsomeheadconversion{#1}{#3}%
+ \let\fullsectionnumber\expandablefullsectionnumber
+ \xdef\currentheadnumber{\someheadconversion}%
+ \fi
\getvalue{\??ko#1\c!tussen}%
\setsectionlistreference{\@@sectie}{#1}%
- \resetsectionmarks[\@@sectie]%
- \marking[#1]{#5}%
+ \resetsectionmarks\@@sectie
+ \marking[#1]{#4}%
\doifelsevalue{\??ko#1\c!eigennummer}{\v!ja}
- {\edef\finalsectionnumber{#4}}
+ {\edef\finalsectionnumber{#3}}
{\bepaalkopnummer[#1]}%
\expanded{\marking[#1\v!nummer]{\finalsectionnumber}}%
- \ExpandFirstAfter\soortpagina[\@@koppeling]%
+ \soortpagina[\@@koppeling]%
\bgroup
- \stellijstin[\@@koppeling][\c!expansie=\getvalue{\??ko#1\c!expansie}]%
+ \setlistparameter\@@koppeling\c!expansie{\getvalue{\??ko#1\c!expansie}}%
\ifkopnummer
- \rawreference{\s!sec}{#2}{{#4}{\asciititle}}%
- \doschrijfnaarlijst{\@@koppeling}{#4}{#5}{\v!kop}%
- \writesection{#1}{#4}{#5}%
+ \rawreference{\s!sec}{#2}{{#3}{\asciititle}}%
+ \doschrijfnaarlijst{\@@koppeling}{#3}{#4}{\v!kop}%
+ \writesection{#1}{#3}{#4}%
\else
- \rawreference{\s!sec}{#2}{{#4}{\asciititle}}%
- \doschrijfnaarlijst{\@@koppeling}{}{#5}{\v!kop}%
- \writesection{#1}{-}{#5}%
+ \rawreference{\s!sec}{#2}{{#3}{\asciititle}}%
+ \doschrijfnaarlijst{\@@koppeling}{}{#4}{\v!kop}%
+ \writesection{#1}{-}{#4}%
\fi
\egroup
\ifkopprefix
- \ExpandFirstAfter\setupreferencing[\c!prefix=\localkopprefix]%
+ \setupreferenceprefix[\localkopprefix]%
\fi
\fi
\else
@@ -1030,10 +1259,10 @@
\getvalue{\??ko#1\c!tussen}%
\doplaatskoptekst
{#1}
- {\rawreference{\s!sec}{#2}{{#4}{\asciititle}}}
- {#5}
+ {\rawreference{\s!sec}{#2}{{#3}{\asciititle}}}
+ {#4}
{}%
- \writesection{#1}{-}{#5}%
+ \writesection{#1}{-}{#4}%
\dosomebreak\nobreak
\ifdisplaysectionhead\getvalue{\??ko#1\c!na}\fi
\else
@@ -1042,21 +1271,20 @@
\fi
\flushingcolumnfloatstrue
\someheadconversionfalse
-% \let\fullsectionnumber\naturalfullsectionnumber
-\let\fullsectionnumber\limitedfullsectionnumber
+ \let\fullsectionnumber\limitedfullsectionnumber
\ifdisplaysectionhead\else\expandafter\GotoPar\fi}
-\def\previoussectionformat{}
-\def\currentsectionformat{}
+\let\previoussectionformat\empty
+\let\currentsectionformat \empty
-\let\updatelistreferences=\relax
-\def\updatedlistreferences{}
+\let\updatelistreferences \relax
+\let\updatedlistreferences\empty
\def\setsectionlistreference#1#2%
{\ifnum\countervalue{\??se\previoussection{#1}}>0\relax
\xdef\previoussectionformat{\@@longformatnumber{\previoussection{#1}}}%
\else
- \xdef\previoussectionformat{}%
+ \global\let\previoussectionformat\empty
\fi
\xdef\currentsectionformat{\@@longformatnumber{#1}}}
@@ -1079,8 +1307,8 @@
\def\dostoplistreferences#1%
{\iflijstgeplaatst
- \addtocommalist{#1}\updatedlistreferences % nog global (\doglobal)
- \global\let\updatedlistreferences=\updatedlistreferences % een noodverbandje
+ \addtocommalist{#1}\updatedlistreferences % nog global (\doglobal)
+ \global\let\updatedlistreferences\updatedlistreferences % een noodverbandje
\gdef\updatelistreferences%
{\def\docommando####1%
%
@@ -1090,8 +1318,8 @@
% {\definereference[\e!vorige####1][\getvalue{\e!huidigelokale####1}]%
%
\processcommacommand[\updatedlistreferences]\docommando
- \global\let\updatelistreferences=\relax
- \global\let\updatedlistreferences=\empty}%
+ \global\let\updatelistreferences\relax
+ \global\let\updatedlistreferences\empty}%
\fi}
\def\stoplistreferences%
@@ -1103,12 +1331,13 @@
% \onderwerp{test} \strut \input tufte
% \onderwerp{test} \plaatslijst[...]
-\newif\ifheadnumbercontent
+\newif\ifheadnumbercontent % niet meer wijzigen / wordt mode
\def\doplaatskoptekst#1#2#3#4%
{\beginheadplacement{#1}%
\setbox0=\ifvertical\vbox\else\hbox\fi % \vhbox
{\headnumbercontentfalse
+ \resetsystemmode\v!sectienummer
\getvalue{\??ko#1\c!commando}
{} % no number
{\doattributes
@@ -1125,7 +1354,7 @@
\getvalue{\??ko#1\c!voorcommando}%
\ifdisplaysectionhead
\getvalue{\??ko#1\c!tekstcommando}%
- {\setstrut\begstrut#3\endstrut}
+ {\setstrut\begstrut#3\endstrut}%
\xdef\localheaddepth{\the\dp\strutbox}%
\else
\getvalue{\??ko#1\c!tekstcommando}{#3}%
@@ -1138,7 +1367,8 @@
{\beginheadplacement{#1}%
\setbox0=\ifvertical\vbox\else\hbox\fi % \vhbox
{\doiftextelse{#3}
- {\headnumbercontenttrue}{\headnumbercontentfalse}%
+ {\setsystemmode \v!sectienummer\headnumbercontenttrue }
+ {\resetsystemmode\v!sectienummer\headnumbercontentfalse}%
\getvalue{\??ko#1\c!commando}%
{\doattributes{\??ko#1}\c!letter\c!kleur
{\doattributes{\??ko#1}\c!nummerletter\c!nummerkleur
@@ -1184,10 +1414,13 @@
\mindermeldingen
\postponefootnotes
\iflocation\ifdisplaysectionhead\else\noninterferingmarks\fi\fi
- \setupinteraction
- [\c!letter=,
- \c!kleur=,
- \c!contrastkleur=]%
+ %\setupinteraction
+ % [\c!letter=,
+ % \c!kleur=,
+ % \c!contrastkleur=]%
+ \resetinteractionparameter\c!letter
+ \resetinteractionparameter\c!kleur
+ \resetinteractionparameter\c!contrastkleur
\strictouterreferencestrue % tzt instelling
\def\localkopsetup%
{\dolocalkopsetup{#1}}%
@@ -1198,8 +1431,7 @@
{\doifvaluenothing{\??ko#1\c!file}{\autocrossdocumentfalse}}
{\autocrossdocumentfalse}%
% no message needed here, should be a proper switch
- \let\unknownreference\relax
- %
+ % \let\unknownreference\gobbleoneargument
\ifdisplaysectionhead
\let\headlastlinewidth\!!zeropoint
\snaptogrid\hbox
@@ -1225,7 +1457,7 @@
\doflushfootnotes % new, here since we're in par mode
\iflocation
\ifautocrossdocument
- \hhboxindent=\ifcontinuoushead\headlastlinewidth\else\!!zeropoint\fi
+ \hhboxindent=\ifcontinuoushead\headlastlinewidth\else\zeropoint\fi
\unhhbox0\with{\naarbox{\box\hhbox}[\getvalue{\??ko#1\c!file}::#1]}%
\advance\lasthhboxwidth by \numberheaddistance
\xdef\headlastlinewidth{\the\lasthhboxwidth}%
@@ -1289,15 +1521,6 @@
\def\stelkopnummerin%
{\dodoubleargument\dostelkopnummerin}
-% \def\dokopnummer[#1]%
-% {\bgroup
-% \setsectieenkoppeling{#1}%
-% \doifnot{\finalsectionnumber}{0} % kan effienter
-% {\finalsectionnumber}%
-% \egroup}
-%
-% beter :
-
\def\huidigekopnummer{0}
\def\bepaalkopnummer[#1]%
@@ -1306,19 +1529,11 @@
\xdef\huidigekopnummer{\@@sectionvalue{\@@sectie}}%
\egroup}
-%\def\complexkopnummer[#1]%
-% {\bgroup
-% \setsectieenkoppeling{#1}%
-% \xdef\huidigekopnummer{\@@sectionvalue{\@@sectie}}%
-% \doifnot{\huidigekopnummer}{0}
-% {\finalsectionnumber}%
-% \egroup}
-
\def\complexkopnummer[#1]%
{\bgroup
\edef\huidigekopnummer{#1}%
- \doifinsetelse{-}{#1}
- {\removefromcommalist{-}\huidigekopnummer
+ \doifinsetelse{-}{#1} % br undocumented
+ {\removefromcommalist{-}\huidigekopnummer % br
\setsectieenkoppeling\huidigekopnummer
\stelsectiein[\@@sectie][\c!vorigenummer=\v!nee]}%
{\setsectieenkoppeling\huidigekopnummer}%
@@ -1358,7 +1573,7 @@
{\vbox
{\localkopsetup
\begstrut % but use one \strut here!
- \ifheadnumbercontent
+ \ifheadnumbercontent
\llap{\hbox to 5em{\hfill{#1}\hskip\linkermargeafstand}}%
\fi
{#2}}}
@@ -1391,7 +1606,8 @@
\c!tekstletter=\getvalue{\??ko#1\c!letter},
\c!nummerkleur=\getvalue{\??ko#1\c!kleur},
\c!tekstkleur=\getvalue{\??ko#1\c!kleur}]%
- \ConvertToConstant\doifinstringelse{=}{#2}
+% \ConvertToConstant\doifinstringelse{=}{#2}
+ \doifassignmentelse{#2}
{\getparameters
[\??ko#1]
[\c!sectie=\getvalue{\??ko\getvalue{\??ko#1\c!koppeling}\c!sectie},
@@ -1400,7 +1616,7 @@
\c!prefix=,
\c!voor=,
\c!na=,
- \c!afstand=,
+ \c!afstand=\!!zeropoint,
\c!pagina=,
\c!hoofd=,
\c!tekst=,
@@ -1417,6 +1633,7 @@
\c!verhoognummer=\v!ja,
\c!variant=\@@kovariant,
\c!commando=\@@plaatskop,
+ \c!scheider=\@@koscheider,
\c!uitlijnen=,
\c!tolerantie=,
\c!file=,
@@ -1431,7 +1648,7 @@
\c!nummer,\c!eigennummer,\c!plaatskop,\c!verhoognummer,
\c!letter,\c!kleur,\c!afstand,\c!variant,\c!springvolgendein,
%\c!nummerletter,\c!tekstletter,
- %\c!expansie, % njet
+ %\c!expansie, % why njet ?
\c!uitlijnen,\c!tolerantie,\c!nummercommando,\c!tekstcommando]}}%
\getparameters[\??ko#1][#2]%
\doifsomething{\getvalue{\??ko#1\c!sectie}}
@@ -1452,8 +1669,9 @@
\c!nummer,\c!eigennummer,\c!plaatskop,\c!verhoognummer,
\c!letter,\c!kleur,\c!afstand,\c!variant,\c!springvolgendein,
%\c!nummerletter,\c!tekstletter,
- %\c!expansie, % njet
+ %\c!expansie, % why njet ?
\c!uitlijnen,\c!tolerantie,\c!nummercommando,\c!tekstcommando]%
+\getparameters[\??ko#1][\c!expansie=]% iig een value, rather fuzzy
\definieermarkering[#1][#2]%
\definieermarkering[#1\v!nummer][#2\v!nummer]%
\doifundefined{\??li#1}{\definieerlijst[#1][#2]}}}%
@@ -1490,7 +1708,7 @@
\def\@@plaatskop{\plaatskopnormaal}
-\def\dostelkopvariantin[#1]%
+\def\dostelkopvariantin[#1]% will be installable ! ! ! ! ! !
{\displaysectionheadtrue
\processaction
[#1]
@@ -1504,12 +1722,10 @@
\def\dostelkoppenin[#1]%
{\getparameters[\??ko][#1]%
- \doifelse{\@@kosectienummer}{\v!ja}
- {\sectienummertrue}
- {\sectienummerfalse}%
- \dostelkopvariantin[\@@kovariant]}
+ \doifelse{\@@kosectienummer}\v!ja\sectienummertrue\sectienummerfalse
+ \dostelkopvariantin[\@@kovariant]} % not really needed here
-\def\stelkoppenin%
+\def\stelkoppenin
{\dosingleargument\dostelkoppenin}
\def\systemsuppliedchapter {\getvalue{\v!hoofdstuk}}
@@ -1688,8 +1904,7 @@
\stellijstin
[\v!deel]
- [\c!breedte=0em,
- \c!voor={\blanko\pagina[\v!voorkeur]},
+ [\c!voor={\blanko\pagina[\v!voorkeur]},
\c!na=\blanko,
\c!label=\v!ja,
\c!scheider=:,
@@ -1697,29 +1912,16 @@
\stellijstin
[\v!hoofdstuk]
- [\c!breedte=2em,
- \c!voor={\blanko\pagina[\v!voorkeur]},
+ [\c!voor={\blanko\pagina[\v!voorkeur]},
\c!na=]
-\stellijstin
- [\v!paragraaf]
- [\c!breedte=3em]
-
-\stellijstin
- [\v!sub\v!paragraaf]
- [\c!breedte=4em]
-
-\stellijstin
- [\v!sub\v!sub\v!paragraaf]
- [\c!breedte=5em]
-
-\stellijstin
- [\v!sub\v!sub\v!sub\v!paragraaf]
- [\c!breedte=6em]
-
-\stellijstin
- [\v!sub\v!sub\v!sub\v!sub\v!paragraaf]
- [\c!breedte=7em]
+\stellijstin [\v!deel] [\c!breedte=0em]
+\stellijstin [\v!hoofdstuk] [\c!breedte=2em]
+\stellijstin [\v!paragraaf] [\c!breedte=3em]
+\stellijstin [\v!sub\v!paragraaf] [\c!breedte=4em]
+\stellijstin [\v!sub\v!sub\v!paragraaf] [\c!breedte=5em]
+\stellijstin [\v!sub\v!sub\v!sub\v!paragraaf] [\c!breedte=6em]
+\stellijstin [\v!sub\v!sub\v!sub\v!sub\v!paragraaf] [\c!breedte=7em]
% hm
@@ -1737,7 +1939,8 @@
\c!tekstscheider=\tfskip,
\c!status=\v!start,
\c!commando=,
- \c!letter=, % \v!normaal, % empty, otherwise conflict
+ \c!strut=\v!ja, % nieuw
+ \c!letter=, % \v!normaal, % empty, otherwise conflict
\c!kleur=]
\protect \endinput
diff --git a/tex/context/base/core-spa.tex b/tex/context/base/core-spa.tex
index 36d1ac5f4..ad2bdc6b2 100644
--- a/tex/context/base/core-spa.tex
+++ b/tex/context/base/core-spa.tex
@@ -24,27 +24,30 @@
\appendtoks \settopskip \to \everybodyfont
\appendtoks \setmaxdepth \to \everybodyfont
\appendtoks \spacing 1\to \everybodyfont
-\appendtoks \stelinspringenin \to \everybodyfont
-\appendtoks \stelblankoin \to \everybodyfont
-\appendtoks \stelwitruimtein \to \everybodyfont
+\appendtoks \simplestelinspringenin \to \everybodyfont
+\appendtoks \simplestelblankoin \to \everybodyfont
+\appendtoks \simplestelwitruimtein \to \everybodyfont
%appendtoks \setupfootnotes \to \everybodyfont % not
-\appendtoks \stelspatieringin \to \everybodyfont % nieuw
+\appendtoks \simplestelspatieringin \to \everybodyfont % nieuw
\appendtoks \setdisplayskips \to \everybodyfont % nieuw
-\appendtoks \updateraggedskips \to \everyfontswitch % under test
+\appendtoks \updateraggedskips \to \everyfontswitch % under test
+
+\prependtoks \let\par\endgraf \to \everypagebody % see \fillinline
\def\stelfactorenin%
- {\stelwitruimtein
- \stelblankoin
+ {\simplestelwitruimtein
+ \simplestelblankoin
\settopskip
\setmaxdepth}
%D The dreadful sequence \type {\bgroup} \unknown\
-%D \type{\carryoverpar} \unknown\ \type{\egroup} is needed
+%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.
+%D inside the group are forgotten afterwards. (I must
+%D not forget its existence).
\global\let\carriedoverpar\relax
@@ -57,6 +60,16 @@
\leftskip \the\leftskip
\rightskip \the\rightskip}}
+%D A quick way to determine left|/|middle|/|right states
+%D (experimental).
+
+\setvalue{\??as\v!links }{0}
+\setvalue{\??as\v!midden}{1}
+\setvalue{\??as\v!rechts}{2}
+
+\def\setalignmentswitch#1%
+ {\chardef\alignmentswitch=0\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
@@ -112,16 +125,17 @@
\advance\scratchdimen by 0\@@itdiepte pt
\ifdim\scratchdimen>1pt
\showmessage{\m!layouts}{10}{\@@ithoogte,\@@itdiepte}%
- \let\@@ithoogte=\strutheightfactor
- \let\@@itdiepte=\strutdepthfactor
+ \let\@@ithoogte\strutheightfactor
+ \let\@@itdiepte\strutdepthfactor
\else
- \let\strutheightfactor=\@@ithoogte
- \let\strutdepthfactor=\@@itdiepte
+ \let\strutheightfactor\@@ithoogte
+ \let\strutdepthfactor \@@itdiepte
\fi
- \let\minimallinedistance=\@@itafstand
- \let\normallineheight=\@@itregel % let ! ! ! ! ! ivm ex
- \let\topskipfactor=\@@itboven
- \let\maxdepthfactor=\@@itonder
+ \let\minimallinedistance\@@itafstand
+ \let\normallineheight\@@itregel % let ! ! ! ! ! ivm ex
+ \let\topskipfactor\@@itboven
+ \let\maxdepthfactor\@@itonder
+ \let\baselinegluefactor\@@itrek
\setfontparameters % redundant, can be \setstrut, test first
\updateraggedskips} % yes indeed
{\processallactionsinset % \regelwit = dummy !
@@ -159,8 +173,8 @@
\newskip\blankoskip \blankoskip=\bigskipamount
\newskip\blankoskipamount
-\def\skipfactor {.75}
-\def\skipgluefactor {.25}
+\def\skipfactor {.75}
+\def\skipgluefactor{.25}
\def\normalskipamount%
{\openlineheight
@@ -180,6 +194,19 @@
\def\geenblanko%
{\removelastskip}
+\def\currentblanko%
+ {\v!groot}
+
+\def\oldprevdepth {\prevdepth}%
+\def\newprevdepth {-1001pt}
+\def\mindimen {1sp} % was: 0.00002pt
+
+\newif\iflokaalblankovast
+\newif\iflokaalblankoflexibel
+\newif\iffuzzyvskip
+
+%%%% pas op, wordt ook in core-pos gebruikt
+
\def\doassignsomeskip#1\to#2% ook nog \v!halveregel+fuzzysnap
{\doifelse{#1}{\v!regel}
{#2\openlineheight}
@@ -191,16 +218,16 @@
{\smallskipamount}{\medskipamount}{\bigskipamount}%
\fi}}
-\def\dosingleblanko#1%
- {\doassignsomeskip#1\to\blankoskipamount
- \global\advance\blankoskip by \blankoskipamount}
-
-\newif\iffuzzyvskip
+%%%% dus niet weg
-% old
+% replaced
%
+% \def\dosingleblanko#1%
+% {\doassignsomeskip#1\to\blankoskipamount
+% \global\advance\blankoskip \blankoskipamount}
+%
% \def\doblanko#1%
-% {\processallactionsinset
+% {\processallactionsinset % is maar een actie
% [#1]
% [ \v!groot=>\dosingleblanko\v!groot, % happens often
% \v!buiten=>\ifvmode\ifinner\blankobuitentrue\fi\fi,
@@ -215,37 +242,240 @@
% \v!blokkeer=>\global\blankoblokkeertrue,
% \v!forceer=>\global\blankoforceertrue,
% \v!regel=>\global\advance\blankoskip by \lineheight,
-% \v!halveregel=>\global\fuzzyvskiptrue\global\advance\blankoskip by .5\lineheight,
-% \s!unknown=>{\herhaalmetcommando[#1]\dosingleblanko}]}
-%
-% new, see below
+% \v!halveregel=>\ifgridsnapping\global\fuzzyvskiptrue\fi
+% \global\advance\blankoskip by .5\lineheight,
+% \s!unknown=>\doindirectblanko{#1}]}
+%
+% \def\docomplexdoblanko[#1]% pas op \relax's zijn nodig ivm volgende \if
+% {\global\blankoresetfalse
+% \global\blankoblokkeerfalse
+% \global\blankogeenwitfalse
+% \global\lokaalblankoflexibelfalse
+% \global\lokaalblankovastfalse
+% \global\blankoskip\zeropoint
+% \global\blankoforceerfalse
+% \blankobuitenfalse
+% \processcommalist[#1]\doblanko
+% \ifdim\blankoskip=\zeropoint\relax
+% \iflokaalblankoflexibel \dosingleblanko\currentblanko \fi
+% \iflokaalblankovast \dosingleblanko\currentblanko \fi
+% \fi
+% \ifblankobuiten
+% \else
+% \par
+% \ifvmode %in pos fonts gaat dit mis
+% \ifblankoforceer%\ifdim\prevdepth>\zeropoint\else
+% % -1000pt signals top of page or column (\ejectcolumn)
+% \vbox{\strut}\kern-\lineheight
+% \fi
+% \ifblankoblokkeer
+% \global\doeblankofalse
+% \edef\oldprevdepth{\the\prevdepth}%
+% \prevdepth=\newprevdepth
+% \else
+% \global\doeblankotrue
+% \fi
+% \ifblankoreset
+% \global\doeblankotrue
+% \ifdim\prevdepth=\newprevdepth
+% \prevdepth=\oldprevdepth
+% \fi
+% \fi
+% \ifdoeblanko
+% \ifdim\lastskip<\blankoskip\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\blankoskip by \mindimen\relax % = skip
+% % test this on 2* + 3* and parskip groot
+% \ifblankogeenwit
+% \global\advance\blankoskip by -\parskip
+% \else
+% \ifdim\lastskip=\parskip
+% \else % force this due to previous comment
+% \ifdim\parskip>\zeropoint\relax
+% \ifdim\blankoskip<\parskip\relax
+% \global\blankoskip\zeropoint
+% \else
+% \global\advance\blankoskip by -\parskip
+% \fi
+% \fi
+% \fi
+% \fi
+% \ifblankoflexibel \else
+% \blankoskip=1\blankoskip
+% \fi
+% \iflokaalblankovast
+% \blankoskip=1\blankoskip
+% \fi
+% \iflokaalblankoflexibel
+% \blankoskip=1\blankoskip
+% \!!plus\skipgluefactor\blankoskip
+% \!!minus\skipgluefactor\blankoskip
+% \fi
+% \ifdim\prevdepth=\newprevdepth
+% \else
+% \iffuzzyvskip
+% \removelastfuzzyvskip
+% \fuzzyvskip\blankoskip\relax
+% \else
+% \removelastskip
+% \vskip\blankoskip\relax
+% \fi
+% \fi
+% \else
+% \iffuzzyvskip
+% \removelastfuzzyvskip
+% \fuzzyvskip\blankoskip\relax
+% \fi
+% \fi
+% \fi
+% \fi
+% \fi
+% \global\fuzzyvskipfalse
+% \presetindentation}
+%
+% \def\complexdodoblanko[#1]%
+% {\flushfootnotes
+% \ifopelkaar
+% \ifinpagebody
+% \expanded{\docomplexdoblanko[#1]}% \expanded=nieuw
+% \else
+% \par
+% \fi
+% \else
+% \expanded{\docomplexdoblanko[#1]}% \expanded = nieuw
+% \fi}
+%
+% % old
+% %
+% % \def\doindirectblanko#1%
+% % {\ifundefined{\??bo#1}% <-etex \expandafter\ifx\csname\??bo#1\endcsname\relax
+% % \expanded{\complexdodoblanko[#1]}%
+% % \else
+% % \expandafter\complexdoblanko\expandafter[\csname\??bo#1\endcsname]%
+% % \fi}
+% %
+% % \def\complexdoblanko[#1]% enables [force,8\bodyfontsize]
+% % {\doifinstringelse{,}{#1}
+% % {\expanded{\complexdodoblanko[#1]}}
+% % {\doifnumberelse{#1}
+% % {\expanded{\complexdodoblanko[#1]}}
+% % {\doindirectblanko{#1}}}}
+% %
+% % new, more robust
+% %
+% % \def\doindirectblanko#1%
+% % {\edef\ascii{#1}\convertcommand\ascii\to\ascii
+% % \ifundefined{\??bo\ascii}% <-etex \expandafter\ifx\csname\??bo#1\endcsname\rel
+% % \herhaalmetcommando[#1]\dosingleblanko
+% % \else
+% % \expandafter\complexdoblanko\expandafter[\csname\??bo\ascii\endcsname]%
+% % \fi}
+% %
+% % even more robust
+%
+% \def\doindirectblanko#1%
+% {\edef\ascii{#1}\convertcommand\ascii\to\ascii
+% \ifundefined{\??bo\ascii}% <-etex \expandafter\ifx\csname\??bo#1\endcsname
+% \expanded{\herhaalmetcommando[#1]\noexpand\dosingleblanko}%
+% \else
+% \expandafter\complexdoblanko\expandafter[\csname\??bo\ascii\endcsname]%
+% \fi}
+
+% \def\TestBlank[#1]%
+% {blank : {\convertargument#1\to\ascii\tttf\ascii}\blanko[#1]}
+%
+% \defineblank[whatever][2*big,2*big]
+% \TestBlank[]
+% \TestBlank[big]
+% \TestBlank[2*big]
+% \TestBlank[big,big,2*big]
+% \TestBlank[big]
+% \TestBlank[whatever]
+% \TestBlank[2*big,whatever]
+% \TestBlank[3\lineheight]
+
+\def\addblankskip#1#2#3%
+ {\global\advance\blankoskip#1\ifgridsnapping#3\else#2\fi}
+
+\def\defineblankmethod[#1]#2{\setvalue{\??bo\??bo#1}{#2}}
+
+\defineblankmethod [\v!groot]{\addblankskip+\bigskipamount \openlineheight}
+\defineblankmethod [-\v!groot]{\addblankskip-\bigskipamount \openlineheight}
+\defineblankmethod [\v!middel]{\addblankskip+\medskipamount {.5\openlineheight}}
+\defineblankmethod [-\v!middel]{\addblankskip-\medskipamount {.5\openlineheight}}
+\defineblankmethod [\v!klein]{\addblankskip+\smallskipamount{.25\openlineheight}}
+\defineblankmethod [-\v!klein]{\addblankskip-\smallskipamount{.25\openlineheight}}
+\defineblankmethod [\v!wit]{\addblankskip+\parskip\openlineheight}
+\defineblankmethod [-\v!wit]{\addblankskip-\parskip\openlineheight}
+\defineblankmethod [\v!regel]{\addblankskip+\openlineheight\openlineheight}
+\defineblankmethod [-\v!regel]{\addblankskip-\openlineheight\openlineheight}
+
+\defineblankmethod [\v!formule ]{\global\advance\blankoskip\medskipamount}
+\defineblankmethod [\v!geenwit ]{\global\blankogeenwittrue}
+\defineblankmethod [\v!blokkeer ]{\global\blankoblokkeertrue}
+\defineblankmethod [\v!forceer ]{\global\blankoforceertrue}
+\defineblankmethod [\v!buiten ]{\ifvmode\ifinner\blankobuitentrue\fi\fi}
+\defineblankmethod [\v!reset ]{\global\blankoresettrue}
+\defineblankmethod [\v!flexibel ]{\global\lokaalblankoflexibeltrue}
+\defineblankmethod [\v!vast ]{\global\lokaalblankovasttrue}
+\defineblankmethod [\v!back ]{\geenblanko}
+\defineblankmethod [\v!halveregel]{\ifgridsnapping\global\fuzzyvskiptrue\fi
+ \global\advance\blankoskip .5\lineheight}
+% happens often
+
+\defineblankmethod [2*\v!groot]{\addblankskip+{2\bigskipamount}{2\openlineheight}}
+
+% ETEX ! ! !
\def\doblanko#1%
- {\processallactionsinset
- [#1]
- [ \v!groot=>\dosingleblanko\v!groot, % happens often
- \v!buiten=>\ifvmode\ifinner\blankobuitentrue\fi\fi,
- \v!reset=>\global\blankoresettrue,
- \v!flexibel=>\global\lokaalblankoflexibeltrue,
- \v!vast=>\global\lokaalblankovasttrue,
- \v!back=>\geenblanko,
- \v!wit=>\global\advance\blankoskip by \parskip,
- \v!formule=>\global\advance\blankoskip by \medskipamount,
- \v!geenwit=>\global\blankogeenwittrue,
- -\v!wit=>\global\advance\blankoskip by -\parskip,
- \v!blokkeer=>\global\blankoblokkeertrue,
- \v!forceer=>\global\blankoforceertrue,
- \v!regel=>\global\advance\blankoskip by \lineheight,
- \v!halveregel=>\global\fuzzyvskiptrue\global\advance\blankoskip by .5\lineheight,
- \s!unknown=>\doindirectblanko{#1}]}
-
-\def\oldprevdepth{\prevdepth}%
-\def\newprevdepth{-1001pt}
-
-\def\mindimen{0.00002pt} % beter 1sp
+ {\edef\ascii{#1}\convertcommand\ascii\to\ascii
+ \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]\doblanko\relax
+ \else
+ \dorepeatwithcommand[#1]\redoblanko
+ \fi\fi
+ \fi}
-\newif\iflokaalblankovast
-\newif\iflokaalblankoflexibel
+\def\redoblanko#1%
+ {\edef\ascii{#1}\convertcommand\ascii\to\ascii
+ \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]\doblanko\relax
+ \else
+ \global\advance\blankoskip#1\relax
+ \fi\fi
+ \fi}
+
+\def\blanko % the \relax is definitely needed due to the many \if's
+ {\relax\complexorsimple\doblanko}
+
+\def\simpledoblanko % ...
+ {\doifelse\currentwitruimte\v!geen
+ {\blanko[\currentblanko]}
+ {\blanko[\s!default]}}
+
+\def\complexdoblanko
+ {\flushfootnotes
+ \ifopelkaar
+ \ifinpagebody
+ \@EAEAEA\docomplexdoblanko
+ \else
+ \@EAEAEA\nocomplexdoblanko
+ \fi
+ \else
+ \@EA\docomplexdoblanko
+ \fi}
+
+\def\nocomplexdoblanko[#1]%
+ {\par}
\def\docomplexdoblanko[#1]% pas op \relax's zijn nodig ivm volgende \if
{\global\blankoresetfalse
@@ -253,33 +483,36 @@
\global\blankogeenwitfalse
\global\lokaalblankoflexibelfalse
\global\lokaalblankovastfalse
- \global\blankoskip=\zeropoint
+ \global\blankoskip\zeropoint
\global\blankoforceerfalse
\blankobuitenfalse
- \processcommalist[#1]\doblanko
-\ifdim\blankoskip=\zeropoint\relax
- \iflokaalblankoflexibel \dosingleblanko\currentblanko \fi
- \iflokaalblankovast \dosingleblanko\currentblanko \fi
-\fi
+ \expanded{\rawprocesscommalist[#1]}\doblanko
+ \ifdim\blankoskip=\zeropoint\relax
+ \iflokaalblankoflexibel
+ \doglobal\advance\blankoskip \currentblanko
+ \else\iflokaalblankovast
+ \doglobal\advance\blankoskip \currentblanko
+ \fi\fi
+ \fi
\ifblankobuiten
\else
\par
\ifvmode %in pos fonts gaat dit mis
- \ifblankoforceer%\ifdim\prevdepth>\!!zeropoint\else
+ \ifblankoforceer%\ifdim\prevdepth>\zeropoint\else
% -1000pt signals top of page or column (\ejectcolumn)
\vbox{\strut}\kern-\lineheight
- \fi%\fi
+ \fi
\ifblankoblokkeer
\global\doeblankofalse
\edef\oldprevdepth{\the\prevdepth}%
- \prevdepth=\newprevdepth
+ \prevdepth\newprevdepth
\else
\global\doeblankotrue
\fi
\ifblankoreset
\global\doeblankotrue
\ifdim\prevdepth=\newprevdepth
- \prevdepth=\oldprevdepth
+ \prevdepth\oldprevdepth
\fi
\fi
\ifdoeblanko
@@ -288,33 +521,33 @@
% 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\blankoskip by \mindimen\relax % = skip
+ \global\advance\blankoskip \mindimen\relax % = skip
% test this on 2* + 3* and parskip groot
\ifblankogeenwit
- \global\advance\blankoskip by -\parskip
+ \global\advance\blankoskip -\parskip
\else
\ifdim\lastskip=\parskip
\else % force this due to previous comment
\ifdim\parskip>\zeropoint\relax
\ifdim\blankoskip<\parskip\relax
- \global\blankoskip=\zeropoint
+ \global\blankoskip\zeropoint
\else
- \global\advance\blankoskip by -\parskip
+ \global\advance\blankoskip -\parskip
\fi
\fi
\fi
\fi
-\ifblankoflexibel \else
- \blankoskip=1\blankoskip
-\fi
-\iflokaalblankovast
- \blankoskip=1\blankoskip
-\fi
-\iflokaalblankoflexibel
- \blankoskip=1\blankoskip
- \!!plus\skipgluefactor\blankoskip
- \!!minus\skipgluefactor\blankoskip
-\fi
+ \ifblankoflexibel \else
+ \blankoskip1\blankoskip
+ \fi
+ \iflokaalblankovast
+ \blankoskip1\blankoskip
+ \fi
+ \iflokaalblankoflexibel
+ \blankoskip1\blankoskip
+ \!!plus\skipgluefactor\blankoskip
+ \!!minus\skipgluefactor\blankoskip
+ \fi
\ifdim\prevdepth=\newprevdepth
\else
\iffuzzyvskip
@@ -337,60 +570,6 @@
\global\fuzzyvskipfalse
\presetindentation}
-\def\complexdodoblanko[#1]%
- {\flushfootnotes
- \ifopelkaar
- \ifinpagebody
- \expanded{\docomplexdoblanko[#1]}% \expanded=nieuw
- \else
- \par
- \fi
- \else
- \expanded{\docomplexdoblanko[#1]}% \expanded = nieuw
- \fi}
-
-% old
-%
-% \def\doindirectblanko#1%
-% {\ifundefined{\??bo#1}% <-etex \expandafter\ifx\csname\??bo#1\endcsname\relax
-% \expanded{\complexdodoblanko[#1]}%
-% \else
-% \expandafter\complexdoblanko\expandafter[\csname\??bo#1\endcsname]%
-% \fi}
-%
-% \def\complexdoblanko[#1]% enables [force,8\bodyfontsize]
-% {\doifinstringelse{,}{#1}
-% {\expanded{\complexdodoblanko[#1]}}
-% {\doifnumberelse{#1}
-% {\expanded{\complexdodoblanko[#1]}}
-% {\doindirectblanko{#1}}}}
-%
-% new, more robust
-%
-% \def\doindirectblanko#1%
-% {\edef\ascii{#1}\convertcommand\ascii\to\ascii
-% \ifundefined{\??bo\ascii}% <-etex \expandafter\ifx\csname\??bo#1\endcsname\rel
-% \herhaalmetcommando[#1]\dosingleblanko
-% \else
-% \expandafter\complexdoblanko\expandafter[\csname\??bo\ascii\endcsname]%
-% \fi}
-%
-% even more robust
-
-\def\doindirectblanko#1%
- {\edef\ascii{#1}\convertcommand\ascii\to\ascii
- \ifundefined{\??bo\ascii}% <-etex \expandafter\ifx\csname\??bo#1\endcsname
- \expanded{\herhaalmetcommando[#1]\noexpand\dosingleblanko}%
- \else
- \expandafter\complexdoblanko\expandafter[\csname\??bo\ascii\endcsname]%
- \fi}
-
-\def\complexdoblanko[#1]% enables [force,8\bodyfontsize]
- {\expanded{\complexdodoblanko[#1]}}
-
-\def\currentblanko%
- {\v!groot}
-
%D For a long time we had:
%D
%D \starttypen
@@ -415,31 +594,18 @@
%D [\v!groot]
%D \stoptypen
-\def\blanko% % the \relax is definitely needed due to the many \if's
+\def\blanko% the \relax is definitely needed due to the many \if's
{\relax\complexorsimple\doblanko}
-%\def\dostelblankoin#1%
-% {\bgroup % rommelig
-% \skip0=#1\relax
-% \xdef\globalblanko{\the\skip0}%
-% \egroup
-% \bigskipamount=\globalblanko
-% \smallskipamount=\globalblanko
-% \medskipamount=\globalblanko
-% \divide\medskipamount by 2\relax
-% \divide\smallskipamount by 4\relax}%
-
-\def\dostelblankoin#1%
+\def\dostelblankoin#1% amount are an plain inheritance
{\bigskipamount=#1\relax
- \ifblankoflexibel \else
- \bigskipamount=1\bigskipamount
+ \ifblankoflexibel \else
+ \bigskipamount=1\bigskipamount
\fi
- \smallskipamount=\bigskipamount
- \medskipamount=\bigskipamount
- \divide\medskipamount by 2
- \divide\smallskipamount by 4 }%
+ \medskipamount \bigskipamount \divide\medskipamount 2
+ \smallskipamount\bigskipamount \divide\smallskipamount 4 }%
-\def\complexstelblankoin[#1]%
+\def\complexstelblankoin[#1]% more \let's
{\ifgridsnapping
\blankoflexibelfalse
\else
@@ -450,36 +616,36 @@
\fi
\ExpandFirstAfter\processallactionsinset
[#1]
- [ \v!flexibel=>\dostelblankoin{\deblankoskip},
- \v!vast=>\dostelblankoin{\deblankoskip},
+ [ \v!flexibel=>\dostelblankoin\deblankoskip,
+ \v!vast=>\dostelblankoin\deblankoskip,
\v!regel=>\edef\deblankoskip{\regelafstand}%
- \dostelblankoin{\deblankoskip}%
- \let\deblanko=\v!groot,
- \v!halveregel=>\scratchskip=.5\regelafstand
+ \dostelblankoin\deblankoskip
+ \let\deblanko\v!groot,
+ \v!halveregel=>\scratchskip.5\regelafstand
\edef\deblankoskip{\the\scratchskip}%
- \dostelblankoin{\deblankoskip}%
- \let\deblanko=\v!middel,
+ \dostelblankoin\deblankoskip
+ \let\deblanko\v!middel,
\v!groot=>\ifgridsnapping
\edef\deblankoskip{\regelafstand}%
- \dostelblankoin{\deblankoskip}%
+ \dostelblankoin\deblankoskip
\fi
\def\currentblanko{\v!groot}%
- \let\deblanko=\v!groot,
+ \let\deblanko\v!groot,
\v!middel=>\def\currentblanko{\v!middel}%
- \let\deblanko=\v!middel,
+ \let\deblanko\v!middel,
\v!klein=>\def\currentblanko{\v!klein}%
- \let\deblanko=\v!klein,
- \v!normaal=>\dostelblankoin{\deblankoskip}%
- \let\deblanko=\v!groot,
+ \let\deblanko\v!klein,
+ \v!normaal=>\dostelblankoin\deblankoskip
+ \let\deblanko\v!groot,
\v!standaard=>\edef\deblankoskip{\skipfactor\regelafstand}%
- \dostelblankoin{\deblankoskip}%
- \let\deblanko=\v!groot,
- \s!default=>\dostelblankoin{\deblankoskip}%
- \let\deblanko=\v!groot,
- \s!unknown=>\let\deblankoskip=\commalistelement
- \dostelblankoin{\deblankoskip}%
- \let\deblanko=\v!groot]%
- \stelwitruimtein}
+ \dostelblankoin\deblankoskip
+ \let\deblanko\v!groot,
+ \s!default=>\dostelblankoin\deblankoskip
+ \let\deblanko\v!groot,
+ \s!unknown=>\let\deblankoskip\commalistelement
+ \dostelblankoin\deblankoskip
+ \let\deblanko\v!groot]%
+ \simplestelwitruimtein}
% \definecomplexorsimpleempty\stelblankoin
%
@@ -493,7 +659,12 @@
\fi
\dostelblankoin{\deblankoskip}%
\let\deblanko\v!groot
- \stelwitruimtein}
+ \simplestelwitruimtein}
+
+\def\restorestandardblank% \v!standaard
+ {\edef\deblankoskip{\skipfactor\regelafstand}%
+ \dostelblankoin\deblankoskip
+ \let\deblanko\v!groot}
\def\dodefinieerblanko[#1][#2]%
{\def\docommando##1{\setvalue{\??bo##1}{#2}}%
@@ -533,22 +704,6 @@
{\doifoutervmode
{\ifindentfirstparagraph\else\noindentation\fi}}
-%\def\dostelinspringenin[#1]%
-% {\processallactionsinset
-% [#1]
-% [ \v!eerste=>\indentfirstparagraphtrue,
-% \v!volgende=>\indentfirstparagraphfalse,
-% \s!default=>\dodostelinspringenin,
-% \s!unknown=>\edef\currentvoorwit{\commalistelement}%
-% \dodostelinspringenin]}
-%
-%\def\dodostelinspringenin%
-% {\assigndimension{\currentvoorwit}{\voorwit}{1em}{1.5em}{2em}%
-% \parindent=\voorwit\relax}
-%
-%\def\stelinspringenin%
-% {\dosingleempty\dostelinspringenin}
-
\definecomplexorsimple\stelinspringenin
\def\complexstelinspringenin[#1]%
@@ -564,16 +719,16 @@
{\assigndimension{\currentvoorwit}{\voorwit}{1em}{1.5em}{2em}%
\parindent=\voorwit\relax}
-\def\doinspringen[#1]%
+\def\doinspringen[#1]% too many relaxes
{\processallactionsinset
[#1]
- [ \v!nee=>\parindent=\voorwit\relax\noindent,
- \v!niet=>\parindent=\voorwit\relax\noindent,
- \v!ja=>\parindent=\voorwit\relax, % geen \indent !
+ [ \v!nee=>\parindent\voorwit\relax\noindent,
+ \v!niet=>\parindent\voorwit\relax\noindent,
+ \v!ja=>\parindent\voorwit\relax, % geen \indent !
\v!eerste=>\indentfirstparagraphtrue,
\v!volgende=>\indentfirstparagraphfalse,
- \v!altijd=>\parindent=\voorwit\relax, % geen \indent !
- \v!nooit=>\parindent=\zeropoint\relax]}
+ \v!altijd=>\parindent\voorwit\relax, % geen \indent !
+ \v!nooit=>\parindent\zeropoint\relax]}
\def\inspringen%
{\dosingleargument\doinspringen}
@@ -589,24 +744,28 @@
\sfcode`\?#1 \sfcode`\!#1\relax
\sfcode`\:#1 \sfcode`\;#1\relax}
-\def\frenchspacing%
- {\dofrenchspacing{1000}} % \@m
+\def\frenchspacing {\dofrenchspacing{1000}}
+\def\newfrenchspacing{\dofrenchspacing{1050}}
+
+\def\nonfrenchspacing
+ {\sfcode`\.3000 \sfcode`\,1250
+ \sfcode`\?3000 \sfcode`\!3000
+ \sfcode`\:2000 \sfcode`\;1500 }
+
+\def\definespacingmethod[#1]#2{\setvalue{\??sg\??sg#1}{#2}}
-\def\newfrenchspacing%
- {\dofrenchspacing{1050}} % \@ml
+\definespacingmethod[\v!opelkaar]{\newfrenchspacing}
+\definespacingmethod[\v!ruim ]{\nonfrenchspacing}
\def\complexstelspatieringin[#1]%
- {\processaction
- [#1]
- [\v!opelkaar=>\newfrenchspacing,
- \v!ruim=>\nonfrenchspacing]%
+ {\executeifdefined{\??sg\??sg#1}\relax
\updateraggedskips}
-\def\simplestelspatieringin%
+\def\simplestelspatieringin
{\updateraggedskips}
\definecomplexorsimple\stelspatieringin
-
+
\bgroup
\catcode`\~=\@@active % eigenlijk is ~ al actief
\gdef\fixedspaces% % in Plain \TeX, maar we weten
@@ -614,9 +773,11 @@
\def~{\fixedspace}} % gebeurd, vandaar.
\egroup
-\def\space { }
-\def\fixedspace {\hskip.5em\relax}
-\def\nospace {\unskip\ignorespaces}
+\def\space { }
+\def\fixedspace {\hskip.5em\relax}
+\def\removelastspace {\ifhmode\unskip\fi}
+\def\nospace {\removelastspace\ignorespaces}
+\def\removeunwantedspaces{\ifhmode\unskip\unskip\unskip\unskip\fi}
\let\spatie \space
\let\hardespatie\fixedspace
@@ -629,55 +790,141 @@
{\nointerlineskip
\vskip#1 }
-\newskip\tussenwit \tussenwit=\zeropoint
+%D A couple of plain macros:
+
+\ifx\thinspace\undefined
+
+ \def\thinspace {\kern .16667em }
+ \def\negthinspace{\kern-.16667em }
+ \def\enspace {\kern .5em }
+
+\fi
+
+\ifx\quad\undefined
+
+ \def\enskip{\hskip.5em\relax}
+ \def\quad {\hskip 1em\relax}
+ \def\qquad {\hskip 2em\relax}
+
+\fi
+
+\ifx\smallskip\undefined
+
+ \def\smallskip{\vskip\smallskipamount}
+ \def\medskip {\vskip\medskipamount}
+ \def\bigskip {\vskip\bigskipamount}
+
+\fi
+
+\ifx\allowbreak\undefined
+
+ \def\break {\penalty-\@M}
+ \def\nobreak {\penalty \@M}
+ \def\allowbreak{\penalty \z@}
+ \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
+ {\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-\@MM}
+
+\fi
+
+\ifx\dosupereject\undefined
+
+ \def\dosupereject
+ {\ifnum\insertpenalties>\z@ % 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\tussenwit \tussenwit\zeropoint
\def\blankokleinmaat {\smallskipamount}
\def\blankomiddelmaat {\medskipamount}
\def\blankogrootmaat {\bigskipamount}
-\def\currentwitruimte {\!!zeropoint}
+\def\currentwitruimte {\zeropoint}
\def\stelwitruimteopnieuwin%
{\expanded{\stelwitruimtein[\currentwitruimte]}}
\newif\ifwitruimteflexibel \witruimteflexibeltrue
-%\def\dodostelwitruimtein[#1]%
-% {%\witruimteflexibeltrue
-% \processallactionsinset
-% [#1]
-% [\v!herstel=>,
-% \v!vast=>\witruimteflexibelfalse,
-% \v!flexibel=>\witruimteflexibeltrue,
-% \v!regel=>\tussenwit=\baselineskip,
-% \v!halveregel=>\tussenwit=.5\baselineskip,
-% \s!default=>\doifnot{\currentwitruimte}{\v!geen}
-% {\stelwitruimteopnieuwin},
-% \s!unknown=>\@EA\assigndimension\@EA{\commalistelement} % \@EA is nodig
-% {\tussenwit}
-% {\blankokleinmaat}{\blankomiddelmaat}{\blankogrootmaat}]% % te vangen
-% \edef\currentwitruimte%
-% {\ifdim\tussenwit=\!!zeropoint
-% \v!geen
-% \else
-% \ifgridsnapping\the\baselineskip\else\the\tussenwit\fi
-% \fi}%
-% \ifgridsnapping
-% \witruimteflexibelfalse
-% \tussenwit=1\tussenwit
-% \ifdim\tussenwit>\!!zeropoint
-% \tussenwit=\baselineskip
-% \fi
-% \else
-% \ifwitruimteflexibel \else \tussenwit=1\tussenwit \fi
-% \fi
-% \parskip=\tussenwit}
-%
-%\def\dostelwitruimtein[#1]%
-% {\expanded{\dodostelwitruimtein[#1]}}
-%
-%\def\stelwitruimtein%
-% {\dosingleempty\dostelwitruimtein}
-
\definecomplexorsimple\stelwitruimtein
\def\complexstelwitruimtein[#1]%
@@ -690,17 +937,15 @@
[\v!herstel=>,
\v!vast=>\witruimteflexibelfalse,
\v!flexibel=>\witruimteflexibeltrue,
- \v!regel=>\tussenwit=\baselineskip,
- \v!halveregel=>\tussenwit=.5\baselineskip,
- \s!default=>\doifnot{\currentwitruimte}{\v!geen}
- {\stelwitruimteopnieuwin},
+ \v!regel=>\tussenwit\baselineskip,
+ \v!halveregel=>\tussenwit.5\baselineskip,
+ \s!default=>\doifnot\currentwitruimte\v!geen\stelwitruimteopnieuwin,
\s!unknown=>\@EA\assigndimension\@EA{\commalistelement} % \@EA is nodig
- {\tussenwit}
- {\blankokleinmaat}{\blankomiddelmaat}{\blankogrootmaat}]} % te vangen
+ \tussenwit\blankokleinmaat\blankomiddelmaat\blankogrootmaat]} % te vangen
\def\dodostelwitruimtein%
{\edef\currentwitruimte%
- {\ifdim\tussenwit=\!!zeropoint
+ {\ifdim\tussenwit=\zeropoint
\v!geen
\else
\ifgridsnapping\the\baselineskip\else\the\tussenwit\fi
@@ -708,7 +953,7 @@
\ifgridsnapping
\witruimteflexibelfalse
\tussenwit=1\tussenwit
- \ifdim\tussenwit>\!!zeropoint
+ \ifdim\tussenwit>\zeropoint
\tussenwit=\baselineskip
\fi
\else
@@ -717,12 +962,11 @@
\parskip=\tussenwit}
\def\simplestelwitruimtein% == snelle \stelwitruimtein[\s!default]
- {\doifnot{\currentwitruimte}{\v!geen}
- {\stelwitruimteopnieuwin}%
+ {\doifnot\currentwitruimte\v!geen\stelwitruimteopnieuwin
\dodostelwitruimtein}
\def\geenwitruimte%
- {\ifdim\parskip>\!!zeropoint\relax
+ {\ifdim\parskip>\zeropoint\relax
\ifdim\lastskip=-\parskip
\else
\vskip-\parskip
@@ -752,7 +996,7 @@
\def\witruimte%
{\par
- \ifdim\parskip>\!!zeropoint\relax
+ \ifdim\parskip>\zeropoint\relax
%\ifdim\lastskip>\parskip \else
% \removelastskip interferes with blanko blokkeer en klein
\vskip\parskip
@@ -790,10 +1034,10 @@
\vskip\noparskipsignal % waarschijnlijk ook in
\fi % blanko blokkeer
\bgroup
- \doifelse{#1}{\v!blanko}
- {\opelkaarfalse}
- {\opelkaartrue}%
- \blanko[\v!blokkeer]%
+ \doifelse{#1}\v!blanko
+ \opelkaarfalse
+ \opelkaartrue
+ \blanko[\v!blokkeer]
\stelwitruimtein[\v!geen]
\fi}
@@ -855,9 +1099,6 @@
\stopbaselinecorrection}%
\vbox}
-\def\removeunwantedspaces % too dumb macro
- {\ifhmode\unskip\unskip\unskip\unskip\fi}
-
\def\toonstruts%
{\setteststrut}
@@ -948,17 +1189,17 @@
\vskip-\openlineheight}
\def\settopskip% the extra test is needed for the lbr family
- {\topskip=\systemtopskipfactor\globalbodyfontsize
+ {\topskip\systemtopskipfactor\globalbodyfontsize
\ifgridsnapping \else
\ifr@ggedbottom\!!plus5\globalbodyfontsize\fi
\fi
\relax % the skip
\ifdim\topskip<\strutheightfactor\openlineheight
- \topskip=\strutheightfactor\openlineheight\relax
+ \topskip\strutheightfactor\openlineheight\relax
\fi}
\def\setmaxdepth%
- {\maxdepth=\systemmaxdepthfactor\globalbodyfontsize}
+ {\maxdepth\systemmaxdepthfactor\globalbodyfontsize}
\def\normalbaselines%
{\baselineskip\normalbaselineskip
@@ -966,21 +1207,20 @@
\lineskiplimit\normallineskiplimit}
\def\setnormalbaselines%
- {\lineheight=\normallineheight
- \openlineheight=\spacingfactor\lineheight
-\openstrutheight=\strutheightfactor\openlineheight
-\openstrutdepth =\strutdepthfactor \openlineheight
- \normalbaselineskip=
- \openlineheight
+ {\lineheight\normallineheight
+ \openlineheight\spacingfactor\lineheight
+ \openstrutheight\strutheightfactor\openlineheight
+ \openstrutdepth \strutdepthfactor \openlineheight
+ \normalbaselineskip\openlineheight
\!!plus\baselinegluefactor\openlineheight
\!!minus\baselinegluefactor\openlineheight
\normallineskip\minimallinedistance\relax % \!!onepoint\relax
- \normallineskiplimit\!!zeropoint\relax
+ \normallineskiplimit\zeropoint\relax
\normalbaselines}
\def\setspacingfactor#1\to#2\by#3\\%
- {\strutdimen=#2pt\relax
- \strutdimen=#3\strutdimen
+ {\strutdimen#2pt\relax
+ \strutdimen#3\strutdimen
\edef#1{\withoutpt{\the\strutdimen}}}
\def\spacing#1%
@@ -990,16 +1230,16 @@
\else
\edef\spacingfactor{#1}%
\fi
- \setspacingfactor\systemtopskipfactor\to\topskipfactor\by#1\\%
+ \setspacingfactor\systemtopskipfactor \to\topskipfactor \by#1\\%
\setspacingfactor\systemmaxdepthfactor\to\maxdepthfactor\by#1\\%
\setnormalbaselines
\setstrut}
-\def\setstrutdimen#1#2#3% % een strut is n.m maal ex
- {\strutdimen=\normallineheight % wat niet per se \lineheight
- \strutdimen=#2\strutdimen % is omdat een strut lokaal
- \strutdimen=#3\strutdimen % kan afwijken van de globale
- \edef#1{\the\strutdimen}} % 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}} % strut
% plain definition:
%
@@ -1009,6 +1249,17 @@
%
% \def\strut{\relax\ifmmode\copy\else\unhcopy\fi\strutbox}
+\ifx\strutbox\undefined
+
+ \newbox\strutbox
+
+ \setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}
+
+ %\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
@@ -1032,7 +1283,7 @@
\dosetstrut}
\def\setcharstrut#1%
- {\setbox\strutbox=\hbox{#1}%
+ {\setbox\strutbox\hbox{#1}%
\edef\strutheight{\the\ht\strutbox}%
\edef\strutdepth {\the\dp\strutbox}%
\dosetstrut}
@@ -1043,9 +1294,9 @@
%D Centered looks nicer:
\def\dosetstrut%
- {\let\strut=\normalstrut
- \setbox\strutbox=\normalhbox
- {\normalhbox to \!!zeropoint
+ {\let\strut\normalstrut
+ \setbox\strutbox\normalhbox
+ {\normalhbox to \zeropoint
{% \hss % new, will be option
\vrule
\!!width \strutwidth
@@ -1080,26 +1331,30 @@
\setstrut}
\def\begstrut%
- {\relax\ifdim\ht\strutbox=\!!zeropoint\else
+ {%relax\ifdim\ht\strutbox=\zeropoint\else
+ \relax\ifcase\ht\strutbox\else
\strut
- \normalpenalty\!!tenthousand
- \normalhskip\!!zeropoint
+ \normalpenalty\@M % \!!tenthousand
+ \normalhskip\zeropoint
\ignorespaces
\fi}
\def\endstrut%
- {\relax\ifhmode\ifdim\ht\strutbox=\!!zeropoint\else
+ {%relax\ifhmode\ifdim\ht\strutbox=\zeropoint\else
+ \relax\ifhmode\ifcase\ht\strutbox\else
\removeunwantedspaces
- \normalpenalty\!!tenthousand
- \normalhskip\!!zeropoint
+ \normalpenalty\@M % \!!tenthousand
+ \normalhskip\zeropoint
\strut
\fi\fi}
+\newbox\nostrutbox \setbox\nostrutbox\normalhbox{\normalhbox{}}
+
\def\setnostrut%
- {\setbox\strutbox=\normalhbox{\normalhbox{}}%
- \let\strut=\empty
- \let\endstrut=\empty
- \let\begstrut=\empty}
+ {\setbox\strutbox\copy\nostrutbox
+ \let\strut\empty
+ \let\endstrut\empty
+ \let\begstrut\empty}
% unsave:
%
@@ -1125,7 +1380,7 @@
\let\pseudoendstrut\removeunwantedspaces
\def\resetteststrut%
- {\let\strutwidth=\zeropoint
+ {\let\strutwidth\!!zeropoint
\setstrut}
\ifx\setfontparameters\undefined
@@ -1141,19 +1396,29 @@
%D why|>| this assignment gives troubles in for instance the
%D visual debugger.
-\ifx\undefined\normaloffinterlineskip
- \let\normaloffinterlineskip=\offinterlineskip % knuth's original
-\fi
+%D The plain ones:
+
+\def\offinterlineskip
+ {\baselineskip-1000\p@
+ \lineskip\zeropoint
+ \lineskiplimit\maxdimen}
+
+\def\nointerlineskip
+ {\prevdepth-1000\p@}
+
+\let\normaloffinterlineskip=\offinterlineskip % knuth's original
+
+%D My own one:
\def\offinterlineskip%
- {\ifdim\baselineskip>\!!zeropoint
+ {\ifdim\baselineskip>\zeropoint
\edef\oninterlineskip%
- {\baselineskip=\the\baselineskip
- \lineskip=\the\lineskip
- \lineskiplimit=\the\lineskiplimit
- \noexpand\let\noexpand\offinterlineskip=\noexpand\normaloffinterlineskip}%
+ {\baselineskip\the\baselineskip
+ \lineskip\the\lineskip
+ \lineskiplimit\the\lineskiplimit
+ \let\noexpand\offinterlineskip\noexpand\normaloffinterlineskip}%
\else
- \let\oninterlineskip=\setnormalbaselines
+ \let\oninterlineskip\setnormalbaselines
\fi
\normaloffinterlineskip}
@@ -1174,11 +1439,8 @@
% Bovendien definieren we enkele extra \fill's:
-\def\hfilll%
- {\hskip\!!zeropoint\!!plus1filll\relax}
-
-\def\vfilll%
- {\vskip\!!zeropoint\!!plus1filll\relax}
+\def\hfilll{\hskip\zeropoint\!!plus1filll\relax}
+\def\vfilll{\vskip\zeropoint\!!plus1filll\relax}
% De onderstaande hulpmacro's moeten nog eens instelbaar worden
% gemaakt.
@@ -1200,30 +1462,30 @@
\def\dosinglesmaller#1%
{\processaction
[#1]
- [ \v!links=>\global\advance\linkssmaller by \@@sllinks,
- \v!midden=>\global\advance\middensmaller by \@@slmidden,
- \v!rechts=>\global\advance\rechtssmaller by \@@slrechts,
- \s!unknown=>\global\advance\middensmaller by \commalistelement]}
+ [ \v!links=>\global\advance\linkssmaller \@@sllinks,
+ \v!midden=>\global\advance\middensmaller \@@slmidden,
+ \v!rechts=>\global\advance\rechtssmaller \@@slrechts,
+ \s!unknown=>\global\advance\middensmaller \commalistelement]}
\def\dosmaller[#1]%
{\processaction
[#1]
- [ \v!links=>\global\advance\linkssmaller by \@@sllinks,
- \v!midden=>\global\advance\middensmaller by \@@slmidden,
- \v!rechts=>\global\advance\rechtssmaller by \@@slrechts,
+ [ \v!links=>\global\advance\linkssmaller \@@sllinks,
+ \v!midden=>\global\advance\middensmaller \@@slmidden,
+ \v!rechts=>\global\advance\rechtssmaller \@@slrechts,
\s!unknown=>{\herhaalmetcommando[#1]\dosinglesmaller}]}
\def\complexstartsmaller[#1]%
{\par
\bgroup
- \global\linkssmaller=\!!zeropoint
- \global\rechtssmaller=\!!zeropoint
- \global\middensmaller=\!!zeropoint
+ \global\linkssmaller \zeropoint
+ \global\rechtssmaller\zeropoint
+ \global\middensmaller\zeropoint
\processcommalistwithparameters[#1]\dosmaller
- \advance\leftskip by \linkssmaller
- \advance\rightskip by \rechtssmaller
- \advance\leftskip by \middensmaller
- \advance\rightskip by \middensmaller}
+ \advance\leftskip \linkssmaller
+ \advance\rightskip \rechtssmaller
+ \advance\leftskip \middensmaller
+ \advance\rightskip \middensmaller}
\def\simplestartsmaller%
{\startsmaller[\v!midden]}
@@ -1261,12 +1523,12 @@
\def\dosetraggedvbox#1%
{\processaction
[#1]
- [ \v!links=>\def\raggedbox{\lbox},
- \v!rechts=>\def\raggedbox{\rbox},
- \v!midden=>\def\raggedbox{\cbox},
+ [ \v!links=>\let\raggedbox\lbox,
+ \v!rechts=>\let\raggedbox\rbox,
+ \v!midden=>\let\raggedbox\cbox,
\v!nee=>\def\raggedbox{\vbox\bgroup\raggedright\let\next=},
- \s!default=>\def\raggedbox{\vbox},
- \s!unknown=>\def\raggedbox{\vbox}]}
+ \s!default=>\let\raggedbox\vbox,
+ \s!unknown=>\let\raggedbox\vbox]}
\def\dosetraggedhbox#1%
{\processaction
@@ -1292,40 +1554,100 @@
\def\dosetraggedcommand#1%
{\expanded{\dodosetraggedcommand{#1}}}
-\def\dodosetraggedcommand#1%
- {\doifinsetelse{\v!ruim} {#1}{\!!doneatrue}{\!!doneafalse}%
- \doifinsetelse{\v!breed}{#1}{\!!donebtrue}{\!!donebfalse}%
- \let\raggedcommand\relax
+% \def\dodosetraggedcommand#1%
+% {\doifinsetelse{\v!ruim} {#1}{\!!doneatrue}{\!!doneafalse}%
+% \doifinsetelse{\v!breed}{#1}{\!!donebtrue}{\!!donebfalse}%
+% \let\raggedcommand\relax
+% \let\raggedtopcommand\empty
+% \let\raggedbottomcommand\empty
+% \!!donectrue
+% \ExpandFirstAfter\processallactionsinset
+% [#1]
+% [ \v!links=>\if!!donea \def\raggedcommand{\veryraggedleft}%
+% \else \def\raggedcommand{\raggedleft}%
+% \fi
+% \!!donecfalse, % {\v!links,\v!midden}
+% \v!rechts=>\if!!donea \def\raggedcommand{\veryraggedright}%
+% \else \def\raggedcommand{\raggedright}%
+% \fi
+% \!!donecfalse, % {\v!rechts,\v!midden}
+% \v!midden=>\if!!donec
+% \if!!doneb \def\raggedcommand{\raggedwidecenter}%
+% \else\if!!donea \def\raggedcommand{\veryraggedcenter}%
+% \else \def\raggedcommand{\raggedcenter}%
+% \fi\fi
+% \!!donecfalse % {\v!midden,\v!midden}
+% \else
+% \let\raggedbottomcommand\vfilll % bonus, pretty strong
+% \let\raggedtopcommand \vfilll % used with \framed for
+% \fi, % instance in tables
+% \v!hoog=>\let\raggedbottomcommand\vfilll, % and since we lack a
+% \v!laag=>\let\raggedtopcommand \vfilll, % proper keyword, but
+% \v!laho=>\let\raggedbottomcommand\vfilll % we do support the
+% \let\raggedtopcommand \vfilll, % ugly laho (lohi)
+% \v!nee=>\def\raggedcommand{\raggedright},
+% \v!ja=>\let\raggedcommand\notragged, % was \relax
+% \v!normaal=>\let\raggedcommand\notragged]} % was \relax
+%
+% much faster and important since TABLE uses them a lot:
+
+\def\dodosetraggedcommand#1%
+ {\let\raggedcommand\relax
\let\raggedtopcommand\empty
\let\raggedbottomcommand\empty
- \!!donectrue
- \ExpandFirstAfter\processallactionsinset
- [#1]
- [ \v!links=>\if!!donea \def\raggedcommand{\veryraggedleft}%
- \else \def\raggedcommand{\raggedleft}%
- \fi
- \!!donecfalse, % {\v!links,\v!midden}
- \v!rechts=>\if!!donea \def\raggedcommand{\veryraggedright}%
- \else \def\raggedcommand{\raggedright}%
- \fi
- \!!donecfalse, % {\v!rechts,\v!midden}
- \v!midden=>\if!!donec
- \if!!doneb \def\raggedcommand{\raggedwidecenter}%
- \else\if!!donea \def\raggedcommand{\veryraggedcenter}%
- \else \def\raggedcommand{\raggedcenter}%
- \fi\fi
- \!!donecfalse % {\v!midden,\v!midden}
- \else
- \let\raggedbottomcommand\vfilll % bonus, pretty strong
- \let\raggedtopcommand \vfilll % used with \framed for
- \fi, % instance in tables
- \v!hoog=>\let\raggedbottomcommand\vfilll, % and since we lack a
- \v!laag=>\let\raggedtopcommand \vfilll, % proper keyword, but
- \v!laho=>\let\raggedbottomcommand\vfilll % we do support the
- \let\raggedtopcommand \vfilll, % ugly laho (lohi)
- \v!nee=>\def\raggedcommand{\raggedright},
- \v!ja=>\let\raggedcommand\notragged, % was \relax
- \v!normaal=>\let\raggedcommand\notragged]} % was \relax
+ \doifsomething{#1}
+ {\doifinsetelse{\v!ruim} {#1}\!!doneatrue\!!doneafalse
+ \doifinsetelse{\v!breed}{#1}\!!donebtrue\!!donebfalse
+ \!!donectrue
+ \rawprocesscommalist[#1]\dododosetraggedcommand}}
+
+\def\dododosetraggedcommand#1%
+ {\executeifdefined{\@@ragged@@command\string#1}\relax}
+
+\def\@@ragged@@command{@@raggedcommand}
+
+\setvalue{\@@ragged@@command\v!links}%
+ {\if!!donea \def\raggedcommand{\veryraggedleft}%
+ \else \def\raggedcommand{\raggedleft}%
+ \fi
+ \!!donecfalse}
+
+\setvalue{\@@ragged@@command\v!rechts}%
+ {\if!!donea \def\raggedcommand{\veryraggedright}%
+ \else \def\raggedcommand{\raggedright}%
+ \fi
+ \!!donecfalse}
+
+\setvalue{\@@ragged@@command\v!midden}%
+ {\if!!donec
+ \if!!doneb \def\raggedcommand{\raggedwidecenter}%
+ \else\if!!donea \def\raggedcommand{\veryraggedcenter}%
+ \else \def\raggedcommand{\raggedcenter}%
+ \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!hoog}%
+ {\let\raggedbottomcommand\vfilll} % and since we lack a
+
+\setvalue{\@@ragged@@command\v!laag}%
+ {\let\raggedtopcommand\vfilll} % proper keyword, but
+
+\setvalue{\@@ragged@@command\v!laho}%
+ {\let\raggedbottomcommand\vfilll % we do support the
+ \let\raggedtopcommand\vfilll} % ugly laho (lohi)
+
+\setvalue{\@@ragged@@command\v!nee}%
+ {\def\raggedcommand{\raggedright}}
+
+\setvalue{\@@ragged@@command\v!ja}%
+ {\let\raggedcommand\notragged}
+
+\setvalue{\@@ragged@@command\v!normaal}%
+ {\let\raggedcommand\notragged}
% Nodig i.v.m. inspringen eerste alineas
@@ -1350,16 +1672,15 @@
% een \penalty v¢¢r witruimte worden geplaatst.
\def\removelastskip% a redefinition of plain
- {\ifvmode\ifdim\lastskip=\z@\else\vskip-\lastskip\fi\fi}
+ {\ifvmode\ifdim\lastskip=\zeropoint\else\vskip-\lastskip\fi\fi}
\def\dosomebreak#1%
- {\skip0=\lastskip
+ {\scratchskip\lastskip
\removelastskip
%\type{#1}%
#1\relax
- \ifdim\skip0=\!!zeropoint
- \else
- \vskip\skip0
+ \ifdim\scratchskip=\zeropoint \else
+ \vskip\scratchskip
\fi}
% beter, vooral in \vbox; nog in \pagina toepassen s!
@@ -1369,13 +1690,13 @@
\def\dosomebreak#1%
{\doifoutervmode
- {\skip0=\lastskip
+ {\scratchskip\lastskip
\removelastskip
%\leavevmode\type{#1}%
#1\relax
- \ifdim\skip0=\!!zeropoint % else interference with footnotes
+ \ifdim\scratchskip=\zeropoint % else interference with footnotes
\else
- \vskip\skip0
+ \vskip\scratchskip
\fi}}
% Idem:
@@ -1384,10 +1705,10 @@
%\def\noindentation% vervallen
% {\EveryPar
-% {\ifdim\parindent=\!!zeropoint
+% {\ifdim\parindent=\zeropoint
% \else
% \bgroup
-% \setbox0=\lastbox
+% \setbox\scratchbox\lastbox
% \egroup
% \fi
% \EveryPar{}}}
@@ -1397,11 +1718,8 @@
\let\checkindentation=\relax
\def\donoindentation%
- {\ifdim\parindent=\!!zeropoint
- \else
- \bgroup
- \setbox0=\lastbox
- \egroup
+ {\ifdim\parindent=\zeropoint \else
+ \bgroup \setbox\scratchbox\lastbox \egroup
\fi}
\def\noindentation% made global
@@ -1419,7 +1737,7 @@
\fi}
\def\indentation%
- {\ifvmode \ifdim\parindent=\!!zeropoint \else
+ {\ifvmode \ifdim\parindent=\zeropoint \else
% was : \hskip\parindent
% can be: \indent
% but we test:
@@ -1507,29 +1825,6 @@
%D anything, even a raw fontswitch. No a real improvement
%D (some 5 seconds on 260 seconds for the maps bibliography).
-\def\@@dodoconvertfont#1{\csname\@letter@ #1\endcsname}
-\def\@@donoconvertfont#1{\csname\@noletter@#1\endcsname}
-
-\unexpanded\def\dodoconvertfont#1%#2%
- {\doifdefinedelse{\@letter@#1}
- {\doifelsenothing{#1}
- {\let\next\gobbleoneargument}
- {\let\next\@@dodoconvertfont}}
- {\doifdefinedelse{#1}
- {\let\next\getvalue}
- {\let\next\firstofoneargument}}%
- \next{#1}}%{#2}}
-
-\let\doconvertfont=\dodoconvertfont
-
-\def\noconvertfont#1%#2%
- {\doifdefinedelse{\@noletter@#1}
- {\doifelsenothing{#1}
- {\let\next\gobbleoneargument}
- {\let\next\@@donoconvertfont}}
- {\let\next\firstofoneargument}%
- \next{#1}}%{#2}}
-
\beginTEX
\unexpanded\def\dostartattributes#1#2#3%
@@ -1573,6 +1868,69 @@
\unexpanded\def\doattributes#1#2#3#4%
{\dostartattributes{#1}{#2}{#3}{#4}\dostopattributes}
+% An even faster \ETEX\ version:
+
+\beginETEX
+
+% \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\endgroup
+% \fi
+% \ifcsname#1#2\endcsname
+% \@EAEAEA\doconvertfont\@EA\@EA\csname#1#2\endcsname
+% \fi}
+%
+% \unexpanded\def\@@dostopattributes%
+% {\stopcolor
+% \endgroup}
+
+\unexpanded\def\dostartattributes#1#2#3%
+ {\begingroup % geen \bgroup, anders in mathmode lege \hbox
+ \ifincolor
+ \ifcsname#1#3\endcsname
+ \let\dostopattributes\@@dostopattributes
+ \doglobalstartcolor[\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
+ \fi}
+
+\unexpanded\def\@@dostopattributes%
+ {\doglobalstopcolor
+ \endgroup}
+
+%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
+ \doglobalstartcolor[\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
+ \fi
+ {#4}%
+ \dostopattributes}
+
+\endETEX
+
% Kan vaker worden toegepast en moet bovendien sneller!
\newskip\leftskipadaption
@@ -1655,14 +2013,37 @@
{\noexpand\realfolio}}}%
\writeparref}
-\def\setraggedparagraphmode#1#2%
- {\ifinner
+% \def\setraggedparagraphmode#1#2%
+% {\ifinner
+% \ifdubbelzijdig
+% \gettwopassdata{\s!paragraph}%
+% \iftwopassdatafound
+% \ifodd\twopassdata#1\else#2\fi
+% \else
+% \ifodd\realfolio#1\else#2\fi
+% \fi
+% \doparagraphreference
+% \else
+% #2\relax
+% \fi
+% \else
+% #2\relax
+% \fi}
+
+\def\setraggedparagraphmode#1#2% combineren met \ifrightpage
+ {\ifinpagebody
+ \ifdubbelzijdig
+ \ifodd\realpageno\relax#1\else#2\fi
+ \else
+ #2\relax
+ \fi
+ \else\ifinner
\ifdubbelzijdig
\gettwopassdata{\s!paragraph}%
\iftwopassdatafound
- \ifodd\twopassdata#1\else#2\fi
+ \ifodd\twopassdata\relax#1\else#2\fi
\else
- \ifodd\realfolio#1\else#2\fi
+ \ifodd\realpageno\relax#1\else#2\fi
\fi
\doparagraphreference
\else
@@ -1670,10 +2051,62 @@
\fi
\else
#2\relax
- \fi}
+ \fi\fi}
% \let\doifrightpageelse\setraggedparagraphmode
+% in both (otr) modules !
+
+% \def\doifrightpageelse#1#2%
+% {\ifdubbelzijdig
+% \gettwopassdata\s!paragraph
+% \iftwopassdatafound
+% \ifodd\twopassdata#1\else#2\fi
+% \else
+% \ifodd\realfolio#1\else#2\fi
+% \fi
+% \else
+% #1% was #2
+% \fi}
+%
+% better :
+
+\def\doifrightpageelse % watch out: other default ! ! !
+ {\ifinpagebody
+ \ifdubbelzijdig
+ \ifodd\twopassdata\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \else
+ \twopassdatafoundtrue
+ \fi
+ \else
+ \ifdubbelzijdig
+ \gettwopassdata\s!paragraph
+ \iftwopassdatafound
+ \ifodd\twopassdata\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \else
+ \ifodd\realpageno\relax
+ \twopassdatafoundtrue \else \twopassdatafoundfalse
+ \fi
+ \fi
+ \else
+ \twopassdatafoundtrue
+ \fi
+ \fi
+ \iftwopassdatafound
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
+
+\def\signalrightpage
+ {\ifdubbelzijdig
+ \doparagraphreference
+ \fi}
+
% De onderstaande macro's zijn opgenomen in Plain TeX.
%
% \def\raggedright%
@@ -1703,6 +2136,10 @@
\newif\ifr@ggedbottom
\newif\ifb@selinebottom
+\def\normalbottom%
+ {% \topskip 10pt
+ \r@ggedbottomfalse}
+
\def\raggedbottom%
{\chardef\bottomraggedness=0
\n@rmalbottomfalse
@@ -1910,12 +2347,11 @@
%\def\regelmidden#1%
% {\noindent\centerline{{\strut#1}}}
-\def\doalignline#1#2%
- {\dowithnextbox
- {\noindent\hbox to \hsize
- {\strut#1\unhbox\nextbox#2}}
- \hbox}
-
+% \def\doalignline#1#2%
+% {\dowithnextbox
+% {\noindent\hbox to \hsize{\strut#1\unhbox\nextbox#2}}
+% \hbox}
+%
% also supporting \\
%
% \def\doalignline#1#2%
@@ -1927,10 +2363,9 @@
\def\doalignline#1#2%
{\bgroup
- \def\\{\egroup\par\doalignline#1#2\bgroup}%
+ \def\\{\egroup\par\doalignline{#1}{#2}\bgroup}%
\dowithnextbox
- {\noindent\hbox to \hsize
- {\strut#1\unhbox\nextbox#2}\egroup}
+ {\noindent\hbox to \hsize{\strut#1\unhbox\nextbox#2}\egroup}
\hbox}
% directe commando's
@@ -1950,6 +2385,23 @@
\def\doregelplaats#1%
{\getvalue{regel#1}}
+%D Experimental:
+
+\def\doxalignline#1#2%
+ {\bgroup
+ \def\\{\egroup\par\doxalignline{#1}{#2}\bgroup}% inefficient
+ \dowithnextbox
+ {\noindent\hbox to \hsize
+ {\strut\signalrightpage
+ \doifrightpageelse{#1\unhbox\nextbox#2}{#2\unhbox\nextbox#1}}%
+ \egroup}
+ \hbox}
+
+\setvalue{regel\v!binnen}{\doxalignline\relax\hss}
+\setvalue{regel\v!buiten}{\doxalignline\hss\relax}
+
+%D ...
+
\def\dosteltolerantiein[#1]%
{\doifinsetelse{\v!vertikaal}{#1}%
{\ExpandFirstAfter\processallactionsinset
@@ -2038,6 +2490,36 @@
%D In \CONTEXT\ however we save some processing time by putting
%D an extra \type{\hbox} around the \type{\strutbox}.
+\def\definehspace
+ {\dodoubleargument\dodefinehspace}
+
+\def\dodefinehspace[#1][#2]%
+ {\setvalue{\??hs#1}{#2}}
+
+\unexpanded\def\hspace
+ {\dosingleempty\dohspace}
+
+\def\dohspace[#1]%
+ {\ifhmode
+ \removeunwantedspaces
+ \hskip
+ \iffirstargument
+ \executeifdefined{\??hs#1}{#1}%
+ \else
+ \getvalue{\??hs\s!default}%
+ \fi
+ \expandafter\ignorespaces
+ \fi}
+
+\def\emspaceamount{\fontdimen6\font}
+\def\spaceamount {\fontdimen2\font}
+
+\definehspace [\v!klein] [.25\emspaceamount]
+\definehspace [\v!middel] [.5\emspaceamount]
+\definehspace [\v!groot] [1\emspaceamount]
+\definehspace [\v!normaal] [1\spaceamount]
+\definehspace [\v!default] [\v!groot]
+
\stelwitruimtein
[\v!geen]
@@ -2068,7 +2550,8 @@
\c!boven=1.0,
\c!onder=0.4,
\c!afstand=1pt,
- \c!regel=2.8ex]
+ \c!regel=2.8ex,
+ \c!rek=0]
\stelsmallerin
[\c!links=1.5em,
diff --git a/tex/context/base/core-syn.tex b/tex/context/base/core-syn.tex
index 190c04b69..a9153089a 100644
--- a/tex/context/base/core-syn.tex
+++ b/tex/context/base/core-syn.tex
@@ -15,6 +15,8 @@
\unprotect
+% \checkdefined kan hierheen
+
% Formaat tex-utility-input-file <jobname.tui>:
%
% synonym entry {tag} {pure} {text} {synonym}
@@ -98,7 +100,7 @@
%\def\getsynonymmeaning#1#2#3%
% {\doifdefinedelse{#2#3}
% {{\synonymmeaningtrue\getvalue{#2#3}}}
-% {{\showmessage{\m!systems}{18}{#1,#3}}}
+% {{\showmessage{\m!systems}{18}{#1,#3}}}}
\def\getsynonymmeaning#1#2#3%
{\bgroup
@@ -167,25 +169,7 @@
\fi}
\def\dodefinieersynoniemen[#1][#2][#3][#4]%
- {\stelsynoniemenin
- [#1]
- [\c!synoniemletter=,
- \c!tekstletter=,
- \c!status=\v!start,
- \c!criterium=,
- \c!plaats=\v!links,
- \c!breedte=5em,
- \c!afstand=0pt,
- \c!monster=,
- \c!hang=,
- \c!uitlijnen=,
- \c!voor=,
- \c!tussen=,
- \c!na=,
- \c!springvolgendein=\v!nee]%
- \presetheadtext
- [#2=\Word{#2}]%
- \setvalue{\e!stel#2\e!in}%
+ {\setvalue{\e!stel#2\e!in}%
{\dodoubleargument\getparameters[\??sm#1]}%
\iffourthargument
\unexpanded\def#4##1%
@@ -204,6 +188,25 @@
\setvalue{#1}%
{\dotripleempty\docomplexsynonym[][#1]}%
\fi
+ \dostelsynoniemenin
+ [#1]%
+ [\c!synoniemletter=,
+ \c!tekstletter=,
+ \c!status=\v!start,
+ \c!criterium=,
+ \c!plaats=\v!links,
+ \c!breedte=5em,
+ \c!afstand=0pt,
+ \c!monster=,
+ \c!hang=,
+ \c!uitlijnen=,
+ \c!voor=,
+ \c!tussen=,
+ \c!na=,
+ \c!springvolgendein=\v!nee,
+ \c!expansie=]%
+ \presetheadtext % changes the \if...argument
+ [#2=\Word{#2}]%
\setvalue{\s!set#1}%
{\dosetsynonym{#1}}%
\setvalue{\s!reset#1}%
@@ -336,7 +339,8 @@
\c!criterium=,
\c!letter=,
\c!voor=,
- \c!na=\endgraf]%
+ \c!na=\endgraf,
+ \c!expansie=]%
\presetheadtext[#2=\Word{#2}]%
\setvalue{\e!stel#2\e!in}[##1]% vervalt tzt, soort oo-mode
{\getparameters[\??so#1][##1]}%
diff --git a/tex/context/base/core-sys.tex b/tex/context/base/core-sys.tex
index bcc3f6173..942f0c310 100644
--- a/tex/context/base/core-sys.tex
+++ b/tex/context/base/core-sys.tex
@@ -15,11 +15,25 @@
\unprotect
+\def\outputfilename{\@@svfile}
+\def\inputfilename {\@@svinputfile}
+
+\def\splitjobfilename
+ {\edef\ascii{\inputfilename}\convertcommand\ascii\to\ascii
+ %\beforesplitstring\ascii\at.\to\jobfilename
+ %\aftersplitstring \ascii\at.\to\jobfilesuffix
+ \splitstring\ascii\at.\to\jobfilename\and\jobfilesuffix
+ \doifnothing\jobfilename {\let\jobfilename \jobname}%
+ \doifnothing\jobfilesuffix{\let\jobfilesuffix\c!tex}}
+
+\appendtoks \splitjobfilename \to \everyjob
+
\def\dosetupsystem[#1]%
{\getparameters[\??sv][#1]%
\setuprandomize[\@@svwillekeur]%
\beforesplitstring\@@svresolutie\at dpi\to\@@svresolutie
- \let\outputresolution=\@@svresolutie}
+ \let\outputresolution\@@svresolutie
+ \splitjobfilename}
\def\setupsystem%
{\dosingleargument\dosetupsystem}
@@ -39,9 +53,6 @@
\nextrandom
\egroup}}
-\def\outputfilename{\@@svfile}
-\def\inputfilename {\@@svinputfile}
-
\setupsystem
[\c!gebied=,
\c!resolutie=600dpi,
@@ -79,7 +90,7 @@
\definecomplexorsimple\start
\definecomplexorsimple\stop
-\def\dodefinieerstartstop[#1][#2]%
+\def\dododefinestartstop[#1][#2]%
{\getparameters
[\??be#1]
[\c!voor=,
@@ -87,8 +98,6 @@
\c!commandos=,
\c!letter=,
#2]%
-% \setvalue{\e!stel#1\e!in}[##1]%
-% {\dodoubleargument\getparameters[\??be##1]}%
\unexpanded\setvalue{#1}%
{\groupedcommand
{\getvalue{\??be#1\c!commandos}%
@@ -104,11 +113,19 @@
\egroup
\getvalue{\??be#1\c!na}}}
-\def\definieerstartstop%
- {\dodoubleargument\dodefinieerstartstop}
+\def\dodefinestartstop[#1][#2]%
+ {\def\docommando##1{\dododefinestartstop[##1][#2]}%
+ \processcommalist[#1]\docommando}
+
+\def\definestartstop
+ {\dodoubleargument\dodefinestartstop}
-\def\stelstartstopin[#1]%
- {\dodoubleargument\getparameters[\??be#1]}
+\def\dosetupstartstop[#1][#2]%
+ {\def\docommando##1{\getparameters[\??be##1][#2]}%
+ \processcommalist[#1]\docommando}
+
+\def\setupstartstop
+ {\dodoubleargument\dosetupstartstop}
% \docommando kan niet worden gebruikt omdat deze macro
% soms lokaal wordt gebruikt
@@ -161,25 +178,63 @@
\definecomplexorsimpleempty\definieer
-\unexpanded\def\naam#1%
+\unexpanded\def\naam#1% brrr
{\getvalue{#1}}
\def\gebruikcommandos#1%
{\bgroup
- \def\docommando##1%
- {\setbox0=\hbox{\getvalue{\string##1}##1}}%
+ \def\docommando##1{\setbox0=\hbox{\getvalue{\string##1}##1}}%
\processcommalist[#1]\docommando
\egroup}
-\def\convertexpanded#1#2#3% watch the double \v!ja expansion !
- {\ExpandFirstAfter\processaction
- [\getvalue{#1\c!expansie}]
- [ \v!ja=>{{\honorunexpanded\xdef\@@globalexpanded{#2}%
- \xdef\@@globalexpanded{\@@globalexpanded}}%
- \dodoglobal\convertcommand\@@globalexpanded\to#3},
- \v!commando=>{\dodoglobal\convertcommand #2\to#3},
- \s!default=>{\dodoglobal\convertargument#2\to#3},
- \s!unknown=>{\dodoglobal\convertargument#2\to#3}]}
+\newif\ifforcefileexpansion % handy for document level overload
+
+% \def\convertexpanded#1#2#3% watch the double \v!ja expansion !
+% {\ExpandFirstAfter\processaction
+% [\ifforcefileexpansion\v!ja\else\getvalue{#1\c!expansie}\fi]
+% [ \v!ja=>{{\honorunexpanded
+% \dontexpandencoding % new
+% \xdef\@@globalexpanded{#2}%
+% \xdef\@@globalexpanded{\@@globalexpanded}}%
+% \convertcommand\@@globalexpanded\to#3},
+% \v!commando=>{\convertcommand #2\to#3},
+% \s!default=>{\convertargument#2\to#3},
+% \s!unknown=>{\convertargument#2\to#3}]}
+
+%D The next implementation is about 4 times as fast on an
+%D string of average length. Since this feature is used in
+%D XML processing, it made sense to support this faster
+%D alternative.
+
+\def\installexpander#1{\setvalue{\s!do\c!expansie#1}}
+
+\long\def\convertexpanded#1#2#3% hm, first we need to make sure
+ {\csname % that we assign all exp a value
+ \s!do\c!expansie
+ \ifforcefileexpansion
+ \v!ja
+ \else\@EA\ifx\csname\s!do\c!expansie\csname#1\c!expansie\endcsname\endcsname\relax
+ \s!default
+ \else
+ \csname#1\c!expansie\endcsname
+ \fi\fi
+ \endcsname#2\to#3}
+
+\installexpander\v!ja {\convertmeaning }
+\installexpander\v!ja {\convertmeaning }
+\installexpander\v!commando{\convertcommand }
+\installexpander\s!default {\convertargument}
+\installexpander\empty {\convertargument}
+\installexpander\v!nee {\convertargument}
+
+\def\convertmeaning#1\to % watch the double expansion !
+ {\bgroup
+ \honorunexpanded
+ \dontexpandencoding % new
+ \xdef\@@globalexpanded{#1}%
+ \xdef\@@globalexpanded{\@@globalexpanded}%
+ \egroup
+ \convertcommand\@@globalexpanded\to}
% \setvalue{statevalue\v!stop }{0}
% \setvalue{statevalue\v!start }{1}
diff --git a/tex/context/base/core-tab.tex b/tex/context/base/core-tab.tex
index ab17fbec0..383f9d8d5 100644
--- a/tex/context/base/core-tab.tex
+++ b/tex/context/base/core-tab.tex
@@ -96,7 +96,7 @@
%D options. After implementing this feature, I also added
%D warnings, error recovery and automatic spacing.
-\newif\iftracetables
+\newif\iftracetables
%D We show this feature in an eample that also shows some of
%D the basic table typesetting commands.
@@ -460,20 +460,6 @@
%D \ReadFormatKeys}
%D \stoptypen
-% \def\BeginTableParBox#1%
-% {\vtop\bgroup
-% \hsize=#1
-% \normalbaselines
-% \let~=\!ttTie
-% \let\-=\!ttDH
-% \the\EveryTableParBox
-% \begstrut} % added
-%
-% \def\EndTableParBox%
-% {\endstrut % added
-% \MakeStrut{0pt}{\StrutDepthFactor\StrutUnit}%
-% \egroup}
-
\newdimen\TABLEparheight
\def\BeginTableParBox#1%
@@ -485,17 +471,74 @@
\blanko[\v!blokkeer]% % added
\the\EveryTableParBox}
-\def\EndTableParBox%
- {\removelastskip % added
- %\MakeStrut{0pt}{\StrutDepthFactor\StrutUnit} % removed
- \par \ifnum\prevgraf>0 \strut \vskip-\lineheight \fi % added
- \egroup % finishes the \vtop begun by \BeginTableParbox
- \getboxheight\scratchdimen\of\box\scratchbox\relax % added
- \ifdim\scratchdimen>\TABLEparheight % added
- \global\TABLEparheight=\scratchdimen % added
- \fi % added
+% \def\EndTableParBox%
+% {\removelastskip % added
+% %\MakeStrut{0pt}{\StrutDepthFactor\StrutUnit} % removed
+% \par
+% \ifnum\prevgraf>0
+% \strut \geenwitruimte \vskip-\lineheight % added
+% \fi
+% \egroup % finishes the \vtop begun by \BeginTableParbox
+% \getboxheight\scratchdimen\of\box\scratchbox\relax % added
+% \ifdim\scratchdimen>\TABLEparheight % added
+% \global\TABLEparheight=\scratchdimen % added
+% \fi % added
+% \box\scratchbox}
+
+\def\EndTableParBox
+ {\removelastskip % itemize or so
+ \par
+ \ifnum\prevgraf>0 % we want at least
+ \strut \geenwitruimte \vskip-\lineheight % one line of text
+ \egroup
+ \ifdim\dp\scratchbox>\lineheight % see (*) for an
+ \getnoflines{\dp\scratchbox}% % example of where
+ \dp\scratchbox=\zeropoint % saving can go
+ \vtop to \noflines\lineheight{\box\scratchbox}% terrible wrong
+ \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}
+% (*) 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})
@@ -987,7 +1030,7 @@
%D The third stage involves a lot of (re)sets, which we will
%D explain later.
-\let \everytable \EveryTable % convenient and more in tune
+\let \everytable \EveryTable % convenient and more in tune
\def\thirdstagestartTABLE#1%
{\global\setTABLEactiontrue
@@ -1011,6 +1054,7 @@
\defineTABLEshorthands
\defineTABLEbackgrounds
\defineTABLEendings
+ \forgetall % added
\doifsomething{#1}
{\def\TABLEformat{#1}%
\expandafter\getTABLEnofcolumns\expandafter{\TABLEformat}%
@@ -1238,7 +1282,8 @@
%D as efficient as possible.
\def\complexorsimpleTable#1#2%
- {\getvalue{\if[\noexpand#2\s!complex\else\s!simple\fi\c!Table#1}#2}
+% {\getvalue{\if[\noexpand#2\s!complex\else\s!simple\fi\c!Table#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.
@@ -2030,7 +2075,7 @@
{\doanalyzeTABLEcr[#1,,]}
\def\doanalyzeTABLEcr[#1,#2,#3]%
- {\doifnumberelse{#1x} % Is the x still needed here?
+ {\doifnumberelse{#1x} % Is the x still needed here?
{\dodoanalyzeTABLEcr[#1,#2,#3]}
{\dodoanalyzeTABLEcr[1,#1,#2]}}
diff --git a/tex/context/base/core-tbl.tex b/tex/context/base/core-tbl.tex
index a2b458d94..2baf2bcda 100644
--- a/tex/context/base/core-tbl.tex
+++ b/tex/context/base/core-tbl.tex
@@ -13,8 +13,12 @@
\writestatus{loading}{Context Core Macros / Tabulation}
+% \processbetween gebruiken in head/tail macros
+
\unprotect
+% watch out, cells expand pretty late on a per row basis
+
% |p2|p3| 2:3
% spanning
@@ -116,9 +120,6 @@
% \NC 500 \NC \NC 20 \NC \NC 100 \NC \NR
% \stoptabulate
-
-
-
\newtoks \tabulatepreamble
\newtoks \tabulatebefore
\newtoks \tabulateafter
@@ -128,8 +129,9 @@
\newtoks \tabulatesettings
\newtoks \tabulatedummy
-\newcounter \nofautotabulate
-\newcounter \tabulatecolumns
+\newcount \nofautotabulate % \newcounter \nofautotabulate
+\newcount \tabulatecolumns % \newcounter \tabulatecolumns
+
\newcounter \tabulateminplines
\newcounter \tabulatemaxplines
@@ -213,11 +215,11 @@
% 1 = RC column raw RQ equal column raw
% 2 = HC column hook HQ equal column hook
\@EA\appendtoks \@EA&\@EA\hskip\pretabskip##&\to\!!toksa
- \@EA\appendtoks\@EA\xdef\@EA\tabulatecolumn\@EA{\tabulatecolumns}\to\!!toksa
-\appendtoks \checktabulatehook\to\!!toksa
+ %\@EA\appendtoks\@EA\xdef\@EA\tabulatecolumn\@EA{\tabulatecolumns}\to\!!toksa
+ \@EA\appendtoks\@EA\xdef\@EA\tabulatecolumn\@EA{\the\tabulatecolumns}\to\!!toksa
+ \appendtoks \checktabulatehook\to\!!toksa
\@EA\appendtoks \preamblebox\to\!!toksa
\appendtoks \bgroup\bbskip\bgroup#1\to\!!toksa
-% \appendtoks \checktabulatehook\to\!!toksa
\appendtoks\ifnum\tabulatetype=1 \else \to\!!toksa
\@EA\appendtoks \the\tabulatebmath\to\!!toksa
\@EA\appendtoks \the\tabulatefont\to\!!toksa
@@ -228,7 +230,8 @@
%
\appendtoks \tabulatehook##\to\!!toksa
%
- %\doifdefinedelse{\@@tabalign@@\tabulatecolumns}
+ %%\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
@@ -246,7 +249,7 @@
\def\pretabskip{.5\tabulateunit}%
\let\postabskip\pretabskip
\let\gettabulateexit\dogettabulateexit
- \tabulatewidth\!!zeropoint}
+ \tabulatewidth\zeropoint}
\def\dosettabulatepreamble%
{\ifx\next\relax
@@ -293,34 +296,36 @@
\def\gettabulatepreskip#1%
{\doifnumberelse{#1}
- {\scratchdimen=#1\tabulateunit\let\next\empty}
- {\scratchdimen=.5\tabulateunit\def\next{#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}}%
+ {\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}}%
+ {\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\gettabulatehook#1%
- {\setvalue{\@@tabhook@@\tabulatecolumns}{#1}%
+ %{\setvalue{\@@tabhook@@\tabulatecolumns}{#1}%
+ {\setvalue{\@@tabhook@@\the\tabulatecolumns}{#1}%
\settabulatepreamble}
\def\gettabulatealign#1%
- {\setvalue{\@@tabalign@@\tabulatecolumns}{#1}%
+ %{\setvalue{\@@tabalign@@\tabulatecolumns}{#1}%
+ {\setvalue{\@@tabalign@@\the\tabulatecolumns}{#1}%
\settabulatepreamble}
\def\gettabulatebefore#1%
@@ -335,32 +340,22 @@
{\tabulatefont{#1}%
\settabulatepreamble}
-\def\gettabulatewidth% why was this split = 0
- {\chardef\tabulatemodus=0
- \doifnextcharelse{(}
- {\chardef\tabulatedimen=0
- \dogettabulatewidth}
- {\chardef\tabulatedimen=0
- \settabulatepreamble}}
-
-%D So:
-
\def\gettabulatewidth%
- {\chardef\tabulatemodus=0
- \chardef\tabulatedimen=0
+ {\chardef\tabulatemodus0
+ \chardef\tabulatedimen0
\doifnextcharelse(\dogettabulatewidth\settabulatepreamble}
\def\gettabulateparagraph%
{\doifnextcharelse{(}
- {\chardef\tabulatemodus=1
- \chardef\tabulatedimen=1
+ {\chardef\tabulatemodus1
+ \chardef\tabulatedimen1
\dogettabulatewidth}
- {\chardef\tabulatemodus=2
- \chardef\tabulatedimen=0
+ {\chardef\tabulatemodus2
+ \chardef\tabulatedimen0
\settabulatepreamble}}
\def\dogettabulatewidth(#1)%
- {\tabulatewidth=#1\relax
+ {\tabulatewidth#1\relax
\ifnum\tabulatedimen=1
\global\advance\tabulatepwidth\tabulatewidth
\fi
@@ -376,16 +371,17 @@
\def\tabulatehss {\ifnum\tabulatetype=1 \else\hss \fi}
\def\nexttabulate#1|%
- {\chardef\tabulatealign=\@@tabulatealign
- \chardef\tabulatemodus=0
- \chardef\tabulatedimen=0
+ {\chardef\tabulatealign\@@tabulatealign
+ \chardef\tabulatemodus0
+ \chardef\tabulatedimen0
\tabulatebefore \emptytoks
\tabulateafter \emptytoks
\tabulatebmath \emptytoks
\tabulateemath \emptytoks
\tabulatefont \emptytoks
\tabulatesettings\emptytoks
- \doglobal\increment\tabulatecolumns
+ %\doglobal\increment\tabulatecolumns
+ \global\advance\tabulatecolumns\plusone
\settabulatepreamble#1\relax\relax % permits i without n
\ifcase\tabulatemodus\relax
\ifcase\tabulatealign\relax
@@ -400,7 +396,8 @@
\dodosettabulatepreamble{\bskip\tabulateraggedleft }\eskip \or
\dodosettabulatepreamble{\bskip\tabulateraggedcenter}\eskip \fi
\or % auto width
- \doglobal\increment\nofautotabulate\relax
+ %\doglobal\increment\nofautotabulate\relax
+ \global\advance\nofautotabulate\plusone\relax
\ifcase\tabulatealign\relax
\dodosettabulatepreamble \bskip \eskip \or
\dodosettabulatepreamble{\bskip\tabulateraggedright }\eskip \or
@@ -416,14 +413,16 @@
\def\splitofftabulatebox%
{\dontcomplain
- \@EA\global\@EA\setbox\@EA\tabulatebox\@EA
+% \global\@EA\setbox\@EA\tabulatebox\@EA
+% \vsplit\csname\@@tabbox@@\tabulatecolumn\endcsname to \lineheight
+ \global\setbox\tabulatebox
\vsplit\csname\@@tabbox@@\tabulatecolumn\endcsname to \lineheight
\setbox\tabulatebox=\vbox
{\unvbox\tabulatebox}%
\setbox\tabulatebox=\hbox to \wd\tabulatebox
{\hss\dotabulatehook{\box\tabulatebox}\hss}%
- \ht\tabulatebox=\ht\strutbox
- \dp\tabulatebox=\dp\strutbox
+ \ht\tabulatebox\ht\strutbox
+ \dp\tabulatebox\dp\strutbox
\box\tabulatebox}
\def\dotabulatehook%
@@ -436,12 +435,12 @@
{\xdef\tabulateminplines{1}%
\getnoflines\tabulatemaxpheight
\xdef\tabulatemaxplines{\the\noflines}%
- \global\tabulatemaxpheight=\!!zeropoint}
+ \global\tabulatemaxpheight\zeropoint}
\def\settabulatepheight%
- {\scratchdimen=\ht\csname\@@tabbox@@\tabulatecolumn\endcsname\relax
+ {\scratchdimen\ht\csname\@@tabbox@@\tabulatecolumn\endcsname\relax
\ifdim\scratchdimen>\tabulatemaxpheight
- \global\tabulatemaxpheight=\scratchdimen
+ \global\tabulatemaxpheight\scratchdimen
\fi}
\def\handletabulatepbreak%
@@ -503,12 +502,66 @@
\c!uitlijnen,\c!lijnkleur,\c!lijndikte,EQ]%
\setvalue{\e!start#1::#2}{\dofinalstarttabulate[#1][#2][#3]}%
\setvalue{\e!start#1}{\bgroup\dosubstarttabulate[#1]}%
+ \letvalue{\??tt#1\v!hoofd}\empty
+ \letvalue{\??tt#1\v!voet }\empty
\else\ifsecondargument
\definetabulate[#1][][#2]%
\else
\definetabulate[#1][][|l|p|]%
\fi\fi}
+\let\tabulateheadcontent\empty
+\let\tabulatetailcontent\empty
+
+% \def\checkfulltabulatecontent
+% {\doifdefinedelse{\??tt\currenttabulate\v!hoofd}
+% {\@EA\let\@EA\tabulateheadcontent\csname\??tt\currenttabulate\v!hoofd\endcsname}
+% {\let\tabulateheadcontent\empty}%
+% \doifdefinedelse{\??tt\currenttabulate\v!voet}
+% {\@EA\let\@EA\tabulatetailcontent\csname\??tt\currenttabulate\v!voet\endcsname}
+% {\let\tabulatetailcontent\empty}}
+
+\def\checkfulltabulatecontent
+ {\doifdefinedelse{\??tt\currenttabulate\v!hoofd}
+ {\@EA\let\@EA\tabulateheadcontent
+ \csname\??tt\currenttabulate\v!hoofd\endcsname}
+ {\let\tabulateheadcontent\empty}%
+ \doifdefinedelse{\??tt\currenttabulate\v!voet}
+ {\@EA\let\@EA\tabulatetailcontent
+ \csname\??tt\currenttabulate\v!voet\endcsname}
+ {\let\tabulatetailcontent\empty}}
+
+\newconditional\tabulatesomeamble
+
+% \def\fulltabulatecontent
+% {\tabulatecontent}
+
+\def\fulltabulatecontent
+ {\ifx\tabulateheadcontent\empty\else
+ \TABLEnoalign{\global\settrue\tabulatesomeamble}%
+ \tabulateheadcontent
+ \TABLEnoalign{\global\setfalse\tabulatesomeamble}%
+ \fi
+ \tabulatecontent
+ \ifx\tabulatetailcontent\empty\else
+ \TABLEnoalign{\global\settrue\tabulatesomeamble}%
+ \tabulatetailcontent
+ \fi}
+
+\setvalue{\e!start\e!tabulatehead}%
+ {\dosingleempty\dostartstarttabulatehead}
+
+\def\dostartstarttabulatehead[#1]%
+ {\processcontent{\e!stop\e!tabulatehead}\next
+ {\letvalue{\??tt\iffirstargument#1\else\e!tabulate\fi::\v!hoofd}\next}}
+
+\setvalue{\e!start\e!tabulatetail}%
+ {\dosingleempty\dostartstarttabulatetail}
+
+\def\dostartstarttabulatetail[#1]%
+ {\processcontent{\e!stop\e!tabulatetail}\next
+ {\letvalue{\??tt\iffirstargument#1\else\e!tabulate\fi::\v!voet}\next}}
+
\def\dosubstarttabulate%
{\dodoubleempty\dodosubstarttabulate}
@@ -587,10 +640,10 @@
{\getvalue{\??tt\currenttabulate EQ}\global\tabulateequalfalse}
\def\tabulatenormalcolumn#1%
- {&\iftabulateequal\tabulateEQ\fi&\global\chardef\tabulatetype=#1&}
+ {&\iftabulateequal\tabulateEQ\fi&\global\chardef\tabulatetype#1&}
\def\tabulateequalcolumn#1%
- {&\tabulateEQ&\global\chardef\tabulatetype=#1&}
+ {&\tabulateEQ&\global\chardef\tabulatetype#1&}
\def\tabulateautocolumn%
{\tabulatenormalcolumn0\relax
@@ -601,8 +654,8 @@
\fi}
\def\setquicktabulate#1% see \startlegend \startgiven
- {\let#1=\tabulateautocolumn
- \let\\=\tabulateautocolumn}
+ {\let#1\tabulateautocolumn
+ \let\\\tabulateautocolumn}
%\def\tabulateruleseperator
% {\vskip\dp\strutbox}
@@ -610,7 +663,7 @@
\def\tabulateruleseperator%
{\bgroup
\def\factor{1}%
- \scratchskip=\dp\strutbox
+ \scratchskip\dp\strutbox
\ExpandFirstAfter\processallactionsinset
[\getvalue{\??tt\currenttabulate\c!afstand}]
[ \v!blanko=>\scratchskip=\bigskipamount,
@@ -618,10 +671,10 @@
\v!klein=>\def\factor{.25},
\v!middel=>\def\factor{.5},
\v!groot=>,
- \v!geen=>\scratchskip=\!!zeropoint\def\factor{0},
+ \v!geen=>\scratchskip=\zeropoint\def\factor{0},
\s!unknown=>\scratchskip=\commalistelement]%
\scratchdimen=\factor\scratchskip
- \vskip\scratchdimen\relax
+ \ifconditional\tabulatesomeamble\kern\else\vskip\fi\scratchdimen % new
\egroup}
\def\tabulaterule%
@@ -639,21 +692,25 @@
\def\processtabulate[|#1|]% in the process of optimizing
{\tabulateunit=\getvalue{\??tt\currenttabulate\c!eenheid}%
- \ExpandFirstAfter\processaction
+ \checkfulltabulatecontent
+ \ExpandFirstAfter\processaction % use \setalignmentswitch instead
[\getvalue{\??tt\currenttabulate\c!uitlijnen}]
- [ \v!rechts=>\def\@@tabulatealign{1},
+ [\v!normaal=>\def\@@tabulatealign{0}, % = default value
+ \v!rechts=>\def\@@tabulatealign{1},
\v!links=>\def\@@tabulatealign{2},
\v!midden=>\def\@@tabulatealign{3},
\s!default=>\def\@@tabulatealign{0},
\s!unknown=>\def\@@tabulatealign{0}]%
\let\pretabskip\!!zeropoint
\def\postabskip{.5\tabulateunit}%
- \doglobal\newcounter\tabulatecolumns
- \doglobal\newcounter\nofautotabulate
+ %\doglobal\newcounter\tabulatecolumns
+ %\doglobal\newcounter\nofautotabulate
+ \global\tabulatecolumns\zerocount
+ \global\nofautotabulate\zerocount
\doglobal\newcounter\noftabulatelines
\let\totalnoftabulatelines\noftabulatelines
\let\minusnoftabulatelines\noftabulatelines
- \global\tabulatepwidth=\!!zeropoint
+ \global\tabulatepwidth\zeropoint
\global\tabulateequalfalse
\resettabulatepheight
\def\NC{\tabulatenormalcolumn0}%
@@ -685,12 +742,12 @@
\let\LL\empty \let\LR\NR
\global\let\flushtabulated\empty
\let\savedbar=|\let|=\nexttabulate
- \tabskip\!!zeropoint
+ \tabskip\zeropoint
\!!toksa{&\hbox to \tabulateindent{}##\strut&##}%
- \tabulatewidth\!!zeropoint
+ \tabulatewidth\zeropoint
|#1X|\relax
- \tabulatewidth\!!zeropoint
- \dorecurse\tabulatecolumns
+ \tabulatewidth\zeropoint
+ \dorecurse\tabulatecolumns % can be made faster
{\doifundefinedelse{\@@tabbox@@\recurselevel}
{\expandafter\newbox\csname\@@tabbox@@\recurselevel\endcsname}%
{\global\setbox\csname\@@tabbox@@\recurselevel\endcsname\box\voidb@x}}%
@@ -720,13 +777,13 @@
{\footnotesenabledfalse
\let\tabulateindent\!!zeropoint
\trialtypesettingtrue % very important
- \@EA\halign\@EA{\the\!!toksa\cr\tabulatecontent\crcr}}%
+ \@EA\halign\@EA{\the\!!toksa\cr\fulltabulatecontent\crcr}}%
\ifnum\nofautotabulate>0
\tabulatewidth\hsize
- \advance\tabulatewidth by -\wd0
- \advance\tabulatewidth by -\tabulatepwidth
+ \advance\tabulatewidth -\wd0
+ \advance\tabulatewidth -\tabulatepwidth
\ifnum\nofautotabulate>0
- \divide\tabulatewidth by \nofautotabulate\relax
+ \divide\tabulatewidth \nofautotabulate\relax
\fi
\fi
\ifsplittabulate
@@ -761,7 +818,7 @@
{\TABLEnoalign % noalign % no interference !
{\global\let\flushtabulatedindeed\empty
\handletabulatepbreak
- \dorecurse\noftabcolumns
+ \dorecurse\tabulatecolumns % was: \noftabcolumns
{\ifvoid\csname\@@tabbox@@\recurselevel\endcsname\else
\gdef\flushtabulatedindeed{\the\tabulatedummy}%
\fi}}%
@@ -805,7 +862,8 @@
{\tabulateruleseperator
\tabulaterule
\ifnum\noftabulatelines>1 \ifnum\noftabulatelines<\minusnoftabulatelines
- \vskip\topskip\allowbreak\vskip-\topskip\vskip-.4pt
+ \vskip\topskip\allowbreak\vskip-\topskip
+ \vskip-\getvalue{\??tt\currenttabulate\c!lijndikte}%
\tabulaterule
\fi\fi
\tabulateruleseperator}}%
@@ -821,7 +879,7 @@
\vskip-\lineheight}%
\fi}}%
\chardef\tabulatepass=2
- \@EA\halign\@EA{\the\!!toksa\cr\tabulatecontent\crcr}%
+ \@EA\halign\@EA{\the\!!toksa\cr\fulltabulatecontent\crcr}%
\prevdepth\dp\strutbox % nog eens beter, temporary hack
\egroup
\ifinsidefloat \else
@@ -853,6 +911,4 @@
\c!uitlijnen=\v!normaal,
\c!inspringen=\v!nee]
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/core-uti.tex b/tex/context/base/core-uti.tex
index f5d5fc778..c9d2e3269 100644
--- a/tex/context/base/core-uti.tex
+++ b/tex/context/base/core-uti.tex
@@ -15,7 +15,8 @@
\unprotect
-% to do : lan ook safen
+% todo : safe lan etc too
+% todo : load all commands at once (tok)
% Utility-file
%
@@ -61,10 +62,10 @@
{\immediate\write\uti}
\def\writeutilitycommand#1%
- {\writeutility{c \string#1}}
+ {\write\uti{c \string#1}}
\def\immediatewriteutilitycommand#1%
- {\immediatewriteutility{c \string#1}}
+ {\immediate\write\uti{c \string#1}}
\def\openutilities%
{\immediate\openout\uti=\jobname.\f!inputextension
@@ -185,17 +186,17 @@
\long\def\doutilities#1#2#3#4#5% % introduceren in utility file
{\restorecatcodes
\resetutilities
- \def\docommando##1% % zo kunnen meerdere dingen
- {\getvalue{\s!set##1}}% % in een pass worden gedaan,
- \processcommacommand[#1]\docommando % zie bijvoorbeeld lijsten
+ \def\docommando##1% % more than one utility thing
+ {\csname\s!set##1\endcsname}% % can be handled in one pass,
+ \processcommacommand[#1]\docommando % for instance lists
\begingroup
\def\currentutilityfilename{#2}%
\footnotesenabledfalse
\doinpututilitiestrue
\global\utilitydonefalse
-\catcode`\\=\@@escape
-\catcode`\{=\@@begingroup
-\catcode`\}=\@@endgroup
+ \catcode`\\=\@@escape
+ \catcode`\{=\@@begingroup
+ \catcode`\}=\@@endgroup
\catcode`\%=\@@comment\relax
\pushendofline % geeft problemen zodra andere file wordt ingelezen
\ifunprotectutilities % nog nodig ?
@@ -207,14 +208,18 @@
\ifnum\catcode`\!=\@@active \else
\catcode`\!=\@@letter % permits multilingual constants
\fi
- #4\readjobfile{#2.\f!outputextension}{}{}#5%
+ #4%
+ \the\everybeforeutilityread
+ \readjobfile{#2.\f!outputextension}{}{}%
+ \the\everyafterutilityread
+ #5%
\relax
\ifunprotectutilities
\protect
\fi
\popendofline
\ifutilitydone\else
- \doifnot{#3}{}
+ \doifsomething{#3}
{\showmessage{\m!systems}{9}{{#3}}%
\ifvoorlopig
\blanko
@@ -269,24 +274,45 @@
\def\twopassentry#1%
{\executeifdefined{@@#1\s!pass}\gobbletwoarguments}
-\def\appendtwopasselement#1#2#3%
+%\def\appendtwopasselement#1#2#3%
+% {%\debuggerinfo{\m!systems}{twopass data #1 - #2 = #3}%
+% \@EA\ifx\csname#1:\s!list\endcsname\empty
+% \setxvalue{#1:\s!list}{#3}%
+% \else
+% \setxvalue{#1:\s!list}{\getvalue{#1:\s!list},#3}%
+% \fi}
+
+\def\appendtwopasselement#1#2#3% can sometimes become a large list
{%\debuggerinfo{\m!systems}{twopass data #1 - #2 = #3}%
- \@EA\ifx\csname#1:\s!list\endcsname\empty
- \setxvalue{#1:\s!list}{#3}%
- \else
- \setxvalue{#1:\s!list}{\getvalue{#1:\s!list},#3}%
- \fi}
+ \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}%
+% {\global\letvalue{\s!set#1\s!pass}\gobbletwoarguments
+% \setgvalue{@@#1\s!pass}{\appendtwopasselement{#1}}}%
+% \setgvalue{\s!reset#1\s!pass}%
+% {\global\letvalue{@@#1\s!pass}\gobbletwoarguments}%
+% \getvalue{\s!reset#1\s!pass}}}
\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}%
- {\global\letvalue{\s!set#1\s!pass}\gobbletwoarguments
- \setgvalue{@@#1\s!pass}{\appendtwopasselement{#1}}}%
- \setgvalue{\s!reset#1\s!pass}%
- {\global\letvalue{@@#1\s!pass}\gobbletwoarguments}%
- \getvalue{\s!reset#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\dosettwopasslist#1%
+ {\global\letvalue{\s!set#1\s!pass}\gobbletwoarguments
+ \setgvalue{@@#1\s!pass}{\appendtwopasselement{#1}}}
+
+\def\doresettwopasslist#1%
+ {\global\letvalue{@@#1\s!pass}\gobbletwoarguments}
\def\definetwopasslist#1%
{\expanded{\dodefinetwopasslist{#1}}%
@@ -323,26 +349,39 @@
\let\twopassdata=\empty
+%\def\dogettwopassdata[#1,#2]#3%
+% {\doifelse{#1}{0} % \ifcase truukje gaat fout
+% {\twopassdatafoundfalse
+% \let\twopassdata\empty}
+% {\twopassdatafoundtrue
+% \setxvalue{#3:\s!list}{#2}%
+% \edef\twopassdata{#1}}}
+
+\def\notwopassdata{0}
+
\def\dogettwopassdata[#1,#2]#3%
- {\doifelse{#1}{0} % \ifcase truukje gaat fout
- {\twopassdatafoundfalse
- \let\twopassdata\empty}
- {\twopassdatafoundtrue
- \setxvalue{#3:\s!list}{#2}%
- \edef\twopassdata{#1}}}
+ {\edef\twopassdata{#1}%
+ \ifx\twopassdata\notwopassdata
+ \twopassdatafoundfalse
+ \let\twopassdata\empty
+ \else
+ \twopassdatafoundtrue
+ \setxvalue{#3:\s!list}{#2}%
+ \fi}
\def\gettwopassdata#1%
{\loadtwopassdata
- \edef\!!stringa{\getvalue{#1:\s!list}}%
+ %\edef\!!stringa{\csname#1:\s!list\endcsname}%
%\debuggerinfo{\m!systems}{twopass get #1 - \!!stringa}%
- \expandafter\dogettwopassdata\expandafter[\!!stringa]{#1}}
+ %\expandafter\dogettwopassdata\expandafter[\!!stringa]{#1}}
+ \expanded{\dogettwopassdata[\csname#1:\s!list\endcsname]}{#1}}
-\def\findtwopassdata%
+\def\findtwopassdata#1#2%
{\loadtwopassdata
- \ExpandBothAfter\dofindtwopassdata}
+ \expanded{\dofindtwopassdata{#1}{#2}}}
\def\dofindtwopassdata#1#2%
- {\edef\!!stringa{,\getvalue{#1:\s!list}}%
+ {\edef\!!stringa{,\csname#1:\s!list\endcsname}%
%\debuggerinfo{\m!systems}{twopass find #2 - \!!stringa}%
\def\dodofindtwopassdata[##1,##2#2##3,##4]%
{\edef\twopassdata{##3}%
@@ -377,7 +416,7 @@
\def\getfromtwopassdata#1#2%
{\loadtwopassdata
- \getfromcommacommand[\getvalue{#1:\s!list}][#2]%
+ \getfromcommacommand[\csname#1:\s!list\endcsname][#2]%
\doifelsenothing{\commalistelement}
{\twopassdatafoundfalse
\let\twopassdata\empty}
diff --git a/tex/context/base/core-var.tex b/tex/context/base/core-var.tex
index ab9c3d6b0..270c0c1d9 100644
--- a/tex/context/base/core-var.tex
+++ b/tex/context/base/core-var.tex
@@ -20,16 +20,23 @@
%D
%D A few every's.
-\newevery \everyshipout \relax
-\newevery \everybeforeshipout \relax
-\newevery \everyaftershipout \relax
-\newevery \everylastshipout \relax
-\newevery \everybye \relax
-\newevery \everygoodbye \relax
-\newevery \everystarttext \relax
-\newevery \everystoptext \relax
-\newevery \everypagebody \relax
-\newevery \everyforgetall \relax
+\newevery \everyshipout \relax
+\newevery \everybeforeshipout \relax
+\newevery \everyaftershipout \relax
+\newevery \everylastshipout \relax
+\newevery \everybye \relax
+\newevery \everygoodbye \relax
+\newevery \everystarttext \relax
+\newevery \everystoptext \relax
+\newevery \everyforgetall \relax
+
+\newevery \everybeforepagebody \relax
+\newevery \everyafterpagebody \relax
+
+\let \everypagebody \everybeforepagebody % backward compatible
+
+\newevery \everybeforeutilityread \relax
+\newevery \everyafterutilityread \relax
%D \macros
%D {ifproductionrun}
@@ -42,6 +49,21 @@
\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
+\newevery \everyboxedcontent \relax
+
+\appendtoks \boxedcontenttrue \to \everyboxedcontent
+
+\def\startboxedcontent{\bgroup\the\everyboxedcontent}
+\let\stopboxedcontent \egroup
+
+%D \macros
%D {fastmode}
%D
%D The command \type {\fastmode} disables some time consuming
@@ -77,6 +99,15 @@
\fi
-\protect
+%D We store some original meanings, maybe in \type
+%D {math-ini}.
+
+\let\normalin \in
+\let\normalover \over
+\let\normalabove \above
+\let\normalatop \atop
+\let\normaloverwithdelims \overwithdelims
+\let\normalabovewithdelims\abovewithdelims
+\let\normalatopwithdelims \atopwithdelims
-\endinput
+\protect \endinput
diff --git a/tex/context/base/core-ver.tex b/tex/context/base/core-ver.tex
index 575e237cd..7833370b2 100644
--- a/tex/context/base/core-ver.tex
+++ b/tex/context/base/core-ver.tex
@@ -119,6 +119,8 @@
{\def\setupprettytype{\getvalue{setuppretty\prettyidentifier type}}}
{\let\setupprettytype=\relax}}
+\installprettytype [RAW] [RAW]
+
\installprettytype [TEX] [TEX]
\installprettytype [PERL] [PL]
@@ -220,6 +222,8 @@
%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 {>}
@@ -236,7 +240,6 @@
%\unexpanded\def\type%
% {\bgroup
-%% \verbatimcolor
% \catcode`\<=\@@other
% \catcode`\>=\@@other
% \futurelet\next\dotype}
@@ -246,6 +249,7 @@
\def\dotype#1%
{\bgroup
+ \strut % new, enables leading space in \type { abc } at par start
\edef\@@currenttype{#1}%
\catcode`\<=\@@other
\catcode`\>=\@@other
@@ -280,33 +284,70 @@
% \fi\fi
% \verbatimcolor
% \next}
+%
+% \def\dodotype%
+% {\ifx\next\bgroup
+% \initializetype
+% \verbatimcolor
+% \initializetypegrouping
+% \def\next%
+% {\afterassignment\protectfirsttype\let\next=}%
+% \else\if\next<%
+% \doifelsevalue{\??ty\@@currenttype\c!optie}{\v!geen}
+% {\initializetype
+% \verbatimcolor
+% \setupnotypegrouping
+% \def\next%
+% {\let\next=}}
+% {\def\next<##1%
+% {\initializetype
+% \verbatimcolor
+% \if##1<%
+% \else
+% \setupalternativetypegrouping
+% ##1%
+% \fi}}%
+% \else
+% \def\next##1%
+% {\initializetype
+% \verbatimcolor
+% \catcode`##1=\@@endgroup}%
+% \fi\fi
+% \next}
+
+\def\dodotypeA
+ {\initializetype
+ \initializetypegrouping
+ \verbatimcolor
+ \afterassignment\protectfirsttype\let\next=}
+
+\def\dodotypeB%
+ {\initializetype
+ \setupnotypegrouping
+ \verbatimcolor
+ \let\next=}
+
+\def\dodotypeC<#1%
+ {\initializetype
+ \verbatimcolor
+ \if#1<\else
+ \setupalternativetypegrouping#1%
+ \fi}
+
+\def\dodotypeD#1%
+ {\initializetype
+ \verbatimcolor
+ \catcode`#1=\@@endgroup}
\def\dodotype%
{\ifx\next\bgroup
- \initializetype
- \initializetypegrouping
- \def\next%
- {\afterassignment\protectfirsttype\let\next=}%
+ \@EA\dodotypeA
\else\if\next<%
\doifelsevalue{\??ty\@@currenttype\c!optie}{\v!geen}
- {\initializetype
- \setupnotypegrouping
- \def\next%
- {\let\next=}}
- {\def\next<##1%
- {\initializetype
- \if##1<%
- \else
- \setupalternativetypegrouping
- ##1%
- \fi}}%
+ {\@EAEAEA\dodotypeB}{\@EAEAEA\dodotypeC}%
\else
- \def\next##1%
- {\initializetype
- \catcode`##1=\@@endgroup}%
- \fi\fi
- \verbatimcolor
- \next}
+ \@EAEAEA\dodotypeD
+ \fi\fi}
\bgroup
\catcode`\[=\@@begingroup
@@ -553,7 +594,7 @@
%D support of \type{\tt} text will be implemented soon.
\def\obeyhyphens%
- {\def\obeyedspace{ }%
+ {\def\obeyedspace{\hskip\spaceskip}%
\edef\savedfont{\the\font}%
\ttsl\hyphenchar\font=45
\tttf\hyphenchar\font=45
@@ -561,7 +602,7 @@
\spaceskip.5em\!!plus.25em\!!minus.25em\relax}
\def\obeybreakpoints%
- {\def\obeyedspace{ }%
+ {\def\obeyedspace{\hskip\spaceskip}%
\spaceskip.5em
\veryraggedright}
@@ -688,7 +729,7 @@
\v!groot=>\scratchskip=\blankogrootmaat,
\v!halveregel=>\scratchskip=.5\baselineskip,
\v!regel=>\scratchskip=\baselineskip,
- \v!geen=>\scratchskip=\!!zeropoint,
+ \v!geen=>\scratchskip=\zeropoint,
\s!unknown=>\scratchskip=\commalistelement]%
\ifgridsnapping
\ifdim\scratchskip=.5\baselineskip\relax
@@ -832,6 +873,7 @@
\definetyping[\v!typen]
+\definetyping[RAW] [\c!optie=RAW]
\definetyping[MP] [\c!optie=MP]
\definetyping[PL] [\c!optie=PL]
\definetyping[PM] [\c!optie=PL]
diff --git a/tex/context/base/core-vis.tex b/tex/context/base/core-vis.tex
index feb4a5afc..c23d1044c 100644
--- a/tex/context/base/core-vis.tex
+++ b/tex/context/base/core-vis.tex
@@ -325,7 +325,7 @@
\normalvfill}%
\normalhbox to \ruledwidth
{\scratchdimen=\cutmarklength
- \divide\scratchdimen by 2
+ \divide\scratchdimen 2
\llap{\copy\scratchbox\normalhskip\cutmarkoffset\scratchdimen}%
\normalhfill
\rlap{\normalhskip\cutmarkoffset\scratchdimen\copy\scratchbox}}}
@@ -416,10 +416,10 @@
\def\colorrangeA#1#2#3#4%
{\vbox
{\scratchdimen=-\colormarklength
- \multiply\scratchdimen by 4
- \advance\scratchdimen by \ruledheight
- \advance\scratchdimen by \ruleddepth
- \divide\scratchdimen by 21
+ \multiply\scratchdimen 4
+ \advance\scratchdimen \ruledheight
+ \advance\scratchdimen \ruleddepth
+ \divide\scratchdimen 21
\def\docommando##1%
{\vbox
{\hsize3em % \scratchdimen
@@ -433,7 +433,7 @@
\hrule
\!!width 3em
\!!height \scratchdimen
- \!!depth \!!zeropoint
+ \!!depth \zeropoint
\localstopcolor
\ifdim\scratchdimen>1ex
\vskip-\scratchdimen
@@ -446,12 +446,12 @@
\offinterlineskip
\processcommalist[1.00,0.95,0.75,0.50,0.25,0.05,0.00]\docommando}}
-\def\colorrangeB%
+\def\colorrangeB
{\hbox
{\scratchdimen=-\colormarklength
- \multiply\scratchdimen by 2
- \advance\scratchdimen by \ruledwidth
- \divide\scratchdimen by 11
+ \multiply\scratchdimen 2
+ \advance\scratchdimen \ruledwidth
+ \divide\scratchdimen 11
\def\docommando ##1 ##2 ##3##4##5##6%
{\definecolor
[\s!dummy]
@@ -463,7 +463,7 @@
\vrule
\!!width \scratchdimen
\!!height \colormarklength
- \!!depth \!!zeropoint
+ \!!depth \zeropoint
\localstopcolor
\ifdim\scratchdimen>2em
\hskip-\scratchdimen
@@ -485,7 +485,7 @@
\docommando B 1 \iftrue \iftrue \iffalse\iffalse
\docommando K 1 \iffalse\iffalse\iffalse\iftrue}}
-\def\colorrangeC%
+\def\colorrangeC
{\hbox
{\scratchdimen=-\colormarklength
\multiply\scratchdimen by 2
@@ -586,8 +586,8 @@
\else
- \let\supernormalmark \normalmark % mark is already superseded
- \let\supernormalmarks \normalmarks % mark is already superseded
+ \let\supernormalmark \normalmark % mark may already superseded
+ \let\supernormalmarks \normalmarks % mark may already superseded
\def\showwhatsits%
{\protected\def\normalmark {\visualwhatsit100+m\supernormalmark }%
@@ -684,7 +684,49 @@
\fi}
\fi
-
-\protect
-\endinput
+%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%
+ {\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\box\nextbox
+ \setbox\nextbox\ifhbox\nextbox\hbox\else\vbox\fi
+ \bgroup
+ \startoverlay
+ {\copy\scratchbox}
+ {\dodotagbox{#1}\scratchbox{\framed
+ [\c!achtergrond=\v!raster,\c!achtergrondraster=1]{#2}}}
+ \stopoverlay
+ \egroup
+ \wd\nextbox\the\wd\scratchbox
+ \ht\nextbox\the\ht\scratchbox
+ \dp\nextbox\the\dp\scratchbox
+ \box\nextbox
+ \egroup}}
+
+\def\tagbox
+ {\dosingleempty\dotagbox}
+
+\protect \endinput
diff --git a/tex/context/base/enco-ans.tex b/tex/context/base/enco-ans.tex
index e78b816b4..2e3b55cb5 100644
--- a/tex/context/base/enco-ans.tex
+++ b/tex/context/base/enco-ans.tex
@@ -49,9 +49,9 @@
% texnansx
-\definecasemap 26 26 29 \definecasemap 29 26 29
-\definecasemap 27 27 30 \definecasemap 30 27 30
-\definecasemap 28 28 31 \definecasemap 31 28 31
+%\definecasemap 26 26 29 \definecasemap 29 26 29
+%\definecasemap 27 27 30 \definecasemap 30 27 30
+%\definecasemap 28 28 31 \definecasemap 31 28 31
\stopmapping
@@ -62,7 +62,7 @@
\definecharacter textmacron 175
\definecharacter textcedilla 184
-\definecharacter dotlessi 105
+\definecharacter dotlessi 16 % 105
\definecharacter Lstroke 128
@@ -147,15 +147,15 @@
% texnansx
-\definecharacter aeligature 26
-\definecharacter oeligature 27
-\definecharacter ostroke 28
-
-\definecharacter AEligature 29
-\definecharacter OEligature 30
-\definecharacter Ostroke 31
-
-\definecharacter ssharp 25
+%\definecharacter aeligature 26
+%\definecharacter oeligature 27
+%\definecharacter ostroke 28
+%
+%\definecharacter AEligature 29
+%\definecharacter OEligature 30
+%\definecharacter Ostroke 31
+%
+%\definecharacter ssharp 25
\stopencoding
diff --git a/tex/context/base/enco-com.tex b/tex/context/base/enco-com.tex
index 06c15eb70..42d0d4774 100644
--- a/tex/context/base/enco-com.tex
+++ b/tex/context/base/enco-com.tex
@@ -14,7 +14,6 @@
%D Here we map some \quote {short} names onto the more
%D verbose glyph names.
-
\def\AA{\Aring}
\def\aa{\aring}
\def\AE{\AEligature}
diff --git a/tex/context/base/enco-def.tex b/tex/context/base/enco-def.tex
index 6a0c0789a..cf132bd40 100644
--- a/tex/context/base/enco-def.tex
+++ b/tex/context/base/enco-def.tex
@@ -284,6 +284,18 @@
\stopencoding
+%D And:
+
+\startencoding[default]
+
+\definecharacter leftguillemot {\leftfakeguillemot }
+\definecharacter rightguillemot {\rightfakeguillemot}
+
+\definecharacter leftsubguillemot {\leftsubfakeguillemot }
+\definecharacter rightsubguillemot {\rightsubfakeguillemot}
+
+\stopencoding
+
%D We also use symbolic names for math accents.
\startencoding[default]
diff --git a/tex/context/base/enco-fde.tex b/tex/context/base/enco-fde.tex
index 6678a2125..6de30ac1b 100644
--- a/tex/context/base/enco-fde.tex
+++ b/tex/context/base/enco-fde.tex
@@ -17,6 +17,8 @@
\startlanguagespecifics[\s!de]
+ \appendtoks \makecharacteractive " \to \everynormalcatcodes
+
\installcompoundcharacter "a {\aumlaut\midworddiscretionary}
\installcompoundcharacter "e {\eumlaut\midworddiscretionary}
\installcompoundcharacter "i {\iumlaut\midworddiscretionary}
diff --git a/tex/context/base/enco-fpl.tex b/tex/context/base/enco-fpl.tex
index acf3caa50..0ae286873 100644
--- a/tex/context/base/enco-fpl.tex
+++ b/tex/context/base/enco-fpl.tex
@@ -17,6 +17,8 @@
\startlanguagespecifics[\s!pl]
+ \appendtoks \makecharacteractive / \to \everynormalcatcodes
+
\installcompoundcharacter /a {\k a}
\installcompoundcharacter /c {\'c}
\installcompoundcharacter /e {\k e}
diff --git a/tex/context/base/enco-ini.tex b/tex/context/base/enco-ini.tex
index 44029c7f0..8f5fe8ab4 100644
--- a/tex/context/base/enco-ini.tex
+++ b/tex/context/base/enco-ini.tex
@@ -162,7 +162,7 @@
{\localpushmacro\characterregime
\edef\characterregime{@#1@}%
\doifundefined{\@reg@\characterregime}
- {\expanded{\newtoks\csname\@reg@\characterregime\endcsname}}}
+ {\@EA\newtoks\csname\@reg@\characterregime\endcsname}}
\def\stopregime%
{\localpopmacro\characterregime}
@@ -201,12 +201,19 @@
%D This command is typically used in coding definitions,
%D like the \UNICODE\ one.
+%\def\dodefineactivedecimal#1#2% \unexpanded ? pdfdoc encoding
+% {\catcode#1=\active % maybe \protectregimetrue
+% \scratchcounter=\the\uccode`~
+% \uccode`~=#1\relax
+% \uppercase{\unexpanded\edef~{\noexpand#2{\number#1}}}%
+% \uccode`~=\scratchcounter}
+
\def\dodefineactivedecimal#1#2% \unexpanded ? pdfdoc encoding
- {\catcode#1=\active % maybe \protectregimetrue
- \scratchcounter=\the\uccode`~
- \uccode`~=#1\relax
+ {\catcode#1\active
+ \scratchcounter\uccode\activehackcode
+ \uccode\activehackcode#1\relax
\uppercase{\unexpanded\edef~{\noexpand#2{\number#1}}}%
- \uccode`~=\scratchcounter}
+ \uccode\activehackcode\scratchcounter}
\long\def\defineactivedecimal#1 #2 %
{\setregimetoks
@@ -340,8 +347,8 @@
\def\definecasemaps #1 to #2 lc #3 uc #4 % from to lc+ uc+
{\dostepwiserecurse{#1}{#2}{1}
- {\!!counta=\recurselevel\advance\!!counta by #3\relax
- \!!countb=\recurselevel\advance\!!countb by #4\relax
+ {\!!counta\recurselevel\advance\!!counta #3\relax
+ \!!countb\recurselevel\advance\!!countb #4\relax
\expanded{\definecasemap
\recurselevel\space\the\!!counta\space\the\!!countb\space}}%
\ignorespaces}
@@ -374,8 +381,8 @@
\def\setspacemap #1 #2 %
{\setregimecode{#1}\@@other
- \lccode #1=0
- \uccode #1=0
+ \lccode #1=\zerocount
+ \uccode #1=\zerocount
\sfcode #1=#2 }
\def\defineuppercasecom#1#2%
@@ -402,10 +409,22 @@
{\the\csname\@map@\charactermapping\endcsname}%
\edef\enabledmapping{\charactermapping}%
\enablelanguagespecifics[\currentlanguage]% new
-% \edef\enabledmapping{\charactermapping\currentlanguage}%
+ % \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
+ \let\enabledmapping\charactermapping
+ \enablelanguagespecifics[\currentlanguage]% to faster
+ \fi}
+
%D This macro wil be implemented in \type {lang-ini.tex}.
\ifx\enablelanguagespecifics\undefined
@@ -518,21 +537,23 @@
%D \type {\reduceto}||command for local switching to
%D simplified commands.
+% etex : \ifcsname
+
\def\donthandleaccent#1#2% \empty makes #2={} save % no \unexpanded
{\ifundefined{\characterencoding#1\string#2\empty}%
#2%
\else
- \getvalue{\characterencoding#1\string#2\empty}%
+ \csname\characterencoding#1\string#2\empty\endcsname
\fi}
\def\donthandlecommand#1% % no \unexpanded, otherwise pdfdoc will fail
{\ifundefined{\characterencoding#1}% as well as hyph patterns
#1%
\else
- \getvalue{\characterencoding#1}%
+ \csname\characterencoding#1\endcsname
\fi}
-\def\enablecoding%
+\def\enableencoding%
{\dodoubleempty\doenableencoding}
\def\doenableencoding[#1][#2]% main fallback
@@ -540,12 +561,24 @@
\edef\nocharacterencoding{@\ifsecondargument#2\else\s!default\fi @}%
\synchronizepatterns}
-\def\startcoding%
- {\dodoubleempty\dostartcoding}
+%\def\enablesimpleencoding#1% e.g. \enableencoding{raw}
+% {\edef\characterencoding{@#1@}% handy for XML key=val's
+% \edef\nocharacterencoding{@\s!default @}} % evt noppes
-\def\dostartcoding[#1][#2]% encoding regime
+% in font switch and xml simple k/v remapping
+
+\edef\xnocharacterencoding{@\s!default @}
+
+\def\fastenableencoding#1%
+ {\edef\characterencoding{@#1@}%
+ \let\nocharacterencoding\xnocharacterencoding}
+
+\def\startencoding%
+ {\dodoubleempty\dostartencoding}
+
+\def\dostartencoding[#1][#2]% encoding regime
{\doifelsenothing{#1}
- {\let\stopcoding\relax}
+ {\let\stopencoding\relax}
{%\protectfontcharacters % problematic in language loading
\showmessage{\m!encodings}{1}{#1}%
\pushmacro\dohandleaccent
@@ -560,14 +593,14 @@
{% message
\let\doautosetregime\gobbletwoarguments}
{\def\currentcharacterregime{@#2@}}%
- \enablecoding[#1]%
- \def\stopcoding%
+ \enableencoding[#1]%
+ \def\stopencoding%
{\popmacro\dosetautoregime
\popmacro\currentcharacterregime
\popmacro\definesortkey
\popmacro\dohandlecommand
\popmacro\dohandleaccent
- \enablecoding[\s!default]%
+ \enableencoding[\s!default]%
}}}% \unprotectfontcharacters}}} % ??
% probably obsolete
@@ -576,12 +609,12 @@
{\doifsomething{#1}
{\let\dohandleaccent\donthandleaccent
\let\dohandlecommand\donthandlecommand
- \enablecoding[#1]%
+ \enableencoding[#1]%
\enablelanguagespecifics[\currentlanguage]}}
-\def\startencoding {\startcoding}
-\def\stopencoding {\stopcoding}
-\def\enableencoding{\enablecoding}
+\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
@@ -908,7 +941,9 @@
%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 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
@@ -1074,22 +1109,26 @@
%D \type{\lccode} and applying \type{\lowcase}. An example of
%D this can be found in \type{spec-mis}.
+\ifx\obeylccodes\undefined
+
\def\obeylccodes%
{\scratchcounter32
\loop
\ifnum\scratchcounter<127
\lccode\scratchcounter\scratchcounter
- \advance\scratchcounter 1
+ \advance\scratchcounter \plusone
\repeat
\ifeightbitcharacters
\scratchcounter128
\loop
\ifnum\scratchcounter<255
\lccode\scratchcounter`.
- \advance\scratchcounter 1
+ \advance\scratchcounter \plusone
\repeat
\fi}
+\fi
+
% %D \macros
% %D {cc,CC}
% %D
@@ -1280,11 +1319,11 @@
{\leavevmode
\vtop
{\forgetall
- \baselineskip\!!zeropoint
+ \baselineskip\zeropoint
\lineskip#1%
\everycr\emptytoks
- \tabskip\!!zeropoint
- \lineskiplimit\!!zeropoint
+ \tabskip\zeropoint
+ \lineskiplimit\zeropoint
\setbox0=\hbox{#4}%
\halign
{##\crcr#5\crcr
@@ -1361,6 +1400,17 @@
% \useencodingvector ec
% \stopregime
+% new, to be documented
+
+\def\dontexpandencoding%
+ {\let\dohandleaccent \donthandleaccent
+ \let\dohandlecommand \donthandlecommand
+ \let\dohandlecharacter\donthandlecharacter}
+
+\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}
+
%D We preload several encodings:
\useencoding[def,acc,raw,com,cas,mis]
diff --git a/tex/context/base/enco-pfr.tex b/tex/context/base/enco-pfr.tex
index 16012a281..5b064805c 100644
--- a/tex/context/base/enco-pfr.tex
+++ b/tex/context/base/enco-pfr.tex
@@ -64,13 +64,13 @@
%D \stopopsomming
\def\pdffontresource%
- {\strippedcsname\pdffontresource\currentencoding}
+ {pdfr:\currentencoding}
\def\pdffontfileresource%
- {pdfr:\pdffontresource}
+ {pdff:\pdffontresource}
%D A resource is defined in a file prefixed by \type {pdfr-}.
-%D The following \PDF\ code is compsed by Ondrej Koala Vacha (i
+%D The following \PDF\ code is composed by Ondrej Koala Vacha (I
%D probably mispelled this name).
%D
%D \starttypen
@@ -151,30 +151,67 @@
\fi\fi
\fi}
-\def\doincludepdffontresource%
- {% does this font has an special encoding entry
- \doifdefined{\purefontname\font\s!encoding}
- {% does this encoding entry has a value
- \doifvaluesomething{\purefontname\font\s!encoding}
- {\bgroup
- % quick and dirty switch
- \edef\currentencoding{\getvalue{\purefontname\font\s!encoding}}% okay?
- % is there a pdf font encoding resource file defined
- \doifdefined{\pdffontfileresource}
- {% load the pdf font resource
- \doifvaluesomething{\pdffontfileresource}
- {% but load it only once
- \startreadingfile
- \readsysfile{pdfr-\getvalue{\pdffontfileresource}}{}{}% messages
- \stopreadingfile
- % but do that only once, so forget the flag, empty==loaded
- \global\letvalue{\pdffontfileresource}\empty}}%
- % is there a resource indeed, i.e. an object reference
- \doifdefined{\pdffontresource}
- {% if so, create a reference to the object
- \expanded{\pdffontattr\font % current font
- {/ToUnicode \getvalue{\pdffontresource}\space0 R}}}%
- \egroup}}}
+\beginETEX
+
+\def\doincludepdffontresource
+ {\ifcsname\s!ucmap\fontfile\endcsname\else
+ \dodoincludepdffontresource
+ \fi}
+
+\def\dodoincludepdffontresource%
+ {% does this font has an encoding specified
+ \ifx\currentencoding\empty \else \ifx\currentencoding\s!default \else
+ % is there a pdf font encoding resource file defined
+ \ifcsname\pdffontfileresource\endcsname
+ % load the pdf font resource
+ \edef\xpdffontfileresource{\csname\pdffontfileresource\endcsname}%
+ \ifx\xpdffontfileresource\empty \else
+ % but load it only once
+ \startreadingfile
+ \readsysfile{pdfr-\xpdffontfileresource}{}{}% messages
+ \stopreadingfile
+ % but do that only once, so forget the flag, empty==loaded
+ \global\@EA\let\csname\pdffontfileresource\endcsname\empty
+ \fi
+ \fi
+ % is there a resource indeed, i.e. an object reference
+ \ifcsname\pdffontresource\endcsname
+ % if so, create a reference to the object
+ \expanded{\pdffontattr\font % current font
+ {/ToUnicode \csname\pdffontresource\endcsname\space0 R}}%
+ \fi
+ \global\@EA\let\csname\s!ucmap\fontfile\endcsname\empty
+ \fi \fi}
+
+\endETEX
+
+\beginTEX
+
+\def\doincludepdffontresource
+ {\@EA\ifx\csname\s!ucmap\fontfile\endcsname\relax
+ \dodoincludepdffontresource
+ \fi}
+
+\def\dodoincludepdffontresource%
+ {\ifx\currentencoding\empty \else \ifx\currentencoding\s!default \else
+ \@EA\ifx\csname\pdffontfileresource\endcsname\relax\else
+ \edef\xpdffontfileresource{\csname\pdffontfileresource\endcsname}%
+ \ifx\xpdffontfileresource\empty \else
+ \startreadingfile
+ \readsysfile{pdfr-\xpdffontfileresource}{}{}%
+ \stopreadingfile
+ \global\@EA\let\csname\pdffontfileresource\endcsname\empty
+ \fi
+ \fi
+ \@EA\ifx\csname\pdffontresource\endcsname\relax\else
+ \expanded{\pdffontattr\font
+ {/ToUnicode \csname\pdffontresource\endcsname\space0 R}}%
+ \fi
+ \global\@EA\let\csname\s!ucmap\fontfile\endcsname\empty
+ \fi\fi}
+
+\endTEX
+
%D For the moment, we keep this definition here, if only
%D because \type {\usepdffontencoding} is not defined in the
diff --git a/tex/context/base/enco-tbo.tex b/tex/context/base/enco-tbo.tex
index ea32a53da..37df4d458 100644
--- a/tex/context/base/enco-tbo.tex
+++ b/tex/context/base/enco-tbo.tex
@@ -142,7 +142,10 @@
\definecharacter yacute 253
\definecharacter thorn 254
\definecharacter ydiaeresis 255
-
+
+\definecharacter leftguillemot 171
+\definecharacter rightguillemot 183
+
\stopencoding
\endinput
diff --git a/tex/context/base/font-ini.tex b/tex/context/base/font-ini.tex
index 3abd84a58..01d879eaa 100644
--- a/tex/context/base/font-ini.tex
+++ b/tex/context/base/font-ini.tex
@@ -27,24 +27,44 @@
\newcounter\pushedfont
-\def\savefont % do we also need to store the encoding ?
+\def\savefont
{\edef\savedfont{\the\font}%
- \pushmacro\savedfont}
+ \pushmacro\savedfont
+ \pushmacro\characterregime
+ \pushmacro\charactermapping
+ \pushmacro\characterencoding}
\def\restorefont%
- {\popmacro\savedfont
+ {\popmacro\characterencoding
+ \popmacro\charactermapping
+ \popmacro\characterregime
+ \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}
% new
\def\dodefinedfont[#1]%
{\iffirstargument\definefont[\string\definedfont][#1]\fi
- \getvalue{\string\definedfont}}
+ \csname\string\definedfont\endcsname}
\def\definedfont%
{\dosingleempty\dodefinedfont}
-%%% message 14 added
+%%% message 14 added
\startmessages dutch library: fonts
title: korps
@@ -73,7 +93,7 @@
8: style -- defined
% 9: mapping -- is loaded
10: unknown font file --
- 14: bodyfont -- is defined (can beter be done global)
+ 14: bodyfont -- is defined (can better be done global)
\stopmessages
\startmessages german library: fonts
@@ -88,7 +108,7 @@
8: Stil -- definiert
% 9: Map -- ist geladen
10: unbekanntes Font --
- 14: bodyfont -- is defined (can beter be done global)
+ 14: Fliesstext -- wurde definiert (besser waere globale Definition)
\stopmessages
\startmessages czech library: fonts
@@ -103,7 +123,7 @@
8: styl -- definovan
% 9: mapovani -- je nacteno
10: neznamy font --
- 14: bodyfont -- is defined (can beter be done global)
+ 14: bodyfont -- is defined (can better be done global)
\stopmessages
\startmessages italian library: fonts
@@ -118,7 +138,7 @@
8: stile -- definito
% 9: mappatura -- caricata
10: file di font sconosciuto --
- 14: bodyfont -- is defined (can beter be done global)
+ 14: corpo del testo -- definito (sarebbe meglio globale)
\stopmessages
\startmessages norwegian library: fonts
@@ -133,7 +153,7 @@
8: stil -- definert
% 9: avbildning -- er lest inn
10: ukjent fontfil --
- 14: bodyfont -- is defined (can beter be done global)
+ 14: bodyfont -- is defined (can better be done global)
\stopmessages
\startmessages romanian library: fonts
@@ -148,7 +168,7 @@
8: stilul -- definit
% 9: maparea -- este incarcat
10: fisier font necunoscut --
- 14: bodyfont -- is defined (can beter be done global)
+ 14: bodyfont -- is defined (can better be done global)
\stopmessages
%D This module is one of the oldest modules of \CONTEXT. The
@@ -468,12 +488,7 @@
\unexpanded\def\mf%
{\dodosetmathfont\fontalternative
- \getvalue{\fontalternative}}
-
-% \unexpanded\def\mf%
-% {\dodosetmathfont\fontalternative
-% \getvalue{\fontalternative}%
-% \fam\getvalue{\fontalternative\s!fam}}
+ \csname\fontalternative\endcsname}
%D The previous example was typeset saying:
%D
@@ -575,6 +590,11 @@
{\normalhbox\bgroup\mf
\dowithnextbox{\box\nextbox\egroup}\normalhbox}
+% to test:
+%
+% \def\normalmbox%
+% {\dowithnextboxcontent{\mf}{\box\nextbox}\normalhbox}
+
\def\mbox%
{\ifmmode\normalmbox\else\normalhbox\fi}
@@ -601,45 +621,49 @@
%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 % 0 (Plain TeX) Math Roman
-\chardef\mifam=1 % 1 (Plain TeX) Math Italic
-\chardef\syfam=2 % 2 (Plain TeX) Math Symbol
-\chardef\exfam=3 % 3 (Plain TeX) Math Extra
+\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.
-%D
-%D \starttypen
-%D \itfam % 4 (Plain TeX) Italic
-%D \slfam % 5 (Plain TeX) Slanted
-%D \bffam % 6 (Plain TeX) Boldface
-%D \stoptypen
-%D
+
+\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.
-%D
-%D \starttypen
-%D \ttfam % 7 (Plain TeX) can be reused!
-%D \stoptypen
-%D
+
+\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 % \newfam\bsfam % 8 (ConTeXt) BoldSlanted
-\chardef\bifam=9 % \newfam\bifam % 9 (ConTeXt) BoldItalic
-\chardef\scfam=10 % \newfam\scfam % A (ConTeXt) SmallCaps
-\chardef\tffam=11 % \newfam\tffam % B (ConTeXt) 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 % \let\nnfam\ttfam % 7 (ReUsed) NoName
+\chardef\nnfam = 7 % (ReUsed) NoName
%D Normally \type{\mrfam} equals \type{\tffam}, but a more
%D distinctive alternatives are possible, for instance the
@@ -650,10 +674,10 @@
%D needed for the \AMS\ Symbol Fonts and Extended Lucida
%D Bright.
-\chardef\mafam=12 % \newfam\mafam % C (ConTeXt) Math A Fam (AmsTeX A)
-\chardef\mbfam=13 % \newfam\mbfam % D (ConTeXt) Math B Fam (AmsTeX B)
-\chardef\mcfam=14 % \newfam\mcfam % E (ConTeXt) Math C Fam (MathTime)
-\chardef\mdfam=15 % \newfam\mdfam % F (ConTeXt) Math D Fam (MathTime)
+\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
@@ -715,13 +739,13 @@
\newif\ifsynchronizemathfonts \synchronizemathfontstrue
\def\synchronizetext % stylish text in mmode
- {\ifsynchronizemathfonts\the\textstrategies\fam\mrfam\fi}
+ {\ifsynchronizemathfonts\the\textstrategies\fam\mrfam\fi}
\def\synchronizemath % math stuff in mmode
{\ifsynchronizemathfonts\the\mathstrategies\fam\mrfam\fi}
-
+
\def\synchronizesymb % stylish math stuff in mmode
- {\ifsynchronizemathfonts\the\symbstrategies\fam\mrfam\fi}
+ {\ifsynchronizemathfonts\the\symbstrategies\fam\mrfam\fi}
%D \macros
%D {textonly}
@@ -743,16 +767,16 @@
\def\dosettextfamily#1%
{\let\savedfontbody\fontbody
\let\fontfamily#1%
- \let\fontbody \scriptscriptface\dodosettextfamily\scriptscriptfont
- \let\fontbody \scriptface \dodosettextfamily \scriptfont
- \let\fontbody \textface \dodosettextfamily \textfont
+ \let\fontbody\scriptscriptface\dodosettextfamily\scriptscriptfont
+ \let\fontbody\scriptface \dodosettextfamily \scriptfont
+ \let\fontbody\textface \dodosettextfamily \textfont
\let\fontbody\savedfontbody}
% \def\s!nullfont{nullfont}
\beginTEX
-\def\dodosettextfamily#1%
+\def\dodosettextfamily#1%
{\@EA\ifx\csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\relax
\@EA\ifx\csname\fontclass\fontbody\c!mm\fontfamily\endcsname \relax
\@EA\ifx\csname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname\relax
@@ -776,16 +800,38 @@
\beginETEX \ifcsname
-\def\dodosettextfamily#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
- \ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
+%\def\dodosettextfamily#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
+% \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\fi\fi\fi\fi
+% #1\csname\fontfamily\s!fam\endcsname\font}
+%
+% slightly faster:
+
+\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
@@ -794,7 +840,20 @@
\ifcsname \fontbody\c!rm\fontfamily\endcsname \autofontsizetrue
\csname \fontbody\c!rm\fontfamily\endcsname \else
\nullfont \autofontsizetrue
- \fi\fi\fi\fi\fi\fi\fi\fi
+ \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}
\endETEX
@@ -825,8 +884,8 @@
\beginTEX
-\def\dodosetmathfamily#1#2%
- {\@EA\ifx \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\relax
+\def\dodosetmathfamily#1#2%
+ {\@EA\ifx \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\relax
\@EA\ifx \csname\fontclass\fontbody\c!mm\fontfamily\endcsname \relax
\@EA\ifx \csname\fontclass\fontbody\backfamily\fontsize\endcsname \relax
\@EA\ifx \csname\fontclass\fontbody\backfamily\endcsname \relax
@@ -849,16 +908,38 @@
\beginETEX \ifcsname
-\def\dodosetmathfamily#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
- \ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse
+%\def\dodosetmathfamily#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
+% \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\fi\fi\fi\fi
+% #1#2\font}
+%
+% sligthly faster:
+
+\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
@@ -867,7 +948,20 @@
\ifcsname \fontbody\backfamily\endcsname \autofontsizetrue
\csname \fontbody\backfamily\endcsname \else
\nullfont \autofontsizetrue
- \fi\fi\fi\fi\fi\fi\fi\fi
+ \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}
\endETEX
@@ -892,7 +986,7 @@
\beginTEX
-\def\dodosetsymbfamily#1#2%
+\def\dodosetsymbfamily#1#2%
{\@EA\ifx\csname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname\relax
\@EA\ifx\csname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname\relax
\else
@@ -1020,7 +1114,7 @@
\def\doresetrelativefontsize%
{\let\dorelativefontsize\norelativefontsize}
-\newdimen\scaledfont
+\newdimen\scaledfont
\def\@fs@{@fs@}
@@ -1031,30 +1125,28 @@
\def\doparsefontspec#1 #2%
{\def\somefontname{#1}%
- \ifx\somefontname\empty % space before fontname
+ \ifx\somefontname\empty % space before fontname
\@EA\doparsefontspec
+ \else\ifx#2\relax
+ \@EAEAEA\setnaturalfontspec
\else
- \ifx#2\relax
- \@EA\@EA\@EA\setnaturalfontspec
- \else
- \@EA\@EA\@EA\setforcedfontspec
- \fi
- \fi
+ \@EAEAEA\setforcedfontspec
+ \fi\fi
#2}
\def\setnaturalfontspec#1]%
{\@fs@scaled\!!thousand}
\def\setforcedfontspec#1 #2\relax]%
- {\getvalue{\@fs@#1}{#2}}
+ {\csname\@fs@#1\endcsname{#2}}
\def\@fs@scaled#1%
{\scaledfont#1pt%
\scaledfont\dorelativefontsize\scaledfont
\ifautofontsize\scaledfont\currentfontbodyscale\scaledfont\fi
- \scratchcounter\scaledfont % \scaledfont is now pretty large
- \advance\scratchcounter \!!medcard
- \divide\scratchcounter \!!maxcard
+ \scratchcounter\scaledfont % \scaledfont is now pretty large
+ \advance\scratchcounter \medcard
+ \divide\scratchcounter \maxcard
\edef\somefontspec{ scaled \the\scratchcounter}}
\def\@fs@at#1%
@@ -1074,56 +1166,8 @@
\def\setsamofontspec#1%
{\checkfontscale#1\end\scaledfont
\scaledfont\dorelativefontsize\scaledfont
- \ifautofontsize
- \def\somefontspec{ at \currentfontbodyscale\scaledfont}%
- \else
- \def\somefontspec{ at \scaledfont}%
- \fi}
-
-% \def\getfontparameters%
-% {\expandafter\setfontparameter\fontdata,]=,}
-%
-% \def\getglobalfontparameters%
-% {\expandafter\setglobalfontparameter\fontdata,]=,}
-%
-% \def\setfontparameter#1=#2,%
-% {\if]#1\else
-% \expandafter\def\csname\fontfile#1\endcsname{#2}%
-% \expandafter\setfontparameter
-% \fi}
-%
-% \def\setglobalfontparameter#1=#2,%
-% {\if]#1\else
-% \expandafter\gdef\csname\fontfile#1\endcsname{#2}%
-% \expandafter\setglobalfontparameter
-% \fi}
-%
-% \def\donoparsefontspec#1%
-% {\edef\fontfile{\truefontname\somefontname}%
-% %\writestatus{specifying}{\somefontname/\fontfile/\somefontspec}%
-% \ifx\fontfile\s!unknown
-% %\writestatus{missing}{\somefontname}%
-% \let\fontfile\defaultfontfile
-% \else
-% \edef\fontdata{\truefontdata\fontfile}%
-% \ifx\fontdata\empty \else
-% %\writestatus{storing}{\fontfile\space(\fontdata)]}%
-% \ifx\fontclass\empty
-% \getfontparameters
-% \else
-% \getglobalfontparameters
-% \fi
-% \fi
-% \fi
-% \edef\lastfontname{\fontfile\somefontspec}% not really needed
-% %\writestatus{tfmloading}{[#1] [\lastfontname][\the\scaledfont]}%
-% \ifx\fontclass\empty\else\global\fi
-% \expandafter\font\csname#1\endcsname\lastfontname\relax
-% \the\everyfont % new
-% % the second \font definition prevents fuzzy font refs
-% % \expandafter\font\csname\dummyfontname\endcsname\lastfontname
-% % but somehow they changed tex so that it does not matter any more
-% \relax}
+ \edef\somefontspec
+ { at \ifautofontsize\currentfontbodyscale\fi\scaledfont}}
\def\getfontparameters%
{\expandafter\setfontparameter\@@fontdata,]=,}
@@ -1146,32 +1190,32 @@
\let\@@fontencoding\empty
\let\@@fontmapping \empty
\let\@@fonthandling\empty
-\let\@@skewchar \empty
-\let\@@hyphenchar \empty % todo, will go to encoding
+\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$\%).
+%D This brings down maps processing from 466 to 309 seconds
+%D ($-33$\%) and mfonts from 42 to 34 seconds ($-15$\%).
\newif\ifskipfontcharacteristics \skipfontcharacteristicstrue
\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
+ \edef\lastfontname{\fontfile\somefontspec}%
+ \ifx\fontclass\empty\else\global\fi
\expandafter\font\csname#1\endcsname\lastfontname\relax
- \the\everyfont
+ %\the\everyfont
\relax}
%D An additional the second \type {\font} definition can
-%D prevent fuzzy font refs
-%D
-%D \starttypen
+%D prevent fuzzy font refs
+%D
+%D \starttypen
%D \expandafter\font\csname\dummyfontname\endcsname\lastfontname
-%D \stoptypen
-%D
+%D \stoptypen
+%D
%D but somehow they changed \TEX\ so that it does not matter
-%D any more.
+%D any more.
\def\defaultfontfile{cmtt10}
\edef\nullfontname {\fontname\nullfont}
@@ -1244,35 +1288,21 @@
%D data: \type {\truefontdata{\truefontname{Lucida-Bright}}}
%D \stopregels
-% \def\definefontsynonym%
-% {\dotripleempty\dodefinefontsynonym}
-%
-% \def\dodefinefontsynonym[#1][#2][#3]%
-% {\ifthirdargument
-% \setevalue{\??ff#1}{#2}%
-% \ifx\fontclass\empty\else\global\fi
-% \setevalue{\??ff\??ff#2}{#3}%
-% \else
-% \setevalue{\??ff\fontclass#1}{#2}%
-% \fi}
-
\def\definefontsynonym%
{\dotripleempty\dodefinefontsynonym}
\def\dodefinefontsynonym[#1][#2][#3]%
- {\ifthirdargument
- \setevalue{\??ff\fontclass#1}{#2}% here fontclass ?
+ {\@EA\edef\csname\??ff\fontclass#1\endcsname{#2}%
+ \ifthirdargument
\edef\@@fontdata{#3}%
\ifx\@@fontdata\empty \else
\edef\@@fontfile{#2}%
- \ifx\fontclass\empty
+ \ifx\fontclass\empty
\getfontparameters
\else
\getglobalfontparameters
\fi
\fi
- \else
- \setevalue{\??ff\fontclass#1}{#2}%
\fi}
\def\setupfontsynonym%
@@ -1280,9 +1310,9 @@
\def\dosetupfontsynonym[#1][#2]%
{\edef\@@fontdata{#2}%
- \ifx\@@fontdata\empty \else
+ \ifx\@@fontdata\empty \else
\edef\@@fontfile{#1}%
- \ifx\fontclass\empty
+ \ifx\fontclass\empty
\getfontparameters
\else
\getglobalfontparameters
@@ -1291,36 +1321,26 @@
\beginTEX
-%\def\truefontdata#1#2% font var
-% {\expandafter\ifx\csname\??ff#1#2\endcsname\relax
-% \expandafter\ifx\csname\??ff\fontclass#1\endcsname\relax
-% \expandafter\ifx\csname\??ff#1\endcsname\relax
-% \else
-% \expandafter\truefontdata\csname\??ff#1\endcsname#2%
-% \fi
-% \else
-% \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
-% \fi
-% \else
-% \csname\??ff#1#2\endcsname
-% \fi}
-
-\def\truefontdata#1#2% font var
- {\expandafter\ifx\csname\??ff#2\endcsname\relax
- \expandafter\ifx\csname\??ff#1#2\endcsname\relax
- \expandafter\ifx\csname\??ff\fontclass#1\endcsname\relax
- \expandafter\ifx\csname\??ff#1\endcsname\relax
+\def\truefontdata#1#2%
+ {\ifx\csname\??ff#1#2\endcsname\relax
+ \ifx\csname\??ff\fontclass#1\endcsname\relax
+ \ifx\csname\??ff#1\endcsname\relax
+ \ifx\csname\??ff#2\endcsname\relax
\else
- \expandafter\truefontdata\csname\??ff#1\endcsname#2%
+ % raw(key)
+ \csname\??ff#2\endcsname
\fi
\else
- \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
+ % exp(Regular) raw(key)
+ \expandafter\truefontdata\csname\??ff#1\endcsname#2%
\fi
\else
- \csname\??ff#1#2\endcsname
+ % exp(palatino Regular) raw(key)
+ \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
\fi
\else
- \csname\??ff#2\endcsname
+ % raw(Regular) raw(key)
+ \csname\??ff#1#2\endcsname\relax
\fi}
\def\truefontname#1%
@@ -1338,24 +1358,19 @@
\beginETEX \ifcsname
-%\def\truefontdata#1#2% font var
-% {\ifcsname\??ff#1#2\endcsname
-% \csname\??ff#1#2\endcsname
-% \else\ifcsname\??ff\fontclass#1\endcsname
-% \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
-% \else\ifcsname\??ff#1\endcsname
-% \expandafter\truefontdata\csname\??ff#1\endcsname#2%
-% \fi\fi\fi}
-
-\def\truefontdata#1#2% font var
- {\ifcsname\??ff#2\endcsname
- \csname\??ff#2\endcsname
- \else\ifcsname\??ff#1#2\endcsname
+\def\truefontdata#1#2%
+ {\ifcsname\??ff#1#2\endcsname
+ % raw(Regular) raw(key)
\csname\??ff#1#2\endcsname
\else\ifcsname\??ff\fontclass#1\endcsname
- \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
+ % exp(palatino Regular) raw(key)
+ \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2%
\else\ifcsname\??ff#1\endcsname
- \expandafter\truefontdata\csname\??ff#1\endcsname#2%
+ % 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%
@@ -1439,9 +1454,10 @@
% \expanded{\getparameters[\@@currentfontfile][\fontdata]}}
\def\getfontfileparameters#1%
- {\edef\currentfontfileencoding{\truefontdata{#1}\s!encoding}%
- \edef\currentfontfilemapping {\truefontdata{#1}\s!mapping }%
- \edef\currentfontfilehandling{\truefontdata{#1}\s!handling}}
+ {\edef\@@truefontname{\truefontname{#1}}%
+ \edef\currentfontfileencoding{\truefontdata\@@truefontname\s!encoding}%
+ \edef\currentfontfilemapping {\truefontdata\@@truefontname\s!mapping }%
+ \edef\currentfontfilehandling{\truefontdata\@@truefontname\s!handling}}
%D \macros
%D {definefont}
@@ -1473,51 +1489,55 @@
\let\lastfontidentifier\empty
+\def\rawfontidentifier{**\lastfontidentifier\fontsize**}
+\def\newfontidentifier{*\fontclass\lastfontidentifier\fontsize*}
+
\def\dododefinefont#1#2%
- {\dosetrelativefontsize{#1}%
- \parsefontspec{#2}{**#1**}%
+ {\edef\lastfontidentifier{#1}%
+ \dosetrelativefontsize\lastfontidentifier
+ \parsefontspec{#2}\rawfontidentifier
\doresetrelativefontsize
- \csname**#1**\endcsname
- \autofontsizefalse
- \edef\lastfontidentifier{#1}%
+ \csname\rawfontidentifier\endcsname
+ \autofontsizefalse
\setfontcharacteristics
\the\everyfontswitch}
-\beginETEX \ifcsname
+\beginTEX
\def\xxdododefinefont#1#2% \autofontsizetrue is set by calling routine
- {\ifcsname*\fontclass#1\fontsize*\endcsname\else
- \dosetrelativefontsize{\fontclass#1}% dangerous with fallback
- \parsefontspec{#2}{*\fontclass#1\fontsize*}%
+ {\edef\lastfontidentifier{#1}%
+ \@EA\ifx\csname\newfontidentifier\endcsname\relax
+ \dosetrelativefontsize{\fontclass\lastfontidentifier}% dangerous with fallback
+ \parsefontspec{#2}\newfontidentifier
\doresetrelativefontsize
\fi
- \csname*\fontclass#1\fontsize*\endcsname
- \autofontsizefalse
- \edef\lastfontidentifier{#1}%
+ \csname\newfontidentifier\endcsname
+ \autofontsizefalse
+ %\edef\lastfontidentifier{#1}%
\ifskipfontcharacteristics \else
\setfontcharacteristics
\the\everyfontswitch
\fi}
+\endTEX
-\endETEX
-
-\beginTEX
+\beginETEX \ifcsname
\def\xxdododefinefont#1#2% \autofontsizetrue is set by calling routine
- {\@EA\ifx\csname*\fontclass#1\fontsize*\endcsname\relax
- \dosetrelativefontsize{\fontclass#1}% dangerous with fallback
- \parsefontspec{#2}{*\fontclass#1\fontsize*}%
+ {\edef\lastfontidentifier{#1}%
+ \ifcsname\newfontidentifier\endcsname\else
+ \dosetrelativefontsize{\fontclass\lastfontidentifier}% dangerous with fallback
+ \parsefontspec{#2}\newfontidentifier
\doresetrelativefontsize
\fi
- \csname*\fontclass#1\fontsize*\endcsname
- \autofontsizefalse
- \edef\lastfontidentifier{#1}%
+ \csname\newfontidentifier\endcsname
+ \autofontsizefalse
+ %\edef\lastfontidentifier{#1}%
\ifskipfontcharacteristics \else
\setfontcharacteristics
\the\everyfontswitch
\fi}
-\endTEX
+\endETEX
%D I considered checking for mistakenly use of \PLAIN's
%D \type{\magstep}'s but although it would take only a few
@@ -1589,7 +1609,7 @@
%D \type{12ptrmtf} as argument, we get \getfontname{12ptrmtf}.
\def\getfontname#1%
- {\getvalue{\??ft#1}}
+ {\csname\??ft#1\endcsname}
%D To be documented.
@@ -1623,7 +1643,7 @@
\beginTEX
-\def\currentfontscale%
+\def\currentfontscale
{\@EA\ifx\csname\??ft\s!default\xfontsize\endcsname\relax
\@EA\ifx\csname\??ft\s!default\s!text\endcsname\relax
1%
@@ -1634,7 +1654,7 @@
\csname\??ft\s!default\xfontsize\endcsname
\fi}
-\def\currentfontbodyscale%
+\def\currentfontbodyscale
{\@EA\ifx\csname\??ft\s!default\fontsize\endcsname\relax
\@EA\ifx\csname\??ft\s!default\s!text\endcsname\relax
1%
@@ -1649,26 +1669,40 @@
\beginETEX \ifcsname
-\def\currentfontscale%
- {\ifcsname\??ft\s!default\xfontsize\endcsname
- \csname\??ft\s!default\xfontsize\endcsname
- \else\ifcsname\??ft\s!default\s!text\endcsname
- \csname\??ft\s!default\s!text\endcsname
- \else
- 1%
- \fi\fi}
+% \def\currentfontscale%
+% {\ifcsname\??ft\s!default\xfontsize\endcsname
+% \csname\??ft\s!default\xfontsize\endcsname
+% \else\ifcsname\??ft\s!default\s!text\endcsname
+% \csname\??ft\s!default\s!text\endcsname
+% \else
+% 1%
+% \fi\fi}
+%
+% \def\currentfontbodyscale%
+% {\ifcsname\??ft\s!default\fontsize\endcsname
+% \csname\??ft\s!default\fontsize\endcsname
+% \else\ifcsname\??ft\s!default\s!text\endcsname
+% \csname\??ft\s!default\s!text\endcsname
+% \else
+% 1%
+% \fi\fi}
-\def\currentfontbodyscale%
- {\ifcsname\??ft\s!default\fontsize\endcsname
- \csname\??ft\s!default\fontsize\endcsname
- \else\ifcsname\??ft\s!default\s!text\endcsname
- \csname\??ft\s!default\s!text\endcsname
- \else
- 1%
- \fi\fi}
+\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}
\endETEX
+\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}.
@@ -1745,20 +1779,20 @@
\def\@@beginfontdef%
{\ifcase\@@fontdefhack
- \let\k!savedtext =\k!text \let\k!text =\s!text
- \let\k!k!savedtext =\k!k!text \def\k!k!text {1}%
- \let\k!saveddefault =\k!default \let\k!default =\s!default
- \let\k!k!saveddefault=\k!k!default \def\k!k!default {1}%
+ \let\k!savedtext \k!text \let\k!text \s!text
+ \let\k!k!savedtext \k!k!text \def\k!k!text {1}%
+ \let\k!saveddefault \k!default \let\k!default \s!default
+ \let\k!k!saveddefault\k!k!default \def\k!k!default {1}%
\fi
- \advance\@@fontdefhack by 1 }
+ \advance\@@fontdefhack 1 }
\def\@@endfontdef%
- {\advance\@@fontdefhack by -1
+ {\advance\@@fontdefhack -1
\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
+ \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%
@@ -1779,10 +1813,10 @@
\def\dododefinebodyfontenvironment[#1][#2][#3]% size class settings
{\@@beginfontdef
- \doifundefined{\??ft#2#1\c!em} % \s!text goes wrong in testing because
+ \doifundefined{\??ft#2#1\c!em} % \s!text goes wrong in testing because
{\def\docommando##1% % the 12pt alternative will called when
- {\scratchdimen=#1\relax % typesetting the test (or so)
- \scratchdimen=\getvalue{\??ft\s!default##1}\scratchdimen
+ {\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}}%
\processcommalist
@@ -1794,34 +1828,34 @@
% \@@beginfontdef
\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
+ % 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
+ % so far
\setvalue{\@size@#1}{\docompletefontswitch[#1]}}
-%D {\bf Remark:} We need to cover the following cases,
+%D {\bf Remark:} We need to cover the following cases,
%D otherwise users can get confused:
-%D
+%D
%D \starttypen
%D \setupbodyfont[23pt]
-%D
+%D
%D \definebodyfontenvironment[23pt]
%D \setupbodyfont[23pt]
-%D
+%D
%D \definebodyfontenvironment[23pt]
%D \definebodyfont[23pt][rm,ss,tt][default]
%D \setupbodyfont[23pt]
-%D \stoptypen
+%D \stoptypen
-%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 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.
+%D environment at the outer level.
\def\checkbodyfontenvironment[#1]%
{\definebodyfontenvironment[\fontclass][#1][]}
@@ -1883,10 +1917,10 @@
%D
%D \showsetup{\y!definebodyfont}
%D
-%D This commands takes three arguments: a (series of) bodyfont
+%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 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
@@ -1989,7 +2023,7 @@
\processcommalist[#1]{\dododefinebodyfont{#2}{#3}}}
{% [12pt] [style] [identifier]
\dodefinedefaultbodyfont[#1][#2][#3]}} % body style identifier
- {% [identifier] [style] [settings] % see ***
+ {% [identifier] [style] [settings] % see ***
\setvalue{\s!default#1#2}##1##2{\expanded{\xdodefinebodyfont[##1][##2][#3]}}}%
\else\ifsecondargument
\definebodyfont[#1][\c!rm][#2]%
@@ -2000,7 +2034,7 @@
{\definebodyfont[#1][\c!rm][]}% make sure some basics are set up.
\fi\fi}
-% nested
+% nested
%
% \def\xdodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier
% {%\writestatus{[#1]}{[#2][#3]}%
@@ -2014,7 +2048,7 @@
% {% [identifier] [style] [settings]
% \setvalue{\s!default#1#2}##1##2{\expanded{\xdodefinebodyfont[##1][##2][#3]}}}}
%
-% faster
+% faster
\def\xdodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier
{%\writestatus{[#1]}{[#2][#3]}%
@@ -2061,23 +2095,23 @@
\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
+ {\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
+ \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 {#3}}% \rmx
- \unexpanded\setgvalue{#2\c!xx}{\setcurrentfontxxstylealternative {#3}}% \rmxx
+ \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}
-
+
\def\dodefinedefaultbodyfont[#1][#2][#3]% sizes styles identifier
{\def\dododefinedefaultbodyfont##1%
{\def\dodododefinedefaultbodyfont####1%
@@ -2097,21 +2131,20 @@
\newif\ifdefiningunknownfont
\def\defineunknownfont#1%
- {\let\c!savedtext=\c!text
- \let\c!text=\s!text
+ {\let\c!savedtext\c!text
+ \let\c!text\s!text
\donefalse
\def\docommando##1%
{\doifdefined{\??ft\s!default##1}
{\donetrue
\scratchdimen=#1\relax
- \scratchdimen=\getvalue{\??ft\s!default##1}\scratchdimen
- %\setevalue{\??ft#1##1}{\the\scratchdimen}}}%
+ \scratchdimen=\csname\??ft\s!default##1\endcsname\scratchdimen
\normalizebodyfontsize\scratchdimen\to\!!stringa
\letvalue{\??ft#1##1}\!!stringa}}%
\processcommalist
[\s!text,\s!script,\s!scriptscript,\c!x,\c!xx,\c!groot,\c!klein]
\docommando
- \let\c!text=\c!savedtext
+ \let\c!text\c!savedtext
\ifdone
\donefalse
\def\defineunknownbodyfont##1% see ***
@@ -2136,7 +2169,7 @@
\fi
\fi
\ifdone
- \showmessage{\m!fonts}{14}{#1}%
+ \showmessage{\m!fonts}{14}{#1}%
\fi
\fi}
@@ -2231,7 +2264,7 @@
%D often not the way users specify the bodyfont size. Therefore
%D we also store the normalized value.
-\chardef\fontdigits=1 %
+\chardef\fontdigits=1
\def\donormalizedbodyfontsize#1.#2#3#4\to#5%
{\edef#5%
@@ -2283,11 +2316,11 @@
\def\resetfontdefinitionfile[#1]%
{\letbeundefined{\c!file\f!fontprefix#1}}
-\newif\ifloadfontdefinitionfileonce
+\newif\ifloadfontfileonce
-\def\doreadfontdefinitionfile#1#2% #1 = set/switch state
+\def\doreadfontdefinitionfile#1#2% #1 = set/switch state
{\doifundefined{\c!file\f!fontprefix#2}%
- {\ifloadfontdefinitionfileonce
+ {\ifloadfontfileonce
\letvalue{\c!file\f!fontprefix#2}\empty
\fi
\startreadingfile
@@ -2299,7 +2332,7 @@
{\showmessage{\m!fonts}{3}{#2}}}%
\stopreadingfile}}
-%D When \type {\loadfontdefinitionfiletrue}, such files are
+%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
@@ -2317,8 +2350,7 @@
{\getvalue{\@size@#1}%
\localbodyfontsize=#1\relax
\normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize
-\checkbodyfontenvironment[\normalizedbodyfontsize]% added
- }% \the\everybodyfont}
+ \checkbodyfontenvironment[\normalizedbodyfontsize]}
{\showmessage{\m!fonts}{4}{#1}}}
\unprotected \def\doswitchstyle[#1]%
@@ -2392,7 +2424,7 @@
%D handle changes in size as well as returning to the global
%D bodyfont size.
-\def\dosetfont#1#2% #1 = set/switch state
+\def\dosetfont#1#2% #1 = set/switch state
{\doifelse{#2}{\v!globaal}
{\restoreglobalbodyfont}
{\processcommalist[#2]{\dodosetfont{#1}}% ##1 get also passed
@@ -2402,10 +2434,10 @@
\fi}%
\chardef\currentxfontsize=0\relax}
-\def\dodosetfont#1#2% #1 = set/switch state
+\def\dodosetfont#1#2% #1 = set/switch state
{\dododosetfont{#1}{#2}{\showmessage{\m!fonts}{4}{#2}}}
-\def\dododosetfont#1#2#3% #1 = set/switch state
+\def\dododosetfont#1#2#3% #1 = set/switch state
{\doifnumberelse{#2}
{\scratchdimen=#2\relax
\normalizebodyfontsize\scratchdimen\to\normalizedsetfont
@@ -2435,7 +2467,7 @@
%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
+\def\dosetsubstitutefont#1#2% #1 = set/switch state
{\scratchdimen=#2\relax
\advance\scratchdimen by .499pt
\dimensiontocount\scratchdimen\scratchcounter
@@ -2474,41 +2506,41 @@
% 0=never 1=everymath 2=always
-\chardef\synchronizebigmathflag =1
+\chardef\synchronizebigmathflag =1
-\appendtoks
+\appendtoks
\ifcase\synchronizebigmathflag
- % never
- \or
+ % never
+ \or
\synchronizebigmath
- \or
- % always
+ \or
+ % always
\fi
\to \everymath
\def\nobigmath{\chardef\synchronizebigmathflag =0 }
\def\bigmath {\chardef\synchronizebigmathflag =2 \synchronizebigmath}
-\let\bigmathfontsize\empty
+\let\bigmathfontsize\empty
\def\synchronizebigmath%
- {\ifx\bigmathfontsize\fontsize
- % already in sync
+ {\ifx\bigmathfontsize\fontsize
+ % already in sync
\else
- \let\bigmathfontsize\fontsize
+ \let\bigmathfontsize\fontsize
\synchronizemath \synchronizetext
\fi}
\def\checkbigmathsynchronization
{\ifcase\synchronizebigmathflag
- % never
+ % never
\or
- \ifmmode \synchronizebigmath \fi
+ \ifmmode \synchronizebigmath \fi
\or
\synchronizebigmath
\fi}
-%D So far for synchronisation.
+%D So far for synchronisation.
\def\dosetcurrentfontsize#1%
{\edef\fontsize{#1}%
@@ -2516,7 +2548,7 @@
\def\dosetcurrentfontalternative#1%
{\edef\fontalternative{#1}%
- \ifmmode % maybe no test, or actually, an option
+ \ifmmode % maybe no test, or actually, an option
\fam\csname\fontalternative\s!fam\endcsname
\fi}
@@ -2536,7 +2568,7 @@
\def\setcurrentfontstyle#1%
{%\message{[3 #1]}%
\edef\fontstyle{#1}%
- \ifmmode\mr\fi % otherwise \rm not downward compatible
+ \ifmmode\mr\fi % otherwise \rm not downward compatible
\synchronizefont}
\def\setcurrentfontbodyalternative#1#2%
@@ -2584,87 +2616,75 @@
%D Some day we will.
\newtoks\fontstrategies
+\newif\iftryingfont
-\def\synchronizefont%
- {\let\fontstrategy\dofontstrategy
- \the\fontstrategies
- \ifskipfontcharacteristics
+\def\synchronizefont
+ {\tryingfonttrue
+ \ifx\fontclass\empty\else
+ \let\fontstrategy\dofontclassstrategy
+ \the\fontstrategies \relax % \relax still needed ?
+ \fi
+ \iftryingfont
+ \let\fontstrategy\dofontstrategy
+ \the\fontstrategies \relax % \relax still needed ?
+ \fi
+ \ifskipfontcharacteristics
\setfontcharacteristics
- \the\everyfontswitch
+ \the\everyfontswitch
\fi}
\beginTEX
-\def\dofontstrategy#1#2#3#4#5#6%
- {\expandafter\ifx\csname#2#3#4#5#6\endcsname\relax\else
- #1\csname#2#3#4#5#6\endcsname
- \let\fontstrategy\gobblesixarguments
+\def\dofontstrategy#1#2#3#4#5%
+ {\@EA\ifx\csname#2#3#4#5\endcsname\relax\else
+ #1\csname#2#3#4#5\endcsname \tryingfontfalse
+ \fi}
+
+\def\dofontclassstrategy#1#2#3#4#5%
+ {\@EA\ifx\csname\fontclass#2#3#4#5\endcsname\relax\else
+ #1\csname\fontclass#2#3#4#5\endcsname \tryingfontfalse
\fi}
\endTEX
\beginETEX \ifcsname
-\def\dofontstrategy#1#2#3#4#5#6%
- {\ifcsname#2#3#4#5#6\endcsname
- #1\csname#2#3#4#5#6\endcsname
- \let\fontstrategy\gobblesixarguments
+\def\dofontstrategy#1#2#3#4#5%
+ {\ifcsname#2#3#4#5\endcsname
+ #1\csname#2#3#4#5\endcsname \tryingfontfalse
\fi}
-\endETEX
-
-% font class
-
-\appendtoks \fontstrategy \autofontsizefalse % --- --- --- --- % pt tt bf a
- \fontclass \fontbody \fontstyle \fontalternative \fontsize
-\to \fontstrategies
-
-\appendtoks \fontstrategy \autofontsizetrue % --- --- --- def % pt tt bf
- \fontclass \fontbody \fontstyle \fontalternative \defaultfontsize
-\to \fontstrategies
-
-\appendtoks \fontstrategy \autofontsizetrue % --- --- def --- % pt tt tf a
- \fontclass \fontbody \fontstyle \defaultfontalternative \fontsize
-\to \fontstrategies
-
-\appendtoks \fontstrategy \autofontsizetrue % --- --- def def % pt tt tf
- \fontclass \fontbody \fontstyle \defaultfontalternative \defaultfontsize
-\to \fontstrategies
-
-\appendtoks \fontstrategy \autofontsizefalse % --- def def def % pt rm tf
- \fontclass \fontbody \defaultfontstyle \defaultfontalternative \defaultfontsize
-\to \fontstrategies
-
-\appendtoks \fontstrategy \autofontsizetrue % def def def def % rm tf
- \fontclass \defaultfontbody \defaultfontstyle \defaultfontalternative \defaultfontsize
-\to \fontstrategies
-
-% no font class
+\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 \fontstrategy \autofontsizefalse % --- --- --- --- % pt tt bf a
- \empty \fontbody \fontstyle \fontalternative \fontsize
-\to \fontstrategies
+\endETEX
-\appendtoks \fontstrategy \autofontsizetrue % --- --- --- def % pt tt bf
- \empty \fontbody \fontstyle \fontalternative \defaultfontsize
-\to \fontstrategies
+\appendtoks \iftryingfont \fontstrategy \autofontsizefalse % --- --- --- --- % pt tt bf a
+ \fontbody \fontstyle \fontalternative \fontsize
+\fi \to \fontstrategies
-\appendtoks \fontstrategy \autofontsizetrue % --- --- def --- % pt tt tf a
- \empty \fontbody \fontstyle \defaultfontalternative \fontsize
-\to \fontstrategies
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- --- def % pt tt bf
+ \fontbody \fontstyle \fontalternative \defaultfontsize
+\fi \to \fontstrategies
-\appendtoks \fontstrategy \autofontsizetrue % --- --- def def % pt tt tf
- \empty \fontbody \fontstyle \defaultfontalternative \defaultfontsize
-\to \fontstrategies
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- def --- % pt tt tf a
+ \fontbody \fontstyle \defaultfontalternative \fontsize
+\fi \to \fontstrategies
-\appendtoks \fontstrategy \autofontsizefalse % --- def def def % pt rm tf
- \empty \fontbody \defaultfontstyle \defaultfontalternative \defaultfontsize
-\to \fontstrategies
+\appendtoks \iftryingfont \fontstrategy \autofontsizetrue % --- --- def def % pt tt tf
+ \fontbody \fontstyle \defaultfontalternative \defaultfontsize
+\fi \to \fontstrategies
-\appendtoks \fontstrategy \autofontsizetrue % def def def def % rm tf
- \empty \defaultfontbody \defaultfontstyle \defaultfontalternative \defaultfontsize
-\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
@@ -2699,7 +2719,7 @@
\def\dosetcurrentfontxxxalternative#1#2#3#4%
{\chardef\currentxfontsize=#2
\ifmmode
- #4%
+ #4%
\else\ifcsname\bodyfontvariable{\normalizedbodyfontsize#3}\endcsname
\setcurrentfontbodyalternative{\bodyfontcsname\normalizedbodyfontsize#3\endcsname}{#1}%
\fi\fi}
@@ -2716,10 +2736,10 @@
\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.
+% we keep it there. We can speed it up when needed.
-\def\setcurrentfontxstylealternative #1{\getvalue{#1}\tfx}
-\def\setcurrentfontxxstylealternative#1{\getvalue{#1}\tfxx}
+\def\setcurrentfontxstylealternative #1{\csname#1\endcsname\tfx}
+\def\setcurrentfontxxstylealternative#1{\csname#1\endcsname\tfxx}
%D These macros also show us that when we call for \type{\tx},
%D this macro is redefined to be \type{\txx}. Therefore calls
@@ -2770,7 +2790,7 @@
% check kan hier
\def\docommando##1%
{\setvalue{\@shortstyle@##1}{#2}%
- \setvalue{\@style@##1}{\getvalue{#2}}}%
+ \setvalue{\@style@##1}{\csname#2\endcsname}}%
\processcommalist[#1]\docommando}
\def\definefontstyle%
@@ -2872,9 +2892,9 @@
\globalbodyfontsize=\localbodyfontsize
\normalizebodyfontsize\globalbodyfontsize\to\normalizedglobalbodyfontsize
\let\globalfontstyle=\fontstyle
-\ifloadingfonts\else
- \the\everybodyfont
- \fi }} % indeed needed in case \dosetfont is not executed
+ \ifloadingfonts\else
+ \the\everybodyfont % indeed needed in case \dosetfont is not executed
+ \fi}}
\unexpanded\def\switchtobodyfont[#1]%
{\doifsomething{#1}
@@ -2884,6 +2904,41 @@
{\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.
+
+\beginTEX
+
+\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}
+
+\endTEX
+
+\beginETEX \ifcsname
+
+\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}
+
+\endETEX
+
%D Because the last macro can appear in arguments or be assigned
%D to parameters, we protect this one for unwanted expansion.
@@ -2892,9 +2947,9 @@
% \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}
+ \textfont \mrfam\textfont \mffam
+ \scriptfont \mrfam\scriptfont \mffam
+ \scriptscriptfont\mrfam\scriptscriptfont\mffam}
\def\domffam#1%
{\csname\ifundefined{#1\s!fam}\c!nn\else#1\fi\s!fam\endcsname}
@@ -2908,35 +2963,57 @@
%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\@@fontencoding{\truefontdata\fontfile \s!encoding}%
+ \edef\@@fontmapping {\truefontdata\fontfile \s!mapping }%
+ \edef\@@fonthandling{\truefontdata\somefontname\s!handling}%
\edef\@@fontskewchar{\truefontdata\fontfile \s!skewchar}}
+% \def\setfontcharacteristics%
+% {\updatefontparameters
+% \enableencoding
+% [\ifx\@@fontencoding\empty
+% \s!default
+% \else
+% \@@fontencoding
+% \fi]%
+% \enablemapping
+% [\ifx\@@fontmapping\empty
+% \ifx\@@fontencoding\empty
+% \s!default
+% \else
+% \@@fontencoding
+% \fi
+% \else
+% \@@fontmapping
+% \fi]%
+% \enablehandling
+% [\ifx\@@fonthandling\empty
+% \s!default
+% \else
+% \@@fonthandling
+% \fi][\lastfontidentifier]}
+
\def\setfontcharacteristics%
{\updatefontparameters
- \enableencoding
- [\ifx\@@fontencoding\empty
- \s!default
- \else
- \@@fontencoding
- \fi]%
- \enablemapping
- [\ifx\@@fontmapping\empty
+ \fastenableencoding
+ {\ifx\@@fontencoding\empty
+ \s!default \else \@@fontencoding
+ \fi}%
+ \fastenablemapping
+ {\ifx\@@fontmapping\empty
\ifx\@@fontencoding\empty
- \s!default
- \else
- \@@fontencoding
+ \s!default \else \@@fontencoding
\fi
\else
\@@fontmapping
- \fi]%
- \enablehandling
- [\ifx\@@fonthandling\empty
- \s!default
- \else
- \@@fonthandling
- \fi][\lastfontidentifier]}
+ \fi}%
+ \fastenablehandling
+ {\ifx\@@fonthandling\empty
+ \s!default \else \@@fonthandling
+ \fi}%
+ {\lastfontidentifier}%
+ \the\everyfont
+ \synchronizepatterns}
%D The next auxilliary macro is an alternative to \type
%D {\fontname}.
@@ -2965,7 +3042,7 @@
\def\complexswitchstyleonly[#1]% todo : check
{\setcurrentfontstyle{\getvalue{\@shortstyle@#1}}%
- \the\everybodyfont} % needed ?
+ \the\everybodyfont} % needed ?
%D \macros
%D {os}
@@ -3060,14 +3137,36 @@
\let\mainfontclass\empty
-\def\restoreglobalbodyfont%
- {\let\fontsize=\empty
+\def\fullrestoreglobalbodyfont
+ {\let\fontsize\empty
\let\fontclass\globalfontclass
- \doswitchstyle[\globalfontstyle]%
\doswitchpoints[\normalizedglobalbodyfontsize]%
+ \doswitchstyle[\globalfontstyle]%
\redoconvertfont % just in case a pagebreak occurs
\tf \the\everybodyfont}
+\def\partialrestoreglobalbodyfont
+ {\let\fontsize\empty
+ \redoconvertfont
+ \tf}
+
+\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
@@ -3190,31 +3289,50 @@
%D \type{\noconvertfont}. In nested calls, we can restore the
%D conversion by saying \type{\redoconvertfont}.
-\unexpanded\def\dodoconvertfont#1#2%
- {\doifdefinedelse{\@letter@#1}
- {\doifelsenothing{#1}
- {\let\next=\empty}
- {\def\next{\getvalue{\@letter@#1}}}}
- {\doifdefinedelse{#1}
- {\def\next{\getvalue{#1}}}
- {\def\next{#1}}}%
- \next{#2}}
+% \unexpanded\def\dodoconvertfont#1#2%
+% {\doifdefinedelse{\@letter@#1}
+% {\doifelsenothing{#1}
+% {\let\next\empty}
+% {\def\next{\getvalue{\@letter@#1}}}}
+% {\doifdefinedelse{#1}
+% {\def\next{\getvalue{#1}}}
+% {\def\next{#1}}}%
+% \next{#2}}
+%
+% \let\doconvertfont=\dodoconvertfont
+%
+% \def\noconvertfont#1#2%
+% {\doifdefinedelse{\@noletter@#1}
+% {\doifelsenothing{#1}
+% {\let\next\empty}
+% {\def\next{\getvalue{\@noletter@#1}}}}
+% {\def\next{#1}}%
+% \next{#2}}
+
+\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%
+\def\noconvertfont#1% #2%
{\doifdefinedelse{\@noletter@#1}
- {\doifelsenothing{#1}
- {\let\next=\empty}
- {\def\next{\getvalue{\@noletter@#1}}}}
- {\def\next{#1}}%
- \next{#2}}
+ {\doifelsenothing{#1}\gobbleoneargument\@@donoconvertfont}
+ {\firstofoneargument}%
+ {#1}} % {#2}}
+
+%D Extras:
\unexpanded\def\dontconvertfont%
- {\let\doconvertfont=\noconvertfont}
+ {\let\doconvertfont\noconvertfont}
\unexpanded\def\redoconvertfont%
- {\let\doconvertfont=\dodoconvertfont}
+ {\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
@@ -3292,7 +3410,7 @@
\let\setemphasisboldface\relax
\unexpanded\def\bf%
{%\relax
- \let\bf\relax % new
+ \let\bf\relax % new
\ifx\fontalternative\c!it % \ifnum\fam=\itfam
\bi
\else\ifx\fontalternative\c!sl % \ifnum\fam=\slfam
@@ -3337,7 +3455,7 @@
\def\dododoemphasiscorrection%
{\scratchskip=\lastskip
- \ifdim\scratchskip=\!!zeropoint\relax
+ \ifdim\scratchskip=\zeropoint\relax
\/\relax
\else
\unskip\/\hskip\scratchskip
@@ -3483,13 +3601,13 @@
%D \starttypen
%D \getglyph{fontname}{character}
%D \stoptypen
-%D
+%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.
+%D definitions.
\def\fontstringA%
{\ifx\fontstyle\c!rm \s!Serif \else
@@ -3528,7 +3646,7 @@
\endETEX
-\beginTEX \ifcsname
+\beginTEX
\def\glyphfontfile#1%
{#1%
@@ -3545,13 +3663,32 @@
\endTEX
-\def\symbolicfont#1% see cont-log.tex for example usage
- {\definedfont[\glyphfontfile{#1} sa *]}
+%D For an example of usage of the following command,
+%D see \type {cont-log.tex}.
+%D
+%D \starttypen
+%D \def\symbolicfont#1%
+%D {\definedfont[\glyphfontfile{#1} sa *]}
+%D \stoptypen
+%D
+%D Since we know what scaling it to be applied, we can
+%D implement a much faster alternative:
+
+\def\symbolicfont#1%
+ {\scaledfont\fontbody
+ \font\definedfont\truefontname{\glyphfontfile{#1}} at
+ \currentfontbodyscale\scaledfont
+ \definedfont}
+
+\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}}
-\def\getglyph#1#2%
- %{{\definefont[\s!dummy][\glyphfontfile{#1} sa \currentfontscale]\dummy#2}}
- %{{\definefont[\s!dummy][\glyphfontfile{#1} sa *]\dummy#2}}
- {{\symbolicfont{#1}#2}}
+\def\getrawglyph#1#2% for simple symbols
+ {{\scaledfont\fontbody
+ \font\definedfont=#1 at \currentfontbodyscale\scaledfont
+ \definedfont#2}}
%D The last implementation of \type {\getglyph} permits
%D definitions like:
@@ -3654,34 +3791,28 @@
%D hexadecimal format. Next we set the height of the accented
%D character to the natural height of the character.
-\def\dodosmashaccent#1%
- {\bgroup
- \setbox0=\hbox{#1}%
- \setbox2=\hbox{\normalaccent\scratchcounter#1}%
- \ht2=\ht0\box2
- \egroup
- \nobreak}
-
-\def\dosmashaccent%
- {\afterassignment\dodosmashaccent\expandafter\scratchcounter}
-
-\def\smashaccent%
+\def\smashaccent#1%
{\dontleavehmode
- \let\accent=\dosmashaccent}
+ \bgroup
+ \setbox\scratchbox\hbox{#1}%
+ \ifdim\ht\scratchbox>\strutheight \ht\scratchbox\strutheight \fi
+ \ifdim\dp\scratchbox>\strutdepth \dp\scratchbox\strutdepth \fi
+ \box\scratchbox
+ \egroup}
%D For instance we can say:
%D
%D \starttypen
-%D \smashaccent\"Uberhaupt
+%D \smashaccent{\"Uberhaupt}
%D \stoptypen
%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\"Uberhaupt}\quad
+%D {\ruledhbox{\smashaccent{\"U}berhaupt}\quad
%D oder\quad
-%D \ruledhbox{\"Uberhaupt}}
+%D \ruledhbox{\"Uberhaupt}
%D \macros
%D {moveaccent}
@@ -3689,34 +3820,25 @@
%D Exact positioning of accents can be realized by saying:
%D
%D \starttypen
-%D \moveaccent{-.1ex}\"uberhaupt
+%D \moveaccent{-.1ex}{\"u}berhaupt
%D \stoptypen
%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 {\ruledhbox{\moveaccent{-.1ex}{\"}Uberhaupt}\quad
%D oder\quad
%D \ruledhbox{\"Uberhaupt}}
-\def\dodomoveaccent#1%
- {\bgroup
- \dimen0=\fontdimen5\font
- \dimen2=\dimen0
- \advance\dimen2 by -\accentdisplacement
- \fontdimen5\font=\dimen2
- \normalaccent\scratchcounter#1\relax
- \fontdimen5\font=\dimen0
- \egroup}
-
-\def\domoveaccent%
- {\afterassignment\dodomoveaccent\expandafter\scratchcounter}
-
-\def\moveaccent#1%
- {\dontleavehmode
- \def\accentdisplacement{#1}%
- \let\accent=\domoveaccent}
+\def\moveaccent#1#2%
+ {\smashaccent
+ {\dimen0=\fontdimen5\font
+ \dimen2=\dimen0
+ \advance\dimen2 -#1%
+ \fontdimen5\font\dimen2
+ #2\relax
+ \fontdimen5\font\dimen0}}
%D Personally I think that using \TEX\ is complicated by the
%D way fonts are handled. Apart from the many encodings, we
@@ -3744,12 +3866,12 @@
\c!b=1.440,
\c!c=1.728,
\c!d=2.074,
- *=\currentfontscale, % wildcard
+ *=\currentfontscale, % wildcard
\c!x=0.8,
\c!xx=0.6,
\c!groot=1.2,
\c!klein=0.8,
- \c!interlinie=,
+ \c!interlinie=,
\c!em=\v!schuin]
\definebodyfontenvironment
@@ -3932,7 +4054,7 @@
%D
%D New or old?
-% tzt proper \define...
+% tzt proper \define...
\def\tfmath{\tf\mf\synchronizesymb}
\def\bfmath{\bf\mf\synchronizesymb}
diff --git a/tex/context/base/font-run.tex b/tex/context/base/font-run.tex
index 26f224d91..0ed13e09e 100644
--- a/tex/context/base/font-run.tex
+++ b/tex/context/base/font-run.tex
@@ -178,11 +178,11 @@
\stopoverlay
\nointerlineskip
\vskip2pt
- \edef\ascii
- {name:~{\black\fontname\font}\quad
- encoding:~{\black\currentencoding}\quad
- mapping:~{\black\currentmapping}\quad
- handling:~{\black\fonthandling}}%
+ \edef\ascii % \noexpand needed for non etex
+ {name:~{\noexpand\black\fontname\font}\quad
+ encoding:~{\noexpand\black\currentencoding}\quad
+ mapping:~{\noexpand\black\currentmapping}\quad
+ handling:~{\noexpand\black\fonthandling}}%
\tf\hbox to 40em
{\blue\hfill\tinyfont\setstrut\strut\ascii}
\egroup
diff --git a/tex/context/base/hand-ini.tex b/tex/context/base/hand-ini.tex
index e41a2f209..74f3073b6 100644
--- a/tex/context/base/hand-ini.tex
+++ b/tex/context/base/hand-ini.tex
@@ -83,8 +83,8 @@
\else
- \def\enableprotruding {\pdfprotrudechars=2 }
- \def\disableprotruding{\pdfprotrudechars=0 }
+ \def\enableprotruding {\pdfprotrudechars2\relax}
+ \def\disableprotruding{\pdfprotrudechars0\relax}
\appendtoks \disableprotruding \to \everyforgetall % Here or not here?
@@ -202,28 +202,119 @@
\def\enablehandling%
{\dodoubleempty\doenablehandling}
+%\def\doenablehandling[#1][#2]% handling / symbolic fontname
+% {\doifdefinedelse{\@fha@\@fha@#1}%
+% {\setprotrudingfactor
+% {\getvalue{\@fha@\@fha@#1\c!links}}
+% {\getvalue{\@fha@\@fha@#1\c!rechts}}%
+% \edef\fonthandling{\getvalue{\@fha@\@fha@#1}}%
+% \checkfonthandling{#2}%
+% \@EA\rawprocesscommalist\@EA[\fonthandling]\dodoenablehandling
+% \registerfonthandling{#2}}
+% {\edef\fonthandling{#1}% new
+% \dodoenablehandling{#1}}}
+%
+%\def\dodoenablehandling#1% weg met die @EA
+% {\doifdefined{\@fha@#1}{\@EA\the\csname\@fha@#1\endcsname}}
+%
+%\def\checkfonthandling#1%
+% {\doifelsevalue{#1\s!handling\c!file}{\purefontname\font}
+% \skipprotrudingdeftrue\skipprotrudingdeffalse}
+%
+%\def\registerfonthandling#1%
+% {%\ifskipprotrudingdef\else\message{#1->#2->\purefontname\font}\wait\fi
+% \setxvalue{#1\s!handling\c!file}{\purefontname\font}}
+%
+%\def\registerfonthandling#1%
+% {%\ifskipprotrudingdef\else\message{#1->#2->\purefontname\font}\wait\fi
+% \setxvalue{#1\s!handling\c!file}{\purefontname\font}}
+
\def\doenablehandling[#1][#2]% handling / symbolic fontname
- {\doifdefinedelse{\@fha@\@fha@#1}%
- {\setprotrudingfactor
- {\getvalue{\@fha@\@fha@#1\c!links}}
- {\getvalue{\@fha@\@fha@#1\c!rechts}}%
- \edef\fonthandling{\getvalue{\@fha@\@fha@#1}}%
- \checkfonthandling{#2}%
- \@EA\rawprocesscommalist\@EA[\fonthandling]\dodoenablehandling
- \registerfonthandling{#2}}
- {\edef\fonthandling{#1}% new
- \dodoenablehandling{#1}}}
+ {\fastenablehandling{#1}{#2}} % for the moment the same as:
+
+% fast one for font switch:
+
+% \def\fastenablehandling#1#2%
+% {\@EA\ifx\csname\@fha@\@fha@#1\endcsname\relax
+% \edef\fonthandling{#1}% new
+% \dodoenablehandling{#1}%
+% \else
+% \setprotrudingfactor
+% {\csname\@fha@\@fha@#1\c!links\endcsname}
+% {\csname\@fha@\@fha@#1\c!rechts\endcsname}%
+% \edef\fonthandling{\csname\@fha@\@fha@#1\endcsname}%
+% \checkfonthandling{#2}%
+% \@EA\rawprocesscommalist\@EA[\fonthandling]\dodoenablehandling
+% \registerfonthandling{#2}%
+% \fi}
+%
+% \def\dodoenablehandling#1%
+% {\@EA\ifx\csname\@fha@#1\endcsname\relax\else
+% \the\csname\@fha@#1\endcsname
+% \fi}
+
+\beginTEX
+
+\def\fastenablehandling#1%
+ {\def\askedfonthandling{#1}%
+ \@EA\ifx\csname\@fha@\@fha@\askedfonthandling\endcsname\relax
+ \expandafter\nofastenablehandling
+ \else
+ \expandafter\dofastenablehandling
+ \fi}
+
+\endTEX
+
+\beginETEX \ifcsname
+
+\def\fastenablehandling#1% also gets #2 passed
+ {\def\askedfonthandling{#1}%
+ \ifcsname\@fha@\@fha@\askedfonthandling\endcsname
+ \expandafter\dofastenablehandling
+ \else
+ \expandafter\nofastenablehandling
+ \fi}
+
+\endETEX
+
+\def\dofastenablehandling#1%
+ {\setprotrudingfactor
+ {\csname\@fha@\@fha@\askedfonthandling\c!links \endcsname}
+ {\csname\@fha@\@fha@\askedfonthandling\c!rechts\endcsname}%
+ \edef\fonthandling{\csname\@fha@\@fha@\askedfonthandling\endcsname}%
+ \checkfonthandling{#1}%
+ \@EA\rawprocesscommalist\@EA[\fonthandling]\dodoenablehandling
+ \registerfonthandling{#1}}
+
+\def\nofastenablehandling#1%
+ {\let\fonthandling\askedfonthandling
+ \dodoenablehandling\fonthandling}
+
+\beginTEX
\def\dodoenablehandling#1%
- {\doifdefined{\@fha@#1}{\@EA\the\csname\@fha@#1\endcsname}}
+ {\@EA\ifx\csname\@fha@#1\endcsname\relax\else
+ \the\csname\@fha@#1\endcsname
+ \fi}
+
+\endTEX
+
+\beginETEX \ifcsname
+
+\def\dodoenablehandling#1%
+ {\ifcsname\@fha@#1\endcsname
+ \the\csname\@fha@#1\endcsname
+ \fi}
+
+\endETEX
-\def\checkfonthandling#1%
- {\doifelsevalue{#1\s!handling\c!file}{\purefontname\font}
+\def\checkfonthandling#1% we need a fast compare
+ {\doifelsevalue{#1\s!handling\c!file}{\purefontname\font}
\skipprotrudingdeftrue\skipprotrudingdeffalse}
\def\registerfonthandling#1%
{%\ifskipprotrudingdef\else\message{#1->#2->\purefontname\font}\wait\fi
- \setxvalue{#1\s!handling\c!file}{\purefontname\font}}
+ \@EA\xdef\csname#1\s!handling\c!file\endcsname{\purefontname\font}}
%D \macros
%D {usehandling}
diff --git a/tex/context/base/java-fld.tex b/tex/context/base/java-fld.tex
index c5df7b08c..dab280e85 100644
--- a/tex/context/base/java-fld.tex
+++ b/tex/context/base/java-fld.tex
@@ -162,15 +162,15 @@ function Vide_Fields ( Name ) % show only one field
function Toggle_Hide ( Name )
{ var v = this.getField(Name) ;
- if (v) { v.hidden = !v.hidden } }
+ if (v) { v.hidden = !v.hidden ; this.dirty = false } }
function Field_On ( Name )
{ v = this.getField(Name) ;
- if (v) { v.value = "On" } }
+ if (v) { v.value = "On" ; this.dirty = false } }
function Field_Off ( Name )
{ var v = this.getField(Name) ;
- if (v) { v.value = "Off" } }
+ if (v) { v.value = "Off" ; this.dirty = false } }
function Toggle_Value ( Name )
{ var v = this.getField(Name) ;
@@ -178,7 +178,8 @@ function Toggle_Value ( Name )
{ if (v.value=="On")
{ v.value = "Off" }
else
- { v.value = "On" } } }
+ { v.value = "On" } }
+ this.dirty = false }
function Toggle_Read ( Name )
{ var v = this.getField(Name);
diff --git a/tex/context/base/java-ini.tex b/tex/context/base/java-ini.tex
index ebe9698a6..d89b14a89 100644
--- a/tex/context/base/java-ini.tex
+++ b/tex/context/base/java-ini.tex
@@ -444,7 +444,7 @@
\ifoneJSpreamble
\gdef\allJSpreambles{collected}%
\fi
- \global\let\presetJSpreamble=\relax
+ \global\let\presetJSpreamble\relax
\egroup
\fi}
@@ -454,13 +454,13 @@
\bgroup
\presetJSpreamble
\expanded{\doflushJSpreamble{\allJSpreambles}}%
- \global\let\flushJSpreamble=\relax
- \global\let\allJSpreambles=\empty
+ \global\let\flushJSpreamble\relax
+ \global\let\allJSpreambles\empty
\egroup
\fi\fi
\fi\fi}
-\def\finalflushJSpreamble% kan direct in \everylastshipout, testen
+\def\finalflushJSpreamble
{\iflocation
\flushJSpreamble
\ifcase\currentJSpreamble\relax\else
@@ -623,7 +623,7 @@
%D Hooking this mechanism into the general \CONTEXT\ reference
%D mechanism does not take much effort:
-\definespecialtest{JS}
+\definespecialtest{JS}%
{\doifdefinedelse{\r!java\currentreferenceoperation}}
\definespeciallocation{JS}#1#2%
@@ -638,9 +638,7 @@
\data
{#2}%
\start
- \dostartgotoJS
- {\number\buttonwidth}{\number\buttonheight}
- {\JScode}%
+ \dostartgotoJS\buttonwidth\buttonheight\JScode
\stop
\dostopgotoJS
\dostopgoto
diff --git a/tex/context/base/lang-alt.tex b/tex/context/base/lang-alt.tex
index 815fa570c..f2192936e 100644
--- a/tex/context/base/lang-alt.tex
+++ b/tex/context/base/lang-alt.tex
@@ -44,16 +44,16 @@
\setupheadtext [\s!tr] [\v!inhoud=Fihrist]
\setupheadtext [\s!tr] [\v!tabellen=Tablolar]
-\setupheadtext [\s!tr] [\v!figuren=\c{S}ekiller]
+\setupheadtext [\s!tr] [\v!figuren=\Scedilla ekiller]
\setupheadtext [\s!tr] [\v!grafieken=Grafikler]
\setupheadtext [\s!tr] [\v!intermezzos=...]
-\setupheadtext [\s!tr] [\v!index=\.Index]
-\setupheadtext [\s!tr] [\v!afkortingen=K\i saltmalar]
+\setupheadtext [\s!tr] [\v!index=\Idotaccent ndex]
+\setupheadtext [\s!tr] [\v!afkortingen=K\dotlessi saltmalar]
\setupheadtext [\s!tr] [\v!logos=Logolar]
\setupheadtext [\s!tr] [\v!eenheden=Birimler]
\setuplabeltext [\s!tr] [\v!tabel=Tablo ]
-\setuplabeltext [\s!tr] [\v!figuur=\c{S}ekil ]
+\setuplabeltext [\s!tr] [\v!figuur=\Scedilla ekil ]
\setuplabeltext [\s!tr] [\v!intermezzo=... ]
\setuplabeltext [\s!tr] [\v!grafiek=Grafik ]
\setuplabeltext [\s!tr] [\v!hoofdstuk=] % [\v!hoofdstuk=Konu ]
@@ -63,27 +63,27 @@
\setuplabeltext [\s!tr] [\v!sub\v!sub\v!sub\v!paragraaf=]
\setuplabeltext [\s!tr] [\v!bijlage=] % [\v!bijlage=Ek ]
\setuplabeltext [\s!tr] [\v!deel=Cilt ]
-\setuplabeltext [\s!tr] [\v!regel=sat\i r ]
-\setuplabeltext [\s!tr] [\v!regels=sat\i rlar ]
+\setuplabeltext [\s!tr] [\v!regel=sat\dotlessi r ]
+\setuplabeltext [\s!tr] [\v!regels=sat\dotlessi rlar ]
\setuplabeltext [\s!tr] [\v!january=ocak]
-\setuplabeltext [\s!tr] [\v!february=\c{s}ubat]
+\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\i s]
+\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\u{g}ustos]
-\setuplabeltext [\s!tr] [\v!september=eyl\"ul]
+\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\i m]
-\setuplabeltext [\s!tr] [\v!december=aral\i k]
+\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\i]
-\setuplabeltext [\s!tr] [\v!wednesday=\c{c}ar\c{s}amba]
-\setuplabeltext [\s!tr] [\v!thursday=per\c{s}embe]
+\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]
diff --git a/tex/context/base/lang-ger.tex b/tex/context/base/lang-ger.tex
index 3b90f5cbe..d02ddc2f9 100644
--- a/tex/context/base/lang-ger.tex
+++ b/tex/context/base/lang-ger.tex
@@ -289,13 +289,12 @@
% \definesortkey {\o}{z} {c}{\o}
% \definesortkey {\O}{z} {c}{\O}
% \definesortkey {\aa}{z}{d}{\aa}
+% \definesortkey {\aring}{z}{d}{\aring}
% \definesortkey {\AA}{z}{d}{\AA}
+% \definesortkey {\Aring}{z}{d}{\Aring}
%
% \stoplanguagespecifics
%
-% Active characters - just for texnansi encoding now.
-% Will the other encodings be the same?
-%
% \startencoding[texnansi]
% \startlanguagespecifics[\s!no]%
% \defineactivecharacter æ {\ae{}}
@@ -311,7 +310,7 @@
\setupheadtext [\s!nl] [\v!inhoud=Inhoud]
\setupheadtext [\s!de] [\v!inhoud=Inhalt]
\setupheadtext [\s!da] [\v!inhoud=Indhold]
-\setupheadtext [\s!sv] [\v!inhoud=Inneh\aa l]
+\setupheadtext [\s!sv] [\v!inhoud=Inneh\aring l]
\setupheadtext [\s!af] [\v!inhoud=Inhoud]
\setupheadtext [\s!no] [\v!inhoud=Innhold]
@@ -357,9 +356,9 @@
\setupheadtext [\s!en] [\v!afkortingen=Abbreviations]
\setupheadtext [\s!nl] [\v!afkortingen=Afkortingen]
-\setupheadtext [\s!de] [\v!afkortingen=Abk\"urzungen]
+\setupheadtext [\s!de] [\v!afkortingen=Abk\uumlaut rzungen]
\setupheadtext [\s!da] [\v!afkortingen=Forkortelser]
-\setupheadtext [\s!sv] [\v!afkortingen=F\"orkortningen]
+\setupheadtext [\s!sv] [\v!afkortingen=F\oumlaut rkortningen]
\setupheadtext [\s!af] [\v!afkortingen=Afkortings]
\setupheadtext [\s!no] [\v!afkortingen=Forkortelser]
@@ -472,7 +471,7 @@
\setuplabeltext [\s!de] [\v!regel=Zeile ]
\setuplabeltext [\s!da] [\v!regel=linie ] % or linje
\setuplabeltext [\s!sv] [\v!regel=rad ]
-\setuplabeltext [\s!af] [\v!regel=re\"el ]
+\setuplabeltext [\s!af] [\v!regel=re\ediaeresis l ]
\setuplabeltext [\s!no] [\v!regel=linje ]
\setuplabeltext [\s!en] [\v!regels=lines ]
@@ -480,7 +479,7 @@
\setuplabeltext [\s!de] [\v!regels=Zeilen ]
\setuplabeltext [\s!da] [\v!regels=linier ] % or linjer
\setuplabeltext [\s!sv] [\v!regels=raden ]
-\setuplabeltext [\s!af] [\v!regels=re\"els ]
+\setuplabeltext [\s!af] [\v!regels=re\ediaeresis ls ]
\setuplabeltext [\s!no] [\v!regels=linjer ]
\setuplabeltext [\s!en] [\v!january=January]
@@ -511,7 +510,7 @@
\setuplabeltext [\s!de] [\v!january=Januar]
\setuplabeltext [\s!de] [\v!february=Februar]
-\setuplabeltext [\s!de] [\v!march=M\"arz]
+\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]
@@ -598,21 +597,21 @@
\setuplabeltext [\s!de] [\v!friday=Freitag]
\setuplabeltext [\s!de] [\v!saturday=Samstag]
-\setuplabeltext [\s!da] [\v!sunday=s\o ndag]
+\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\o rdag]
+\setuplabeltext [\s!da] [\v!saturday=l\ostroke rdag]
-\setuplabeltext [\s!sv] [\v!sunday=s\"ondag]
-\setuplabeltext [\s!sv] [\v!monday=m\aa ndag]
+\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\"ordag]
+\setuplabeltext [\s!sv] [\v!saturday=l\oumlaut rdag]
\setuplabeltext [\s!af] [\v!sunday=sondag]
\setuplabeltext [\s!af] [\v!monday=maandag]
@@ -622,13 +621,13 @@
\setuplabeltext [\s!af] [\v!friday=vrydag]
\setuplabeltext [\s!af] [\v!saturday=saterdag]
-\setuplabeltext [\s!no] [\v!sunday=s\o ndag]
+\setuplabeltext [\s!no] [\v!sunday=s\ostroke ndag]
\setuplabeltext [\s!no] [\v!monday=mandag]
\setuplabeltext [\s!no] [\v!tuesday=tirsdag]
\setuplabeltext [\s!no] [\v!wednesday=onsdag]
\setuplabeltext [\s!no] [\v!thursday=torsdag]
\setuplabeltext [\s!no] [\v!friday=fredag]
-\setuplabeltext [\s!no] [\v!saturday=l\o rdag]
+\setuplabeltext [\s!no] [\v!saturday=l\ostroke rdag]
%D Rather new ...
@@ -651,13 +650,13 @@
\setuplabeltext [\s!de] [\v!zie=siehe ]
\setuplabeltext [\s!da] [\v!pagina=Side ]
-\setuplabeltext [\s!da] [\v!oppagina=p\aa\ side ]
+\setuplabeltext [\s!da] [\v!oppagina=p\aring\ side ]
\setuplabeltext [\s!da] [\v!hierboven=se foroven]
\setuplabeltext [\s!da] [\v!hieronder=se forneden]
\setuplabeltext [\s!da] [\v!zie=se ]
\setuplabeltext [\s!no] [\v!pagina=Side ]
-\setuplabeltext [\s!no] [\v!oppagina=p\aa\ side ]
+\setuplabeltext [\s!no] [\v!oppagina=p\aring\ side ]
\setuplabeltext [\s!no] [\v!hierboven=se foroven]
\setuplabeltext [\s!no] [\v!hieronder=se forneden]
\setuplabeltext [\s!no] [\v!zie=se ]
diff --git a/tex/context/base/lang-ini.tex b/tex/context/base/lang-ini.tex
index a94b41c5b..0aee0de61 100644
--- a/tex/context/base/lang-ini.tex
+++ b/tex/context/base/lang-ini.tex
@@ -8,8 +8,8 @@
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
%D This module implements the (for the moment still simple)
%D multi||language support of \CONTEXT, which should not be
@@ -31,7 +31,7 @@
7: taal specifieke opties [--] introduceren een skip van --
8: taal specifieke opties [--] naadloos toegevoegd
9: taal -- is actief
- 10: patronen --geladen
+ 10: patronen --geladen
\stopmessages
\startmessages english library: linguals
@@ -59,10 +59,10 @@
7: Sprachenspezifische Option [--] fuegt eine Luecke von -- ein
8: Sprachenspezifische Option [--] nahtlos hinzugefuegt
9: Sprache -- ist aktiv
- 10: Trennmuster --geladen
+ 10: Trennmuster --geladen
\stopmessages
-% TOM: 9 and 10
+% TOM: 9 and 10
\startmessages czech library: linguals
title: jazyky
@@ -75,7 +75,7 @@
7: specificke volby jazyka [--] zavadeji -- (zavlecenou) mezeru
8: specificke volby jazyka [--] bez mezer pripojeny
9: language -- is active
- 10: vzory --nacteny
+ 10: vzory --nacteny
\stopmessages
\startmessages italian library: linguals
@@ -143,17 +143,19 @@
\newcounter\loadedlanguage
%D \macros
-%D {currentlanguage, setcurrentlanguage}
+%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 \type {\currentlanguage}. The setup macro is mainly used
+%D for cosmetic purposes.
-\let\currentlanguage=\empty
+\let\currentlanguage \empty
+\let\currentmainlanguage\empty
-\def\setupcurrentlanguage[#1]%
- {\edef\currentlanguage{#1}}
+\def\setupcurrentlanguage[#1]{\def\currentlanguage{#1}}
+
+%D The internal macros will be defined later.
%D \macros
%D {installlanguage}
@@ -187,19 +189,19 @@
%D implementations support run time addition of patterns to a
%D preloaded format).
-\def\dodoinstalllanguage#1#2% #2 added
- {\doifundefined{#1}{\setvalue{#1}{\language[#2]}}%
+\def\dodoinstalllanguage#1#2% #2 added
+ {\doifundefined{#1}{\setvalue{#1}{\complexlanguage[#2]}}%
\expanded{\noexpand\uppercase{\noexpand\edef\noexpand\ascii{#1}}}%
- \doifundefined{\ascii}{\setvalue{\ascii}{\language[#2]}}}
+ \doifundefined{\ascii}{\setvalue{\ascii}{\complexlanguage[#2]}}}
%D \macros
%D {preloadlanguages}
%D
-%D We first try to load the files defined as file synonym
+%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.
+%D fall back on those files. The macro \type {\preloadpatterns}
+%D reports which patterns are loaded and what hyphenmin
+%D values are set.
\let\preloadedpatterns\empty
@@ -208,12 +210,13 @@
-#1-%
\getvalue{\??la#1\s!righthyphenmin} }
-\def\preloadlanguages%
+\def\preloadlanguages%
{\doifsomething{\preloadedpatterns}
{\showmessage{\m!linguals}{10}{\preloadedpatterns}}}
\def\doinstalllanguage[#1][#2]%
- {\ConvertConstantAfter\doifinstringelse{=}{#2}
+ {%\ConvertConstantAfter\doifinstringelse{=}{#2}
+ \doifassignmentelse{#2}
{\doifdefinedelse{\??la#1\c!status}
{\getparameters[\??la#1][#2]}
{\setvalue{\l!prefix!#1}{#1}%
@@ -231,9 +234,9 @@
\c!rightquote=\upperrightsingleninequote,
\c!leftquotation=\upperleftdoublesixquote,
\c!rightquotation=\upperrightdoubleninequote,
- \c!leftspeech=\getvalue{\??la#1\c!leftquotation},
-\c!middlespeech=,
- \c!rightspeech=\getvalue{\??la#1\c!rightquotation},
+ \c!leftspeech=\getvalue{\??la#1\c!leftquotation},
+ \c!middlespeech=,
+ \c!rightspeech=\getvalue{\??la#1\c!rightquotation},
\c!datum={\v!jaar,\ ,\v!maand,\ ,\v!dag},
\c!status=\v!stop,
\c!default=,
@@ -256,9 +259,9 @@
\c!rightquote=\languagedefault{#1}\c!rightquote,
\c!leftquotation=\languagedefault{#1}\c!leftquotation,
\c!rightquotation=\languagedefault{#1}\c!rightquotation,
- \c!leftspeech=\languagedefault{#1}\c!leftspeech,
-\c!middlespeech=\languagedefault{#1}\c!middlespeech,
- \c!rightspeech=\languagedefault{#1}\c!rightspeech,
+ \c!leftspeech=\languagedefault{#1}\c!leftspeech,
+ \c!middlespeech=\languagedefault{#1}\c!middlespeech,
+ \c!rightspeech=\languagedefault{#1}\c!rightspeech,
\c!datum=\languagedefault{#1}\c!datum,
\s!mapping=\languagedefault{#1}\s!mapping,
\s!encoding=\languagedefault{#1}\s!encoding,
@@ -281,18 +284,18 @@
\showmessage{\m!linguals}{3}{\languagesuffix,#1,\loadedlanguage}%
\egroup}}
{\showmessage{\m!linguals}{5}{#1}}}
- {\setvalue{\l!prefix!#1}{#2}%
+ {\setvalue{\l!prefix!#1}{#2}%
\dodoinstalllanguage{#1}{#2}}}
-% ^^ \language[#1] gave unwanted side effect of loading language specifics
+% ^^ \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.
+%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
@@ -316,10 +319,10 @@
\let\normalpatterns\patterns
\def\dodoloadpatterns#1#2#3#4%
- {\normallanguage=\loadedlanguage
-% \letvalue{\??la\??la#2}=\loadedlanguage
+ {\normallanguage\loadedlanguage
+% \letvalue{\??la\??la#2}\loadedlanguage
\bgroup
- \scratchtoks=\everyjob % we don't want additional junk put there
+ \scratchtoks\everyjob % we don't want additional junk put there
\let\showpatterns\relax
\startencoding[#3]%
\enablemapping[#4]%
@@ -350,10 +353,10 @@
\egroup
\increment\loadedlanguage}
-%D \macros
+%D \macros
%D {setuplanguage}
%D
-%D Quick and dirty, but useful:
+%D Quick and dirty, but useful:
%D
%D \showsetup{\y!setuplanguage}
@@ -361,8 +364,8 @@
{\dodoubleargument\dosetuplanguage}
\def\dosetuplanguage[#1][#2]%
- {\getparameters[\??la#1][#2]% % we need to make sure
- \doif{#1}{\currentlanguage}{\language[#1]}} % that settings apply
+ {\getparameters[\??la#1][#2]%
+ \doif{#1}{\currentlanguage}{\docomplexlanguage}}
%D The values \type {\c!leftsentence} and \type
%D {\c!rightsentence} can be (and are) used to implement
@@ -408,7 +411,7 @@
%D \stoptypen
%D
%D is a valid operation, where the relation between number
-%D and language depends on the order in installing languages.
+%D and language depends on the order in installing languages.
%D
%D \showsetup{\y!language}
%D \showsetup{\y!mainlanguage}
@@ -422,40 +425,61 @@
%D We take care of local as well as standardized language
%D switching (fr and fa, de and du, but nl and nl).
-% new, encoding specific patterns
+% new, encoding specific patterns
\ifx\synchronizepatterns\undefined \let\synchronizepatterns\relax \fi
-\def\dosetnormallanguage#1#2#3#4%
- {\doifdefinedelse{\??la\??la#2#3}
- {\doifelsevaluenothing{\??la\??la#2#3}
- {#4}
- {\donetrue
- \setxvalue{\??la#1\s!patterns}{#3}%
- \normallanguage=\getvalue{\??la\??la#2#3}\relax}} % \relax is needed for lookahead problems
- {#4}}
-
-\def\setnormallanguage#1#2%
- {\dosetnormallanguage{#1}{:\currentencoding:\currentmapping:}{#2}{%
- \dosetnormallanguage{#1}{:\currentencoding:\s!default :}{#2}{%
- \dosetnormallanguage{#1}{:\s!default :\currentmapping:}{#2}{%
- \dosetnormallanguage{#1}{:\s!default :\s!default :}{#2}{}}}}}
-
+%\def\dosetnormallanguage#1#2#3#4%
+% {\doifdefinedelse{\??la\??la#2#3}
+% {\doifelsevaluenothing{\??la\??la#2#3}
+% {#4}
+% {\donetrue
+% \setxvalue{\??la#1\s!patterns}{#3}%
+% \normallanguage=\getvalue{\??la\??la#2#3}\relax}} % \relax is needed for lookahead problems
+% {#4}}
%
-
+% because this macro is called often, we optimize 'm
+%
+% \def\dosetnormallanguage#1#2#3%
+% {\@EA\ifx\csname\??la\??la#2#3\endcsname\relax
+% \@EA\firstofoneargument
+% \else\@EA\ifx\csname\??la\??la#2#3\endcsname\empty
+% \@EAEAEA\firstofoneargument
+% \else
+% \donetrue
+% \global\expandafter\xdef\csname\??la#1\s!patterns\endcsname{#3}%
+% \normallanguage\csname\??la\??la#2#3\endcsname\relax % \relax is needed for lookahead problems
+% \@EAEAEA\gobbleoneargument
+% \fi\fi}
+%
+% \def\setnormallanguage#1#2%
+% {\dosetnormallanguage{#1}{:\currentencoding:\currentmapping:}{#2}{%
+% \dosetnormallanguage{#1}{:\currentencoding:\s!default :}{#2}{%
+% \dosetnormallanguage{#1}{:\s!default :\currentmapping:}{#2}{%
+% \dosetnormallanguage{#1}{:\s!default :\s!default :}{#2}{}}}}}
+%
% \def\docomplexlanguage[#1]%
% {\donefalse
-% \setnormallanguage{#1}{\getvalue{\??la#1\s!patterns}}%
+% % \def\synchronizepatterns{\setnormallanguage
+% % {#1}{\getvalue{\??la#1\s!patterns}}}%
+% % called often, so :
+% \def\synchronizepatterns{\setnormallanguage
+% {#1}{\csname\??la#1\s!patterns\endcsname}}%
+% \synchronizepatterns
% \ifdone\else
-% \setnormallanguage{#1}{#1}%
+% \def\synchronizepatterns{\setnormallanguage{#1}{#1}}%
+% \synchronizepatterns
% \ifdone\else
% \doifvaluesomething{\??la#1\c!default}
-% {\setnormallanguage{#1}{\getvalue{\??la\defaultlanguage{#1}\s!patterns}}%
+% {\def\synchronizepatterns{\setnormallanguage
+% {#1}{\getvalue{\??la\defaultlanguage{#1}\s!patterns}}}%
+% \synchronizepatterns
% \ifdone\else
% \setnormallanguage{#1}{\defaultlanguage{#1}}%
+% \synchronizepatterns
% \fi}%
% \fi
-% \fi
+% \fi
% \edef\currentlanguage{#1}%
% \enablelanguagespecifics[#1]%
% \enablemapping[\getvalue{\??la#1\s!mapping}]%
@@ -467,73 +491,177 @@
% \v!ruim=>\nonfrenchspacing,
% \s!unknown=>\frenchspacing]}
-\def\docomplexlanguage[#1]%
- {\donefalse
+\beginTEX
+
+\def\dosetnormallanguage#1#2%
+ {\@EA\ifx\csname\??la\??la#1#2\endcsname\relax
+ \@EA\firstofoneargument
+ \else\@EA\ifx\csname\??la\??la#1#2\endcsname\empty
+ \@EAEAEA\firstofoneargument
+ \else
+ \donetrue
+ \global\@EA\xdef\csname\??la\currentlanguage\s!patterns\endcsname{#2}%
+ \normallanguage\csname\??la\??la#1#2\endcsname\relax % \relax is needed for lookahead problems
+ \@EAEAEA\gobbleoneargument
+ \fi\fi}
+
+\endTEX
+
+\beginETEX
+
+\def\dosetnormallanguage#1#2%
+ {\ifcsname\??la\??la#1#2\endcsname
+ \edef\thenormallanguage{\csname\??la\??la#1#2\endcsname}%
+ \ifx\thenormallanguage\empty
+ \@EAEAEA\firstofoneargument
+ \else
+ \donetrue
+ \global\@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}
+
+\endETEX
+
+\def\setnormallanguage#1%
+ {\dosetnormallanguage{:\currentencoding:\currentmapping:}{#1}{%
+ \dosetnormallanguage{:\currentencoding:\s!default :}{#1}{%
+ \dosetnormallanguage{:\s!default :\currentmapping:}{#1}{%
+ \dosetnormallanguage{:\s!default :\s!default :}{#1}{}}}}}
+
+\def\docomplexlanguage% assumes that \currentlanguage is set
+ {\edef\currentdefaultlanguage{\defaultlanguage\currentlanguage}%
\def\synchronizepatterns{\setnormallanguage
- {#1}{\getvalue{\??la#1\s!patterns}}}%
+ {\csname\??la\currentlanguage\s!patterns\endcsname}}% called often
+ \donefalse
\synchronizepatterns
\ifdone\else
- \def\synchronizepatterns{\setnormallanguage{#1}{#1}}%
+ \def\synchronizepatterns{\setnormallanguage\currentlanguage}%
\synchronizepatterns
\ifdone\else
- \doifvaluesomething{\??la#1\c!default}
- {\def\synchronizepatterns{\setnormallanguage
- {#1}{\getvalue{\??la\defaultlanguage{#1}\s!patterns}}}%
- \synchronizepatterns
- \ifdone\else
- \setnormallanguage{#1}{\defaultlanguage{#1}}%
- \synchronizepatterns
- \fi}%
+ \ifx\currentdefaultlanguage\empty\else
+ \def\synchronizepatterns{\setnormallanguage
+ {\csname\??la\currentdefaultlanguage\s!patterns\endcsname}}%
+ \synchronizepatterns
+ \ifdone\else
+ \setnormallanguage\currentdefaultlanguage
+ \synchronizepatterns
+ \fi
+ \fi
\fi
- \fi
- \edef\currentlanguage{#1}%
- \enablelanguagespecifics[#1]%
- \enablemapping[\getvalue{\??la#1\s!mapping}]%
- \lefthyphenmin =0\getvalue{\??la#1\s!lefthyphenmin}\relax
- \righthyphenmin=0\getvalue{\??la#1\s!righthyphenmin}\relax
- \processaction
- [\getvalue{\??la#1\c!spatiering}]
- [\v!opelkaar=>\frenchspacing,
- \v!ruim=>\nonfrenchspacing,
- \s!unknown=>\frenchspacing]}
+ \fi
+ \enablelanguagespecifics[\currentlanguage]%
+% strange, what is this doing here, dangerous for {il2,ec}
+% \edef\languagemapping{\csname\??la\currentlanguage\s!mapping\endcsname}%
+% \ifx\languagemapping\empty\else
+% \fastenablemapping\languagemapping
+% \fi
+ \lefthyphenmin 0\csname\??la\currentlanguage\s!lefthyphenmin \endcsname
+ \righthyphenmin0\csname\??la\currentlanguage\s!righthyphenmin\endcsname\relax
+ % will be definable
+ \doifelsevalue{\??la\currentlanguage\c!spatiering}\v!ruim
+ \nonfrenchspacing\frenchspacing}
+
+\beginETEX
+
+\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
+ \let\currentlanguage\askedlanguage
+ \docomplexlanguage
+ \fi
+ \else
+ \showmessage\m!linguals6{#1}%
+ \fi
+ \fi}
+
+\endETEX
+
+\beginTEX
\def\complexlanguage[#1]%
- {\doifdefinedelse{\l!prefix!#1}
- {\expanded{\docomplexlanguage[\getvalue{\l!prefix!#1}]}}
- {\showmessage{\m!linguals}{6}{#1}}}
+ {\edef\askedlanguage{#1}%
+ \ifx\askedlanguage\empty \else
+ \@EA\ifx\csname\l!prefix!\askedlanguage\endcsname\relax
+ \showmessage\m!linguals6{#1}%
+ \else
+ \edef\askedlanguage{\csname\l!prefix!\askedlanguage\endcsname}%
+ \ifx\currentlanguage\askedlanguage \else
+ \let\currentlanguage\askedlanguage
+ \docomplexlanguage
+ \fi
+ \fi
+ \fi}
-\def\simplelanguage%
- {\normallanguage}
+\endTEX
+
+\let\simplelanguage\normallanguage
\definecomplexorsimple\language
-\let\currentmainlanguage=\empty
+\beginETEX
+
+\def\mainlanguage[#1]%
+ {\edef\askedlanguage{#1}%
+ \ifx\askedlanguage\empty \else
+ \ifcsname\l!prefix!\askedlanguage\endcsname
+ \edef\askedlanguage{\csname\l!prefix!\askedlanguage\endcsname}%
+ \ifx\currentmainlanguage\askedlanguage \else
+ \let\currentmainlanguage\askedlanguage
+ \let\currentlanguage\askedlanguage
+ \docomplexlanguage
+ \fi
+ \fi
+ \fi}
+
+\endETEX
-%\def\mainlanguage[#1]%
-% {\edef\currentmainlanguage{#1}} % We expand indeed!
+\beginTEX
\def\mainlanguage[#1]%
- {\doifsomething{#1}
- {\doifdefined{\l!prefix!#1}
- {\@EA\let\@EA\currentmainlanguage\csname\l!prefix!#1\endcsname
- \language[#1]}}}
+ {\edef\askedlanguage{#1}%
+ \ifx\askedlanguage\empty \else
+ \@EA\ifx\csname\l!prefix!\askedlanguage\endcsname\relax\else
+ \edef\askedlanguage{\csname\l!prefix!\askedlanguage\endcsname}%
+ \ifx\currentmainlanguage\askedlanguage \else
+ \let\currentmainlanguage\askedlanguage
+ \let\currentlanguage\askedlanguage
+ \docomplexlanguage
+ \fi
+ \fi
+ \fi}
+
+\endTEX
%D \macros
%D {defaultlanguage,languagedefault}
%D
-%D The macro \type {\defaultlanguage{id}} expands into the
-%D default language, when defined, while \type
-%D {\languagedefault{id}\c!parameter} returns the default's
-%D parameter.
+%D The macro \type {\defaultlanguage{id}} expands into the
+%D default language, when defined, while \type
+%D {\languagedefault{id}\c!parameter} returns the default's
+%D parameter.
+
+%\def\defaultlanguage#1%
+% {\@EA\ifx\csname\??la#1\c!default\endcsname\empty
+% #1%
+% \else
+% \@EA\defaultlanguage\@EA{\csname\??la#1\c!default\endcsname}%
+% \fi}
\def\defaultlanguage#1%
{\@EA\ifx\csname\??la#1\c!default\endcsname\empty
#1%
\else
- \@EA\defaultlanguage\@EA{\csname\??la#1\c!default\endcsname}%
+ \@EA\defaultlanguage\csname\??la#1\c!default\endcsname
\fi}
-\def\languagedefault#1#2%
+\def\languagedefault#1#2%
{\csname\??la\defaultlanguage{#1}#2\endcsname}
%D \macros
@@ -563,7 +691,7 @@
%D precautions that will prevent spurious spaces to creep into
%D the list.
-\def\startlanguagespecifics% % we use double to
+\def\startlanguagespecifics% % we use double to
{\bgroup
\catcode`\^^I=\@@ignore
\catcode`\^^M=\@@ignore
@@ -573,7 +701,7 @@
%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 be sure, we check on spurious spaces. The second dummy
%D argument gobbles spaces.
\def\languageencoding%
@@ -601,12 +729,12 @@
% {\enablelanguagespecifics[##1]}}%
% \processcommalist[#1]\docommando}
-% This saves 3K in the fmt file.
+% This saves 3K in the fmt file.
\long\def\dostartlanguagespecifics[#1][#2]#3\stoplanguagespecifics%
{\egroup
\processcommalist[#1]{\dosetlanguagespecifics{#3}}}
-
+
\long\def\dosetlanguagespecifics#1#2%
{\doifdefinedelse{\??la\languageencoding#2\??la}
{\long\def\do##1##2##3%
@@ -628,16 +756,29 @@
%D define \type{\do} in such a way that \type{{ }} is removed
%D and the language key is gobbled.
+%\def\enablelanguagespecifics[#1]%
+% {\let\do\secondoftwoarguments
+% \doifvaluesomething{\??la#1\c!default}
+% {\getvalue{\??la\getvalue{\??la#1\c!default}\??la}%
+% \getvalue{\??la\languageencoding\??la}}%
+% \getvalue{\??la#1\??la}%
+% \getvalue{\??la\languageencoding#1\??la}}
+%
+% sped up since used often:
+
\def\enablelanguagespecifics[#1]%
- {\long\def\do##1##2{##2}%
- \doifvaluesomething{\??la#1\c!default}
- {\getvalue{\??la\getvalue{\??la#1\c!default}\??la}%
- \getvalue{\??la\languageencoding\getvalue{\??la#1\c!default}\??la}}%
- % or
- %\doifvaluesomething{\??la#1\c!default}
- % {\expanded{\enablelanguagespecifics[\getvalue{\??la#1\c!default}]}}%
- \getvalue{\??la#1\??la}%
- \getvalue{\??la\languageencoding#1\??la}}
+ {\let\do\secondoftwoarguments
+ \csname
+ \??la
+ \@EA\ifx\csname\??la#1\c!default\endcsname\relax
+ \languageencoding
+ \else
+ \csname\??la#1\c!default\endcsname
+ \fi
+ \??la
+ \endcsname
+ \csname\??la#1\??la\endcsname
+ \csname\??la\languageencoding#1\??la\endcsname} % dup ?
%D \macros
%D {leftguillemot,rightguillemot,leftsubguillemot,rightsubguillemot,
@@ -646,9 +787,9 @@
%D We assign logical names to all kind of quote and sentence
%D boundary characters.
%D
-%D When using Computer Modern Roman, the next definitions
-%D looks a bit better than the default ligatures.
-%D
+%D When using Computer Modern Roman, the next definitions
+%D looks a bit better than the default ligatures.
+%D
%D \starttypen
%D \def\lowerleftsingleninequote {,}
%D \def\lowerleftdoubleninequote {,\kern-.1em,}
@@ -656,7 +797,7 @@
%D \def\upperleftdoubleninequote {''\kern-.1em}
%D \def\upperleftsinglesixquote {`}
%D \def\upperleftdoublesixquote {`\kern-.1em`}
-%D
+%D
%D \def\lowerrightsingleninequote {,}
%D \def\lowerrightdoubleninequote {,\kern-.1em,}
%D \def\upperrightsingleninequote {'}
@@ -682,18 +823,18 @@
\def\upperrightsinglesixquote {`}
\def\upperrightdoublesixquote {``}
-%D Yes I know, they are ugly:
+%D Yes I know, they are ugly:
-\def\leftguillemot%
+\def\leftfakeguillemot
{\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle\ll$}}}
-\def\rightguillemot%
+\def\rightfakeguillemot
{\hbox{\raise.25ex\hbox{$\scriptscriptstyle\gg$}}}
-\def\leftsubguillemot%
+\def\leftsubfakeguillemot
{\dontleavehmode\hbox{\raise.25ex\hbox{$\scriptscriptstyle<$}}}
-\def\rightsubguillemot%
+\def\rightsubfakeguillemot
{\hbox{\raise.25ex\hbox{$\scriptscriptstyle>$}}}
%D Just like with subsentence boundary symbols, quotes
@@ -711,8 +852,10 @@
%D \vskip.5em
%D \hrule
%D \vskip.5em
+%D \let\normalbar=|
%D \hbox to \hsize
-%D {\hfil\citaat{#3 #4}\hfil\citeer{#2}\hfil\strut|<||<|#3|>|#4|>|\hfil}
+%D {\hfil\citaat{#3 #4}\hfil\citeer{#2}\hfil
+%D \let|=\normalbar\strut|<||<|#3|>|#4|>|\hfil}
%D \vskip.5em
%D \hrule
%D \egroup
@@ -720,101 +863,108 @@
%D \blanko}
%D
%D \ShowLanguageValues [af] [afrikaans] afrikaanse ...
-%D \ShowLanguageValues [cz] [czech] tjechisch tex
-%D \ShowLanguageValues [cz] [slovak] slowaakse ...
+%D \ShowLanguageValues [cz] [czech] tjechisch tex
+%D \ShowLanguageValues [cz] [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 [la] [latin] latijnse missen
%D \ShowLanguageValues [nl] [dutch] nederlandse zuinigheid
%D \ShowLanguageValues [no] [norwegian] noorse ...
%D \ShowLanguageValues [pl] [polish] poolse ...
%D \ShowLanguageValues [pt] [portuguese] portugese ...
-%D \ShowLanguageValues [sp] [spanish] spaans benauwd
+%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 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 \plaatstabel{The germanic languages (\type{lang-ger})}
%D \starttabel[||||]
-%D \HL
+%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!no \NC norwegian \NC germanic \NC\LR
-%D \HL
+%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!no \NC norwegian \NC germanic \NC\LR
+%D \HL
%D \stoptabel
%D \protect
-%D
+%D
%D \unprotect
%D \plaatstabel{The italic languages (\type{lang-ita})}
%D \starttabel[||||]
-%D \HL
+%D \HL
%D \NC \bf mnemonic \NC \bf language \NC \bf group \NC\SR
-%D \HL
+%D \HL
%D \NC \s!fr \NC french \NC italic \NC\FR
-%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 \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 \stoptabel
%D \protect
-%D
+%D
%D \unprotect
%D \plaatstabel{The slavic languages (\type{lang-sla})}
%D \starttabel[||||]
-%D \HL
+%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!cz \NC czech \NC slavic \NC\MR
-%D \NC \s!sk \NC slavik \NC slavic \NC\LR
-%D \HL
+%D \HL
+%D \NC \s!pl \NC polish \NC slavic \NC\FR
+%D \NC \s!cz \NC czech \NC slavic \NC\MR
+%D \NC \s!sk \NC slavik \NC slavic \NC\LR
+%D \HL
%D \stoptabel
%D \protect
%D \unprotect
-%D
+%D
%D \plaatstabel{The altaic languages (\type{lang-alt})}
%D \starttabel[||||]
-%D \HL
+%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 \HL
+%D \NC \s!tr \NC turkish \NC altaic \NC\SR
+%D \HL
%D \stoptabel
%D
%D \plaatstabel{The uralic languages (\type{lang-ura})}
%D \starttabel[||||]
-%D \HL
+%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 \HL
+%D \NC \s!fi \NC finnish \NC uralic \NC\SR
+%D \HL
%D \stoptabel
%D \protect
+%D
+
+% \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 \type{\startinterface} is used.
\let\normaldoublequote ="
\let\normalforwardslash=/
-%D We default to english:
+%D We default to english:
\setupcurrentlanguage[\s!en]
@@ -822,6 +972,4 @@
\appendtoks\showmessage{\m!linguals}{9}{\currentlanguage}\to\everyjob
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/lang-ita.tex b/tex/context/base/lang-ita.tex
index e4bbd19ab..7d325e45a 100644
--- a/tex/context/base/lang-ita.tex
+++ b/tex/context/base/lang-ita.tex
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D Todo: replace \'.. by \namedglyph
+
\writestatus{loading}{Italic Languages}
%D The framework of this module is set up by Hans Hagen while
diff --git a/tex/context/base/lang-lab.tex b/tex/context/base/lang-lab.tex
index 00efe5a56..794cdf4c3 100644
--- a/tex/context/base/lang-lab.tex
+++ b/tex/context/base/lang-lab.tex
@@ -42,32 +42,29 @@
%D In a few paragraphs we'll show quite a lot of examples
%D of its use.
-\def\setupheadtext%
- {\dosetupsometextprefix\c!titel}
+\let\handletextprefix\relax
-\def\setuplabeltext%
- {\dosetupsometextprefix\c!label}
+\def\setupheadtext {\dosetupsometextprefix[\c!titel]}
+\def\setuplabeltext{\dosetupsometextprefix[\c!label]}
-\let\handletextprefix=\relax
+\def\dosetupsometextprefix
+ {\let\dodocommando\xdosetupsometextprefix
+ \dotripleempty\dodosetupsometextprefix}
-\def\dodosetupsometextprefix#1%
- {\def\dododosetupsometextprefix[##1][##2]%
- {\ifsecondargument
- \def\docommando####1{\dodocommando[#1##1][####1]}%
- \processcommalist[##2]\docommando
- \else
- \def\docommando####1{\dodocommando[#1\currentmainlanguage][####1]}%
- \processcommalist[##1]\docommando
- \fi}%
- \dodoubleempty\dododosetupsometextprefix}
+\def\dodosetupsometextprefix[#1][#2][#3]%
+ {\ifthirdargument
+ \def\docommando##1{\dodocommando[#1#2][##1]}%
+ \processcommalist[#3]\docommando
+ \else
+ \def\docommando##1{\dodocommando[#1\currentmainlanguage][##1]}%
+ \processcommalist[#2]\docommando
+ \fi}
\def\doassignsometextprefix[#1][#2,#3,#4]%
{\setvalue{#1}{\handletextprefix{#2}{#3}}}
-\def\dosetupsometextprefix#1%
- {\def\dodocommando[##1][##2=##3]%
- {\doassignsometextprefix[##1##2][##3,,]}%
- \dodosetupsometextprefix{#1}}
+\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
@@ -96,8 +93,11 @@
%D
%D The latter one has an upcased alternative \type{\LABELTEXT}.
-\def\labellanguage{\currentmainlanguage}
-\def\headlanguage {\currentmainlanguage}
+% \def\labellanguage{\currentmainlanguage}
+% \def\headlanguage {\currentmainlanguage}
+
+\def\labellanguage{\defaultlanguage\currentmainlanguage}
+\def\headlanguage {\defaultlanguage\currentmainlanguage}
\def\headtext%
{\let\handletextprefix\firstoftwoarguments
@@ -128,24 +128,116 @@
\def\labeltexts#1#2{\leftlabeltext{#1}#2\rightlabeltext{#1}}
\def\LABELTEXTS#1#2{\LEFTLABELTEXT{#1}#2\RIGHTLABELTEXT{#1}}
-\def\dodogetupsometextprefix#1#2#3#4%
- {\doifdefinedelse{#2#1#3}
- {\getvalue{#2#1#3}}
- {\doifdefinedelse{#1#3}
- {\getvalue{#2#3}}
- {#4}}}
-
\newif\iflabeltextdone % needs to be reset elsewhere
\newif\iftracinglabels % shows missing labels
+% \def\dodogetupsometextprefix#1#2#3#4%
+% {\doifdefinedelse{#2#1#3}
+% {\getvalue{#2#1#3}}
+% {\doifdefinedelse{#2#3} % was bug: #1#3
+% {\getvalue{#2#3}}
+% {#4}}}
+%
+% \unexpanded\def\dogetupsometextprefix#1#2#3%
+% {\global\labeltextdonetrue
+% \dodogetupsometextprefix{#1}{#2}{#3}
+% {\dodogetupsometextprefix{\defaultlanguage{#1}}{#2}{#3}
+% {\dodogetupsometextprefix{\s!en}{#2}{#3}
+% {\dodogetupsometextprefix{\s!nl}{#2}{#3}
+% {\iftracinglabels{\tttf[#2:~#3/#1]~}\fi}}}}}
+
+\beginETEX
+
+% \def\dodogetupsometextprefix#1#2#3#4%
+% {\ifcsname#2#1#3\endcsname
+% \csname#2#1#3\endcsname
+% \else\ifcsname#2#3\endcsname
+% \csname#2#3\endcsname
+% \else
+% #4%
+% \fi\fi}
+%
+% this can be reduced to:
+%
+% \def\dodogetupsometextprefix#1#2#3%
+% {\ifcsname#2#1#3\endcsname
+% \csname#2#1#3\endcsname
+% \@EA\gobbleoneargument
+% \else\ifcsname#2#3\endcsname
+% \csname#2#3\endcsname
+% \@EAEAEA\gobbleoneargument
+% \else
+% \@EAEAEA\firstofoneargument
+% \fi\fi}
+%
+% \endETEX
+%
+% \beginTEX
+%
+% \def\dodogetupsometextprefix#1#2#3%
+% {\@EA\ifx\csname#2#1#3\endcsname\relax
+% \@EA\ifx\csname#2#3\endcsname\relax
+% \@EAEAEA\firstofoneargument
+% \else
+% \csname#2#3\endcsname
+% \@EAEAEA\gobbleoneargument
+% \fi
+% \else
+% \csname#2#1#3\endcsname
+% \@EA\gobbleoneargument
+% \fi}
+%
+% \endTEX
+%
+% \unexpanded\def\dogetupsometextprefix#1#2#3%
+% {\global\labeltextdonetrue
+% \dodogetupsometextprefix{#1}{#2}{#3}
+% {\dodogetupsometextprefix{\defaultlanguage{#1}}{#2}{#3}
+% {\dodogetupsometextprefix\s!en{#2}{#3}
+% {\dodogetupsometextprefix\s!nl{#2}{#3}
+% {\reporttextprefixerror{#1}{#2}{#3}}}}}}
+
+\def\reporttextprefixerror#1#2#3%
+ {\iftracinglabels{\tttf[#2:~#3/#1]~}\fi}
+
+\beginETEX \ifcsname
+
\unexpanded\def\dogetupsometextprefix#1#2#3%
- {\global\labeltextdonetrue
- \dodogetupsometextprefix{#1}{#2}{#3}
- {\dodogetupsometextprefix{\defaultlanguage{#1}}{#2}{#3}
- {\dodogetupsometextprefix{\s!en}{#2}{#3}
- {\dodogetupsometextprefix{\s!nl}{#2}{#3}
- {\iftracinglabels{\tttf[#2:~#3/#1]~}\fi}}}}}
+ {\global\labeltextdonetrue
+ \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}
+
+\endETEX
+
+\beginTEX
+\unexpanded\def\dogetupsometextprefix#1#2#3%
+ {\global\labeltextdonetrue
+ \@EA\ifx\csname#2#1#3\endcsname\relax
+ \@EA\ifx\csname#2#3\endcsname\relax
+ \@EA\ifx\csname#2\defaultlanguage{#1}#3\endcsname\relax
+ \@EA\ifx\csname#2\s!en#3\endcsname\relax
+ \@EA\ifx\csname#2\s!nl#3\endcsname\relax
+ \reporttextprefixerror{#1}{#2}{#3}%
+ \else\csname#2\s!nl#3\endcsname
+ \fi\else\csname#2\s!en#3\endcsname
+ \fi\else\csname#2\defaultlanguage{#1}#3\endcsname
+ \fi\else\csname#2#3\endcsname
+ \fi\else\csname#2#1#3\endcsname
+ \fi}
+
+\endTEX
+
\ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi
\appendtoks
@@ -166,17 +258,15 @@
%D head and label texts without replacing predefined ones.
%D These are internal macros.
-\def\dopresetsometextprefix#1%
- {\def\dodocommando[##1][##2=##3]%
- {\doifundefined{##1##2}
- {\doassignsometextprefix[##1##2][##3,,]}}%
- \dodosetupsometextprefix{#1}}
+\def\xdopresetsometextprefix[#1][#2=#3]%
+ {\ifundefined{#1#2}\doassignsometextprefix[#1#2][#3,,]\fi}
-\def\presetheadtext%
- {\dopresetsometextprefix\c!titel}
+\def\dopresetsometextprefix
+ {\let\dodocommando\xdopresetsometextprefix
+ \dotripleempty\dodosetupsometextprefix}
-\def\presetlabeltext%
- {\dopresetsometextprefix\c!label}
+\def\presetheadtext {\dopresetsometextprefix[\c!titel]}
+\def\presetlabeltext{\dopresetsometextprefix[\c!label]}
%D \macros
%D {translate}
@@ -196,7 +286,7 @@
%D which expands to {\em something} or {\em iets}, depending on
%D de current language.
-\def\dotranslate[#1]% don't group!
+\def\dotranslate[#1]% don't group! SLOW if really used: speed up
{\getparameters[\??lg][#1]%
\doifdefinedelse{\??lg\currentlanguage}%
{\getvalue{\??lg\currentlanguage}}
@@ -206,7 +296,7 @@
{\getvalue{\??lg\s!nl}}
{[translation #1]}}}}
-\unexpanded\def\translate%
+\unexpanded\def\translate
{\dosingleempty\dotranslate}
%D When used without argument, the last defined values are
@@ -228,8 +318,6 @@
\def\assigntranslation[#1]\to#2%
{\getparameters[\??lg][#1]%
- \edef#2{\getvalue{\??lg\currentlanguage}}}
-
-\protect
+ \edef#2{\csname\??lg\currentlanguage\endcsname}}
-\endinput
+\protect \endinput
diff --git a/tex/context/base/lang-sla.tex b/tex/context/base/lang-sla.tex
index 1b3dd3d3e..fa9eb9605 100644
--- a/tex/context/base/lang-sla.tex
+++ b/tex/context/base/lang-sla.tex
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D 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,
diff --git a/tex/context/base/lang-ura.tex b/tex/context/base/lang-ura.tex
index 128fab6d5..22072dc0e 100644
--- a/tex/context/base/lang-ura.tex
+++ b/tex/context/base/lang-ura.tex
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D Todo: replace \'.. by \namedglyph
+
\writestatus{loading}{Uralic Languages}
%D The framework of this module is set up by Hans Hagen while
diff --git a/tex/context/base/m-chart.tex b/tex/context/base/m-chart.tex
index 708aa791d..95d768cc3 100644
--- a/tex/context/base/m-chart.tex
+++ b/tex/context/base/m-chart.tex
@@ -77,6 +77,9 @@
\def\FLOWbufferprefix{flw-}
+\def\processFLOWbuffer#1{\haalbuffer[\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%
@@ -159,8 +162,8 @@
\def\doFLOWtext%
{\dosingleempty\dodoFLOWtext}
-\def\dodoFLOWtext[#1]#2%
- {\gdef\FLOWalign{#1}\gdef\FLOWtext{#2}}
+\def\dodoFLOWtext[#1]% % #2%
+ {\gdef\FLOWalign{#1}\gdef\FLOWtext}% {#2}}
\def\doFLOWcomment[#1]#2%
{\ignorespaces\dogobblesingleempty}
@@ -284,7 +287,7 @@
\gdef\dohandleflowchart[####1][####2]%
{\popmacro\dohandleflowchart
\resetFLOWlocation
- \haalbuffer[\FLOWbufferprefix####1]}%
+ \processFLOWbuffer{####1}}%
\getvalue{\@FLOW@-##1}}}%
\processcommalist[#1]\dodoincludeFLOWchart
\popmacro\includeFLOWx
@@ -387,7 +390,7 @@
\let\FLOWheight\@@FLOWny
\let\startFLOWcell\startFLOWcellA
\resetFLOWlocation
- \haalbuffer[\FLOWbufferprefix\currentFLOWnumber]%
+ \processFLOWbuffer\currentFLOWnumber
\ifcase\@@FLOWnx\relax \let\@@FLOWnx\FLOWwidth \fi
\ifcase\@@FLOWny\relax \let\@@FLOWny\FLOWheight \fi
\doifnothing{\@@FLOWmaxbreedte\@@FLOWmaxhoogte}{\FLOWscalingfalse}%
@@ -473,7 +476,7 @@
\resetMPdrawing
\doglobal\newcounter\FLOWcomment
\startMPdrawing
- input mp-char.mp ;
+ if unknown context_char : input mp-char.mp ; fi ;
grid_width := \FLOWgridwidth ;
grid_height := \FLOWgridheight ;
shape_width := \FLOWshapewidth ;
@@ -493,7 +496,7 @@
% \ignorespaces}%
% \let\startFLOWcell\startFLOWcellX
% \resetFLOWlocation
-% \haalbuffer[\FLOWbufferprefix\currentFLOWnumber]%
+% \processFLOWbuffer\currentFLOWnumber
% \ifnum\@@FLOWnx\@@FLOWny=11 % listig
% \let\@@FLOWnx\FLOWwidth
% \let\@@FLOWny\FLOWheight
@@ -528,16 +531,19 @@
\stopMPdrawing]%
\let\startFLOWcell\startFLOWcellB
\resetFLOWlocation
- \haalbuffer[\FLOWbufferprefix\currentFLOWnumber]%
+ \processFLOWbuffer\currentFLOWnumber
\let\startFLOWcell\startFLOWcellC
\resetFLOWlocation
- \haalbuffer[\FLOWbufferprefix\currentFLOWnumber]%
+ \processFLOWbuffer\currentFLOWnumber
\startMPdrawing
clip_chart(\@@FLOWx,\@@FLOWy,\@@FLOWnx,\@@FLOWny) ;
end_chart ;
\stopMPdrawing
\MPdrawingdonetrue
- \setbox0=\hbox{\MPshiftdrawingfalse\getMPdrawing}%
+ \setbox0=\hbox
+ {\MPstaticgraphictrue
+ \MPshiftdrawingfalse
+ \getMPdrawing}%
\def\MPmessage##1%
{\writestatus{MP charts}{##1}}%
\def\MPposition##1##2##3%
@@ -554,7 +560,7 @@
\setbox2=\vbox to \ht0
{\forgetall % \offinterlineskip
\resetFLOWlocation
- \haalbuffer[\FLOWbufferprefix\currentFLOWnumber]\vss}%
+ \processFLOWbuffer\currentFLOWnumber\vss}%
\setbox2=\hbox
{\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box2}%
\wd2=\wd0\ht2=\ht0\dp2=\dp0
@@ -562,7 +568,7 @@
\setbox4=\vbox to \ht0
{\forgetall % \offinterlineskip
\resetFLOWlocation
- \haalbuffer[\FLOWbufferprefix\currentFLOWnumber]\vss}%
+ \processFLOWbuffer\currentFLOWnumber\vss}%
\setbox4=\hbox
{\hskip\@@FLOW@@offset\lower\@@FLOW@@offset\box4}%
\wd4=\wd0\ht4=\ht0\dp4=\dp0
@@ -710,7 +716,7 @@
\doifelse{\@@FLOLpijl}{\v!ja}
{\startMPdrawing arrowtip := true ; \stopMPdrawing}
{\startMPdrawing arrowtip := false ; \stopMPdrawing}%
- \doifelse{\@@FLOLoffset}{none} % {\v!geen}
+ \doifelse{\@@FLOLoffset}{\v!geen}
{\startMPdrawing touchshape := true ; \stopMPdrawing}
{\startMPdrawing touchshape := false ; \stopMPdrawing}%
\startMPdrawing
@@ -940,7 +946,7 @@
\def\@@FLOWabsx {0}\let\@@FLOWabsy\@@FLOWabsx
\let\startFLOWcell\startFLOWcellF
\resetFLOWlocation
- \haalbuffer[\FLOWbufferprefix\currentFLOWnumber]%
+ \processFLOWbuffer\currentFLOWnumber
%\message{AUTOSHAPE 1: (\@@FLOWminx,\@@FLOWminy)->(\@@FLOWmaxx,\@@FLOWmaxy)}%
\ifnum\@@FLOWabsx<\@@FLOWmaxx\let\@@FLOWmaxx\@@FLOWabsx\fi
\ifnum\@@FLOWabsy<\@@FLOWmaxy\let\@@FLOWmaxy\@@FLOWabsy\fi
@@ -1051,7 +1057,7 @@
{{##1\expandafter\getFLOWlocation\FLOWlocation\end}}%
\def\dohandleflowchart[##1][##2]%
{\resetFLOWlocation
- \haalbuffer[\FLOWbufferprefix##1]}%
+ \processFLOWbuffer{##1}}%
\getvalue{\@FLOW@-#1}}}
\def\setupFLOWsplit%
@@ -1162,7 +1168,7 @@
\def\typeFLOWchart[#1]%
{\bgroup
- \def\dohandleflowchart[##1][##2]{\typebuffer[\FLOWbufferprefix##1]}%
+ \def\dohandleflowchart[##1][##2]{\typeFLOWbuffer{##1}}%
\convertargument\startFLOWchart[#1]\to\firstverbatimfileline
\convertargument \stopFLOWchart\to\lastverbatimfileline
\getvalue{\@FLOW@-#1}
@@ -1239,6 +1245,22 @@
\setupFLOWsets
[\c!commando=]
+%D This will be an option:
+
+% \def\startFLOWchart%
+% {\dodoubleempty\dostartFLOWchart}
+%
+% \long\def\dostartFLOWchart[#1][#2]#3\stopFLOWchart
+% {\preparenextFLOWchart{#1}{#2}%
+% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
+%
+% \long\def\dodefineFLOWchart[#1][#2]#3%
+% {\preparenextFLOWchart{#1}{#2}%
+% \long\setgvalue{\FLOWbufferprefix\nofFLOWcharts}{#3}}
+%
+% \def\processFLOWbuffer#1{\getvalue{\FLOWbufferprefix#1}}
+% \def\typeFLOWbuffer #1{[Sorry, no verbatim chart #1 available.]}
+
%D The XML interface [will be mode protected or separate x-chart file]
\startXMLdefinitions flowchart
@@ -1269,9 +1291,6 @@
\defineXMLdirective [flowchart] [shapes] \setupFLOWshapes
\defineXMLdirective [flowchart] [lines] \setupFLOWlines
-
\stopXMLdefinitions
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/m-pstric.tex b/tex/context/base/m-pstric.tex
index c093cc7fa..39f45525a 100644
--- a/tex/context/base/m-pstric.tex
+++ b/tex/context/base/m-pstric.tex
@@ -26,18 +26,18 @@
{} %{\writestatus{pstricks}{overslaan definieer kleurgroep #2}}
\def\loadpstrickscolors#1%
- {\let\olddefinieerkleur=\definieerkleur
- \let\olddefinieerpalet=\definieerpalet
- \let\olddefinieerkleurgroep=\definieerkleurgroep
+ {\let\olddefinekleur =\definecolor
+ \let\olddefinepalet =\definepalet
+ \let\olddefinecolorgroup=\definecolorgroup
\writestatus{pstricks}{loading colors from #1}%
\input #1 \relax
- \let\definieerkleur=\olddefinieerkleur
- \let\definieerpalet=\olddefinieerpalet
- \let\definieerkleurgroep=\olddefinieerkleurgroep}
+ \let\definecolor =\olddefinecolor
+ \let\definepalet =\olddefinepalet
+ \let\definecolorgroup=\olddefinecolorgroup}
\input multido \relax
\input pstricks \relax
-\input pst_plot \relax
+\input pst-plot \relax
\loadpstrickscolors{colo-rgb} % nog koppelen \redef\
diff --git a/tex/context/base/m-quest.tex b/tex/context/base/m-quest.tex
index 23e9dc279..eb9787b81 100644
--- a/tex/context/base/m-quest.tex
+++ b/tex/context/base/m-quest.tex
@@ -206,10 +206,10 @@
\doifsomething{#1}
{\global\advance\invulget by 1
\doconvertfont
- {\@@ivletter}
- {\@@ivlinks
- \getvalue{\r!fillin\the\invulget}%
- \@@ivrechts}}
+ {\@@ivletter}
+ {\@@ivlinks
+ \getvalue{\r!fillin\the\invulget}%
+ \@@ivrechts}}
{\doconvertfont
{\@@ivletter}
{\@@ivlinks
diff --git a/tex/context/base/m-steps.tex b/tex/context/base/m-steps.tex
index 72a30b6eb..00a8c1ae3 100644
--- a/tex/context/base/m-steps.tex
+++ b/tex/context/base/m-steps.tex
@@ -457,8 +457,7 @@
anchor_box(\MPpos{\stepchartprefix origin}) ;
\stopMPdrawing
\MPdrawingdonetrue
- \setbox0=\vbox
- {\getMPdrawing}%
+ \setbox0=\vbox{\MPstaticgraphictrue\getMPdrawing}%
\resetMPdrawing
\setbox2=\vbox
{\offinterlineskip
@@ -792,7 +791,7 @@
anchor_box(\MPpos{\steptableprefix origin}) ;
\stopMPdrawing
\MPdrawingdonetrue
- \setbox0=\vbox{\getMPdrawing}
+ \setbox0=\vbox{\MPstaticgraphictrue\getMPdrawing}%
\resetMPdrawing
% typesetting pass
\dimen6=\@@STPTafstand \dimen6=2\dimen6
diff --git a/tex/context/base/m-units.tex b/tex/context/base/m-units.tex
index b2c82373c..8cd1d4794 100644
--- a/tex/context/base/m-units.tex
+++ b/tex/context/base/m-units.tex
@@ -83,14 +83,14 @@
%D \stelsynoniemenin [unit] [textstyle=\dimension]
%D \stoptypen
%D
-%D We have to use the command \type {\unitedmeaning} 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
%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}
@@ -277,15 +277,14 @@
\newif\ifSIunits \SIunitstrue
\def\noSI#1{\begingroup\SIunitsfalse#1\endgroup}
-\def\doSI#1{\begingroup\SIunitstrue#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{^\circ}}
+\def\Degrees{\dimensionaddfix{^\circ}}
%D \macro
%D {Unit, NoUnit}
@@ -414,6 +413,21 @@
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!eenheid} [Rad] {rad} {\labeltext{u:rad}}
@@ -434,6 +448,11 @@
[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!eenheid} [Hertz] {Hz} {Hertz}
@@ -461,6 +480,11 @@
[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!eenheid} [Gram] {g} {gram}
@@ -488,6 +512,10 @@
[\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!eenheid} [Joule] {J} {Joule}
@@ -565,6 +593,11 @@
[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!eenheid} [Baud] {Baud} {Baud (Bit/s)}
@@ -606,6 +639,14 @@
\getvalue{\v!eenheid} [kCal] {\Kilo \Cal} {\labeltext{u:kcal}}
\getvalue{\v!eenheid} [Lux] {lux} {lux}
+
+\def\xPercent {\dimensionaddfix{\percent }}
+\def\xPromille{\dimensionaddfix{\promille}}
+
+\getvalue{\v!eenheid} [Percent] {\xPercent } {percent}
+\getvalue{\v!eenheid} [Permille] {\xPromille} {promille}
+\getvalue{\v!eenheid} [Promille] {\xPromille} {promille}
+
%D Some more, thanks to Tobias:
\getvalue{\v!eenheid} [Gray] {Gr} {Gray}
@@ -642,6 +683,15 @@
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.
diff --git a/tex/context/base/math-ini.tex b/tex/context/base/math-ini.tex
index 3e02d7dbc..de2ea3ffa 100644
--- a/tex/context/base/math-ini.tex
+++ b/tex/context/base/math-ini.tex
@@ -315,12 +315,12 @@
{\popmacro\mathcollection}
\def\startrawmathcollection%
- {\pushmacro\iftracemathcollection
- \tracemathcollectionfalse
+ {%\pushmacro\iftracemathcollection % does not work in new push
+ %\tracemathcollectionfalse
\startmathcollection}
\def\stoprawmathcollection%
- {\popmacro\iftracemathcollection
+ {%\popmacro\iftracemathcollection
\stopmathcollection}
\newtoks\mathtoks
@@ -356,6 +356,43 @@
\fetchruntimecommand \showmathcharacters {\f!mathprefix\s!run}
+%D \macros
+%D {ifmathpunctuation, enablemathpunctuation,
+%D definemathpunctuation}
+%D
+%D \starttypen
+%D \definemathpunctuation . mathperiod textperiod
+%D \definemathpunctuation , mathcomma textcomma
+%D \stoptypen
+
+\newif\ifmathpunctuation
+
+\def\enablemathpunctuation{\mathpunctuationtrue}
+
+\def\definemathpunctuation #1 #2 #3 %
+ {\appendtoks
+ \initializemathpunctuation{#1}{#2}{#3}%
+ \to\everymath}
+
+\def\initializemathpunctuation#1#2#3% sloowww
+ {\ifmathpunctuation
+ \mathcode`#1="8000
+ \defineactivecharacter #1 {\dohandlemathpunctuation{#2}{#3}}%
+ \fi}
+
+\unexpanded\def\dohandlemathpunctuation#1#2% \if fails in mathml interval
+% {\def\next{\csname\if\space\nexttoken#2\else#1\fi\endcsname}%
+ {\def\next{\csname\ifx\space\nexttoken#2\else#1\fi\endcsname}%
+ \futurelet\nexttoken\next}
+
+%D \startbuffer
+%D \enablemathpunctuationtrue$(1,2) (1, 2) (1{,}2) \hbox{foo, not bar}$
+%D \stopbuffer
+%D
+%D \typebuffer
+%D
+%D \blanko{\getbuffer}\blanko
+
\edef\hexmrfam {0} \edef\hexbsfam {8}
\edef\hexmifam {1} \edef\hexbifam {9}
\edef\hexsyfam {2} \edef\hexscfam {A}
@@ -382,6 +419,10 @@
\usemathcollection[default]
+%D Some goodies:
+
+\def\Angstrom{\nomathematics{\Aring}}
+
\protect \endinput
\tracemathcollectiontrue
@@ -390,7 +431,6 @@
\setupbodyfont[ams] \enablemathcollection[ams] \input math-ams \page
\setupbodyfont[lbr] \enablemathcollection[lbr] \input math-lbr \page
\setupbodyfont[eul] \enablemathcollection[eul] \input math-eul \stoptext
-
% to be checked
diff --git a/tex/context/base/math-pln.tex b/tex/context/base/math-pln.tex
new file mode 100644
index 000000000..5bc8c689b
--- /dev/null
+++ b/tex/context/base/math-pln.tex
@@ -0,0 +1,336 @@
+%D \module
+%D [ file=math-pln,
+%D version=2001.11.16,
+%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 is a temporary module, some of this code will move to
+%D the other math modules.
+
+\unprotect
+
+\def\m@th{\mathsurround\z@}
+
+\newbox\rootbox
+
+\def\root#1\of%
+ {\setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$}%
+ \mathpalette\r@@t}
+
+\def\r@@t#1#2% will be overloaded
+ {\setbox\z@\hbox{$\m@th#1\sqrt{#2}$}\dimen@\ht\z@
+ \advance\dimen@-\dp\z@
+ \mkern5mu\raise.6\dimen@\copy\rootbox
+ \mkern-10mu\box\z@}
+
+\def\mathhexbox#1#2#3%
+ {\leavevmode
+ \hbox{$\m@th\mathchar"#1#2#3$}}
+
+\def\oalign#1%
+ {\leavevmode
+ \vtop
+ {\baselineskip\z@skip \lineskip.25ex%
+ \ialign{##\crcr#1\crcr}}}
+
+\def\o@lign
+ {\lineskiplimit\z@ \oalign}
+
+\def\ooalign % chars over each other
+ {\lineskiplimit-\maxdimen
+ \oalign}
+
+{\catcode`p=12 \catcode`t=12 \gdef\\#1pt{#1}} \let\getf@ctor=\\
+
+\def\sh@ft#1% kern by #1 times the current slant
+ {\dimen@#1%
+ \kern\expandafter\getf@ctor\the\fontdimen1\font
+ \dimen@}
+
+\def\copyright
+ {{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\Orb}}}
+
+\def\dots
+ {\relax\ifmmode\ldots\else$\m@th\ldots\,$\fi}
+
+\def\hrulefill
+ {\leaders\hrule\hfill}
+
+\def\dotfill
+ {\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill}
+
+\def\rightarrowfill
+ {$\m@th\smash-\mkern-7mu%
+ \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
+ \mkern-7mu\mathord\rightarrow$}
+
+\def\leftarrowfill
+ {$\m@th\mathord\leftarrow\mkern-7mu%
+ \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
+ \mkern-7mu\smash-$}
+
+% must go to math-tex
+
+\mathchardef\braceld="37A
+\mathchardef\bracerd="37B
+\mathchardef\bracelu="37C
+\mathchardef\braceru="37D
+
+\def\downbracefill
+ {$\m@th\setbox\z@\hbox{$\braceld$}%
+ \braceld\leaders\vrule\!!height\ht\z@\!!depth\z@\hfill\braceru
+ \bracelu\leaders\vrule\!!height\ht\z@\!!depth\z@\hfill\bracerd$}
+
+\def\upbracefill
+ {$\m@th\setbox\z@\hbox{$\braceld$}%
+ \bracelu\leaders\vrule\!!height\ht\z@\!!depth\z@\hfill\bracerd
+ \braceld\leaders\vrule\!!height\ht\z@\!!depth\z@\hfill\braceru$}
+
+\def\bye{\par\vfill\supereject\end}
+
+\let\sp=^
+\let\sb=_
+\def\,{\mskip\thinmuskip}
+\def\>{\mskip\medmuskip}
+\def\;{\mskip\thickmuskip}
+\def\!{\mskip-\thinmuskip}
+\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}}
+
+{\catcode`\'=\active \gdef'{^\bgroup\prim@s}}
+
+\def\prim@s
+ {\prime\futurelet\next\pr@m@s}
+
+\def\pr@m@s
+ {\ifx'\next
+ \let\nxt\pr@@@s
+ \else
+ \ifx^\next
+ \let\nxt\pr@@@t
+ \else
+ \let\nxt\egroup
+ \fi
+ \fi
+ \nxt}
+
+\def\pr@@@s#1%
+ {\prim@s}
+
+\def\pr@@@t#1#2%
+ {#2\egroup}
+
+{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_
+
+\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{\m@th\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+
+\def\overleftarrow#1%
+ {\vbox{\m@th\ialign{##\crcr
+ \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+
+\def\overbrace#1%
+ {\mathop{\vbox{\m@th\ialign{##\crcr\noalign{\kern3\p@}
+ \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits}
+
+\def\underbrace#1%
+ {\mathop{\vtop{\m@th\ialign{##\crcr
+ $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip}
+ \upbracefill\crcr\noalign{\kern3\p@}}}}\limits}
+
+\def\skew#1#2#3%
+ {{\muskip\z@#1mu\divide\muskip\z@\tw@ \mkern\muskip\z@
+ #2{\mkern-\muskip\z@{#3}\mkern\muskip\z@}\mkern-\muskip\z@}{}}
+
+\def\n@space
+ {\nulldelimiterspace\z@ \m@th}
+
+\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\p@\vbox{\lineskiplimit\maxdimen\lineskip-.5\p@
+ \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
+
+\def\notin%
+ {\mathrel{\mathpalette\c@ncel\in}}
+
+\def\c@ncel#1#2%
+ {\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
+
+\def\rightleftharpoons%
+ {\mathrel{\mathpalette\rlh@{}}}
+
+\def\rlh@#1%
+ {\vcenter
+ {\m@th
+ \hbox
+ {\ooalign
+ {\raise2pt\hbox{$#1\rightharpoonup$}\crcr
+ $#1\leftharpoondown$}}}}
+
+\def\buildrel#1\over#2%
+ {\mathrel{\mathop{\kern\z@#2}\limits^{#1}}}
+
+\def\doteq%
+ {\buildrel\textstyle.\over=}
+
+\def\bmod%
+ {\nonscript
+ \mskip-\medmuskip
+ \mkern5mu
+ \mathbin{\rm mod}%
+ \penalty900
+ \mkern5mu
+ \nonscript
+ \mskip-\medmuskip}
+
+\def\pmod#1%
+ {\allowbreak
+ \mkern18mu
+ ({\rm mod}\,\,#1)}
+
+\def\cases#1%
+ {\left\{%
+ \,%
+ \vcenter
+ {\normalbaselines
+ \m@th
+ \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}%
+ \right.}
+
+\def\matrix#1%
+ {\null
+ \,%
+ \vcenter
+ {\normalbaselines\m@th
+ \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\p@renwd
+
+% \setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left (
+
+\def\bordermatrix#1%
+ {\begingroup
+ \m@th
+ \setbox\z@\vbox
+ {\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}%
+ \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil
+ &&\quad\hfil$##$\hfil\crcr
+ \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}%
+ #1\crcr\omit\strut\cr}}%
+ \setbox\tw@\vbox
+ {\unvcopy\z@\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox
+ {\unhbox\@ne\unskip\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox
+ {$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne
+ \global\setbox\@ne\vbox{\box\@ne\kern2\p@}%
+ \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}%
+ \null
+ \;%
+ \vbox{\kern\ht\@ne\box\tw@}%
+ \endgroup}
+
+\def\openup{\afterassignment\@penup\dimen@=}
+
+\def\@penup{\advance\lineskip\dimen@
+ \advance\baselineskip\dimen@
+ \advance\lineskiplimit\dimen@}
+
+\def\eqalign#1%
+ {\null
+ \,%
+ \vcenter
+ {\openup
+ \jot\m@th
+ \ialign
+ {\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil\crcr
+ #1\crcr}}%
+ \,}
+
+\newif\ifdt@p
+
+\def\displ@y%
+ {\global\dt@ptrue
+ \openup\jot\m@th
+ \everycr
+ {\noalign
+ {\ifdt@p
+ \global\dt@pfalse
+ \ifdim\prevdepth>-1000\p@
+ \vskip-\lineskiplimit
+ \vskip\normallineskiplimit
+ \fi
+ \else
+ \penalty\interdisplaylinepenalty
+ \fi}}}
+
+\def\@lign % restore inside \displ@y
+ {\tabskip\z@skip
+ \everycr{}}
+
+\def\displaylines#1%
+ {\displ@y
+ \tabskip\z@skip
+ \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\z@skip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\llap{$\@lign##$}\tabskip\z@skip\crcr
+ #1\crcr}}
+
+\def\leqalignno#1%
+ {\displ@y
+ \tabskip\centering
+ \halign to \displaywidth
+ {\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr
+ #1\crcr}}
+
+\protect \endinput
diff --git a/tex/context/base/math-tex.tex b/tex/context/base/math-tex.tex
index 2cc88200f..9ac574889 100644
--- a/tex/context/base/math-tex.tex
+++ b/tex/context/base/math-tex.tex
@@ -218,6 +218,12 @@
\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]
@@ -495,4 +501,17 @@
\def\mit {\fam\purefamily{mitfamily}}
\def\cal {\fam\purefamily{calfamily}}
+\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
+
\protect \endinput
diff --git a/tex/context/base/meta-fig.tex b/tex/context/base/meta-fig.tex
index e86d4f913..efbd48f0e 100644
--- a/tex/context/base/meta-fig.tex
+++ b/tex/context/base/meta-fig.tex
@@ -41,47 +41,6 @@
%D definitions with the text flow, since all settings are
%D kept local. The page is clipped to the image size.
-% \presetlocalframed[\??mp]
-%
-% \def\setupMPpage%
-% {\dodoubleargument\getparameters[\??mp]}
-%
-% \def\startMPpage%
-% {\dosingleempty\dostartMPpage}
-%
-% \long\def\dostartMPpage[#1]#2\stopMPpage
-% {\pagina
-% \bgroup
-% \setbox\scratchbox=\hbox
-% {\localframed[\??mp][#1]{\startMPcode#2\stopMPcode}}
-% \edef\MPwd{\the\wd\scratchbox}
-% \edef\MPht{\the\ht\scratchbox}
-% \definepapersize
-% [\s!dummy]
-% [\c!breedte=\MPwd,
-% \c!hoogte=\MPht]
-% \startlocal % keep settings as local as can be
-% \setuppapersize
-% [\s!dummy][\s!dummy]
-% \stellayoutin
-% [\c!breedte=\MPwd,\c!hoogte=\MPht,
-% \c!kopwit=\!!zeropoint,\c!rugwit=\!!zeropoint,
-% \c!snijwit=\!!zeropoint,\c!bodemwit=\!!zeropoint,
-% \c!hoofd=\!!zeropoint,\c!voet=\!!zeropoint]
-% \stoplocal % which saves us the trouble of push/pop
-% \startmakeup[\v!standaard]%
-% \centerbox{\box\scratchbox}%
-% \stopmakeup
-% \egroup}
-%
-% \setupMPpage
-% [\c!strut=\v!nee,
-% \c!uitlijnen=,
-% \c!offset=\v!overlay,
-% \c!breedte=\v!passend,
-% \c!hoogte=\v!passend,
-% \c!kader=\v!uit]
-
% generalized, so this belongs in another module
\def\dostartfittingpage[#1][#2]%
@@ -94,22 +53,22 @@
\def\dostopfittingpage%
{\egroup\egroup\egroup
- \edef\fittingwd{\the\wd\scratchbox}
- \edef\fittinght{\the\ht\scratchbox}
+ \edef\fittingwd{\the\wd\scratchbox}%
+ \edef\fittinght{\the\ht\scratchbox}%
\definepapersize
[\s!dummy]
[\c!breedte=\fittingwd,
- \c!hoogte=\fittinght]
+ \c!hoogte=\fittinght]%
\startlocal % keep settings as local as can be
\setuppapersize
- [\s!dummy][\s!dummy]
+ [\s!dummy][\s!dummy]%
\stellayoutin
[\c!breedte=\fittingwd,\c!hoogte=\fittinght,\c!plaats=\v!midden,
\c!kopwit=\!!zeropoint,\c!rugwit=\!!zeropoint,
\c!snijwit=\!!zeropoint,\c!bodemwit=\!!zeropoint,
- \c!hoofd=\!!zeropoint,\c!voet=\!!zeropoint]
+ \c!hoofd=\!!zeropoint,\c!voet=\!!zeropoint]%
\stoplocal % which saves us the trouble of push/pop
- \startmakeup[\v!standaard]%
+ \startmakeup[\v!standaard][\c!dubbelzijdig=\v!nee,\c!pagina=]%
\centerbox{\box\scratchbox}%
\stopmakeup
\egroup}
@@ -126,7 +85,7 @@
\long\def\dostartMPpage[#1]#2\stopMPpage
{\dostartfittingpage[\??mg][#1]%
- \startMPcode#2\stopMPcode%
+ \startMPcode#2\stopMPcode
\dostopfittingpage}
\setupMPpage
@@ -167,7 +126,7 @@
\def\MPfigure#1#2% test for dup figure
{\bgroup
- \getfiguredimensions[#1][\c!object=\v!nee]%
+ \getfiguredimensionsonly[#1]% [\c!object=\v!nee] already set
\freezedimenmacro\naturalfigurewidth
\freezedimenmacro\naturalfigureheight
\startMPcode
diff --git a/tex/context/base/meta-ini.tex b/tex/context/base/meta-ini.tex
index 6a8d90399..f7c337645 100644
--- a/tex/context/base/meta-ini.tex
+++ b/tex/context/base/meta-ini.tex
@@ -11,6 +11,11 @@
%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
@@ -57,6 +62,8 @@
%D macros. so let's first preload a few auxiliary \METAPOST\
%D files.
+\maxnofMPgraphics = 8000 % metafun disables the 4K boundary
+
\appendtoks
if unknown context_tool : input mp-tool ; fi ;
if unknown context_spec : input mp-spec ; fi ;
@@ -83,13 +90,19 @@
\appendtoks \let\handlecompoundcharacter\string \to \everyMPgraphic
+%D Another one:
+
+\prependtoks \MPstaticgraphictrue \to \everyoverlay
+\prependtoks \MPstaticgraphictrue \to \everypagebody
+
%D We save the number of graphics for the sake of \TEXEXEC.
\newcounter\totalnumberofMPgraphics
-\def\thecurrentMPgraphic{\the\currentMPgraphic}
+
+\def\thenofMPgraphics{\the\nofMPgraphics} % from supp-mps
\appendtoks
- \savecurrentvalue\totalnumberofMPgraphics\thecurrentMPgraphic
+ \savecurrentvalue\totalnumberofMPgraphics\thenofMPgraphics
\to \everybye
%D \macros
@@ -120,8 +133,26 @@
\let\@@framed\s!unknown
+% \def\MPvariable#1%
+% {\getvalue{\ifundefined{\@@framed\@@meta#1}\else\@@framed\fi\@@meta#1}}
+
+\beginTEX
+
\def\MPvariable#1%
- {\getvalue{\ifundefined{\@@framed\@@meta#1}\else\@@framed\fi\@@meta#1}}
+ {\csname
+ \@EA\ifx\csname\@@framed\@@meta#1\endcsname\relax\else\@@framed\fi\@@meta#1%
+ \endcsname}
+
+\endTEX
+
+\beginETEX \ifcsname
+
+\def\MPvariable#1%
+ {\csname
+ \ifcsname\@@framed\@@meta#1\endcsname\@@framed\fi\@@meta#1%
+ \endcsname}
+
+\endETEX
\let\MPvar\MPvariable
@@ -146,18 +177,22 @@
%D
%D \starttypen
%D \long\def\startuniqueMPgraphic#1#2\stopuniqueMPgraphic%
-%D {\setvalue{MP:#1}%
+%D {\setvalue{\@@MPG#1}%
%D {\startreusableMPgraphic{\overlaystamp:#1}#2\stopreusableMPgraphic
%D \reuseMPgraphic{\overlaystamp:#1}}}
%D
%D \def\uniqueMPgraphic#1%
-%D {\getvalue{MP:#1}}
+%D {\getvalue{\@@MPG#1}}
%D \stoptypen
+%\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}}
-
+ :\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
@@ -176,35 +211,33 @@
%D \uniqueMPgraphic{meta:hash}{gap=10pt,angle=30}
%D \stoptypen
-\def\handleuniqueMPgraphic#1#2#3%
+\long\def\handleuniqueMPgraphic#1#2#3%
{\def\@@meta{#1:}%
\extendMPoverlaystamp{#2}% incl prepare
- %\startreusableMPgraphic{\overlaystamp:#1}#3\stopreusableMPgraphic
- %\getvalue{MP:\overlaystamp:#1}} % no \reuseMPgraphic, else wrong \@@meta
- \ifundefined{MP:\overlaystamp:#1}%
+ \ifundefined{\@@MPG\overlaystamp:#1}%
\enableincludeMPgraphics
\startMPgraphic#3\stopMPgraphic
- \doifobjectssupportedelse{}{\useMPboxfalse}%
+ \doifobjectssupportedelse\donothing\useMPboxfalse
\ifuseMPbox
- \douseMPbox{MP:\overlaystamp:#1}%
+ \@EA\douseMPbox
\else
- \nouseMPbox{MP:\overlaystamp:#1}%
- \fi
+ \@EA\nouseMPbox
+ \fi {\@@MPG\overlaystamp:#1}%
\fi
- \getvalue{MP:\overlaystamp:#1}}
+ \getvalue{\@@MPG\overlaystamp:#1}}
\long\def\startuniqueMPgraphic%
{\dodoublegroupempty\dostartuniqueMPgraphic}
\long\def\dostartuniqueMPgraphic#1#2#3\stopuniqueMPgraphic%
- {\setvalue{MP:#1}{\handleuniqueMPgraphic{#1}{#2}{#3}}}
+ {\long\setvalue{\@@MPG#1}{\handleuniqueMPgraphic{#1}{#2}{#3}}}
\unexpanded\def\uniqueMPgraphic%
{\dodoublegroupempty\douniqueMPgraphic}
\def\douniqueMPgraphic#1#2%
-% {{\def\@@meta{#1:}\setupMPvariables[#2]\getvalue{MP:#1}{}}}
- {{\setupMPvariables[#1][#2]\getvalue{MP:#1}{}}}
+% {{\def\@@meta{#1:}\setupMPvariables[#2]\getvalue{\@@MPG#1}{}}}
+ {{\setupMPvariables[#1][#2]\getvalue{\@@MPG#1}{}}}
\long\def\handleuseMPgraphic#1#2#3%
{\bgroup
@@ -212,22 +245,24 @@
\prepareMPvariables{#2}%
\enableincludeMPgraphics
\startMPgraphic#3\stopMPgraphic
- \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \ifMPrun \else % see mfun-004 : processing buffer
+ \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \placeMPgraphic
+ \fi
\deallocateMPslot\currentMPgraphic
- \placeMPgraphic
\egroup}
\long\def\startuseMPgraphic%
{\dodoublegroupempty\dostartuseMPgraphic}
\long\def\dostartuseMPgraphic#1#2#3\stopuseMPgraphic%
- {\long\setgvalue{MP:#1}{\handleuseMPgraphic{#1}{#2}{#3}}}
+ {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}{#3}}}
\long\def\startusableMPgraphic% % redundant but handy
{\dodoublegroupempty\dostartusableMPgraphic}
\long\def\dostartusableMPgraphic#1#2#3\stopusableMPgraphic%
- {\long\setgvalue{MP:#1}{\handleuseMPgraphic{#1}{#2}{#3}}}
+ {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}{#3}}}
\long\def\handlereusableMPgraphic#1#2#3%
{\bgroup
@@ -235,28 +270,31 @@
\prepareMPvariables{#2}%
\enableincludeMPgraphics
\startMPgraphic#3\stopMPgraphic
- \doifobjectssupportedelse{}{\useMPboxfalse}%
+ \doifobjectssupportedelse\donothing\useMPboxfalse
\ifuseMPbox
- \douseMPbox{MP:#1}%
+ \@EA\douseMPbox
\else
- \nouseMPbox{MP:#1}%
- \fi
- \getvalue{MP:#1}%
+ \@EA\nouseMPbox
+ \fi {\@@MPG#1}%
+ \getvalue{\@@MPG#1}%
\egroup}
\long\def\startreusableMPgraphic%
{\dodoublegroupempty\dostartreusableMPgraphic}
-\long\def\dostartreusableMPgraphic#1#2#3\stopreusableMPgraphic%
- {\ifundefined{MP:#1}%
- \long\setgvalue{MP:#1}{\handlereusableMPgraphic{#1}{#2}{#3}}%
- \fi}
+% \long\def\dostartreusableMPgraphic#1#2#3\stopreusableMPgraphic%
+% {\ifundefined{\@@MPG#1}%
+% \long\setgvalue{\@@MPG#1}{\handlereusableMPgraphic{#1}{#2}{#3}}%
+% \fi}
+
+\long\def\dostartreusableMPgraphic#1#2#3\stopreusableMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handlereusableMPgraphic{#1}{#2}{#3}}}
\unexpanded\def\useMPgraphic%
{\dodoublegroupempty\douseMPgraphic}
\def\douseMPgraphic#1#2%
- {{\setupMPvariables[#1][#2]\getvalue{MP:#1}{}}}
+ {{\setupMPvariables[#1][#2]\getvalue{\@@MPG#1}{}}}
\let\reuseMPgraphic\useMPgraphic
@@ -302,11 +340,12 @@
%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%
- {\def\docommando##1%
- {\prepareMPvariable{##1}%
- \edef\overlaystamp{\overlaystamp:\MPvariable{##1}}}%
- \processcommalist[#1]\docommando}
+ {\processcommalist[#1]\doextendMPoverlaystamp}
\def\prepareMPvariables#1%
{\processcommalist[#1]\prepareMPvariable}
@@ -319,6 +358,15 @@
\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 We also have to make sure that \METAPOST\ knows this:
\appendtoks
@@ -367,20 +415,22 @@
{\doifelsenothing{#1}
{\doprocessMPbuffer[\jobname]}
{\bgroup
- \let\par\empty
- \!!toksa=\emptytoks
+ \setnormalcatcodes
+ %\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
- \ifMPrun
- \@EA\startMPrun\the\!!toksa\stopMPrun
- \else
- \@EA\startuseMPgraphic\@EA{\@EA\s!dummy\@EA}\the\!!toksa\stopuseMPgraphic
- \useMPgraphic{\s!dummy}%
- \fi
+ \@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
@@ -391,6 +441,8 @@
\newtoks\everyMPTEXgraphic
\fi
+%D A more generar of passing environments is:
+
\def\startMPenvironment% % second arg gobbles spaces, so
{\dodoubleempty\dostartMPenvironment} % that reset gives \emptytoks
@@ -404,11 +456,11 @@
\def\resetMPenvironment%
{\everyMPTEXgraphic=\emptytoks % = is really needed !
\startMPenvironment
- \global\loadfontdefinitionfileoncetrue
+ \global\loadfontfileoncetrue
\stopMPenvironment}
\startMPenvironment
- \global\loadfontdefinitionfileoncetrue
+ \global\loadfontfileoncetrue
\stopMPenvironment
%D This command takes \type {[reset]} as optional
@@ -436,11 +488,17 @@
% \immediate\closeout\MPwrite
% }%\fi}
-
\def\initializeMPgraphicfile
- {\immediate\openout\MPwrite\MPgraphicfile.mp
- \immediate\write\MPwrite{end.}%
- \immediate\closeout\MPwrite}
+ {\bgroup
+ \doinitializeMPgraphicfile
+ \MPruntrue
+ \doinitializeMPgraphicfile
+ \egroup}
+
+\def\doinitializeMPgraphicfile
+ {\immediate\openout\scratchwrite\MPgraphicfile.mp
+ \immediate\write\scratchwrite{end.}%
+ \immediate\closeout\scratchwrite}
\def\initializeMPgraphics%
{\bgroup
@@ -538,6 +596,11 @@
\includeMPgraphic{init data}
\to \MPinitializations
+\appendtoks
+ \baselineskip1\baselineskip
+ \lineheight 1\lineheight
+\to \everyMPgraphic
+
% this will become (more efficient)
%
% \startuseMPgraphic{init data}
@@ -597,17 +660,83 @@
%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 \starttypen
+%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!nee,%
+%D \c!symbool=\v!ja,\c!reset=\v!ja,%
+%D \c!maxbreedte=,\c!maxhoogte=,%
+%D \c!kader=\v!uit,\c!achtergrond=,%
+%D #2]%
+%D \egroup
+%D \fi}
+%D \stoptypen
+%D
+%D However, on a 1 Gig Pentium, the next alternative saves
+%D us 20 seconds run time for the 300 page \METAFUN\ manual:
+
\def\insertMPfile#1#2%
- {\ifx\pdfoutput\undefined
- \doinsertMPfile{#1}%
- \else\ifcase\pdfoutput
- \doinsertMPfile{#1}%
- \else
- \doiffileelse{#1}
- {{\chardef\makeMPintoPDFobject=2 % in order to handle specials
- \convertMPtoPDF{#1}{1}{1}}}
- {\doinsertMPfile{#1}}%
- \fi\fi}
+ {\doiffileelse{./#1}
+ {\ifcase\pdfoutput
+ \@EA\includeMPasEPS\else\@EA\includeMPasPDF
+ \fi{./#1}}
+ {\message{[MP #1]}}}
+
+\def\includeMPasEPS#1%
+ {\bgroup
+ \message{[MP as EPS #1]}%
+ \the\everyinsertMPfile
+ \dogetEPSboundingbox{#1}\!!widtha\!!heighta\!!widthb\!!heightb
+ \setbox\scratchbox\vbox to \!!heightb
+ {\vfill
+ \doinsertfile
+ {\c!mps,\c!mps}{#1,\empty}{100}{100}
+ \!!widtha\!!heighta\!!widthb\!!heightb{0}}%
+ \wd\scratchbox\!!widthb
+ \dp\scratchbox\zeropoint
+ \box\scratchbox
+ \egroup}
+
+\def\includeMPasPDF#1%
+ {\bgroup
+ \the\everyinsertMPfile
+ \ifinobject \else \chardef\makeMPintoPDFobject=2 \fi % when needed
+ \convertMPtoPDF{#1}{1}{1}%
+ \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 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,
@@ -616,13 +745,9 @@
%D can occur. One took me over a day to uncover when
%D processing the screen version of the \METAFUN\ manual.
-\def\doinsertMPfile#1%
- {\externalfigure
- [#1]
- [\c!type=\c!mps,\c!object=\v!nee,
- \c!reset=\v!ja,\c!symbool=\v!ja,
- \c!maxbreedte=,\c!maxhoogte=,
- \c!kader=\v!uit,\c!achtergrond=]}
+%D For my eyes only:
+
+\def\doifelseMPgraphic#1{\doifdefinedelse{\@@MPG#1}}
\protect \endinput
diff --git a/tex/context/base/meta-pag.tex b/tex/context/base/meta-pag.tex
index e1deafb21..90c8cc25b 100644
--- a/tex/context/base/meta-pag.tex
+++ b/tex/context/base/meta-pag.tex
@@ -1,38 +1,39 @@
%D \module
%D [ file=meta-ini,
%D version=1999.07.10,
-%D title=\METAPOST\ Graphics,
-%D subtitle=Initialization,
+%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.
+%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.
+%D keeping them separate is cleaner.
\writestatus{loading}{MetaPost Graphics / Page Data Management}
-\unprotect
+\unprotect
-\appendtoks
- if unknown context_page : input mp-page ; fi ;
-\to \MPinitializations
+\appendtoks
+ if unknown context_page : input mp-page ; fi ;
+\to \MPinitializations
-%D The next few macros tell \METAPOST\ how the \CONTEXT\
-%D pagebody looks.
+%D The next few macros tell \METAPOST\ how the \CONTEXT\
+%D pagebody looks.
\startuseMPgraphic{page data}
- boolean PageStateAvailable ; PageStateAvailable := true ;
- boolean OnRightPage ; OnRightPage := true ;
- def LoadPageState =
- OnRightPage := \MPonrightpage ;
- RealPageNumber := \the\realpageno ;
- PageNumber := \the\pageno ;
+ boolean PageStateAvailable, OnRightPage, InPageBody ;
+ PageStateAvailable := OnRightPage := true ;
+ InPageBody := \ifinpagebody true \else false \fi ;
+ def LoadPageState =
+ OnRightPage := \MPonrightpage ;
+ RealPageNumber := \the\realpageno ;
+ PageNumber := \the\pageno ;
NOfPages := \lastpage ;
PaperHeight := \the\papierhoogte ;
PaperWidth := \the\papierbreedte ;
@@ -60,67 +61,61 @@
RightMarginWidth := \the\rechtermargebreedte ;
RightEdgeDistance := \@the\rechterrandafstand ;
RightEdgeWidth := \the\rechterrandbreedte ;
- PageOffset := \MPpageoffset ;
- PageDepth := \MPpagedepth ;
- enddef ;
+ PageOffset := \the\pageoffset ;
+ PageDepth := \the\pagedepth ;
+ enddef ;
\stopuseMPgraphic
-
-\def\MPonrightpage{true}
-\let\MPpageoffset \!!zeropoint
-\let\MPpagedepth \!!zeropoint
+
+\def\MPonrightpage{true}
\def\freezeMPpagelayout%
- {\doifelsevalue{\??ma\v!pagina\c!offset}{\v!overlay}
- {\let\MPpageoffset\!!zeropoint}
- {\edef\MPpageoffset{\getvalue{\??ma\v!pagina\c!offset}}}%
- \edef\MPpagedepth{\getvalue{\??ma\v!pagina\c!diepte}}%
- \freezedimenmacro\MPpageoffset
- \freezedimenmacro\MPpagedepth
- \doifbothsides
- \def\MPonrightpage{true}%
+ {% the \edef\MPonrightpage{....} alternative is slower
+ \doifbothsides
+ \def\MPonrightpage{true}%
\orsideone
- \def\MPonrightpage{true}%
+ \def\MPonrightpage{true}%
\orsidetwo
- \def\MPonrightpage{false}%
+ \def\MPonrightpage{false}%
\od}
-
-\iffixedlayoutdimensions
+
+\iffixedlayoutdimensions
\let\freezeMPlayout\relax
\else
\def\freezeMPlayout% must be done more efficient
- {\freezedimenmacro\bovenafstand
- \freezedimenmacro\hoofdafstand
- \freezedimenmacro\voetafstand
- \freezedimenmacro\onderafstand
- \freezedimenmacro\linkerrandafstand
- \freezedimenmacro\linkermargeafstand
- \freezedimenmacro\rechtermargeafstand
- \freezedimenmacro\rechterrandafstand}
+ {\freezedimenmacro\bovenafstand
+ \freezedimenmacro\hoofdafstand
+ \freezedimenmacro\voetafstand
+ \freezedimenmacro\onderafstand
+ \freezedimenmacro\linkerrandafstand
+ \freezedimenmacro\linkermargeafstand
+ \freezedimenmacro\rechtermargeafstand
+ \freezedimenmacro\rechterrandafstand}
\fi
-%D We need to freeze the pagelayout before the backgrounds
-%D are build, because the overlay will temporarily become
+%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 \everypagebody
+\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.
+%D By freezing these value every graphic, we can use layout
+%D variables that change halfways a page, whatever use that
+%D has.
-\prependtoks
+\prependtoks
\calculatereducedvsizes % this is really needed
- \freezeMPlayout % to be used grouped
-\to \everyMPgraphic
+ \freezeMPpagelayout
+ \freezeMPlayout % to be used grouped
+\to \everyMPgraphic
-\appendtoks
- \includeMPgraphic{page data}
+\appendtoks
+ \includeMPgraphic{page data}
\to \MPinitializations
-\protect \endinput
+\protect \endinput
diff --git a/tex/context/base/meta-txt.tex b/tex/context/base/meta-txt.tex
index 87605556d..85d12d68e 100644
--- a/tex/context/base/meta-txt.tex
+++ b/tex/context/base/meta-txt.tex
@@ -25,7 +25,7 @@
\unprotect
\appendtoks
- input mp-text ;
+ if unknown context_text : input mp-text ; fi ;
\to \MPinitializations
%%%%%%%
@@ -48,7 +48,7 @@
\expanded{\switchtobodyfont[\@@shkorps]}%
\dontcomplain
\hsize\parwidth
- \setuptolerance[\v!zeersoepel,\v!rek]%
+ \steltolerantiein[\v!zeersoepel,\v!rek]%
\!!counta=0
\!!toksa=\emptytoks
\def\docommando##1%
@@ -83,12 +83,12 @@
\else
\advance\!!counta by -1
\fi}%
- \!!counta=\prevgraf
+ \!!counta\prevgraf
\doglobal\decrement(\totalparlines,\!!counta)%
\multiply\!!counta by 2
- \!!toksa=\emptytoks
+ \!!toksa\emptytoks
\expanded{\processseparatedlist[\the\partoks][\space]}\docommando
- \global\partoks=\!!toksa
+ \global\partoks\!!toksa
%\ifx\partoks\emptytoks\else % safeguard
\expanded{\parshape\totalparlines\the\partoks}%
}%\fi}
@@ -96,18 +96,18 @@
\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 =1
- \global\chardef\parfirst =0
- \global\parvoffset =\!!zeropoint
- \global\parhoffset =\!!zeropoint
- \global\parwidth =\hsize
- \global\parheight =\vsize}}
+ {\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 1
+ \global\chardef\parfirst 0
+ \global\parvoffset \zeropoint
+ \global\parhoffset \zeropoint
+ \global\parwidth \hsize
+ \global\parheight \vsize}}
\def\setshapecharacteristics%
{\doglobal\increment\currentshapetext
@@ -123,14 +123,14 @@
\forgetall
\setbox\scratchbox\vbox to \parheight
{\expanded{\switchtobodyfont[\@@shkorps]}% evt strutheight en
- \splittopskip=\strutheight % lineheight opslaan
+ \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
+ \wd\scratchbox\parwidth
+ \ht\scratchbox\parheight
+ \dp\scratchbox\zeropoint
\box\scratchbox
\getshapecharacteristics
\egroup}
@@ -175,6 +175,7 @@
\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 ;
@@ -187,7 +188,7 @@
RotPath := RotPath scaled ((len[n]+ExtraRot)/al) ;
al := arclength RotPath ;
fi ;
- pl := (al-len[n])/(n-1) ;
+ pl := (al-len[n])/(if n>1 : (n-1) else : 1 fi) ;
if TraceRot :
draw RotPath withpen pencircle scaled 1pt withcolor blue ;
fi ;
@@ -197,7 +198,8 @@
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 ;
+ 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
@@ -274,4 +276,18 @@
\setlocalhsize \noindent \reuseMPgraphic{EnglishRule}
\stoplinecorrection}
+%D The following macro returns a tight bound character
+%D sequence.
+%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/mult-com.tex b/tex/context/base/mult-com.tex
index d04ad2059..98a2e0441 100644
--- a/tex/context/base/mult-com.tex
+++ b/tex/context/base/mult-com.tex
@@ -22,7 +22,7 @@
%D
%D The German translations were provided by Tobias Burnus,
%D the Czech ones by Tom Hudec, and the Italian ones
-%D by Giuseppe Bilotta. Here we include their comments.
+%D by Giuseppe Bilotta. Here we include their comments.
%D Giuseppe Bilotta: \citaat {Having to choose between a
%D full|-|length name and a shortcut, I decided to resort to the
@@ -34,7 +34,7 @@
%D \tex{impostapdp}, and so for all composed words: \tex{footnote}
%D (nota a pi\`e di pagina) becomes \tex{notapdp};
%D \tex{footnotetext} (testo della nota a pi\`e di pagina) becomes
-%D \tex{testonotapdp}; and so on.}
+%D \tex{testonotapdp}; and so on.}
\writestatus{loading}{Context Multilingual Macros / Commands}
@@ -757,13 +757,13 @@
kolom: kolom column
spalte sloupec
colonna coloana
- kop: kop head
+ head: kop head
kopf nadpis
testa titlu % GB
but: but but
but spodek
fondo but
- som: som item
+ item: som item
pos polozka
elemento element
nop: nop nop
@@ -780,19 +780,26 @@
el el % abbr. of elemento (it) element (ro)
ran: ran ran
ran ran
- ran ran
- startopsomming: startopsomming startitemize
- startaufzaehlung startvycet
- iniziaelenco startenumerare
- stelopsommingenin: stelopsommingenin setupitemizations
+ ran ran
+% new
+ setupitemgroups: stelitemgroepenin setupitemgroups
+ setupitemgroups setupitemgroups
+ setupitemgroups setupitemgroups
+% downward compatible
+ setupitemgroups: stelopsommingenin setupitemizations
stelleaufzaehlungenein nastavvycty
impostaelencazioni setareitemization
- stelopsommingin: stelopsommingin setupitemize
+% will be replaced / generatated
+ startitemize: startopsomming startitemize
+ startaufzaehlung startvycet
+ iniziaelenco startenumerare
+ setupitemize: stelopsommingin setupitemize
stelleaufzaehlungein nastavvycet
impostaelenco setareenumerare
- stopopsomming: stopopsomming stopitemize
+ stopitemize: stopopsomming stopitemize
stopaufzaehlung stopvycet
terminaelenco stopenumerare
+%
definieerkop: definieerkop definehead
definiereueberschrift definujnadpis
definiscitesta definesteantet
@@ -1087,6 +1094,9 @@
stelplaatsblokkensplitsenin: stelplaatsblokkensplitsenin setupfloatsplitting
stelleplatziegeteiltegleitobjekt nastavdeleniplvoucichobjektu
impostaspezzamentooggettomobile seteazaimpartireafloat
+ placefloat: plaatsplaatsblok placefloat
+ placefloat placefloat
+ placefloat placefloat %%%
startcombinatie: startcombinatie startcombination
startkombination startspojeni
iniziacombinazione startcombinare
@@ -1468,9 +1478,12 @@
gebruikcommandos: gebruikcommandos usecommands
verwendebefehl uzijprikazy
usacomandi folosestecomenzi
- definieerstartstop: definieerstartstop definestartstop
+ definestartstop: definieerstartstop definestartstop
definierestartstop definujstartstop
definisciiniziatermina definestestartstop
+ setupstartstop: stelstartstopin setupstartstop
+ setupstartstop setupstartstop
+ impostainiziatermina setupstartstop
startlocal: startlokaal startlocal
startlokal startlokalni
inizialocale startlocal
@@ -1551,7 +1564,7 @@
impostaposizionamento setarepozitie
roteer: roteer rotate
drehen otocit
- rotazione roteste % GB
+ ruota roteste % GB
stelroterenin: stelroterenin setuprotate
stelledrehenein nastavotoceni
impostarotazione seteazarotare
@@ -1560,7 +1573,7 @@
riflessione reflexie
schaal: schaal scale
format meritko
- scale scala % GB
+ scala scala % GB
stelnummerenin: stelnummerenin setupnumbering
stellenummerierungein nastavcislovani
impostanumerazione seteazanumerotare
@@ -1713,7 +1726,7 @@
impostaposizionetesto seteazapozitietext
positiontext: positioneertekst positiontext
positiontext positiontext
- posizionetesto pozitietext % GB
+ posizionatesto pozitietext % GB
definerawfont: definerawfont definerawfont
definerawfont definerawfont
definiscifontgrezzo definestefontraw
@@ -1826,6 +1839,12 @@
printpapierhoogte: printpapierhoogte printpaperheight
printpapierhoehe vyskatiskpapiru
altezzacartastampa inaltimehartieimprimanta % GB
+ pageoffset: paginaoffset pageoffset
+ pageoffset pageoffset
+ pageoffset pageoffset
+ pagedepth: paginadiepte pagedepth
+ pagedepth pagedepth
+ pagedepth pagedepth
kopniveau: kopniveau headlevel
kopfniveau hlavniuroven
livellotesta niveltitlu % GB
diff --git a/tex/context/base/mult-con.tex b/tex/context/base/mult-con.tex
index d7cc303ae..b7f1ee84a 100644
--- a/tex/context/base/mult-con.tex
+++ b/tex/context/base/mult-con.tex
@@ -873,6 +873,9 @@
paginaovergangen: paginaovergangen pageboundaries
seitenbegrenzung hranicestranky
limitipagina marginipagina
+ paginastatus: paginastatus pagestate
+ pagestate pagestate
+ statopagina pagestate % TODO
palet: palet palet
palette paleta
tavolozza paleta
@@ -969,6 +972,9 @@
regels: regels lines
zeilen radky
righe linii
+ rek: rek stretch
+ strecken natahnout
+ dilata dilatat % CHECK
resolutie: resolutie resolution
aufloesung rozliseni
risoluzione rezolutie
@@ -2262,6 +2268,9 @@
interactiemenu: interactiemenu interactionmenu
interaktionsmenue interaktivnimenu
menuinterattivo meniuinteractiune
+ itemize: opsomming itemize
+ aufzaehlung vycet
+ elenco enumerare
laad: laad load
laden nacist
carica incarca
@@ -2300,13 +2309,19 @@
termina stop
tabelkop: tabelkop tablehead
tabellenueberschrift zahlavitabulky
- testatabella antettabel % GB
+ testatabella antettabel
tabelstaart: tabelstaart tabletail
tabellenende konectabulky
- codatabella subsoltabel % GB
+ codatabella subsoltabel
tabulate: tabulatie tabulate
tabulator tabelator
- tabulate tabulate % GB
+ tabulato tabulate
+ tabulatehead: tabulatiekop tabulatehead
+ tabulatehead tabulatehead
+ testatabulato tabulatehead %
+ tabulatetail: tabulatiestaart tabulatetail
+ tabulatetail tabulatetail
+ codatabulato tabulatetail %
tekst: tekst text
text text
testo text
@@ -2436,13 +2451,13 @@
StartSound: StartGeluid StartSound
StartSound StartZvuk
IniziaSuono StartSunet % TB
- StopSound: StopFilm StopSound
+ StopSound: StopGeluid StopSound
StopSound StopZvuk
FermaSuono StopSunet % TB
- PauseSound: PauzeerFilm PauseSound
+ PauseSound: PauzeerGeluid PauseSound
PauseSound PozastavitZvuk
PausaSuono PauzaSunet % TB
- ResumeSound: HervatSound ResumeSound
+ ResumeSound: HervatGeluid ResumeSound
ResumeSound PokracovatZvuk
RiprendiSuono RepornesteSunet % TB
SaveForm: BewaarFormulier SaveForm
diff --git a/tex/context/base/mult-ini.tex b/tex/context/base/mult-ini.tex
index f76e7943f..98af68127 100644
--- a/tex/context/base/mult-ini.tex
+++ b/tex/context/base/mult-ini.tex
@@ -347,8 +347,7 @@
\def\findinterfacemessage#1#2%
{\let#2\empty
- \def\dofindinterfacemessage##1 #1: ##2\relax##3\end%
- {\def#2{##2}}%
+ \def\dofindinterfacemessage##1 #1: ##2\relax##3\end{\def#2{##2}}%
\edef\!!stringa{\getvalue{\??ms\currentmessagelibrary} #1: \relax}%
\expandafter\dofindinterfacemessage\!!stringa\end}
@@ -404,11 +403,10 @@
\def\getinterfacemessage%
{\ifx\next\stopmessages
- \def\next##1{\egroup}%
+ \egroup\expandafter\gobbleoneargument
\else
- \let\next\addinterfacemessage
- \fi
- \next}
+ \expandafter\addinterfacemessage
+ \fi}
\def\startmessages #1 library: #2
{\definemessageconstant{#2}% handy for modules
@@ -572,12 +570,12 @@
\def\docopyvalue#1#2#3% c -> k
{\p!doifundefined{\k!prefix!#3}%
\let\donottest\doprocesstest
- \@EA\@EA\@EA\def\@EA
+ \@EAEAEA\def\@EA
\csname\@EA#1\@EA#3\@EA
\endcsname\@EA{\csname#2#3\endcsname}%
\else
\let\donottest\doprocesstest
- \@EA\@EA\@EA\def\@EA
+ \@EAEAEA\def\@EA
\csname\@EA#1\@EA\csname\@EA\k!prefix!\@EA#3\@EA\endcsname\@EA
\endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}%
\fi}
@@ -622,30 +620,30 @@
{\let\c!internal!\c!internal!n
\@EA\ifx\csname\k!prefix!#2\endcsname\relax
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\def\@EA\@EA\csname#1#2\endcsname
+ \@EAEAEA\def\@EA\@EA\csname#1#2\endcsname
\else
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\def\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
+ \@EAEAEA\def\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
\fi}
\def\dosetevalue#1#2%
{\let\c!internal!\c!internal!n
\@EA\ifx\csname\k!prefix!#2\endcsname\relax
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\edef\@EA\@EA\csname#1#2\endcsname
+ \@EAEAEA\edef\@EA\@EA\csname#1#2\endcsname
\else
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\edef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
+ \@EAEAEA\edef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
\fi}
\def\dosetgvalue#1#2%
{\let\c!internal!\c!internal!n
\@EA\ifx\csname\k!prefix!#2\endcsname\relax
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\gdef\@EA\@EA\csname#1#2\endcsname
+ \@EAEAEA\gdef\@EA\@EA\csname#1#2\endcsname
\else
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\gdef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
+ \@EAEAEA\gdef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
\fi}
% so far
@@ -654,12 +652,12 @@
{\let\c!internal!\c!internal!n
\@EA\ifx\csname\k!prefix!#3\endcsname\relax
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\def\@EA
+ \@EAEAEA\def\@EA
\csname\@EA#1\@EA#3\@EA
\endcsname\@EA{\csname#2#3\endcsname}%
\else
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\def\@EA
+ \@EAEAEA\def\@EA
\csname\@EA#1\@EA\csname\@EA\k!prefix!\@EA#3\@EA\endcsname\@EA
\endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}%
\fi}
@@ -699,51 +697,93 @@
% \fi}
%
% cleaner (not that much faster) don't pass #3 yet:
+%
+% \def\dosetvalue#1#2%
+% {\let\c!internal!\c!internal!n
+% \ifcsname\k!prefix!#2\endcsname
+% \let\c!internal!\c!internal!y
+% \@EAEAEA\def\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
+% \else
+% \let\c!internal!\c!internal!y
+% \@EAEAEA\def\@EA\@EA\csname#1#2\endcsname
+% \fi}
+%
+% \def\dosetevalue#1#2%
+% {\let\c!internal!\c!internal!n
+% \ifcsname\k!prefix!#2\endcsname
+% \let\c!internal!\c!internal!y
+% \@EAEAEA\edef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
+% \else
+% \let\c!internal!\c!internal!y
+% \@EAEAEA\edef\@EA\@EA\csname#1#2\endcsname
+% \fi}
+%
+% \def\dosetgvalue#1#2%
+% {\let\c!internal!\c!internal!n
+% \ifcsname\k!prefix!#2\endcsname
+% \let\c!internal!\c!internal!y
+% \@EAEAEA\gdef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
+% \else
+% \let\c!internal!\c!internal!y
+% \@EAEAEA\gdef\@EA\@EA\csname#1#2\endcsname
+% \fi}
+%
+% \def\docopyvalue#1#2#3%
+% {\let\c!internal!\c!internal!n
+% \ifcsname\k!prefix!#3\endcsname
+% \let\c!internal!\c!internal!y
+% \@EAEAEA\def\@EA
+% \csname\@EA#1\@EA\csname\@EA\k!prefix!\@EA#3\@EA\endcsname\@EA
+% \endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}%
+% \else
+% \let\c!internal!\c!internal!y
+% \@EAEAEA\def\@EA
+% \csname\@EA#1\@EA#3\@EA
+% \endcsname\@EA{\csname#2#3\endcsname}%
+% \fi}
+%
+% sligntly more efficient (but not faster in day to day runs)
\def\dosetvalue#1#2%
{\let\c!internal!\c!internal!n
\ifcsname\k!prefix!#2\endcsname
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\def\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
+ \@EA\def\csname#1\csname\k!prefix!#2\endcsname%\endcsname
\else
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\def\@EA\@EA\csname#1#2\endcsname
- \fi}
+ \@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\@EA\@EA\edef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
+ \@EA\edef\csname#1\csname\k!prefix!#2\endcsname%\endcsname
\else
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\edef\@EA\@EA\csname#1#2\endcsname
- \fi}
+ \@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\@EA\@EA\gdef\@EA\@EA\csname#1\csname\k!prefix!#2\endcsname\endcsname
+ \@EA\gdef\csname#1\csname\k!prefix!#2\endcsname%\endcsname
\else
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\gdef\@EA\@EA\csname#1#2\endcsname
- \fi}
-
-% so far
+ \@EA\gdef\csname#1#2%\endcsname
+ \fi\endcsname}
\def\docopyvalue#1#2#3%
{\let\c!internal!\c!internal!n
\ifcsname\k!prefix!#3\endcsname
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\def\@EA
- \csname\@EA#1\@EA\csname\@EA\k!prefix!\@EA#3\@EA\endcsname\@EA
+ \@EAEAEA\def\@EA\@EA
+ \csname#1\csname\k!prefix!#3\endcsname
\endcsname\@EA{\csname#2\csname\k!prefix!#3\endcsname\endcsname}%
\else
\let\c!internal!\c!internal!y
- \@EA\@EA\@EA\def\@EA
- \csname\@EA#1\@EA#3\@EA
- \endcsname\@EA{\csname#2#3\endcsname}%
+ \@EAEAEA\def\@EA\@EA\csname#1#3\endcsname\@EA{\csname#2#3\endcsname}%
\fi}
\endETEX
@@ -1296,7 +1336,7 @@
{\doifdefinedelse{#2}
{\debuggerinfo{command}{core command #2 redefined as #1}}%
{\debuggerinfo{command}{#2 defined as #1}}%
- \@EA\@EA\@EA\def\@EA\csname\@EA#2\@EA\endcsname
+ \@EAEAEA\def\@EA\csname\@EA#2\@EA\endcsname
\@EA{\csname#1\endcsname}}%
\setinterfacesetupvariable{#1}{#2}}}
diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex
index 2b0d9b7a2..fdd5e9155 100644
--- a/tex/context/base/mult-sys.tex
+++ b/tex/context/base/mult-sys.tex
@@ -49,11 +49,13 @@
\definesystemconstant {polish} \definesystemconstant {pl}
\definesystemconstant {portuguese} \definesystemconstant {pt}
\definesystemconstant {romanian} \definesystemconstant {ro}
+\definesystemconstant {russian} \definesystemconstant {ru}
\definesystemconstant {slovak} \definesystemconstant {sk}
\definesystemconstant {spanish} \definesystemconstant {es}
\definesystemconstant {swedish} \definesystemconstant {sv}
\definesystemconstant {turkish} \definesystemconstant {tr}
\definesystemconstant {ukenglish} \definesystemconstant {uk}
+\definesystemconstant {ukrainian} \definesystemconstant {ua}
\definesystemconstant {usenglish} \definesystemconstant {us}
%D For proper \UNICODE\ support we need a few font related
@@ -174,6 +176,7 @@
\definesystemconstant {mapping}
\definesystemconstant {patterns}
\definesystemconstant {handling}
+\definesystemconstant {ucmap}
%D Just to be complete we define the standard \TEX\ units.
@@ -320,6 +323,9 @@
\ifx\z@\undefined \newdimen\zeropoint \else \let\zeropoint\z@ \fi
+\newcount\medcard \medcard\!!medcard % used in font module
+\newcount\maxcard \maxcard\!!maxcard % used in font module
+
%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
@@ -330,6 +336,7 @@
\definesystemvariable {ag} % AchterGrond
\definesystemvariable {al} % ALinea's
\definesystemvariable {am} % interActieMenu
+\definesystemvariable {as} % AlignmentSwitch
\definesystemvariable {ba} % synchronisatieBAlk
\definesystemvariable {be} % startstop (BeginEnd)
\definesystemvariable {bj} % BlokJe
@@ -357,7 +364,8 @@
\definesystemvariable {do} % DefinieerOpmaak
\definesystemvariable {ds} % DoorSpringen
\definesystemvariable {ef} % ExternFiguur
-\definesystemvariable {ec} % Encoding
+\definesystemvariable {ec} % EnCoding
+\definesystemvariable {en} % ENvironments
\definesystemvariable {ep} % ExternfiguurPreset
\definesystemvariable {ex} % ExterneFiguren
\definesystemvariable {ht} % HiddenText
@@ -371,9 +379,11 @@
\definesystemvariable {fr} % ForM
\definesystemvariable {fs} % FileSynonym
\definesystemvariable {ft} % FonTs
+\definesystemvariable {hs} % HSpace
\definesystemvariable {ia} % Interactie
\definesystemvariable {ib} % InteractieBalk
\definesystemvariable {id} % Index
+\definesystemvariable {ig} % ItemGroup
\definesystemvariable {ih} % InHoudsopgave
\definesystemvariable {ii} % stelIndexIn
\definesystemvariable {il} % stelInvulRegelsin
@@ -444,6 +454,7 @@
\definesystemvariable {sc} % SCherm
\definesystemvariable {sd} % SounD
\definesystemvariable {se} % SEctie
+\definesystemvariable {sg} % SpacinG
\definesystemvariable {sh} % ShapeText
\definesystemvariable {si} % SplIt
\definesystemvariable {sk} % SectieKop
@@ -478,6 +489,8 @@
\definesystemvariable {vn} % VoetNoten
\definesystemvariable {vt} % VerTical
\definesystemvariable {wr} % WitRuimte
+\definesystemvariable {xf} % XML File
+\definesystemvariable {xp} % XML Processing
\definesystemvariable {xy} % schaal
\definesystemvariable {za} % ZetspiegelAanpassing
@@ -513,6 +526,9 @@
\defineinterfaceconstant {h} {h}
\defineinterfaceconstant {b} {b}
+\defineinterfaceconstant {t} {t} % transparency
+\defineinterfaceconstant {a} {a} % alternative
+
\defineinterfaceconstant {rgb} {rgb}
\defineinterfacevariable {rgb} {rgb}
diff --git a/tex/context/base/page-bck.tex b/tex/context/base/page-bck.tex
index 0885dcf33..29ba0056e 100644
--- a/tex/context/base/page-bck.tex
+++ b/tex/context/base/page-bck.tex
@@ -60,9 +60,6 @@
\newif\ifnewbackground
\newif\ifsomebackground
-\def\recalculatebackgrounds%
- {\global\newbackgroundtrue}
-
%D For special purposes, users can question the \type
%D {*background} mode. This mode is only available when
%D typesetting the pagebody.
@@ -72,8 +69,8 @@
%D \stoptypen
\appendtoks
- \ifnewbackground\enablemode[\systemmodeprefix\v!achtergrond]\fi
-\to \everypagebody
+ \ifsomebackground \ifnewbackground \setsystemmode\v!achtergrond \fi \fi
+\to \everybeforepagebody
%D \macros
%D {addmainbackground, addtextbackground,
@@ -118,22 +115,27 @@
\def\ifsomebackgroundfound#1%
{\ifusage{\??ma#1}}
-\def\doifsomebackgroundelse#1#2#3%
- {\ifusage{\??ma#1}#2\else#3\fi}
+% \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
- {\ifdim#3>\zeropoint\ifdim#4>\zeropoint\ifsomebackgroundfound{#1}%
+ {\ifdim#3>\zeropoint\ifdim#4>\zeropoint\ifsomebackgroundfound#1%
\setbox#2=\vbox\localframed
[\??ma#1]
[\c!strut=\v!nee,\c!offset=\v!overlay,
\c!breedte=#3,\c!hoogte=#4]
{\dp#2=\zeropoint\box#2}%
-%{\offinterlineskip\smashbox#2\box#2\endgraf
-% \getvalue{\??ma#1\c!commando}}%
\fi\fi\fi}
%D There are quite some backgrounds. At the bottom layer,
@@ -142,7 +144,7 @@
\def\addprintbackground#1%
{\addsomebackground
- \v!papier{#1}\printpapierbreedte\printpapierhoogte}
+ \v!papier#1\printpapierbreedte\printpapierhoogte}
%D The page backgrounds can be put behind the {\em left
%D page}, the {\em right page} or {\em each page}. As with
@@ -150,13 +152,13 @@
\def\addpagebackground#1%
{\doifbothsidesoverruled
- \addsomebackground\v!rechterpagina{#1}\papierbreedte\papierhoogte
+ \addsomebackground\v!rechterpagina#1\papierbreedte\papierhoogte
\orsideone
- \addsomebackground\v!rechterpagina{#1}\papierbreedte\papierhoogte
+ \addsomebackground\v!rechterpagina#1\papierbreedte\papierhoogte
\orsidetwo
- \addsomebackground\v!linkerpagina {#1}\papierbreedte\papierhoogte
+ \addsomebackground\v!linkerpagina #1\papierbreedte\papierhoogte
\od
- \addsomebackground\v!pagina{#1}\papierbreedte\papierhoogte}
+ \addsomebackground\v!pagina #1\papierbreedte\papierhoogte}
%D Then there are the 25 areas that make up the layout: {\em
%D top, header, text, footer, bottom} times {\em left edge,
@@ -186,49 +188,104 @@
\def\addtextbackground#1%
{\ifconditional\hiddenbackgroundenabled
- \addsomebackground\v!verborgen{#1}\zetbreedte\teksthoogte% mine !
+ \addsomebackground\v!verborgen#1\zetbreedte\teksthoogte % mine !
\fi
- \addsomebackground\v!tekst{#1}\zetbreedte\teksthoogte}
+ \addsomebackground\v!tekst#1\zetbreedte\teksthoogte}
%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!layouts}{8}\empty
- \setbackgroundbox\leftbackground\relax
- \ifdubbelzijdig
- \setbackgroundbox\rightbackground\doswapmargins
- \fi
- \doifnot{\@@mastatus}{\v!herhaal}{\global\newbackgroundfalse}}
+% \def\setbackgroundboxes
+% {\showmessage{\m!layouts}{8}\empty
+% \setbackgroundbox\leftbackground\relax
+% \ifdubbelzijdig
+% \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\newrightbackground0
+\chardef\newleftbackground 0
+
+\def\recalculatebackgrounds
+ {\global\newbackgroundtrue}
+
+\def\setbackgroundboxes
+ {\ifnewbackground
+ \global\chardef\newrightbackground1
+ \global\chardef\newleftbackground1
+ \global\setbox\leftbackground\emptybox
+ \global\setbox\rightbackground\emptybox
+ \fi
+ \doifbothsides
+ \ifcase\newleftbackground \else
+ \showmessage\m!layouts8\empty
+ \setbackgroundbox\leftbackground\relax
+ \global\chardef\newleftbackground0
+ \global\chardef\newrightbackground0
+ \fi
+ \orsideone
+ \ifcase\newleftbackground \else
+ \showmessage\m!layouts8\empty
+ \setbackgroundbox\leftbackground\relax
+ \global\chardef\newleftbackground0
+ %\global\chardef\newrightbackground0
+ \fi
+ \orsidetwo
+ \ifcase\newrightbackground \else
+ \showmessage\m!layouts8\empty
+ \setbackgroundbox\rightbackground\doswapmargins
+ \global\chardef\newrightbackground0
+ \fi
+ \od
+ \ifx\@@mastatus\v!herhaal\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
+ \global\let\pagebackgroundhoffset\!!zeropoint
+ \global\let\pagebackgroundvoffset\!!zeropoint
+ \global\let\pagebackgrounddepth \!!zeropoint
\doifsomebackgroundelse{\v!tekst\v!tekst}\donetrue\donefalse
- \ifdone\else\doifsomebackgroundelse{\v!tekst}\donetrue\donothing\fi
+ \ifdone\else\doifsomebackgroundelse\v!tekst\donetrue\donothing\fi
\ifdone
\bgroup
- \scratchdimen=\getvalue{\??ma\v!pagina\c!offset}%
+ \scratchdimen\getvalue{\??ma\v!pagina\c!offset}%
\doifsomebackgroundelse{\v!boven\v!tekst}\donothing
{\doifsomebackgroundelse{\v!onder\v!tekst}\donothing
{\xdef\pagebackgroundhoffset{\the\scratchdimen}}}%
\doifsomebackgroundelse{\v!tekst\v!rechterrand}\donothing
{\doifsomebackgroundelse{\v!tekst\v!linkerrand}\donothing
{\xdef\pagebackgroundvoffset{\the\scratchdimen}%
- \scratchdimen=\getvalue{\??ma\v!pagina\c!diepte}%
+ \scratchdimen\getvalue{\??ma\v!pagina\c!diepte}%
\xdef\pagebackgrounddepth{\the\scratchdimen}}}%
\egroup
\fi
\fi \fi}
-\appendtoks \setbackgroundoffsets \to \everypagebody
+\appendtoks \setbackgroundoffsets \to \everybeforepagebody
\def\setbackgroundbox#1#2%
{\global\setbox#1=\vbox
@@ -330,9 +387,20 @@
\else\iffirstargument
\getparameters[\??ma][#1]%
\fi\fi\fi
- \doifelse{\@@mastatus}{\v!stop}
+ \doifelsevalue{\??ma\v!pagina\c!offset}\v!overlay
+ {\global\pageoffset\zeropoint}
+ {\global\pageoffset\getvalue{\??ma\v!pagina\c!offset}}%
+ \global\pagedepth\getvalue{\??ma\v!pagina\c!diepte}%
+ \xdef\pagebackgroundoffset{\the\pageoffset}%
+ \xdef\pagebackgrounddepth {\the\pagedepth }%
+ \doifelse\@@mastatus\v!stop
{\global\newbackgroundfalse}
- {\global\newbackgroundtrue}}
+ {\global\newbackgroundtrue }}
+
+\let\pagebackgroundoffset\!!zeropoint
+\let\pagebackgrounddepth \!!zeropoint
+
+\appendtoks\global\newbackgroundfalse\to\everyjob
%D Each areas (currently there are $1+3+25+1=30$ of them)
%D has its own low level framed object associated.
@@ -453,8 +521,8 @@
\def\enablehiddenbackground
{\global\settrue\hiddenbackgroundenabled
- \global\somebackgroundtrue % also make these
- \global\newbackgroundtrue} % two conditionals
+ \global\somebackgroundtrue
+ \recalculatebackgrounds}
\def\disablehiddenbackground
{\global\setfalse\hiddenbackgroundenabled}
diff --git a/tex/context/base/page-flt.tex b/tex/context/base/page-flt.tex
index 3fd29d64d..2a43cc8a1 100644
--- a/tex/context/base/page-flt.tex
+++ b/tex/context/base/page-flt.tex
@@ -13,6 +13,9 @@
\writestatus{loading}{Context OTR Macros / Floating Bodies}
+%D This module is currently a mess, due to splitting float
+%D handlers over specific otr's. Consider it work in progress.
+
\unprotect
% naar supp-box.tex
@@ -109,7 +112,7 @@
\startmessages italian library: floatblocks
title: oggetti mobili
1: -- rinumerato / -- => --
- 2: -- salavto
+ 2: -- salvato
3: -- mosso
4: -- sistemato
5: ordine aggiustato
@@ -154,22 +157,24 @@
12: nedefinit
\stopmessages
-\def\stelplaatsblokkenin%
+\def\stelplaatsblokkenin
{\dodoubleargument\getparameters[\??bk]}
-\def\stelblokkopjesin%
+\def\stelblokkopjesin
{\dodoubleargument\getparameters[\??kj]}%
\def\dostelplaatsblokin[#1][#2]%
- {\getparameters[\??fl#1][#2]}
+ {\def\docommando##1{\getparameters[\??fl##1][#2]}%
+ \processcommalist[#1]\docommando}
-\def\stelplaatsblokin%
+\def\stelplaatsblokin
{\dodoubleargument\dostelplaatsblokin}
\def\dostelblokkopjein[#1][#2]%
- {\getparameters[\??kj#1][#2]}
+ {\def\docommando##1{\getparameters[\??kj##1][#2]}%
+ \processcommalist[#1]\docommando}
-\def\stelblokkopjein%
+\def\stelblokkopjein
{\dodoubleargument\dostelblokkopjein}
\def\doleegblok#1%
@@ -177,22 +182,97 @@
[\??fl#1][\c!kader=\v!aan]%
{\getmessage{\m!floatblocks}{12}}}
+% \def\docomplexplaatsblok[#1][#2][#3]#4%
+% {\flushfootnotes
+% \ifsomefloatwaiting
+% % this was \checkwaitingfloats spread all over
+% \doifinsetelse{\v!altijd}{#2}
+% {\showmessage{\m!floatblocks}{5}{}}
+% {\doifcommonelse{#2}{\v!tekst,\v!naast,% \v!pagina,
+% \v!links,\v!rechts,\v!inlinker,\v!inrechter,%
+% \v!inmarge}
+% {\doflushfloats}
+% {}}%
+% % but which should be done before using box \floatbox
+% \fi
+% \ifmargeblokken
+% \doifinset{\v!marge}{#2}
+% {\bgroup
+% \everypar{\egroup\the\everypar}%
+% \hsize=\@@mbbreedte}%
+% \fi
+% \global\insidefloattrue
+% \dowithnextboxcontent % better a \the\everyfloattoks
+% {\postponefootnotes} % new
+% {\setlocalfloatdimensions{#1}{#2}% new
+% \docompletefloat
+% {#1}{#3}{#1}{#2}{#1}{#4}
+% {\box\nextbox}}%
+% \vbox}
+
\def\docomplexplaatsblok[#1][#2][#3]#4%
{\flushfootnotes
+ \ifsomefloatwaiting
+ % this was \checkwaitingfloats spread all over
+ \doifinsetelse{\v!altijd}{#2}
+ {\showmessage{\m!floatblocks}{5}{}}
+ {\doifcommonelse
+ {#2}
+ {\v!tekst,\v!naast,% \v!pagina,
+ \v!links,\v!rechts,\v!inlinker,\v!inrechter,%
+ \v!inmarge}
+ {\doflushfloats}
+ {}}%
+ % but which should be done before using box \floatbox
+ \fi
\ifmargeblokken
\doifinset{\v!marge}{#2}
- {\bgroup
- \everypar{\egroup\the\everypar}%
- \hsize=\@@mbbreedte}%
+ {\bgroup\everypar{\egroup\the\everypar}%
+ \hsize\@@mbbreedte}%
\fi
\global\insidefloattrue
- \dowithnextboxcontent
- {\postponefootnotes} % new
- {\docompletefloat
- {#1}{#3}{#1}{#2}{#1}{#4}
- {\box\nextbox}}%
+ \let\@@extrafloat\empty
+ \dowithnextboxcontent % better a \the\everyfloattoks
+ {\postponefootnotes} % new
+ {\xdocompletefloat{#1}{#3}{#1}{#2}{#1}{#4}}%
\vbox}
+\def\xxdocompletefloat#1#2%
+ {\setbox\nextbox\hbox{\signalrightpage\box\nextbox}%
+ \doifrightpageelse{\let\@@extrafloat#1}{\let\@@extrafloat#2}}
+
+\newif\ifextrafloatactions \extrafloatactionstrue
+
+\def\xdocompletefloat#1#2#3#4#5#6%
+ {\ifextrafloatactions
+ \let\@@extrafloat\empty
+ \processallactionsinset
+ [#4]
+ [\v!binnen=>\xxdocompletefloat\v!links \v!rechts,
+ \v!buiten=>\xxdocompletefloat\v!rechts \v!links,
+ ininner=>\xxdocompletefloat\v!inlinker \v!inrechter,
+ inouter=>\xxdocompletefloat\v!inrechter\v!inlinker]%
+ \ifx\@@extrafloat\empty
+ \setlocalfloatdimensions{#1}{#4}%
+ \docompletefloat{#1}{#2}{#3}{#4}{#5}{#6}{\box\nextbox}%
+ \else
+ \setlocalfloatdimensions{#1}{\@@extrafloat,#4}%
+ \docompletefloat{#1}{#2}{#3}{\@@extrafloat,#4}{#5}{#6}{\box\nextbox}%
+ \fi
+ \else % downward compatible
+ \docompletefloat{#1}{#2}{#3}{#4}{#5}{#6}{\box\nextbox}%
+ \fi}
+
+\def\setlocalfloatdimensions#1#2% experimental ! ! ! !
+ {\doifvaluesomething{\??fl#1\c!maxbreedte}
+ {\scratchdimen=\getvalue{\??fl#1\c!maxbreedte}\relax
+ \ifdim\wd\nextbox>\scratchdimen
+ \setbox\nextbox=\hbox to \scratchdimen
+ {\doifnotcommon{\v!rechts,\v!inrechter}{#2}{\hss}%
+ \box\nextbox
+ \doifnotcommon{\v!links ,\v!inlinker }{#2}{\hss}}%
+ \fi}}
+
\def\docomplexstarttekstblok[#1][#2][#3]%
{\flushfootnotes
\flushsidefloats % hoort eigenlijk niet hier
@@ -205,12 +285,29 @@
{\flushsidefloats % hoort eigenlijk niet hier
\docomplexreserveerblok[#1][#2][\v!tekst,#3,\v!links][#4]}
-\def\dodefinieerplaatsblok[#1][#2]% #1=naam #2=meervoud
+\def\definieerplaatsblok
+ {\dotripleempty\dodefinieerplaatsblok}
+
+\def\dodefinieerplaatsblok[#1][#2][#3]% #1=naam #2=meervoud #3=parent
+ {\ifthirdargument
+ \redodefinieerplaatsblok[#1][#2][#3]%
+ \else\ifsecondargument
+ \dododefinieerplaatsblok[#1][#2]%
+ \else
+ \dododefinieerplaatsblok[#1][#1]%
+ \fi\fi}
+
+\def\dododefinieerplaatsblok[#1][#2]%
{\presetlocalframed[\??fl#1]%
\stelplaatsblokin
[#1]
[\c!breedte=15\korpsgrootte,
\c!hoogte=10\korpsgrootte,
+\c!maxbreedte=,
+\c!maxhoogte=,
+\c!zijvoorwit=\@@bkzijvoorwit,
+\c!zijnawit=\@@bkzijnawit,
+\c!marge=\@@bkmarge,
\c!kader=\@@bkkader,
\c!straal=\@@bkstraal,
\c!hoek=\@@bkhoek,
@@ -228,11 +325,14 @@
\stelblokkopjein
[#1]
[\c!plaats=\@@kjplaats,
- %\c!voor=\@@kjvoor,
+ %\c!voor=\@@kjvoor,
\c!tussen=\@@kjtussen,
- %\c!na=\@@kjna,
+ %\c!na=\@@kjna,
\c!breedte=\@@kjbreedte,
\c!kopletter=\@@kjkopletter,
+ \c!kopkleur=\@@kjkopkleur,
+ \c!tekstletter=\@@kjtekstletter,
+ \c!tekstkleur=\@@kjtekstkleur,
\c!letter=\@@kjletter,
\c!kleur=\@@kjkleur,
\c!uitlijnen=\@@kjuitlijnen,
@@ -240,6 +340,7 @@
\c!wijze=\@@kjwijze,
\c!blokwijze=\@@kjblokwijze,
\c!sectienummer=\@@kjsectienummer,
+ \c!scheider=\@@kjscheider,
\c!conversie=\@@kjconversie]%
\doorlabelen
[#1]
@@ -250,8 +351,11 @@
\c!sectienummer=\getvalue{\??kj#1\c!sectienummer},
\c!conversie=\getvalue{\??kj#1\c!conversie}]%
\presetlabeltext[#1=\Word{#1}~]%
+ \dodefinefloatcommands[#1][#2]}
+
+\def\dodefinefloatcommands[#1][#2]%
+ {\definieerlijst[#1]%
\presetheadtext[#2=\Word{#2}]%
- \definieerlijst[#1]%
\setvalue{\e!plaats\e!lijstmet#2}%
{\dodoubleempty\doplaatslijst[#1]}%
\setvalue{\e!volledige\e!lijstmet#2}%
@@ -273,8 +377,28 @@
\setvalue{\e!leeg#1}%
{\doleegblok{#1}}}
-\def\definieerplaatsblok%
- {\dodoubleargument\dodefinieerplaatsblok}
+\def\redodefinieerplaatsblok[#1][#2][#3]% same label/number
+ {\presetlocalframed[\??fl#1]%
+ \copylocalframed[\??fl#1][\??fl#3]%
+ \copyparameters[\??fl#1][\??fl#3]
+ [\c!breedte,\c!hoogte,
+ \c!maxbreedte,\c!maxhoogte,\c!marge,\c!zijvoorwit,\c!zijnawit,
+ \c!kader,\c!straal,\c!hoek,\c!plaats,\c!achtergrond,
+ \c!achtergrondraster,\c!achtergrondkleur,\c!achtergrondoffset,
+ \c!bovenkader,\c!onderkader,\c!linkerkader,\c!rechterkader,
+ \c!kaderoffset,\c!paginaovergangen]%
+ \copyparameters[\??kj#1][\??kj#3]
+ [\c!plaats,\c!voor,\c!tussen,\c!na,
+ \c!breedte,\c!kopletter,\c!kopkleur,\c!letter,\c!kleur,
+ \c!tekstletter,\c!tekstkleur,
+ \c!uitlijnen,\c!nummer,\c!wijze,\c!blokwijze,
+ \c!sectienummer,\c!scheider,\c!conversie]%
+ \definieernummer[#1][#3]%
+ \presetlabeltext[#1=\labeltext{#3}]%
+ \dodefinefloatcommands[#1][#2]}
+
+\def\placefloat % \plaatsplaatsblok
+ {\dotripleempty\docomplexplaatsblok}
% De onderstaande macro's zijn verantwoordelijk voor het plaatsen
% van floats. De macro's moeten nog worden aangepast en
@@ -296,13 +420,21 @@
\newbox\floatlist
\newbox\savedfloatlist
-%newinsert\topins
-\newinsert\botins
-\newinsert\lowins % below footnotes
+\ifx\topins\undefined \newinsert\topins \fi
+\ifx\botins\undefined \newinsert\botins \fi
+\ifx\lowins\undefined \newinsert\lowins \fi
+
+\skip\topins\zeropoint
+\skip\botins\zeropoint
+\skip\lowins\zeropoint
-\skip \botins=\zeropoint \skip \lowins=\zeropoint
-\count\botins=\!!thousand \count\lowins=\!!thousand
-\dimen\botins=\maxdimen \dimen\lowins=\maxdimen
+\count\topins\!!thousand
+\count\botins\!!thousand
+\count\lowins\!!thousand
+
+\dimen\topins\maxdimen
+\dimen\botins\maxdimen
+\dimen\lowins\maxdimen
\newdimen\topinserted \topinserted=\zeropoint
\newdimen\botinserted \botinserted=\zeropoint
@@ -482,7 +614,7 @@
{\nointerlineskip
\uncenteredfloatbox
\unvbox\floatlist}%
- \global\advance\savednoffloats by 1
+ \global\advance\savednoffloats 1
\global\somefloatwaitingtrue
\dosavefloatinfo
\nonoindentation}
@@ -492,7 +624,7 @@
{\nointerlineskip
\unvbox\floatlist
\uncenteredfloatbox}%
- \global\advance\savednoffloats by 1
+ \global\advance\savednoffloats 1
\global\somefloatwaitingtrue}
\def\doreversesavefloat%
@@ -500,26 +632,26 @@
{\nointerlineskip
\unvbox\floatlist
\uncenteredfloatbox}%
- \global\advance\savednoffloats by 1
+ \global\advance\savednoffloats 1
\global\somefloatwaitingtrue
\dosavefloatinfo}
\def\dosavefloatstatus%
- {\global\setbox\savedfloatlist=\copy\floatlist
- \global\setbox\savedfloatbox =\copy\floatbox
+ {\global\setbox\savedfloatlist\copy\floatlist
+ \global\setbox\savedfloatbox \copy\floatbox
\xdef\dorestorefloatstatus%
- {\global\setbox\floatlist=\box\savedfloatlist
- \global\setbox\floatbox =\box\savedfloatbox
- \savednoffloats=\the\savednoffloats}}
+ {\global\setbox\floatlist\box\savedfloatlist
+ \global\setbox\floatbox \box\savedfloatbox
+ \savednoffloats\the\savednoffloats}}
\let\dorestorefloatstatus\relax
-\def\checkwaitingfloats#1%
- {\ifsomefloatwaiting
- \doifinsetelse{\v!altijd}{#1}
- {\showmessage{\m!floatblocks}{5}{}}
- {\doflushfloats}%
- \fi}
+%\def\checkwaitingfloats#1%
+% {\ifsomefloatwaiting
+% \doifinsetelse{\v!altijd}{#1}
+% {\showmessage{\m!floatblocks}{5}{}}
+% {\doflushfloats}%
+% \fi}
\ifx\doflushfloats\undefined \let\doflushfloats\relax \fi
\ifx\flushfloatbox\undefined \let\flushfloatbox\relax \fi
@@ -534,7 +666,7 @@
\def\betweenfloatblanko% assumes that \@@bknawit is present
{\bgroup
\setbox0=\vbox{\strut\blanko[\@@bkvoorwit]\strut}%
- \setbox2=\vbox{\strut\blanko[\@@bknawit]\strut}%
+ \setbox2=\vbox{\strut\blanko[\@@bknawit ]\strut}%
\ifdim\ht0>\ht2
\blanko[-\@@bknawit,\@@bkvoorwit]
\fi
@@ -558,7 +690,7 @@
\ifx\sometextfloat\undefined \let\sometextfloat\doplacefloatbox \fi
\def\somepagefloat[#1]% links, rechts, midden, hoog, midden, laag
- {\checkwaitingfloats{#1}%
+ {%\checkwaitingfloats{#1}%
\global\setbox\collectedpagefloats=\vbox
{\unvbox\collectedpagefloats
\vbox to \teksthoogte
@@ -569,13 +701,13 @@
\doinsertfloatinfo}
\def\sometextfloat[#1]% lang, links, rechts, hoog, midden, laag, offset
- {\checkwaitingfloats{#1}%
+ {%\checkwaitingfloats{#1}%
\def\dostoptextfloat{\dodostoptextfloat[#1]}%
\global\floattextwidth=\hsize
\global\floatwidth=\wd\floatbox
\global\floatheight=\ht\floatbox % forget about the depth
- \global\advance\floattextwidth by -\floatwidth
- \global\advance\floattextwidth by -\@@bkmarge\relax % was \tfskipsize
+ \global\advance\floattextwidth -\floatwidth
+ \global\advance\floattextwidth -\@@bkmarge\relax % was \tfskipsize
\doifinsetelse{\v!lang}{#1}
{\floattextheight=\pagegoal
\advance\floattextheight by -\pagetotal
@@ -595,9 +727,9 @@
\hsize\floattextwidth
\ignorespaces}
-\def\dodostoptextfloat[#1]%
- {\egroup
- \doifnotinset{\v!lang}{#1}%
+\def\dodostoptextfloat[#1]% % de tekst kan beter in een soort
+ {\egroup % kadertekst zonder kader, is flexibeler
+ \doifnotinset{\v!lang}{#1}% en beter
{\ifdim\ht\floattext<\floatheight
\floattextheight=\floatheight
\else
@@ -644,7 +776,7 @@
\doinsertfloatinfo}
\def\somefacefloat[#1]% links, rechts, midden, hoog, midden, laag
- {\checkwaitingfloats{#1}%
+ {%\checkwaitingfloats{#1}%
\startnaast\box\floatbox\stopnaast
\doinsertfloatinfo}
@@ -723,41 +855,94 @@
\newcount\noftopfloats \noftopfloats=2
\newcount\nofbotfloats \nofbotfloats=0
-\def\calculatefloatskips%
- {{\def\calculatefloatskips##1##2%
- {\doifelsenothing{##2}
- {\global##1=\zeropoint}
- {\doifelse{##2}{\v!geen}
- {\global##1=\zeropoint}
- {\setbox0=\vbox{\witruimte\@EA\blanko\@EA[##2]}%
- \global##1=\ht0}}}%
- \calculatefloatskips\floattopskip\@@bkvoorwit
- \calculatefloatskips\floatbottomskip\@@bknawit
- \calculatefloatskips\sidefloattopskip\@@bkzijvoorwit
- \calculatefloatskips\sidefloatbottomskip\@@bkzijnawit
- \def\sidefloattopoffset{\openstrutdepth}% {\dp\strutbox}%
- \global\floatsideskip=\@@bkmarge\relax
- \global\noftopfloats=\@@bknboven\relax
- \global\nofbotfloats=\@@bknonder\relax}}
+\def\docalculatefloatskip#1#2%
+ {\doifelsenothing{#2}
+ {\global#1\zeropoint}
+ {\doifelse{#2}{\v!geen}
+ {\global#1\zeropoint}
+ {\setbox0\vbox{\witruimte\@EA\blanko\@EA[#2]}%
+ \global#1\ht0}}}
+
+\def\calculatefloatskips#1%
+ {{\docalculatefloatskip\floattopskip \@@bkvoorwit
+ \docalculatefloatskip\floatbottomskip \@@bknawit
+ \docalculatefloatskip\sidefloattopskip {\getvalue{\??fl#1\c!zijvoorwit}}% \@@bkzijvoorwit
+ \docalculatefloatskip\sidefloatbottomskip{\getvalue{\??fl#1\c!zijnawit}}% \@@bkzijnawit
+ \gdef\sidefloattopoffset{\openstrutdepth}% was \def
+ \global\floatsideskip\getvalue{\??fl#1\c!marge}% \@@bkmarge\relax
+ \global\noftopfloats \@@bknboven\relax
+ \global\nofbotfloats \@@bknonder\relax}}
\newif\ifinsidefloat
-\def\floatcaptionsuffix{} % an optional suffix
-\def\floatcaptionnumber{} % a logical counter
-
-\def\dosetfloatcaption#1#2#3% name will change
- {\def\dofloattekst%
- {{\doattributes{\??kj#1}\c!letter\c!kleur{#3}}}%
- \doifelsevalue{\??kj#1\c!nummer}{\v!ja}
- {\def\dofloatnummer%
- {{\xdef\floatcaptionnumber{#1}%
- \hbox{\doattributes{\??kj#1}\c!kopletter\c!kopkleur
- {\strut#2\floatcaptionsuffix}}}%
- \ConvertToConstant\doifnot{#3}{}
- {\tfskip
- \emergencystretch=.5em}}}
- {\let\dofloatnummer=\empty}}
+\let\floatcaptionsuffix\empty % an optional suffix
+\let\floatcaptionnumber\empty % a logical counter
+
+% obsolete ?
+%
+% \def\dosetfloatcaption#1#2#3% name will change
+% {\def\dofloattekst%
+% {{\doattributes{\??kj#1}\c!letter\c!kleur{#3}}}%
+% \doifelsevalue{\??kj#1\c!nummer}{\v!ja}
+% {\def\dofloatnummer%
+% {{\xdef\floatcaptionnumber{#1}%
+% \hbox{\doattributes{\??kj#1}\c!kopletter\c!kopkleur
+% {\strut#2\floatcaptionsuffix}}}%
+% \ConvertToConstant\doifnot{#3}{}
+% {\tfskip\emergencystretch=.5em}}}
+% {\let\dofloatnummer\empty}}
+
+% 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}
+
+\def\doplacefloatcaption[#1][#2]#3%
+ {\setfloatcaption[#1][#2]{#3}%
+ \placefloatcaptiontext[#1]%
+ \placefloatcaptionreference[#1]}
+
+\def\setfloatcaption % \dosetfloatcaption already in use
+ {\dodoubleempty\dodosetfloatcaption} % beware, name clash
+
+\def\dodosetfloatcaption[#1][#2]#3% to do namespace for number/ascii
+ {\doifelsevalue{\??kj#1\c!nummer}{\v!ja} % also handle trialtypesetting
+ {\verhoognummer[#1]%
+ \maakhetnummer[#1]%
+ \global\let\flhetnummer\hetnummer
+ \setgvalue{@fl@r@#1}%
+ {\dofloatreference
+ \redofloatorder{#1}%
+ \doschrijfnaarlijst{#1}{\flhetnummer}{#3}{#1}%
+ \doglobal\convertargument#3\to\flasciititle % \asciititle is global
+ \doifsomething{#2}{\rawreference{\s!flt}{#2}{{\flhetnummer}{\flasciititle}}}%
+ \global\letvalue{@fl@r@#1}\relax}% nills
+ \setgvalue{@fl@t@#1}%
+ {\preparethenumber{\??kj#1}\flhetnummer\preparednumber
+ \doattributes{\??kj#1}\c!letter\c!kleur
+ {\doattributes{\??kj#1}\c!kopletter\c!kopkleur
+ {\labeltexts{#1}{\preparednumber}}%
+ \doattributes{\??kj#1}\c!tekstletter\c!tekstkleur
+ {\tfskip#3}}}}
+ {\global\letvalue{@fl@r@#1}\relax
+ \global\letvalue{@fl@t@#1}\relax}}
+
+\def\placefloatcaptiontext [#1]{\getvalue{@fl@t@#1}}
+\def\placefloatcaptionreference[#1]{\getvalue{@fl@r@#1}}
+
+% still needed for uguide
+
+\let\placefloatlabel \placefloatcaption
+\let\placefloatlabeltext \placefloatcaptiontext
+\let\placefloatlabelreference \placefloatcaptionreference
+
\def\putborderedfloat#1\in#2\\%
{\setbox#2=\vbox
{\localframed
@@ -782,155 +967,8 @@
\else
\ifx\@@kjkjtussen\empty\else\unskip\@@kjkjtussen\fi
\fi}}%
- \begstrut#3\endstrut\endgraf}}
-
-% \def\dosetpagfloat#1#2#3#4% \copy wegwerken
-% {\bgroup
-% \forgetall
-% \postponefootnotes
-% \mindermeldingen
-% %\showcomposition
-% \putborderedfloat#4\in4\\%
-% \def\locatefloat%
-% {\doregelplaats\@@flflplaats}%
-% \ConvertToConstant\doifelse{#3}{\v!geen}
-% {\global\setbox\floatbox=\vbox % pas op als wd groter dan hsize
-% {\ifbinnenkolommen\ifdim\wd4>\hsize
-% \let\locatefloat\relax
-% \fi\fi
-% \locatefloat{\copy4}}} % we need \wd4 later
-% {\setbox2=\hbox
-% {\footnotesenabledfalse\putcompletecaption{#4}{#2}{#3}{0}}%
-% \doifinsetelse{\@@kjkjplaats}{\v!hoog,\v!midden,\v!laag}
-% {\dimen0=\hsize
-% \advance\dimen0 by -\wd4\relax
-% \advance\dimen0 by -\@@bkmarge\relax % \was tfskipsize\relax
-% \ifdim\wd2>\dimen0\relax
-% \dimen2=1.3\dimen0\relax
-% \ifdim\wd2<\dimen2\relax
-% \dimen0=0.8\dimen0\relax
-% \fi
-% \fi
-% \setbox2=\vbox
-% {\forgetall
-% \hsize=\dimen0\relax
-% \raggedright
-% \putcompletecaption{#4}{#2}{#3}{1}}}
-% {\doifelse{\@@kjkjbreedte}{\v!max}
-% {\dosetraggedvbox{\@@kjkjuitlijnen}%
-% \setbox2=\raggedbox
-% {\hsize\wd4\relax
-% \putcompletecaption{#4}{#2}{#3}{0}}}
-% {\ifdim\wd2>\wd4\relax
-% \doifelse{\@@kjkjbreedte}{\v!passend}
-% {\ifdim\wd4<15\korpsgrootte\relax
-% \dimen0=15\korpsgrootte\relax
-% \else
-% \dimen0=\wd4\relax
-% \fi
-% \ifdim\wd4>\hsize
-% \setbox0=\vbox
-% {\forgetall
-% \hsize=1.0\wd4
-% \footnotesenabledfalse
-% \putcompletecaption{#4}{#2}{#3}{0}}%
-% \ifdim\ht0>\lineheight\relax
-% \setbox2=\vbox
-% {\forgetall
-% \hsize=0.9\wd4
-% \putcompletecaption{#4}{#2}{#3}{0}}%
-% \else
-% %\setbox2=\vbox % was 0, bug
-% % {\forgetall
-% % \hsize=1.0\wd4
-% % \putcompletecaption{#4}{#2}{#3}{0}}%
-% \setbox2=\hbox{\putcompletecaption{#4}{#2}{#3}{0}}%
-% \fi
-% \else
-% \setbox0=\vbox
-% {\forgetall
-% \dimen2=1.5\dimen0\relax
-% \ifdim\dimen2<\hsize
-% \hsize=\dimen2\relax
-% \fi
-% \footnotesenabledfalse
-% \putcompletecaption{#4}{#2}{#3}{0}}%
-% \ifdim\ht0>\lineheight\relax
-% \setbox2=\vbox
-% {\forgetall
-% \dimen2=1.2\dimen0\relax
-% \ifdim\dimen2<\hsize
-% \hsize=\dimen2\relax
-% \fi
-% \putcompletecaption{#4}{#2}{#3}{0}}%
-% \else
-% %\setbox2=\vbox % was 0, bug
-% % {\forgetall
-% % \dimen2=1.5\dimen0\relax
-% % \ifdim\dimen2<\hsize
-% % \hsize=\dimen2\relax
-% % \fi
-% % \putcompletecaption{#4}{#2}{#3}{0}}%
-% \setbox2=\hbox{\putcompletecaption{#4}{#2}{#3}{0}}%
-% \fi
-% \fi}
-% {\dosetraggedvbox{\@@kjkjuitlijnen}%
-% \setbox2=\raggedbox
-% {\hsize\@@kjkjbreedte
-% \putcompletecaption{#4}{#2}{#3}{0}}}%
-% \else
-% % \setbox2=\hbox % we want footnotes !
-% % {\putcompletecaption{#4}{#2}{#3}{0}}%
-% \dosetraggedvbox{\@@kjkjuitlijnen}%
-% \setbox2=\raggedbox
-% {\hsize\wd4
-% \putcompletecaption{#4}{#2}{#3}{0}}%
-% \fi}}%
-% \global\setbox\floatbox=\vbox
-% {\forgetall
-% \processaction
-% [\@@kjkjplaats]
-% [ \v!boven=>\locatefloat{\copy2}%
-% \endgraf\@@kjkjtussen
-% \locatefloat{\copy4},
-% \v!onder=>\locatefloat{\copy4}%
-% \endgraf\@@kjkjtussen
-% \locatefloat{\copy2},
-% \v!hoog=>\locatefloat
-% {\doifelse{\@@flflplaats}{\v!links}
-% {\copy4
-% \tfskip
-% \vbox to\ht4{\@@kjkjtussen\copy2\vfill}}
-% {\vbox to\ht4{\@@kjkjtussen\copy2\vfill}%
-% \tfskip
-% \copy4}},
-% \v!laag=>\locatefloat
-% {\doifelse{\@@flflplaats}{\v!links}
-% {\copy4
-% \tfskip
-% \vbox to\ht4
-% {\vfill\copy2\@@kjkjtussen}}
-% {\vbox to\ht4
-% {\vfill\copy2\@@kjkjtussen}%
-% \tfskip
-% \copy4}},
-% \v!midden=>\locatefloat
-% {\doifelse{\@@flflplaats}{\v!links}
-% {\copy4
-% \tfskip
-% \vbox to\ht4{\vfill\copy2\vfill}}
-% {\vbox to\ht4{\vfill\copy2\vfill}%
-% \tfskip
-% \copy4}},
-% \v!geen=>\locatefloat{\copy4}]}}%
-% % extended:
-% \postcenterfloatbox{\wd4}%
-% %\ifdim\wd4>\hsize
-% % \global\setbox\floatbox=
-% % \hbox to \ifbinnenkolommen\wd4\else\hsize\fi
-% % {\hss\box\floatbox\hss}%
-% %\fi
-% \egroup}
+ \doattributes{\??kj#1}\c!tekstletter\c!tekstkleur
+ {\begstrut#3\endstrut\endgraf}}}
% new
@@ -1033,10 +1071,16 @@
\putcompletecaption{#4}{#2}{#3}{0}}%
\else
% just over a line, don't use an overshoot
- \dosetraggedvbox\@@kjkjuitlijnen
- \setbox\tempcaptionbox=\raggedbox
- {\hsize\scratchdimen
- \putcompletecaption{#4}{#2}{#3}{0}}%
+ \doifinsetelse{\@@kjkjuitlijnen}{\v!links,\v!rechts}
+ {\dosetraggedvbox\@@kjkjuitlijnen
+ \setbox\tempcaptionbox\raggedbox
+ {\hsize\scratchdimen
+ \raggedcenter
+ \putcompletecaption{#4}{#2}{#3}{0}}}
+ {% nicer
+ \setbox\tempcaptionbox\cbox
+ {\hsize\scratchdimen
+ \putcompletecaption{#4}{#2}{#3}{0}}}%
\fi
\fi}
@@ -1203,7 +1247,9 @@
{\ifvisible
\par
\doifcommonelse
- {#1}{\v!links,\v!rechts,\v!inlinker,\v!inrechter,\v!inmarge}
+ {#1}
+ {\v!links,\v!rechts,\v!inlinker,\v!inrechter,%
+ \v!inmarge}
{\global\parfloattrue}
{\global\parfloatfalse}%
\ifbinnenkolommen
@@ -1275,7 +1321,7 @@
\long\def\docompletefloat#1#2#3#4#5#6#7%
{\flushsidefloats
- \calculatefloatskips
+ \calculatefloatskips{#1}%
\bgroup
\global\setbox\floatbox=\vbox{#7}%
\dimen0=\ht\floatbox
@@ -1300,13 +1346,14 @@
\redofloatorder{#1}%
\rawreference{\s!flt}{#2}{{\hetnummer}{\asciititle}}%
\doschrijfnaarlijst{#3}{\hetnummer}{#6}{#3}}%
- \egroup\dofloat{#4}{\labeltexts{#5}{\hetnummer}}{#6}{#1}}
+ \egroup
+ \preparethenumber{\??kj#1}\hetnummer\preparednumber
+ \dofloat{#4}{\labeltexts{#5}{\preparednumber}}{#6}{#1}}
{\global\setbox\floatbox=\vbox
{\unvbox\floatbox % no \vss, keep the depth
\rawreference{\s!flt}{#2}{{}{\asciititle}}}%
\egroup\dofloat{#4}{}{#6}{#1}}}%
\global\insidefloatfalse}
-
\newif\ifmargeblokken
@@ -1460,6 +1507,26 @@
% \global\inuitstellenfalse % Anyhow, 'uitstellen'
% \fi\fi} % is still suboptimal.
+% \def\douitstellen%
+% {\the\everytopofpage
+% \ifvoid\collectedpagefloats\else
+% % message
+% \unvbox\collectedpagefloats
+% \fi
+% \ifinuitstellen\else\ifcase\nofpostponedblocks\else % The \nof-test is
+% \bgroup
+% \restoreglobalbodyfont % else problems inside split verbatim
+% % message
+% \global\pagetotal\zeropoint % recently added
+% \global\inuitstellentrue % definitely needed
+% \dorecurse{\nofpostponedblocks} % else we can loose
+% {\haalbuffer[buf-\recurselevel]} % or disorder floats
+% \doflushfloats % new but potential dangerous % and that is something
+% \doglobal\newcounter\nofpostponedblocks % we don't want, do we?
+% \global\inuitstellenfalse % Anyhow, 'uitstellen'
+% \egroup
+% \fi\fi} % is still suboptimal.
+
\def\douitstellen%
{\the\everytopofpage
\ifvoid\collectedpagefloats\else
@@ -1467,19 +1534,21 @@
\unvbox\collectedpagefloats
\fi
\ifinuitstellen\else\ifcase\nofpostponedblocks\else % The \nof-test is
-\bgroup
-\black % else problems inside split verbatim
-\restoreglobalbodyfont % else problems inside split verbatim
- % message
- \global\pagetotal\zeropoint % recently added
- \global\inuitstellentrue % definitely needed
- \dorecurse{\nofpostponedblocks} % else we can loose
- {\haalbuffer[buf-\recurselevel]} % or disorder floats
- \doflushfloats % new but potential dangerous % and that is something
- \doglobal\newcounter\nofpostponedblocks % we don't want, do we?
- \global\inuitstellenfalse % Anyhow, 'uitstellen'
-\egroup
- \fi\fi} % is still suboptimal.
+ \bgroup % we need the color/font switch, else problems inside split verbatim
+ \setnormalcatcodes % uitstellen in verbatim
+ \edef\savedtopofpagecolor{\topofpagecolor}%
+ \doifsomething\savedtopofpagecolor\stopcolormode
+ \restoreglobalbodyfont
+ \global\pagetotal\zeropoint % recently added and
+ \global\inuitstellentrue % definitely needed else
+ \dorecurse{\nofpostponedblocks} % we can loose or disorder
+ {\haalbuffer[buf-\recurselevel]} % floats; anyhow, this
+ \doflushfloats % new but potential dangerous % mechanism is still
+ \doglobal\newcounter\nofpostponedblocks % suboptimal and needs a
+ \global\inuitstellenfalse % proper analysis
+ \doifsomething\savedtopofpagecolor\startcolormode\savedtopofpagecolor
+ \egroup
+ \fi\fi}
\setvalue{\e!start\e!uitstellen}%
{\doglobal\increment\nofpostponedblocks
@@ -1506,7 +1575,7 @@
\getparameters[\??si][#1]%
\resetnummer[\??si]%
\def\floatcaptionsuffix{\nummer[\??si]}%
- \TABLEcaptionheight=\@@siregels\lineheight
+ \TABLEcaptionheight=\@@siregels\lineheight % brrr
\def\docomplexpagina[##1]{\goodbreak}%
\dowithnextbox
{\forgetall
@@ -1581,13 +1650,17 @@
\c!na=\blanko,
\c!breedte=\v!passend,
\c!kopletter=\v!vet,
+ \c!kopkleur=,
\c!letter=\v!normaal,
\c!kleur=,
+ \c!tekstletter=,
+ \c!tekstkleur=,
\c!uitlijnen=,
\c!nummer=\v!ja,
\c!wijze=\@@nrwijze,
\c!blokwijze=\@@nrblokwijze,
\c!sectienummer=\@@nrsectienummer,
+ \c!scheider=\@@koscheider,
\c!conversie=\v!cijfers]
\stelplaatsblokkenin
@@ -1623,18 +1696,22 @@
[\c!conversie=\v!letter, % \v!romeins
\c!regels=3]
-% float strategy
+% float strategy, replaces some of the above macros
\let\floatmethod\empty
+\let\floatcolumn\empty
+\let\floatrow \empty
\def\dogetfloatbox#1%
{\ifvisible
\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
% nog algemeen otr
\ifx\OTRSETsetpreferedcolumnslot\undefined\else
- \OTRSETsetpreferedcolumnslot\floatcolumn
+ \OTRSETsetpreferedcolumnslot\floatcolumn\floatrow
\fi
% commando van maken
\doifundefined{\string\floatmethod\floatmethod}
diff --git a/tex/context/base/page-imp.tex b/tex/context/base/page-imp.tex
index b013bb917..fb4684f4c 100644
--- a/tex/context/base/page-imp.tex
+++ b/tex/context/base/page-imp.tex
@@ -8,24 +8,24 @@
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
+
+% much of this can more to run time loading !
\writestatus{loading}{Context Core Macros / Pagebody Building}
\unprotect
-% moved code:
+% moved code:
\def\myshipout#1%
- {\voorpagina % voor de pagebody dus !
+ {\voorpagina % voor de pagebody dus !
\dontshowcomposition
\ifarrangingpages
- \actualarrange
- {\thisisrealpage{\realfolio}#1}%
+ \actualarrange{\thisisrealpage{\realfolio}#1}%
\else
- \actualshipout
- {\thisisrealpage{\realfolio}#1}%
+ \actualshipout{\thisisrealpage{\realfolio}#1}%
\fi
\gotonextrealpage
\napagina}
@@ -34,24 +34,24 @@
\def\flushatshipout%
{\dowithnextbox
- {\global\setbox\postponedcontent=\hbox to \!!zeropoint
+ {\global\setbox\postponedcontent=\hbox to \zeropoint
{%\hskip-\maxdimen % niet hier, gaat mis in acrobat (clipt)
\box\postponedcontent\box\nextbox}%
- \global\ht\postponedcontent=\!!zeropoint
- \global\dp\postponedcontent=\!!zeropoint
- \global\wd\postponedcontent=\!!zeropoint}%
+ \global\ht\postponedcontent\zeropoint
+ \global\dp\postponedcontent\zeropoint
+ \global\wd\postponedcontent\zeropoint}%
\hbox}
-
% \starttypen
% \def\pagestoshipout{1,3,5}
% \stoptypen
-\newcounter\shippedoutpages
+\newcount\shippedoutpages
+
\let\pagestoshipout\empty % {1,3,6}
\chardef\whichpagetoshipout=0 % 0=all 1=odd 2=even
\def\actualshipout#1%
- {\doglobal\increment\shippedoutpages
+ {\global\advance\shippedoutpages\plusone
\ifx\pagestoshipout\empty
\ifcase\whichpagetoshipout\relax
\donetrue
@@ -62,8 +62,8 @@
\else
\donetrue
\fi
- \else
- \ExpandBothAfter\doifinsetelse{\shippedoutpages}{\pagestoshipout}
+ \else % testen, aangepast
+ \expandbothargsafter\doifinsetelse{\the\shippedoutpages}{\pagestoshipout}
\donetrue\donefalse
\fi
\ifdone
@@ -73,7 +73,7 @@
\mindermeldingen
\vskip-1in
\hskip-1in
- \hbox
+ \hbox % \setbox0=\box.. is nicer
{\setbox0=\hbox{#1}% just in case there are objects there
\setbox\scratchbox=\hbox
{\the\everyshipout
@@ -99,10 +99,15 @@
\pusharrangedpage0
\deadcycles=0 }
-% so far for the moved code
+%D We need a couple of boxes for duplex printing \unknown
+
+\newbox\arrangedpageA \newbox\arrangedpageB
+
+%D \unknown\ and some for simulating big sheets.
-\newbox\arrangedpageA
-\newbox\arrangedpageB
+\newbox\arrangedpageC \newbox\arrangedpageD
+\newbox\arrangedpageE \newbox\arrangedpageF
+\newbox\arrangedpageG \newbox\arrangedpageH
\newif\ifswaparranged
\newif\ifnegatearranged
@@ -121,12 +126,12 @@
\chardef\arrangedpageY=1
\def\calculatepaperoffsets#1%
- {\scratchdimen=\getvalue{\??pp#1\c!offset}%
- \divide\scratchdimen by \arrangedpageX
- \global\advance\papierbreedte by -2\scratchdimen
- \scratchdimen=\getvalue{\??pp#1\c!offset}%
- \divide\scratchdimen by \arrangedpageY
- \global\advance\papierhoogte by -2\scratchdimen}
+ {\scratchdimen\getvalue{\??pp#1\c!offset}%
+ \divide\scratchdimen \arrangedpageX
+ \global\advance\papierbreedte -2\scratchdimen
+ \scratchdimen\getvalue{\??pp#1\c!offset}%
+ \divide\scratchdimen \arrangedpageY
+ \global\advance\papierhoogte -2\scratchdimen}
\def\setuparranging[#1]%
{\ifarrangingdisabled \else
@@ -148,67 +153,9 @@
90=>\gdef\arrangedrotationO {90}\gdef\arrangedrotationE{270},
180=>\gdef\arrangedrotationO{180}\gdef\arrangedrotationE{0},
270=>\gdef\arrangedrotationO{270}\gdef\arrangedrotationE{90},
- 2*16=>\global\chardef\arrangedpageX=8
- \global\chardef\arrangedpageY=4
- \global\chardef\arrangedpageT=16
- \global\chardef\horizontalcutmarks=5
- \global\chardef\verticalcutmarks=5
- \global\let\pusharrangedpage=\pusharrangedpageTHIRTYTWO
- \global\let\poparrangedpages=\poparrangedpagesAB,
- 2*8=>\global\chardef\arrangedpageX=4
- \global\chardef\arrangedpageY=2
- \global\chardef\arrangedpageT=8
- \global\chardef\horizontalcutmarks=5
- \global\chardef\verticalcutmarks=3
- \global\let\pusharrangedpage=\pusharrangedpageSIXTEEN
- \global\let\poparrangedpages=\poparrangedpagesAB,
- 2*4=>\global\chardef\arrangedpageX=2
- \global\chardef\arrangedpageY=2
- \global\chardef\arrangedpageT=4
- \global\chardef\horizontalcutmarks=3
- \global\chardef\verticalcutmarks=3
- \global\let\pusharrangedpage=\pusharrangedpageEIGHT
- \global\let\poparrangedpages=\poparrangedpagesAB,
- 2*2=>\global\chardef\arrangedpageX=2
- \global\chardef\arrangedpageY=1
- \global\chardef\arrangedpageT=2
- \global\chardef\horizontalcutmarks=3
- \global\chardef\verticalcutmarks=2
- \global\let\pusharrangedpage=\pusharrangedpageFOURA
- \global\let\poparrangedpages=\poparrangedpagesAB,
- 2**2=>\global\chardef\arrangedpageX=2
- \global\chardef\arrangedpageY=1
- \global\chardef\arrangedpageT=2
- \global\chardef\horizontalcutmarks=3
- \global\chardef\verticalcutmarks=2
- \global\let\pusharrangedpage=\pusharrangedpageFOURB
- \global\let\poparrangedpages=\poparrangedpagesAB,
- 2SIDE=>\global\chardef\arrangedpageX=2
- \global\chardef\arrangedpageY=1
- \global\chardef\arrangedpageT=2
- \global\chardef\horizontalcutmarks=3
- \global\chardef\verticalcutmarks=2
- \global\let\pusharrangedpage=\pusharrangedpageSIDE
- \global\let\poparrangedpages=\poparrangedpagesAB,
- 2UP=>\global\chardef\arrangedpageX=2
- \global\chardef\arrangedpageY=1
- \global\chardef\arrangedpageT=4
- \global\chardef\horizontalcutmarks=3
- \global\chardef\verticalcutmarks=2
- \global\let\handlearrangedpage=\handlearrangedpageTWOUP
- \global\let\pusharrangedpage=\pusharrangedpageTWO
- \global\let\poparrangedpages=\poparrangedpagesTWO,
- 2DOWN=>\global\chardef\arrangedpageX=1
- \global\chardef\arrangedpageY=2
- \global\chardef\arrangedpageT=4
- \global\chardef\horizontalcutmarks=2
- \global\chardef\verticalcutmarks=3
- \global\let\handlearrangedpage=\handlearrangedpageTWODOWN
- \global\let\pusharrangedpage=\pusharrangedpageTWO
- \global\let\poparrangedpages=\poparrangedpagesTWO,
\s!reset=>\global\arrangingpagesfalse,
- \s!unknown=>\global\arrangingpagesfalse,
- \s!default=>\global\arrangingpagesfalse]%
+ \s!unknown=>\checkinstalledpagearrangement\commalistelement,
+ \s!default=>\checkinstalledpagearrangement\commalistelement]%
\doifcommonelse{#1}{90,270,\v!geroteerd}
{\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
\setuppapersize
@@ -216,96 +163,75 @@
\abortutilitygeneration
\fi
\fi}
-
-% cleaner, but unchecked, and incomplete
-%
-% \def\dosetuparrangingXY#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}
-%
-% \def\dosetuparrangingOE#1#2%
-% {\gdef\arrangedrotationO{#1}%
-% \gdef\arrangedrotationE{#2}}
-%
-% \def\setuparranging[#1]%
-% {\ifarrangingdisabled \else
-% \doifelse{#1}{\v!blokkeer}
-% {\global\arrangingdisabledtrue}
-% {\global\arrangingdisabledfalse}%
-% \global\arrangingpagestrue
-% \global\negatearrangedfalse
-% \global\mirrorarrangedfalse
-% \global\doublearrangedfalse
-% \gdef\arrangedrotationO{0}%
-% \gdef\arrangedrotationE{180}%
-% \processallactionsinset
-% [#1]
-% [ \v!gespiegeld=>\global\mirrorarrangedtrue,
-% \v!dubbelzijdig=>\global\doublearrangedtrue,
-% \v!negatief=>\global\negatearrangedtrue,
-% \v!geroteerd=>\dosetuparrangingOE{90}{270},
-% 90=>\dosetuparrangingOE{90}{270},
-% 180=>\dosetuparrangingOE{180}{0},
-% 270=>\dosetuparrangingOE{270}{90},
-% 2*16=>\dosetuparrangingXY{8}{4}{16}{5}{5}
-% \pusharrangedpageTHIRTYTWO
-% \poparrangedpagesAB
-% \relax,
-% 2*8=>\dosetuparrangingXY{4}{2}{8}{5}{3}
-% \pusharrangedpageSIXTEEN
-% \poparrangedpagesAB
-% \relax,
-% 2*4=>\dosetuparrangingXY{2}{2}{4}{3}{3}
-% \pusharrangedpageEIGHT
-% \poparrangedpagesAB
-% \relax,
-% 2*2=>\dosetuparrangingXY{2}{1}{2}{3}{2}
-% \pusharrangedpageFOUR
-% \poparrangedpagesAB
-% \relax,
-% 2**2=>\dosetuparrangingXY{2}{1}{2}{3}{2}
-% \pusharrangedpageFOURPLUS
-% \poparrangedpagesAB
-% \relax,
-% 2SIDE=>\dosetuparrangingXY{2}{1}{2}{3}{2}
-% \pusharrangedpageSIDE
-% \poparrangedpagesAB
-% \relax,
-% 2UP=>\dosetuparrangingXY{2}{1}{4}{3}{2}
-% \pusharrangedpageTWO
-% \poparrangedpagesTWO,
-% \handlearrangedpageTWOUP,
-% 2DOWN=>\dosetuparrangingXY{1}{2}{4}{2}{3}
-% \pusharrangedpageTWO
-% \poparrangedpagesTWO
-% \handlearrangedpageTWODOWN,
-% \s!reset=>\global\arrangingpagesfalse,
-% \s!unknown=>\global\arrangingpagesfalse,
-% \s!default=>\global\arrangingpagesfalse]%
-% \doifcommonelse{#1}{90,270,\v!geroteerd}
-% {\swapmacros\horizontalcutmarks\verticalcutmarks}{}% ugly solution
-% \setuppapersize
-% \ifarrangingpages
-% \abortutilitygeneration
-% \fi
-% \fi}
+
+\def\installpagearrangement #1 %
+ {\setgvalue{\??pp\??pp#1}}
+
+\def\checkinstalledpagearrangement#1%
+ {\executeifdefined{\??pp\??pp#1}{\global\arrangingpagesfalse}}
+
+\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 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}
\def\filluparrangedpages% beware: \realpageno is 1 ahead
{\ifarrangingpages
- \scratchcounter=-\realpageno
- \divide\scratchcounter by \arrangedpageT
- \multiply\scratchcounter by \arrangedpageT
- \advance\scratchcounter by \realpageno
- \advance\scratchcounter by -1
- \dorecurse{\scratchcounter}
- {\noheaderandfooterlines
- \ejectdummypage}
+ \scratchcounter-\realpageno
+ \divide\scratchcounter \arrangedpageT
+ \multiply\scratchcounter \arrangedpageT
+ \advance\scratchcounter \realpageno
+ \advance\scratchcounter -1
+ \dorecurse\scratchcounter{\noheaderandfooterlines\ejectdummypage}
\fi}
\def\handlearrangedpageXY#1#2#3#4#5%
@@ -316,47 +242,51 @@
\mindermeldingen
\vskip#4\papierhoogte
\hskip#3\papierbreedte
- \dorotatebox{#2}\hbox{\box#1}%
+ \dorotatebox{\ifcase#2 0\else180\fi}\hbox{\box#1}%
\vfill}%
- \wd\scratchbox=\!!zeropoint
+ \wd\scratchbox\zeropoint
\box\scratchbox\box#5\hss}}
-\def\gotonextarrangepage%
- {\global\advance\arrangeno by 1
- \def\pagecutmarksymbol%
- {\the\arrangeno}}
+\def\gotonextarrangepage
+ {\global\advance\arrangeno 1
+ \def\pagecutmarksymbol{\the\arrangeno}}
\def\outputarrangedbox#1%
{\bgroup
\gotonextarrangepage
\ifnum\arrangedrotationO\arrangedrotationE>0
\ifdoublearranged
- \ifodd\arrangeno
+ \ifodd\arrangeno % if into 2d arg
\setbox#1=\vbox{\dorotatebox\arrangedrotationO\hbox{\box#1}}%
\else
\setbox#1=\vbox{\dorotatebox\arrangedrotationE\hbox{\box#1}}%
\fi
\else
\setbox#1=\vbox{\dorotatebox\arrangedrotationO\hbox{\box#1}}%
- \fi
+ \fi
\fi
\ifmirrorarranged
\setbox#1=\vbox{\domirrorbox\vbox{\box#1}}%
\fi
\ifnegatearranged
\negatecolorbox{#1}%
- \fi
+ \fi
\finishpagebox#1
\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>0
\mindermeldingen
- \papierbreedte=\arrangedpageX\papierbreedte
- \papierhoogte=\arrangedpageY\papierhoogte
+ \papierbreedte\arrangedpageX\papierbreedte
+ \papierhoogte\arrangedpageY\papierhoogte
\outputarrangedbox\arrangedpageA
\outputarrangedbox\arrangedpageB
\doglobal\newcounter\arrangedpageN
@@ -366,38 +296,38 @@
{\doglobal\increment\arrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
- \or \handlearrangedpageXY{#1} {0}{3}{3}\arrangedpageA % 1
- \or \handlearrangedpageXY{#1} {0}{0}{3}\arrangedpageB % 2
- \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageB % 3
- \or \handlearrangedpageXY{#1}{180}{3}{0}\arrangedpageA % 4
- \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageA % 5
- \or \handlearrangedpageXY{#1}{180}{3}{0}\arrangedpageB % 6
- \or \handlearrangedpageXY{#1} {0}{3}{3}\arrangedpageB % 7
- \or \handlearrangedpageXY{#1} {0}{0}{3}\arrangedpageA % 8
- \or \handlearrangedpageXY{#1}{180}{0}{2}\arrangedpageA % 9
- \or \handlearrangedpageXY{#1}{180}{3}{2}\arrangedpageB % 10
- \or \handlearrangedpageXY{#1} {0}{3}{1}\arrangedpageB % 11
- \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageA % 12
- \or \handlearrangedpageXY{#1} {0}{3}{1}\arrangedpageA % 13
- \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageB % 14
- \or \handlearrangedpageXY{#1}{180}{0}{2}\arrangedpageB % 15
- \or \handlearrangedpageXY{#1}{180}{3}{2}\arrangedpageA % 16
- \or \handlearrangedpageXY{#1}{180}{2}{2}\arrangedpageA % 17
- \or \handlearrangedpageXY{#1}{180}{1}{2}\arrangedpageB % 18
- \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageB % 19
- \or \handlearrangedpageXY{#1} {0}{2}{1}\arrangedpageA % 20
- \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageA % 21
- \or \handlearrangedpageXY{#1} {0}{2}{1}\arrangedpageB % 22
- \or \handlearrangedpageXY{#1}{180}{2}{2}\arrangedpageB % 23
- \or \handlearrangedpageXY{#1}{180}{1}{2}\arrangedpageA % 24
- \or \handlearrangedpageXY{#1} {0}{1}{3}\arrangedpageA % 25
- \or \handlearrangedpageXY{#1} {0}{2}{3}\arrangedpageB % 26
- \or \handlearrangedpageXY{#1}{180}{2}{0}\arrangedpageB % 27
- \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageA % 28
- \or \handlearrangedpageXY{#1}{180}{2}{0}\arrangedpageA % 29
- \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageB % 30
- \or \handlearrangedpageXY{#1} {0}{1}{3}\arrangedpageB % 31
- \or \handlearrangedpageXY{#1} {0}{2}{3}\arrangedpageA % 32
+ \or \handlearrangedpageXY{#1}033\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1}003\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1}100\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1}130\arrangedpageA % 4
+ \or \handlearrangedpageXY{#1}100\arrangedpageA % 5
+ \or \handlearrangedpageXY{#1}130\arrangedpageB % 6
+ \or \handlearrangedpageXY{#1}033\arrangedpageB % 7
+ \or \handlearrangedpageXY{#1}003\arrangedpageA % 8
+ \or \handlearrangedpageXY{#1}102\arrangedpageA % 9
+ \or \handlearrangedpageXY{#1}132\arrangedpageB % 10
+ \or \handlearrangedpageXY{#1}031\arrangedpageB % 11
+ \or \handlearrangedpageXY{#1}001\arrangedpageA % 12
+ \or \handlearrangedpageXY{#1}031\arrangedpageA % 13
+ \or \handlearrangedpageXY{#1}001\arrangedpageB % 14
+ \or \handlearrangedpageXY{#1}102\arrangedpageB % 15
+ \or \handlearrangedpageXY{#1}132\arrangedpageA % 16
+ \or \handlearrangedpageXY{#1}122\arrangedpageA % 17
+ \or \handlearrangedpageXY{#1}112\arrangedpageB % 18
+ \or \handlearrangedpageXY{#1}011\arrangedpageB % 19
+ \or \handlearrangedpageXY{#1}021\arrangedpageA % 20
+ \or \handlearrangedpageXY{#1}011\arrangedpageA % 21
+ \or \handlearrangedpageXY{#1}021\arrangedpageB % 22
+ \or \handlearrangedpageXY{#1}122\arrangedpageB % 23
+ \or \handlearrangedpageXY{#1}112\arrangedpageA % 24
+ \or \handlearrangedpageXY{#1}013\arrangedpageA % 25
+ \or \handlearrangedpageXY{#1}023\arrangedpageB % 26
+ \or \handlearrangedpageXY{#1}120\arrangedpageB % 27
+ \or \handlearrangedpageXY{#1}110\arrangedpageA % 28
+ \or \handlearrangedpageXY{#1}120\arrangedpageA % 29
+ \or \handlearrangedpageXY{#1}110\arrangedpageB % 30
+ \or \handlearrangedpageXY{#1}013\arrangedpageB % 31
+ \or \handlearrangedpageXY{#1}023\arrangedpageA % 32
\poparrangedpages
\fi}
@@ -405,22 +335,22 @@
{\doglobal\increment\arrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
- \or \handlearrangedpageXY{#1} {0}{3}{1}\arrangedpageA % 1
- \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageB % 2
- \or \handlearrangedpageXY{#1} {0}{3}{1}\arrangedpageB % 3
- \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageA % 4
- \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageA % 5
- \or \handlearrangedpageXY{#1}{180}{3}{0}\arrangedpageB % 6
- \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageB % 7
- \or \handlearrangedpageXY{#1}{180}{3}{0}\arrangedpageA % 8
- \or \handlearrangedpageXY{#1}{180}{2}{0}\arrangedpageA % 9
- \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageB % 10
- \or \handlearrangedpageXY{#1}{180}{2}{0}\arrangedpageB % 11
- \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageA % 12
- \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageA % 13
- \or \handlearrangedpageXY{#1} {0}{2}{1}\arrangedpageB % 14
- \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageB % 15
- \or \handlearrangedpageXY{#1} {0}{2}{1}\arrangedpageA % 16
+ \or \handlearrangedpageXY{#1}031\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1}001\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1}031\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1}001\arrangedpageA % 4
+ \or \handlearrangedpageXY{#1}100\arrangedpageA % 5
+ \or \handlearrangedpageXY{#1}130\arrangedpageB % 6
+ \or \handlearrangedpageXY{#1}100\arrangedpageB % 7
+ \or \handlearrangedpageXY{#1}130\arrangedpageA % 8
+ \or \handlearrangedpageXY{#1}120\arrangedpageA % 9
+ \or \handlearrangedpageXY{#1}110\arrangedpageB % 10
+ \or \handlearrangedpageXY{#1}120\arrangedpageB % 11
+ \or \handlearrangedpageXY{#1}110\arrangedpageA % 12
+ \or \handlearrangedpageXY{#1}011\arrangedpageA % 13
+ \or \handlearrangedpageXY{#1}021\arrangedpageB % 14
+ \or \handlearrangedpageXY{#1}011\arrangedpageB % 15
+ \or \handlearrangedpageXY{#1}021\arrangedpageA % 16
\poparrangedpages
\fi}
@@ -428,14 +358,14 @@
{\doglobal\increment\arrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
- \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageA % 1
- \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageB % 2
- \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageB % 3
- \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageA % 4
- \or \handlearrangedpageXY{#1}{180}{0}{0}\arrangedpageA % 5
- \or \handlearrangedpageXY{#1}{180}{1}{0}\arrangedpageB % 6
- \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageB % 7
- \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageA % 8
+ \or \handlearrangedpageXY{#1}011\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1}001\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1}100\arrangedpageB % 3
+ \or \handlearrangedpageXY{#1}110\arrangedpageA % 4
+ \or \handlearrangedpageXY{#1}100\arrangedpageA % 5
+ \or \handlearrangedpageXY{#1}110\arrangedpageB % 6
+ \or \handlearrangedpageXY{#1}011\arrangedpageB % 7
+ \or \handlearrangedpageXY{#1}001\arrangedpageA % 8
\poparrangedpages
\fi}
@@ -446,65 +376,79 @@
{\doglobal\increment\arrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
- \or \handlearrangedpageXY{#3} {0} {1}{0}\arrangedpageA % 1
- \or \handlearrangedpageXY{#3}{180}{#1}{0}\arrangedpageB % 2/3
- \or \handlearrangedpageXY{#3}{180}{#2}{0}\arrangedpageB % 3/2
- \or \handlearrangedpageXY{#3} {0} {0}{0}\arrangedpageA % 4
+ \or \handlearrangedpageXY{#3}010\arrangedpageA % 1
+ \or \handlearrangedpageXY{#3}0{#1}0\arrangedpageB % 2/3 not {1}
+ \or \handlearrangedpageXY{#3}0{#2}0\arrangedpageB % 3/2 not {1}
+ \or \handlearrangedpageXY{#3}000\arrangedpageA % 4
\poparrangedpages
\fi}
-\def\pusharrangedpageSIDE#1% not ok yet
+\def\pusharrangedpageSIDETOP#1%
{\doglobal\increment\arrangedpageN
\reportarrangedpage\arrangedpageN
\ifcase\arrangedpageN
- \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageA % 1
- \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageA % 2
- \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageB % 3
- \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageB % 4
+ \or \handlearrangedpageXY{#1}000\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1}000\arrangedpageB % 2
\poparrangedpages
\fi}
+\def\handlearrangedpageSIDE
+ {\global\wd\arrangedpageA\papierbreedte
+ \global\wd\arrangedpageB\papierbreedte
+ \global\setbox\arrangedpageA\hbox
+ {\box\arrangedpageA\box\arrangedpageB}%
+ \global\ht\arrangedpageA\papierhoogte
+ \global\setbox\arrangedpageB\box\scratchbox} % ?
+
+\def\handlearrangedpageTOP
+ {\global\ht\arrangedpageA\papierhoogte
+ \global\ht\arrangedpageB\papierhoogte
+ \global\setbox\arrangedpageA\vbox
+ {\forgetall\offinterlineskip\vskip\papierhoogte
+ \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=\ht\arrangedpageB
- \advance\scratchdimen by -\!!onepoint
+ {\splittopskip\zeropoint
+ \global\setbox\arrangedpageA\vsplit\arrangedpageB to \!!onepoint
+ \scratchdimen\ht\arrangedpageB
+ \advance\scratchdimen -\!!onepoint
\ifdim\scratchdimen>\!!onepoint
- \setbox\scratchbox=\vsplit\arrangedpageB to \scratchdimen
+ \setbox\scratchbox\vsplit\arrangedpageB to \scratchdimen
\fi}
\def\handlearrangedpageTWOUP%
{\splitoffarrangedpagesTWO
\ifswaparranged
- \global\setbox\arrangedpageA=\hbox
+ \global\setbox\arrangedpageA\hbox
{\box\arrangedpageA\box\arrangedpageB}%
\swaparrangedfalse
\else
- \global\setbox\arrangedpageA=\hbox
+ \global\setbox\arrangedpageA\hbox
{\box\arrangedpageB\box\arrangedpageA}%
\swaparrangedtrue
\fi
- \global\ht\arrangedpageA=\papierhoogte
- \global\setbox\arrangedpageB=\box\scratchbox}
+ \global\ht\arrangedpageA\papierhoogte
+ \global\setbox\arrangedpageB\box\scratchbox}
\def\handlearrangedpageTWODOWN%
{\splitoffarrangedpagesTWO
- \global\ht\arrangedpageA=\papierhoogte
- \global\ht\arrangedpageB=\papierhoogte
+ \global\ht\arrangedpageA\papierhoogte
+ \global\ht\arrangedpageB\papierhoogte
\ifswaparranged
- \global\setbox\arrangedpageA=\vbox
+ \global\setbox\arrangedpageA\vbox
{\forgetall\offinterlineskip\vskip\papierhoogte
\box\arrangedpageA\box\arrangedpageB}%
\swaparrangedfalse
\else
- \global\setbox\arrangedpageA=\vbox
+ \global\setbox\arrangedpageA\vbox
{\forgetall\offinterlineskip\vskip\papierhoogte
\box\arrangedpageB\box\arrangedpageA}%
\swaparrangedtrue
\fi
- \global\setbox\arrangedpageB=\box\scratchbox}
+ \global\setbox\arrangedpageB\box\scratchbox}
\def\poparrangedpagesTWO%
{\ifnum\arrangedpageN>0
@@ -513,13 +457,13 @@
\doloop
{\handlearrangedpage
\bgroup
- \papierbreedte=\arrangedpageX\papierbreedte
- \papierhoogte=\arrangedpageY\papierhoogte
- \ht\arrangedpageA=\papierhoogte
- \wd\arrangedpageA=\papierbreedte
+ \papierbreedte\arrangedpageX\papierbreedte
+ \papierhoogte\arrangedpageY\papierhoogte
+ \ht\arrangedpageA\papierhoogte
+ \wd\arrangedpageA\papierbreedte
\outputarrangedbox\arrangedpageA
\egroup
- \ifdim\ht\arrangedpageB=\!!zeropoint
+ \ifdim\ht\arrangedpageB=\zeropoint
\exitloop
\fi}%
\doglobal\newcounter\arrangedpageN
@@ -528,41 +472,123 @@
\def\pusharrangedpageTWO#1%
{\doglobal\increment\arrangedpageN
\reportarrangedpage\arrangedpageN
- \global\setbox\arrangedpageB=\vbox
+ \global\setbox\arrangedpageB\vbox
{\forgetall
\offinterlineskip
\unvbox\arrangedpageB
\allowbreak
\ht#1=\!!onepoint
- \dp#1=\!!zeropoint
+ \dp#1=\zeropoint
\vbox{\box#1}}}
-%D One can (mis)use this mechanism, in close cooperation
-%D with \PDFTEX\ to arrange pages of already produced files.
+%D Willy Egger's sheet simulations:
+
+\def\poparrangedpagesAtoH%
+ {\ifnum\arrangedpageN>0
+ \mindermeldingen
+ \papierbreedte\arrangedpageX\papierbreedte
+ \papierhoogte\arrangedpageY\papierhoogte
+ \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>0
+ \mindermeldingen
+ \papierbreedte\arrangedpageX\papierbreedte
+ \papierhoogte\arrangedpageY\papierhoogte
+ \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 \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageC % 3
+ \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageD % 4
+ \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageE % 5
+ \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageF % 6
+ \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageG % 7
+ \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageH % 8
+ \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageH % 9
+ \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageG % 10
+ \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageF % 11
+ \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageE % 12
+ \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageD % 13
+ \or \handlearrangedpageXY{#1}{0}{0}{0}\arrangedpageC % 14
+ \or \handlearrangedpageXY{#1}{0}{1}{0}\arrangedpageB % 15
+ \or \handlearrangedpageXY{#1}{0}{0}{0}\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 \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageA % 1
+ \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageB % 2
+ \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageC % 3
+ \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageD % 4
+ \or \handlearrangedpageXY{#1}{1}{0}{0}\arrangedpageD % 5
+ \or \handlearrangedpageXY{#1}{1}{1}{0}\arrangedpageC % 6
+ \or \handlearrangedpageXY{#1}{1}{0}{0}\arrangedpageB % 7
+ \or \handlearrangedpageXY{#1}{1}{1}{0}\arrangedpageA % 8
+ \or \handlearrangedpageXY{#1}{1}{0}{0}\arrangedpageA % 9
+ \or \handlearrangedpageXY{#1}{1}{1}{0}\arrangedpageB % 10
+ \or \handlearrangedpageXY{#1}{1}{0}{0}\arrangedpageC % 11
+ \or \handlearrangedpageXY{#1}{1}{1}{0}\arrangedpageD % 12
+ \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageD % 13
+ \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageC % 14
+ \or \handlearrangedpageXY{#1} {0}{1}{1}\arrangedpageB % 15
+ \or \handlearrangedpageXY{#1} {0}{0}{1}\arrangedpageA % 16
+ \poparrangedpages
+ \fi}
+
+%D One can (mis)use this mechanism, in close cooperation
+%D with \PDFTEX\ to arrange pages of already produced files.
%D
%D \starttypen
%D \insertpages[file.pdf][1,3][n=30,width=18cm]
%D \stoptypen
%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 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 Selecting pages can be accomplished by:
%D
-%D \starttypen
+%D \starttypen
%D \filterpages[file.pdf][1,3,5][n=30,width=18cm]
%D \stoptypen
%D
-%D One may pass \type {odd} or \type {even} instead of a
-%D comma separated list. A third alternative is:
+%D One may pass \type {odd} or \type {even} instead of a
+%D comma separated list. A third alternative is:
%D
-%D \starttypen
+%D \starttypen
%D \copypages[file.pdf][n=30,scale=950]
%D \stoptypen
-%D
-%D This macros inserts the page, according to the settings
-%D provided.
+%D
+%D This macros inserts the page, according to the settings
+%D provided.
\def\insertpages%
{\dotripleempty\doinsertpages}
@@ -570,13 +596,14 @@
\def\doinsertpages[#1][#2][#3]%
{\doifassignmentelse{#2}
{\dodoinsertpages[#1][][#2]}
- {\dodoinsertpages[#1][#2][#3]}}
+ {\dodoinsertpages[#1][#2][#3]}}
-\def\dodoinsertpages[#1][#2][#3]%
+\def\dodoinsertpages[#1][#2][#3]%
{\bgroup
\mindermeldingen
- \getfiguredimensions[#1]%
+ \getfiguredimensions[#1]%
\getparameters[\??ip][\c!n=\noffigurepages,\c!breedte=\!!zeropoint,#3]%
+ \doifinsetelse{0}{#2}{\null\pagina}{}%
\dorecurse{\@@ipn}
{\dofilterpage{#1}{\recurselevel}%
\doifinsetelse{\recurselevel}{#2}{\null\pagina}{}}%
@@ -585,10 +612,10 @@
\def\filterpages%
{\dotripleempty\dofilterpages}
-\def\dofilterpages[#1][#2][#3]% % \noffigurepages not yet supported
+\def\dofilterpages[#1][#2][#3]% % \noffigurepages not yet supported
{\bgroup
\mindermeldingen
- \getfiguredimensions[#1]%
+ \getfiguredimensions[#1]%
\getparameters[\??ip][\c!n=\noffigurepages,\c!breedte=\!!zeropoint,#3]%
\doifelse{#2}{\v!even}
{\dorecurse{\@@ipn}
@@ -612,13 +639,13 @@
\def\dofilterpage#1#2%
{\hbox to \tekstbreedte
- {\ifdubbelzijdig\ifdim\@@ipbreedte>\!!zeropoint\relax\ifodd\realpageno\else
+ {\ifdubbelzijdig\ifdim\@@ipbreedte>\zeropoint\relax\ifodd\realpageno\else
\hfill
\def\dowithfigure{\hskip-\@@ipbreedte}%
\fi\fi\fi
- \setbox0=\hbox
+ \setbox0=\hbox
{\externalfigure[#1][\c!pagina=#2,\c!hoogte=\teksthoogte]}%
- \wd0=\!!zeropoint
+ \wd0\zeropoint
\box0}
\pagina}
@@ -642,8 +669,8 @@
{\doifelse{\@@ipmarkering}{\v!aan}
{\let\next\cuthbox}{\let\next\hbox}%
\next
- {\ifdim\scratchdimen>\!!zeropoint\relax
- \advance\vsize by -2\scratchdimen
+ {\ifdim\scratchdimen>\zeropoint\relax
+ \advance\vsize by -2\scratchdimen
\advance\hsize by -2\scratchdimen
\externalfigure[#1][\c!pagina=\recurselevel,#2,\c!schaal=,\c!factor=\v!max,\c!offset=\v!overlay]%
\else
@@ -654,12 +681,12 @@
%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 \starttypen
+%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 \starttypen
%D \setuppapersize
%D [A4][A4] % or [A4,landscape][A4,landscape]
%D
@@ -667,86 +694,114 @@
%D [header=0pt,footer=1cm,
%D backspace=1cm,topspace=1cm,
%D width=middle,height=middle]
-%D
+%D
%D \setupfootertexts
%D [presentation---\currentdate\space---\space\pagenumber]
-%D
+%D
%D \starttext
-%D \combinepages[slides][nx=2,ny=3,frame=on]
+%D \combinepages[slides][nx=2,ny=3,frame=on]
%D \stoptext
-%D \starttypen
+%D \starttypen
%D
-%D One can influence the way the pages are combined. (This
+%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]%
+\def\docombinepages[#1][#2]% a=perpag b=free
{\bgroup
- \getfiguredimensions[#1]%
+ \mindermeldingen
+ \getfiguredimensions[#1]%
\getparameters
[\??ip]
- [\c!n=\noffigurepages,\c!nx=2,\c!ny=2,
+ [\c!variant=\v!a,
+ \c!n=\noffigurepages,\c!nx=2,\c!ny=2,
\c!afstand=\bodyfontsize,
\c!onder=\vfill,\c!boven=\vss,
\c!links=\hss,\c!rechts=\hss,
- \c!voor=\pagina,\c!na=\pagina,\c!kader=,
+ \c!voor=\pagina,\c!na=\pagina,\c!tussen=\blanko,
+ \c!kader=,
#2]%
\@@ipvoor
\doglobal\newcounter\combinedpagescounter
- \doloop
- {\vbox to \teksthoogte
- {\mindermeldingen
- \hsize=\tekstbreedte
- \scratchdimen=\@@ipafstand
- \!!widtha=\hsize
- \advance\!!widtha by -\@@ipnx\scratchdimen
- \advance\!!widtha by \scratchdimen
- \divide \!!widtha by \@@ipnx
- \!!heighta=\vsize
- \advance\!!heighta by -\@@ipny\scratchdimen
- \advance\!!heighta by \scratchdimen
- \divide \!!heighta by \@@ipny
- \dorecurse{\@@ipny}
- {\hbox to \hsize
- {\dorecurse{\@@ipnx}
- {\doglobal\increment\combinedpagescounter
- \vbox to \!!heighta
- {\hsize=\!!widtha
- \vsize=\!!heighta
- \@@ipboven
- \hbox to \hsize
- {\@@iplinks
- \ifnum\combinedpagescounter>\@@ipn \else
- \externalfigure[#1]
- [\c!pagina=\combinedpagescounter,
- \c!factor=\v!max,
- \c!kader=\@@ipkader]%
- \fi
- \@@iprechts}
- \@@iponder}%
- \hfil}%
- \hfilneg}
- \vfil}
- \vfilneg}
- \pagina
- \ifnum\combinedpagescounter<\@@ipn \else\exitloop\fi}
+ \doifelse{\@@ipvariant}{\v!b}{\!!doneafalse}{\!!doneatrue}%
+ \if!!donea
+ \doloop
+ {\vbox to \teksthoogte
+ {\hsize=\tekstbreedte % ? ?
+ \scratchdimen=\@@ipafstand
+ \!!widtha=\hsize
+ \advance\!!widtha by -\@@ipnx\scratchdimen
+ \advance\!!widtha by \scratchdimen
+ \divide \!!widtha by \@@ipnx
+ \!!heighta=\vsize
+ \advance\!!heighta by -\@@ipny\scratchdimen
+ \advance\!!heighta by \scratchdimen
+ \divide \!!heighta by \@@ipny
+ \dorecurse{\@@ipny}
+ {\hbox to \hsize
+ {\dorecurse{\@@ipnx}
+ {\doglobal\increment\combinedpagescounter
+ \vbox to \!!heighta
+ {\hsize=\!!widtha
+ \vsize=\!!heighta
+ \@@ipboven
+ \hbox to \hsize
+ {\@@iplinks
+ \ifnum\combinedpagescounter>\@@ipn \else
+ \externalfigure[#1]
+ [\c!object=\v!nee,
+ \c!pagina=\combinedpagescounter,
+ \c!factor=\v!max,
+ \c!kader=\@@ipkader]%
+ \fi
+ \@@iprechts}
+ \@@iponder}%
+ \hfil}%
+ \hfilneg}
+ \vfil}%
+ \vfilneg}%
+ \ifnum\combinedpagescounter<\@@ipn \else\exitloop\fi}
+ \else
+ \doloop
+ {\startbaselinecorrection
+ \scratchdimen=\@@ipafstand
+ \!!widtha=\hsize
+ \advance\!!widtha by -\@@ipnx\scratchdimen
+ \advance\!!widtha by \scratchdimen
+ \divide \!!widtha by \@@ipnx
+ \hbox to \hsize
+ {\dorecurse{\@@ipnx}
+ {\doglobal\increment\combinedpagescounter
+ \ifnum\combinedpagescounter>\@@ipn \else
+ \externalfigure[#1]
+ [\c!pagina=\combinedpagescounter,
+ \c!breedte=\!!widtha,
+ \c!kader=\@@ipkader]%
+ \fi}}%
+ \stopbaselinecorrection
+ \ifnum\combinedpagescounter<\@@ipn
+ \@@iptussen
+ \else
+ \exitloop
+ \fi}
+ \fi
\@@ipna
\egroup}
-%D \macros
+%D \macros
%D {setuppagecomment,startpagecomment}
%D
-%D This command is not yet documented. Usage:
+%D This command is not yet documented. Usage:
+%D
+%D \starttypen
+%D \setuppagecomment[state=start,location=right]
%D
-%D \starttypen
-%D \setuppagecomment[state=start,location=right]
-%D
%D \startpagecomment
-%D \input knuth
+%D \input knuth
%D \stoppagecomment
-%D \stoptypen
+%D \stoptypen
\def\setuppagecomment%
{\dosingleempty\dosetuppagecomment}
@@ -776,8 +831,8 @@
\let\@@pcprintpapersize\printpapersize
\setuppapersize[\papersize][commentedpage]%
\setupbackgrounds[\v!papier][\c!achtergrond=pagecomment]}
- {\doif{\@@pcstatus}{\v!stop} % else initialization invokes backgrounds
- {% this should be tested first
+ {\doif{\@@pcstatus}{\v!stop} % else initialization invokes backgrounds
+ {% this should be tested first
% \expanded{\setuppapersize[\papersize][\@@pcprintpapersize]}%
\setupbackgrounds[\v!papier][\c!achtergrond=]}}}
@@ -830,43 +885,75 @@
\c!afstand=.5cm,
\c!hoogte=5cm,
\c!breedte=10cm]
-
-\protect \endinput
-% This macro cuts a page into n parts that can be pasted
+% 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
+ \gdef\slicedpagenumber{0}%
+ \getfiguredimensions[#1]
+ \getparameters
+ [\??ip]
+ [\c!n=1,
+ \c!offset=\!!zeropoint,
+ \c!hoffset=\!!zeropoint,\c!voffset=\!!zeropoint,
+ \c!breedte=\figurewidth,\c!hoogte=\figureheight,#2]
+\ifnum\@@ipn>0
+ \definepapersize
+ [\s!dummy][\c!hoogte=\@@iphoogte,\c!breedte=\@@ipbreedte]
+ \setuppapersize
+ [\s!dummy][\s!dummy]
+ \stellayoutin % \setuplayout
+ [\c!rugwit=\!!zeropoint,\c!kopwit=\!!zeropoint,
+ \c!hoogte=\v!midden,\c!breedte=\v!midden,
+ \c!hoofd=\!!zeropoint,\c!voet=\!!zeropoint]
+\fi
+ \dorecurse\noffigurepages
+ {\global\let\slicedpagenumber\recurselevel
+ \ifnum\@@ipn>1
+ \dorecurse\@@ipn
+ {\let\xslice\recurselevel
+ \dorecurse\@@ipn
+ {\let\yslice\recurselevel
+ \clip
+ [\c!nx=\@@ipn,\c!ny=\@@ipn,\c!x=\xslice,\c!y=\yslice]
+ {\schaal
+ [\c!schaal=\@@ipn000]
+ {\externalfigure[#1][\c!pagina=\slicedpagenumber]}}
+ \pagina}}
+ \else
+ \ifodd\slicedpagenumber\relax
+ \getparameters[\??ip][#2]
+ \else
+ \getparameters[\??ip][#3]
+ \fi
+ \hskip\@@ipoffset
+ \clip
+ [\c!hoffset=\@@iphoffset,\c!voffset=\@@ipvoffset,
+ \c!hoogte=\@@iphoogte,\c!breedte=\@@ipbreedte]
+ {\externalfigure[#1][\c!pagina=\slicedpagenumber]}
+ \pagina
+ \fi}
+ \egroup}
+
+% \starttext
+%
+% \slicepages[slice1.pdf][n=3]
%
-% \def\slicepages%
-% {\dodoubleempty\doslicepages}
-%
-% \def\doslicepages[#1][#2]%
-% {\bgroup
-% \getfiguredimensions[#1]
-% \getparameters[\??ip][\c!n=1,#2]
-% \definepapersize
-% [\s!dummy][\c!hoogte=\figureheight,\c!breedte=\figurewidth]
-% \setuppapersize
-% [\s!dummy][\s!dummy]
-% \setuplayout
-% [\c!rugwit=\!!zeropoint,\c!kopwit=\!!zeropoint,
-% \c!hoogte=\v!midden,\c!breedte=\v!midden,
-% \c!hoofd=\!!zeropoint,\c!voet=\!!zeropoint]
-% \dorecurse{\noffigurepages}
-% {\let\pslice=\recurselevel
-% \dorecurse{\@@ipn}
-% {\let\xslice\recurselevel
-% \dorecurse{\@@ipn}
-% {\let\yslice\recurselevel
-% \clip
-% [\c!nx=\@@ipn,\c!ny=\@@ipn,\c!x=\xslice,\c!y=\yslice]
-% {\schaal
-% [\c!schaal=\@@ipn000]
-% {\externalfigure[#1][\c!pagina=\pslice]}}
-% \pagina}}}
-% \egroup}
-%
-% \starttext
-%
-% \slicepages[slice1.pdf][n=3]
-%
-% \stoptext
+% \stoptext
+
+\protect \endinput
diff --git a/tex/context/base/page-ini.tex b/tex/context/base/page-ini.tex
index f6f59dd92..528102b18 100644
--- a/tex/context/base/page-ini.tex
+++ b/tex/context/base/page-ini.tex
@@ -24,8 +24,6 @@
\unprotect
-\def\m!otr{otr}
-
% message will be distributed
\startmessages dutch library: systems
@@ -343,6 +341,12 @@
11: spatierea -- nu este permisa in gridmode
\stopmessages
+\def\m!otr{otr}
+
+\chardef\normalpagebox=255
+
+\newbox\pagebox
+
\ifx\recalculatelayout\undefined
\let \recalculatelayout \relax
@@ -557,24 +561,6 @@
\def\@@OTR{OTR}
-% \beginETEX \ifcsname
-%
-% \let\ifcs \ifcsname
-% \let\endcs\endcsname
-%
-% \endETEX
-%
-% \beginTEX \ifcsname
-%
-% \def\ifcs#1\endcs{\@EA\ifx\csname#1\endcsname\relax\else}
-%
-% \endTEX
-%
-% \def\OTRcommand#1%
-% {\csname\@@OTR
-% \ifcs\@@OTR\OTRidentifier\strippedcsname#1\endcs\OTRidentifier\fi
-% \strippedcsname#1\endcsname}
-
\let\OTRdefault\empty
\beginETEX \ifcsname
@@ -584,7 +570,7 @@
\ifcsname\@@OTR\OTRidentifier\strippedcsname#1\endcsname
\OTRidentifier
\else\ifcsname\@@OTR\OTRdefault\strippedcsname#1\endcsname % fallback
- \OTRidentifier
+ \OTRdefault
\fi\fi
\strippedcsname#1\endcsname}
@@ -686,21 +672,16 @@
\unvbox\normalpagebox}
\newtoks\mainoutput
+\newif\ifinotr
-\mainoutput
- {\doifdefinedelse{\@@OTR\the\outputpenalty}
- {\getvalue{\@@OTR\the\outputpenalty}}
- {\the\OTRcommand\output}}
-
-%\mainoutput
-% {\advance\otrlevel 1
-% \ifnum\otrlevel>1 \writestatus{otr}{nested main output}\fi
-% \doifdefinedelse{\@@OTR\the\outputpenalty}
-% {\getvalue{\@@OTR\the\outputpenalty}}
-% {\the\OTRcommand\output}%
-% \advance\otrlevel -1 }
+\def\invokeoutputroutine
+ {\ifcsname\@@OTR\the\outputpenalty\endcsname
+ \csname\@@OTR\the\outputpenalty\endcsname
+ \else
+ \the\OTRcommand\output
+ \fi}
-\output{\the\mainoutput}
+\mainoutput{\invokeoutputroutine} \output{\inotrtrue\the\mainoutput}
%D In order to force consistent use of variables, we
%D predefine a lot of them here.
@@ -877,7 +858,7 @@
\def\afterfinaloutput%
{\forgetall
- \vskip\!!zeropoint\relax
+ \vskip\zeropoint\relax
\ifvoid\normalpagebox
\else
\unvbox\normalpagebox
@@ -896,7 +877,7 @@
{\beforefinaloutput
\the\everybeforeshipout
\ifspecialbasedsettings
- \myshipout{\hbox{\hbox to \!!zeropoint{\the\pageboundsettings}\hbox{\dopagebody#1#2\setpagecounters}}}%
+ \myshipout{\hbox{\hbox to \zeropoint{\the\pageboundsettings}\hbox{\dopagebody#1#2\setpagecounters}}}%
\else
\the\pageboundsettings
\myshipout{\hbox{\dopagebody#1#2\setpagecounters}}%
@@ -984,7 +965,7 @@
\def\doversie[#1]%
{\voorlopigfalse
\conceptfalse
- \overfullrule=\!!zeropoint
+ \overfullrule=\zeropoint
\processaction
[#1]
[\v!voorlopig=>\voorlopigtrue\overfullrule=5pt,
@@ -993,21 +974,42 @@
\def\versie%
{\dosingleargument\doversie}
-\def\addstatusinfo#1%
- {\ifvoorlopig \donetrue \fi
- \ifconcept \donetrue \fi
- \ifdone
- \setbox#1=\vbox to \papierhoogte
- {\vsmashbox#1\box#1
- \offinterlineskip
- \vskip\topspace
- \hsize\papierbreedte
- \hfill\hbox{\plaatstestinfo\hskip.5cm}\vss
- \settexthoffset\hskip\texthoffset
- \tlap{\plaatsversieaanduiding}
- \vskip.5cm}%
- \fi}
-
+%\def\addstatusinfo#1%
+% {\ifvoorlopig \donetrue \else
+% \ifconcept \donetrue \else
+% \donefalse \fi \fi
+% \ifdone
+% \setbox#1=\vbox to \papierhoogte
+% {\vsmashbox#1\box#1
+% \offinterlineskip
+% \vskip\kopwit
+% \hsize\papierbreedte
+% \hfill\hbox{\plaatstestinfo\hskip.5cm}\vss
+% \settexthoffset\hskip\texthoffset
+% \tlap{\plaatsversieaanduiding}
+% \vskip.5cm}%
+% \fi}
+
+\def\addstatusinfo
+ {\ifvoorlopig
+ \@EA\doaddstatusinfo
+ \else\ifconcept
+ \@EAEAEA\doaddstatusinfo
+ \else
+ \@EAEAEA\gobbleoneargument
+ \fi\fi}
+
+\def\doaddstatusinfo#1%
+ {\setbox#1=\vbox to \papierhoogte
+ {\vsmashbox#1\box#1
+ \offinterlineskip
+ \vskip\kopwit
+ \hsize\papierbreedte
+ \hfill\hbox{\plaatstestinfo\hskip.5cm}\vss
+ \settexthoffset\hskip\texthoffset
+ \tlap{\plaatsversieaanduiding}
+ \vskip.5cm}}
+
% this will be inserts some day
%\newinsert\referentieinfobox
@@ -1021,7 +1023,7 @@
\def\dotestinfo#1#2#3%
{\ifvoorlopig\ifinpagebody\else
\begingroup
- \convertargument#3\to\ascii
+ \@EA\convertargument#3\to\ascii
\xdef\extratestinfo%
{#2 \ascii}%
\gdef\totaltestinfo%
@@ -1043,14 +1045,9 @@
\fi
\fi\fi}
-\def\referentieinfo%
- {\dotestinfo\referentieinfobox}
-
-\def\registerinfo%
- {\dotestinfo\registerinfobox}
-
-\def\floatinfo%
- {\dotestinfo\floatinfobox}
+\def\referentieinfo{\dotestinfo\referentieinfobox}
+\def\registerinfo {\dotestinfo\registerinfobox}
+\def\floatinfo {\dotestinfo\floatinfobox}
\def\plaatstestinfo%
{\ifvoorlopig
@@ -1080,14 +1077,6 @@
\versie[\v!definitief]
-% Output routines
-%
-% \dopagecontents#1#2 : tekst, floats en footnotes
-% \dopagebody#1#2 : hoofd, \pagecontents, voet
-% \dooutput : outputroutine
-%
-% \ifinpagebody
-
% De volgende macro's worden gedefinieerd in de module
% colo-ini. Om resetten bij twee maal laden te voorkomen
% checken we wel even. Anders krijgen we een mark-build-up.
@@ -1155,7 +1144,7 @@
\hskip-\zetbreedte
\od
\box#1}%
- \dp#1=\!!zeropoint}
+ \dp#1=\zeropoint}
\newif\ifpagebodyornaments \pagebodyornamentstrue
\newif\ifarrangingpages \arrangingpagesfalse
@@ -1177,7 +1166,7 @@
\forgetall % igv problemen, check: \boxmaxdepth\maxdimen
\boxmaxdepth\maxdimen % new
\mindermeldingen
- \setbox0=\vbox
+ \setbox\pagebox=\vbox
{\offinterlineskip
\ifpagebodyornaments
% \getbackgroundbox
@@ -1190,35 +1179,35 @@
\fi
\getmainbox#1#2}% including footnotes
\ifpagebodyornaments
- \addmainbackground0%
- \addlogobackground0%
+ \addmainbackground\pagebox
+ \addlogobackground\pagebox
\fi
- \buildpagebox0%
- \addstatusinfo0% new
+ \buildpagebox\pagebox
+ \addstatusinfo\pagebox
\ifpagebodyornaments
- \addpagebackground0%
+ \addpagebackground\pagebox
\fi
\ifarrangingpages \else
- \addpagecutmarks0%
- \replicatepagebox0%
- \scalepagebox0%
- \mirrorpaperbox0%
- \rotatepaperbox0%
- \addpagecolormarks0%
- \centerpagebox0%
-\addprintbackground0%
- \mirrorprintbox0%
- \rotateprintbox0%
- \offsetprintbox0%
- \negateprintbox0%
+ \addpagecutmarks\pagebox
+ \replicatepagebox\pagebox
+ \scalepagebox\pagebox
+ \mirrorpaperbox\pagebox
+ \rotatepaperbox\pagebox
+ \addpagecolormarks\pagebox
+ \centerpagebox\pagebox
+ \addprintbackground\pagebox
+ \mirrorprintbox\pagebox
+ \rotateprintbox\pagebox
+ \offsetprintbox\pagebox
+ \negateprintbox\pagebox
\fi
- \box0%
+ \box\pagebox
\endrestorecatcodes}%
\ifsavepagebody\copy\savedpagebody\fi}
\def\finishpagebox#1%
{\ifarrangingpages
- \addpagecutmarks#1%
+ \addpagecutmarks#1%
\addpagecolormarks#1%
\centerpagebox#1%
\mirrorprintbox#1%
@@ -1227,14 +1216,12 @@
\negateprintbox#1%
\fi}
-\chardef\normalpagebox=255
-
-\appendtoks \restoreglobalbodyfont \to \everypagebody
-\appendtoks \restorecolumnsettings \to \everypagebody
+\appendtoks \restoreglobalbodyfont \to \everybeforepagebody
+\appendtoks \restorecolumnsettings \to \everybeforepagebody
\def\dopagebody#1#2%
- {\getallmarks
- \the\everypagebody
+ {%\getallmarks % now in following token register
+ \the\everybeforepagebody
\startcolorpage
\gotonextsubpage % nog eens: als in pagina (tbv standaard opmaak)
\dontshowboxes % dan hier blokkeren en verderop resetten
@@ -1249,7 +1236,8 @@
\resetpagina
\updatelistreferences
\resetlayoutlines % will go to \aftereverypage
- \stopcolorpage}
+ \stopcolorpage
+ \the\everyafterpagebody}
\newtoks\pageboundsettings
@@ -1282,9 +1270,17 @@
\let\resetcurrentsectionmarks=\relax
-% was: \resetsectionmarks[\firstsection], zie \handelpaginaaf
+% was: \resetsectionmarks\firstsection, zie \handelpaginaaf
-\def\docomplexpagina[#1]%
+\def\complexpagina[#1]%
+ {\edef\!!stringa{#1}%
+ \ifx\!!stringa\empty
+ % do nothing and avoid processing, see head's
+ \else
+ \@EA\docomplexpagina\@EA[\!!stringa]
+ \fi}
+
+\def\docomplexpagina[#1]% % will be installable
{\flushfootnotes
\bgroup
\processallactionsinset
@@ -1372,13 +1368,15 @@
%\fi
\od
\filluparrangedpages},
- \s!unknown=>\doifinstringelse{+}{#1}
+% \s!default=>,% do nothing if empty
+ \s!unknown=>\let\@@pagespecification\commalistelement
+ \doifinstringelse{+}\@@pagespecification
{\ejectinsert\ejectpage
- \dorecurse{#1}{\ejectdummypage}}
- {\doifnumberelse{#1}
+ \dorecurse\@@pagespecification\ejectdummypage}
+ {\doifnumberelse\@@pagespecification
{\ejectinsert\ejectpage
\doloop
- {\ifnum\userpageno<#1\relax
+ {\ifnum\userpageno<\@@pagespecification\relax
\ejectdummypage
\else
\exitloop
@@ -1386,11 +1384,7 @@
{}}]%
\egroup}
-\def\complexpagina[#1]%
- {\expanded{\docomplexpagina[#1]}}
-
-\def\simplepagina%
-% {\docomplexpagina[\v!ja]}
+\def\simplepagina
{\flushfootnotes
\ifpaginageblokkeerd\else
\ejectinsert
@@ -1415,55 +1409,57 @@
% \setuphead[chapter][before={\pagetype[chapter]}]
% \chapter{First} \page test \chapter{second} \page test
-\newif\ifgeselecteerd
-\geselecteerdtrue
-
-\newif\ifselecteren
-\selecterenfalse
-
-\newif\ifverwerken
-\verwerkentrue
+\newif\ifgeselecteerd \geselecteerdtrue
+\newif\ifselecteren \selecterenfalse
+\newif\ifverwerken \verwerkentrue
-\def\selectie{}
-\def\paginasoort{}
+\let\selectie \empty
+\let\paginasoort\empty
+\let\naastpagina\relax
+\let\napagina \relax
+\let\voorpagina \relax
-\let\naastpagina=\relax
-\let\napagina=\relax
-\let\voorpagina=\relax
+\def\dodovoorpagina#1%
+ {\global\let\voorpagina\relax
+ \getvalue{\??pg#1\c!voor}}
\def\dovoorpagina%
{\doifsomething{\paginasoort}
- {\def\dododopagina##1%
- {\global\let\voorpagina=\relax
- \getvalue{\??pg##1\c!voor}}%
- \processcommacommand[\paginasoort]\dododopagina}}
+ {\processcommacommand[\paginasoort]\dodovoorpagina}}
\def\dododonapagina#1%
- {\global\let\napagina=\relax
- \gdef\paginasoort{}%
+ {\global\let\napagina\relax
+ \global\let\paginasoort\empty
\getvalue{\??pg#1\c!na}}
+\def\dodonapagina#1%
+ {\doifelsevalue{\??pg#1\c!optie}{\v!dubbelzijdig}
+ {\doifbothsidesoverruled
+ \dododonapagina{#1}%
+ \orsideone
+ \dododonapagina{#1}%
+ \orsidetwo
+ \od}
+ {\dododonapagina{#1}}}
+
\def\donapagina%
{\doifsomething{\paginasoort}
- {\def\dodopagina##1%
- {\doifelsevalue{\??pg##1\c!optie}{\v!dubbelzijdig}
- {\doifbothsidesoverruled
- \dododonapagina{##1}%
- \orsideone
- \dododonapagina{##1}%
- \orsidetwo
- \od}%
- {\dododonapagina{##1}}}%
- \processcommacommand[\paginasoort]\dodopagina}}
+ {\processcommacommand[\paginasoort]\dodonapagina}}
+
+% Dit wordt eigenlijk nooit en moet worden vervangen door
+% het meer algemene mechanisme.
\def\dosoortpagina[#1]%
- {\doglobal\addtocommalist{#1}\paginasoort
- \ifselecteren
- \ExpandBothAfter\doifcommon{#1}{\selectie}
- {\global\geselecteerdtrue}%
- \fi
- \gdef\voorpagina{\dovoorpagina}%
- \gdef\napagina{\donapagina}}
+ {\edef\desoortpagina{#1}%
+ \ifx\desoortpagina\empty \else
+ \@EA\doglobal\@EA\addtocommalist\@EA{\desoortpagina}\paginasoort
+ \ifselecteren
+ \fullexpandtwoargsafter\doifcommon{\desoortpagina}{\selectie}
+ {\global\geselecteerdtrue}%
+ \fi
+ \gdef\voorpagina{\dovoorpagina}%
+ \gdef\napagina {\donapagina }%
+ \fi}
\def\soortpagina%
{\dosingleargument\dosoortpagina}
diff --git a/tex/context/base/page-lay.tex b/tex/context/base/page-lay.tex
index 25360af97..dd8b46690 100644
--- a/tex/context/base/page-lay.tex
+++ b/tex/context/base/page-lay.tex
@@ -15,6 +15,9 @@
% 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
@@ -211,12 +214,17 @@
\global\rechtermargeafstand\layoutdistance\rechtermargebreedte\c!rechtermargeafstand
\global\bovenafstand\layoutdistance\bovenhoogte\c!bovenafstand
\global\hoofdafstand\layoutdistance\hoofdhoogte\c!hoofdafstand
- \global\global\voetafstand \layoutdistance\voethoogte \c!voetafstand
+ \global\voetafstand \layoutdistance\voethoogte \c!voetafstand
\global\onderafstand\layoutdistance\onderhoogte\c!onderafstand}
+ \def\setlayoutdistances% local in \setreducedvsize
+ {\hoofdafstand\layoutdistance\hoofdhoogte\c!hoofdafstand
+ \voetafstand \layoutdistance\voethoogte \c!voetafstand}
+
\else
\let\setlayoutdimensions\relax
+ \let\setlayoutdistance \relax
\fi
@@ -282,9 +290,11 @@
{\dodoubleempty\dosetuppapersize}
\def\dosetuppapersize[#1][#2]%
- {\doifinstringelse{=}{#1}
+% {\doifinstringelse{=}{#1}
+ {\doifassignmentelse{#1}
{\getparameters[\??pp][#1]}
- {\doifinstringelse{=}{#2}
+% {\doifinstringelse{=}{#2}
+ {\doifassignmentelse{#2}
{\getparameters[\??pp#1][#2]}
{\dodosetuppapersize[#1][#2]}}}
@@ -374,83 +384,89 @@
\processcommalist[#1]\docommando}
\def\recalculatelayout%
- {\global\linkermargebreedte =\layoutparameter\c!linkermarge
- \global\rechtermargebreedte=\layoutparameter\c!rechtermarge
- \global\linkerrandbreedte =\layoutparameter\c!linkerrand
- \global\rechterrandbreedte =\layoutparameter\c!rechterrand
- \global\hoofdhoogte =\layoutparameter\c!hoofd
- \global\voethoogte =\layoutparameter\c!voet
- \global\onderhoogte =\layoutparameter\c!onder
- \global\bovenhoogte =\layoutparameter\c!boven
- \global\rugwit =\layoutparameter\c!rugwit
- \global\kopwit =\layoutparameter\c!kopwit
+ {\global\linkermargebreedte \layoutparameter\c!linkermarge
+ \global\rechtermargebreedte\layoutparameter\c!rechtermarge
+ \global\linkerrandbreedte \layoutparameter\c!linkerrand
+ \global\rechterrandbreedte \layoutparameter\c!rechterrand
+ \global\hoofdhoogte \layoutparameter\c!hoofd
+ \global\voethoogte \layoutparameter\c!voet
+ \global\onderhoogte \layoutparameter\c!onder
+ \global\bovenhoogte \layoutparameter\c!boven
+ \global\rugwit \layoutparameter\c!rugwit
+ \global\kopwit \layoutparameter\c!kopwit
\setlayoutdimensions % the rest of the `dimensions'
- \doifelse{\@@lygrid}{\v!ja}
- {\gridsnappingtrue}
- {\gridsnappingfalse}%
+ \doifelse\@@lygrid\v!ja\gridsnappingtrue\gridsnappingfalse
\ifgridsnapping
- \widowpenalty=0 % is gewoon beter
- \clubpenalty =0 % zeker bij grids
+ \widowpenalty\zerocount % is gewoon beter
+ \clubpenalty \zerocount % zeker bij grids
\else
- \widowpenalty=\defaultwidowpenalty
- \clubpenalty =\defaultclubpenalty
+ \widowpenalty\defaultwidowpenalty
+ \clubpenalty \defaultclubpenalty
\fi
- \stelwitruimtein
- \stelblankoin
- \doifelse{\layoutparameter\c!breedte}{\v!midden}
- {\global\zetbreedte=\papierbreedte
- \global\advance\zetbreedte by -\rugwit
- \scratchdimen=\layoutparameter\c!snijwit\relax
- \ifdim\scratchdimen=\zeropoint
- \scratchdimen=\rugwit
- \fi
- \global\advance\zetbreedte by -\scratchdimen}
- {\doifelse{\layoutparameter\c!breedte}{\v!passend}
- {\global\zetbreedte=\papierbreedte
- \global\advance\zetbreedte by -\rugwit
- \scratchdimen=\rugwit
- \advance\scratchdimen by -\linkerrandbreedte
- \advance\scratchdimen by -\linkerrandafstand
- \advance\scratchdimen by -\linkermargebreedte
- \advance\scratchdimen by -\linkermargeafstand
+ \simplestelwitruimtein
+ \simplestelblankoin
+ \scratchdimen\layoutparameter\c!snijwit\relax
+ \ifdim\scratchdimen=\zeropoint
+ \scratchdimen\rugwit
+ \fi
+ \doifelse{\layoutparameter\c!breedte}\v!midden
+ {\global\zetbreedte\papierbreedte
+ \global\advance\zetbreedte -\rugwit
+ %\scratchdimen\layoutparameter\c!snijwit\relax
+ %\ifdim\scratchdimen=\zeropoint
+ % \scratchdimen\rugwit
+ %\fi
+ \global\advance\zetbreedte -\scratchdimen}
+ {\doifelse{\layoutparameter\c!breedte}\v!passend
+ {\global\zetbreedte\papierbreedte
+ %\global\advance\zetbreedte -\rugwit
+ \global\advance\zetbreedte -\scratchdimen
+ %
+ \scratchdimen\rugwit
+ \advance\scratchdimen -\linkerrandbreedte
+ \advance\scratchdimen -\linkerrandafstand
+ \advance\scratchdimen -\linkermargebreedte
+ \advance\scratchdimen -\linkermargeafstand
\ifdim\scratchdimen<\zeropoint
- \scratchdimen=\zeropoint
- \fi
- \global\advance\zetbreedte by -\rechtermargeafstand
- \global\advance\zetbreedte by -\rechtermargebreedte
- \global\advance\zetbreedte by -\rechterrandafstand
- \global\advance\zetbreedte by -\rechterrandbreedte
- \global\advance\zetbreedte by -\scratchdimen}
- {\global\zetbreedte=\layoutparameter\c!breedte}}%
- \doifelse{\layoutparameter\c!regels}{}
- {\doifelse{\layoutparameter\c!hoogte}{\v!midden}
- {\global\zethoogte=\papierhoogte
- \global\advance\zethoogte by -\kopwit
- \scratchdimen=\layoutparameter\c!bodemwit\relax
- \ifdim\scratchdimen=\zeropoint
- \scratchdimen=\kopwit
+ \scratchdimen\zeropoint
\fi
- \global\advance\zethoogte by -\scratchdimen}
- {\doifelse{\layoutparameter\c!hoogte}{\v!passend}
- {\global\zethoogte=\papierhoogte
- \global\advance\zethoogte by -\kopwit
- \scratchdimen=\kopwit
- \advance\scratchdimen by -\bovenhoogte
- \advance\scratchdimen by -\bovenafstand
+ \global\advance\zetbreedte -\rechtermargeafstand
+ \global\advance\zetbreedte -\rechtermargebreedte
+ \global\advance\zetbreedte -\rechterrandafstand
+ \global\advance\zetbreedte -\rechterrandbreedte
+ \global\advance\zetbreedte -\scratchdimen}
+ {\global\zetbreedte\layoutparameter\c!breedte}}%
+ \scratchdimen\layoutparameter\c!bodemwit\relax
+ \ifdim\scratchdimen=\zeropoint
+ \scratchdimen\kopwit
+ \fi
+ \doifelse{\layoutparameter\c!regels}\empty
+ {\doifelse{\layoutparameter\c!hoogte}\v!midden
+ {\global\zethoogte\papierhoogte
+ \global\advance\zethoogte -\kopwit
+ \global\advance\zethoogte -\scratchdimen}
+ {\doifelse{\layoutparameter\c!hoogte}\v!passend
+ {\global\zethoogte\papierhoogte
+ %\global\advance\zethoogte -\kopwit
+ \global\advance\zethoogte -\scratchdimen
+ %
+ \scratchdimen\kopwit
+ \advance\scratchdimen -\bovenhoogte
+ \advance\scratchdimen -\bovenafstand
\ifdim\scratchdimen<\zeropoint
- \scratchdimen=\zeropoint
+ \scratchdimen\zeropoint
\fi
- \global\advance\zethoogte by -\onderafstand
- \global\advance\zethoogte by -\onderhoogte
- \global\advance\zethoogte by -\scratchdimen}
- {\global\zethoogte=\layoutparameter\c!hoogte}}}
- {\global\zethoogte=\layoutparameter\c!regels\lineheight
- \global\advance\zethoogte by \hoofdhoogte
- \global\advance\zethoogte by \voethoogte}%
- \rugoffset=\layoutparameter\c!rugoffset
- \kopoffset=\layoutparameter\c!kopoffset
-\global\setdimentoatleast\zetbreedte\!!onepoint
-\global\setdimentoatleast\zethoogte\!!onepoint
+ \global\advance\zethoogte -\onderafstand
+ \global\advance\zethoogte -\onderhoogte
+ \global\advance\zethoogte -\scratchdimen}
+ {\global\zethoogte\layoutparameter\c!hoogte}}}
+ {\global\zethoogte\layoutparameter\c!regels\lineheight
+ \global\advance\zethoogte \hoofdhoogte
+ \global\advance\zethoogte \voethoogte}%
+ \rugoffset\layoutparameter\c!rugoffset
+ \kopoffset\layoutparameter\c!kopoffset
+ \global\setdimentoatleast\zetbreedte\!!onepoint
+ \global\setdimentoatleast\zethoogte\!!onepoint
\calculatehsizes
\calculatevsizes
\recalculatelogos
@@ -463,11 +479,30 @@
\appendtoks \checklayout \to \everystarttext
\def\checkcurrentlayout%
- {\doifundefinedelse{\??ly\number\realfolio\c!status}
- {\doifonevenpaginaelse
- {\doifdefined{\??ly\v!oneven\c!status}{\stellayoutin[\v!oneven]}}
- {\doifdefined{\??ly\v!even \c!status}{\stellayoutin[\v!even ]}}}
- {\stellayoutin[\number\realfolio]}}
+ {\ifundefined{\??ly\number\realfolio\c!status}%
+ \doifonevenpaginaelse\checkcurrentoddlayout\checkcurrentevenlayout
+ \else
+ \stellayoutin[\number\realfolio]%
+ \fi}
+
+\def\checkcurrentoddlayout
+ {\ifundefined{\??ly\v!oneven\c!status}\else\stellayoutin[\v!oneven]\fi}
+
+\def\checkcurrentevenlayout
+ {\ifundefined{\??ly\v!even \c!status}\else\stellayoutin[\v!even ]\fi}
+% not much faster at all
+%
+% \beginETEX
+%
+% \def\checkcurrentlayout%
+% {\ifcsname\??ly\number\realfolio\c!status\endcsname
+% \stellayoutin[\number\realfolio]%
+% \else\doifonevenpaginaelse
+% {\ifcsname\??ly\v!oneven\c!status\endcsname\stellayoutin[\v!oneven]\fi}
+% {\ifcsname\??ly\v!even \c!status\endcsname\stellayoutin[\v!even ]\fi}%
+% \fi}
+%
+% \endETEX
\appendtoks \checkcurrentlayout \to \everyaftershipout
@@ -508,7 +543,7 @@
\recalculatelayout
\presetcenterpagebox}
-\def\stellayoutin%
+\def\stellayoutin
{\dodoubleempty\dostellayoutin}
\let\@@zahoogte=\!!zeropoint
@@ -516,14 +551,14 @@
\def\dopushpagedimensions%
{\xdef\oldteksthoogte{\the\teksthoogte}%
\xdef\oldvoethoogte{\the\voethoogte}%
- \global\let\@@zahoogte=\@@zahoogte}
+ \global\let\@@zahoogte\@@zahoogte}
\def\dopoppagedimensions%
- {\global\teksthoogte=\oldteksthoogte
- \global\voethoogte=\oldvoethoogte
+ {\global\teksthoogte\oldteksthoogte
+ \global\voethoogte\oldvoethoogte
\recalculatelayout
- \global\let\pushpagedimensions=\dopushpagedimensions
- \global\let\poppagedimensions=\relax}
+ \global\let\pushpagedimensions\dopushpagedimensions
+ \global\let\poppagedimensions\relax}
\let\poppagedimensions = \relax
\let\pushpagedimensions = \dopushpagedimensions
@@ -535,20 +570,21 @@
\let\adaptedpages\empty
-\def\adaptpagedimensions%
- {\rawdoifinsetelse{\realfolio}{\adaptedpages}
- {\getvalue{\??za\realfolio}%
- \letbeundefined{\??za\realfolio}}
- {}}
+\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
- \spatie\@@zahoogte\spatie-
+ {\ifx\poppagedimensions\relax \else
+ \spatie\@@zahoogte\space-\space
\fi
\realfolio}
@@ -563,16 +599,16 @@
{\balancedimensions{\teksthoogte}{\voethoogte}{\voethoogte}}
{\balancedimensions{\teksthoogte}{\voethoogte}{\@@zahoogte}}%
\ifdim\voethoogte<\zeropoint
- \global\advance\teksthoogte by \voethoogte
- \global\voethoogte=\zeropoint
+ \global\advance\teksthoogte \voethoogte
+ \global\voethoogte\zeropoint
\global\xdef\@@zahoogte{\layoutparameter\c!voet\spatie(\v!max)}%
\fi
\setvsize
- \global\pagegoal=\vsize % nog corrigeren voor insertions ?
+ \global\pagegoal\vsize % nog corrigeren voor insertions ?
\recalculatelogos
\recalculatebackgrounds
- \global\let\pushpagedimensions=\relax
- \global\let\poppagedimensions=\dopoppagedimensions}
+ \global\let\pushpagedimensions\relax
+ \global\let\poppagedimensions\dopoppagedimensions}
\def\dopaslayoutaan[#1][#2]%
{\doifelsenothing{#2}
@@ -660,8 +696,8 @@
\setbox#1=\vbox
{%\forgetall
\offinterlineskip
- \dorecurse{\@@lyny}
- {\hbox{\dorecurse{\@@lynx}{\copy#1\hskip\@@lydx}\unskip}%
+ \dorecurse\@@lyny
+ {\hbox{\dorecurse\@@lynx{\copy#1\hskip\@@lydx}\unskip}%
\vskip\@@lydy}
\unskip}%
\fi}
@@ -709,13 +745,13 @@
{\the\realpageno}%
\def\addpagecutmarks#1%
- {\doif{\@@lymarkering}{\v!aan}
- {\let\cutmarksymbol=\pagecutmarksymbol
+ {\doif\@@lymarkering\v!aan
+ {\let\cutmarksymbol\pagecutmarksymbol
\makecutbox{#1}}}
\def\addpagecolormarks#1%
- {\doif{\@@lymarkering}{\v!kleur}
- {\let\cutmarksymbol=\pagecutmarksymbol
+ {\doif\@@lymarkering\v!kleur
+ {\let\cutmarksymbol\pagecutmarksymbol
\makecutbox{#1}%
\ifnum\horizontalcutmarks>1 \chardef\colormarkoffset=4 \fi
\ifnum\verticalcutmarks >1 \chardef\colormarkoffset=4 \fi
@@ -724,40 +760,52 @@
\newif\ifdubbelzijdig \dubbelzijdigfalse
\newif\ifenkelzijdig \enkelzijdigtrue
-\def\doifsometextlineelse#1#2#3% ! omgekeerd !
- {\doifinsetelse{\getvalue{\??tk#1\v!tekst\c!status}}{\v!geen,\v!hoog}
- {#3}{#2}}
+%\def\doifsometextlineelse#1#2#3% ! omgekeerd !
+% {\doifinsetelse{\getvalue{\??tk#1\v!tekst\c!status}}{\v!geen,\v!hoog}
+% {#3}{#2}}
+
+\def\doifsometextlineelse#1%
+ {\edef\!!stringa{\csname\??tk#1\v!tekst\c!status\endcsname}%
+ \ifx\!!stringa\v!geen
+ \@EA\secondoftwoarguments
+ \else\ifx\!!stringa\v!hoog
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi\fi}
% NOG EENS NAGAAN WANNEER NU GLOBAL EN WANNEER NIET
\def\calculatevsizes% global needed in \recalculatelayoutregel
- {\redoglobal\teksthoogte=\zethoogte
+ {\redoglobal\teksthoogte\zethoogte
\doifsometextlineelse \v!hoofd
- {\redoglobal\advance\teksthoogte by -\hoofdhoogte
- \redoglobal\advance\teksthoogte by -\hoofdafstand}
+ {\redoglobal\advance\teksthoogte -\hoofdhoogte
+ \redoglobal\advance\teksthoogte -\hoofdafstand}
\donothing
\doifsometextlineelse \v!voet
- {\redoglobal\advance\teksthoogte by -\voethoogte
- \redoglobal\advance\teksthoogte by -\voetafstand}
+ {\redoglobal\advance\teksthoogte -\voethoogte
+ \redoglobal\advance\teksthoogte -\voetafstand}
\donothing
\resetglobal
\setvsize}
\def\calculatereducedvsizes%
- {\teksthoogte=\zethoogte
+ {\teksthoogte\zethoogte
\doifsometextlineelse \v!hoofd
- {\advance\teksthoogte by -\hoofdhoogte
- \advance\teksthoogte by -\hoofdafstand}
- {\hoofdhoogte=\zeropoint}%
+ {\advance\teksthoogte -\hoofdhoogte
+ \advance\teksthoogte -\hoofdafstand}
+ {\hoofdhoogte\zeropoint
+ \setlayoutdistances}%
\doifsometextlineelse \v!voet
- {\advance\teksthoogte by -\voethoogte
- \advance\teksthoogte by -\voetafstand}
- {\voethoogte=\zeropoint}}
+ {\advance\teksthoogte -\voethoogte
+ \advance\teksthoogte -\voetafstand}
+ {\voethoogte\zeropoint
+ \setlayoutdistances}}
\def\freezetextwidth% % \zetbreedte may be set to \tekstbreedte
- {\tekstbreedte=\zetbreedte % which is a tricky but valid value
+ {\tekstbreedte\zetbreedte % which is a tricky but valid value
\doifsomething{\layoutparameter\c!tekstbreedte}
- {\tekstbreedte=\layoutparaneter\c!tekstbreedte}}
+ {\tekstbreedte\layoutparaneter\c!tekstbreedte}}
\def\calculatehsizes%
{\freezetextwidth
@@ -775,11 +823,26 @@
\newif\ifshiftedrealpageno
-\def\doifonevenpaginaelse#1#2%
+% \def\doifonevenpaginaelse#1#2%
+% {\ifshiftedrealpageno
+% \ifodd\realpageno#2\else#1\fi
+% \else
+% \ifodd\realpageno#1\else#2\fi
+% \fi}
+
+\def\doifonevenpaginaelse
{\ifshiftedrealpageno
- \ifodd\realpageno#2\else#1\fi
+ \ifodd\realpageno
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi
\else
- \ifodd\realpageno#1\else#2\fi
+ \ifodd\realpageno
+ \@EAEAEA\firstoftwoarguments
+ \else
+ \@EAEAEA\secondoftwoarguments
+ \fi
\fi}
\def\doifbothsidesoverruled#1\orsideone#2\orsidetwo#3\od%
@@ -813,19 +876,6 @@
\advance\texthoffset-\zetbreedte
\od}
-\def\initializepaper%
- {\iflocation
- \dosetuppaper
- {\papersize}
- {\the\papierbreedte}
- {\the\papierhoogte}%
- \else
- \dosetuppaper
- {\printpapersize}
- {\the\printpapierbreedte}
- {\the\printpapierhoogte}%
- \fi}
-
\def\goleftonpage%
{\hskip-\linkermargeafstand
\hskip-\linkermargebreedte
@@ -835,7 +885,7 @@
\iffixedlayoutdimensions
\def\doswapmargins%
- {\let\doswapmargins=\relax % to prevent local swapping
+ {\let\doswapmargins\relax % to prevent local swapping
\swapdimens\linkermargeafstand\rechtermargeafstand
\swapdimens\linkerrandafstand \rechterrandafstand
\swapdimens\linkermargebreedte\rechtermargebreedte
@@ -850,7 +900,7 @@
\letvalue{\??ly\currentlayout#2}\!!stringa}
\def\doswapmargins%
- {\let\doswapmargins=\relax % to prevent local swapping
+ {\let\doswapmargins\relax % to prevent local swapping
\dodoswapmargins\c!linkermargeafstand\c!rechtermargeafstand
\dodoswapmargins\c!linkerrandafstand \c!rechterrandafstand
\swapdimens\linkermargebreedte\rechtermargebreedte
@@ -862,7 +912,7 @@
{\doifbothsides#1\orsideone#1\orsidetwo#2\od}
\def\swapmargins%
- {\doifmarginswapelse{}{\doswapmargins}}
+ {\doifmarginswapelse\relax\doswapmargins}
%D \macros
%D {showprint, showframe, showlayout, showsetups}
@@ -990,27 +1040,34 @@
%D \CDROM\ covers, but it does not hurt to have the paper size
%D ready.
-\definepapersize [CD] [\c!breedte=120mm, \c!hoogte=120mm]
+\definepapersize [CD] [\c!breedte=120mm,\c!hoogte=120mm]
%D The next series is for our English speaking friends who
-%D decided to stick to non metric values.
+%D decided to stick to non metric values. Thanks to Nelson
+%D Beebe for completing the inch based list.
+
+\definepapersize [letter] [\c!breedte=8.5in,\c!hoogte=11in]
+\definepapersize [ledger] [\c!breedte=11in,\c!hoogte=17in]
+\definepapersize [tabloid] [\c!breedte=17in,\c!hoogte=11in]
+
+\definepapersize [legal] [\c!breedte=8.5in,\c!hoogte=14in]
+\definepapersize [folio] [\c!breedte=8.5in,\c!hoogte=13in]
+\definepapersize [executive] [\c!breedte=7.25in,\c!hoogte=10.5in]
-\definepapersize [letter] [\c!breedte=8.5in, \c!hoogte=11in]
-\definepapersize [2*letter] [\c!breedte=11in, \c!hoogte=17in]
-\definepapersize [legal] [\c!breedte=8.5in, \c!hoogte=14in]
-\definepapersize [folio] [\c!breedte=8.5in, \c!hoogte=13in]
-\definepapersize [executive] [\c!breedte=7.25in, \c!hoogte=10.5in]
+\definepapersize [A] [\c!breedte=8.5in,\c!hoogte=11in] % 1 sheet
+\definepapersize [B] [\c!breedte=11in,\c!hoogte=17in] % 2 sheets
+\definepapersize [C] [\c!breedte=17in,\c!hoogte=22in] % 4 sheets
-%D This set is for Tobias Burnus, who gave me the sizes.
+%D The next set is for Tobias Burnus, who gave me the sizes.
-\definepapersize [envelope 9] [\c!breedte=8.88in, \c!hoogte=3.88in]
-\definepapersize [envelope 10] [\c!breedte=9.5in, \c!hoogte=4.13in]
+\definepapersize [envelope 9] [\c!breedte=8.88in,\c!hoogte=3.88in]
+\definepapersize [envelope 10] [\c!breedte=9.5in,\c!hoogte=4.13in]
\definepapersize [envelope 11] [\c!breedte=10.38in,\c!hoogte=4.5in]
-\definepapersize [envelope 12] [\c!breedte=11.0in, \c!hoogte=4.75in]
-\definepapersize [envelope 14] [\c!breedte=11.5in, \c!hoogte=5.0in]
-\definepapersize [monarch] [\c!breedte=7.5in, \c!hoogte=3.88in]
-\definepapersize [check] [\c!breedte=8.58in, \c!hoogte=3.88in]
-\definepapersize [DL] [\c!breedte=220mm, \c!hoogte=110mm]
+\definepapersize [envelope 12] [\c!breedte=11.0in,\c!hoogte=4.75in]
+\definepapersize [envelope 14] [\c!breedte=11.5in,\c!hoogte=5.0in]
+\definepapersize [monarch] [\c!breedte=7.5in,\c!hoogte=3.88in]
+\definepapersize [check] [\c!breedte=8.58in,\c!hoogte=3.88in]
+\definepapersize [DL] [\c!breedte=220mm,\c!hoogte=110mm]
%D We can now default to a reasonable size. We match the print
%D paper size with the typeset paper size. This setting should
diff --git a/tex/context/base/page-lin.tex b/tex/context/base/page-lin.tex
index d9c624815..91b2d0863 100644
--- a/tex/context/base/page-lin.tex
+++ b/tex/context/base/page-lin.tex
@@ -50,6 +50,7 @@
\global\let\afterfirstobeyedline\relax}}%
\def\obeyedline%
{\par
+\let\checkindentation=\relax % else problems with odd/even
\afterfirstobeyedline
\ifdim\lastskip>\zeropoint
\gdef\@@rglinesteptoggle{0}%
@@ -164,7 +165,7 @@
{\regelreferentie1[#1]\ignorespaces}
\def\stopregel[#1]%
- {\unskip\regelreferentie2[#1]}
+ {\removelastspace\regelreferentie2[#1]}
% \def\inregellabel#1%
% {\doifinstringelse{--}{#1}
@@ -313,7 +314,7 @@
{\ifhmode\unskip\else\strut\fi\ifcase\raggedstatus\hfil\fi\break}
\def\opeenregel%
- {\def\crlf{\ifhmode\unskip\fi\space}\let\\\crlf}
+ {\def\crlf{\removelastspace\space}\let\\\crlf}
\newcount\internalparagraphnumber
diff --git a/tex/context/base/page-log.tex b/tex/context/base/page-log.tex
index 15e7f3125..66feb39f5 100644
--- a/tex/context/base/page-log.tex
+++ b/tex/context/base/page-log.tex
@@ -94,17 +94,17 @@
% no logos to take care of
\or % 1
\ifnewlogos
- \chardef\logostatus=2
+ \chardef\logostatus2
\setlogoboxes
- \chardef\logostatus=1
+ \chardef\logostatus1
\global\newlogosfalse
\fi
\or % 2
\setlogoboxes
- \chardef\logostatus=1
+ \chardef\logostatus1
\or % 3
\setlogoboxes
- \global\chardef\logostatus=2
+ \global\chardef\logostatus2
\fi
\setbox#1=\vbox
{\offinterlineskip
diff --git a/tex/context/base/page-lyr.tex b/tex/context/base/page-lyr.tex
index 7bc27b31f..a9bc11ac7 100644
--- a/tex/context/base/page-lyr.tex
+++ b/tex/context/base/page-lyr.tex
@@ -15,12 +15,16 @@
\unprotect
+% When being backgrounds layers get the background offset
+% displacement. Should be an option, on by default
+% (compatibility).
+
%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 third (optional) argument: the specific layer it
+%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.
@@ -29,12 +33,13 @@
\def\defineoverlay%
{\dotripleempty\dodefineoverlay}
-\def\dodefineoverlay[#1][#2][#3]%
+\def\dodefineoverlay[#1][#2][#3]% overlay [layer] content
{\ifthirdargument
+ \writestatus{BEWARE}{This (overlay definition) has changed!}% temp
\def\docommando##1%
{\setvalue{\??ov##1}####1####2####3####4####5####6####7%
- {\setlayer[#3]{\executedefinedoverlay
- ##1\\#2\\{####1}{####2}{####3}{####4}{####5}{####6}{####7}}}}%
+ {\setlayer[#2]{\executedefinedoverlay
+ ##1\\#3\\{####1}{####2}{####3}{####4}{####5}{####6}{####7}}}}%
\else
\def\docommando##1%
{\setvalue{\??ov##1}{\executedefinedoverlay
@@ -75,8 +80,10 @@
[\c!status=\v!start,\c!richting=\v!normaal,\c!optie=,
\c!x=\!!zeropoint,\c!y=\!!zeropoint,\c!positie=\v!nee,
\c!breedte=\wd\nextbox,\c!hoogte=\ht\nextbox,
+ \c!offset=\!!zeropoint,
\c!hoffset=\!!zeropoint,\c!voffset=\!!zeropoint,
- \c!plaats=rb,\c!positie=\v!nee,\c!pagina=,#2]}
+ \c!plaats=rb,\c!positie=\v!nee,\c!pagina=,
+ \c!sx=1,\c!sy=1,\c!hoek=,#2]}
%D \macros
%D {setuplayer}
@@ -116,7 +123,8 @@
\doglobal\increment\currentlayerdata
\forgetall
\dontcomplain
- \doifvalue{\??ll#1\c!optie}{\v!test}{\tracelayerstrue}%
+ \doifvalue{\??ll#1\c!optie}{\v!test}
+ {\traceboxplacementtrue\tracelayerstrue}%
\dowithnextbox % sneller als aparte macro
{\ifundefined{\@@layerbox#1}%
\writestatus{layer}{unknown layer #1}%
@@ -128,28 +136,102 @@
\newbox\layerbox
-\def\dododosetlayer[#1][#2]%
+% \def\dododosetlayer[#1][#2]%
+% {\getparameters[\??ll#1][#2]%
+% \doifvalue{\??ll#1\c!positie}{\v!overlay}
+% {\getparameters[\??ll#1]
+% [\c!positie=\v!ja,
+% \c!breedte=\!!zeropoint,
+% \c!hoogte=\!!zeropoint]}%
+% \doifelsevalue{\??ll#1\c!positie}{\v!ja}
+% {\edef\layerpage{\MPp{lyr:\currentlayerdata}}%
+% \scratchdimen\MPx{lyr:#1:\layerpage}\scratchdimen-\scratchdimen
+% \advance\scratchdimen\MPx{lyr:\currentlayerdata}%
+% \setevalue{\??ll#1\c!x}{\the\scratchdimen}%
+% \scratchdimen\MPy{lyr:#1:\layerpage}%
+% \advance\scratchdimen-\MPy{lyr:\currentlayerdata}%
+% \setevalue{\??ll#1\c!y}{\the\scratchdimen}%
+% \setxvalue{\??ll#1\layerpage\c!positie}{\v!ja}%
+% \setxvalue{\??ll#1\c!status}{\v!start}% needed ?
+% \setbox\layerbox\vbox to \getvalue{\??ll#1\c!hoogte} % \ht\nextbox
+% {\hbox to \getvalue{\??ll#1\c!breedte} % \wd\nextbox
+% {\xypos{lyr:\currentlayerdata}\hss}%
+% \vss}}
+% {\setbox\layerbox=\emptybox
+% \edef\layerpage{\getvalue{\??ll#1\c!pagina}}}%
+% \doifsomething{\layerpage}
+% {\edef\layerpage{:\layerpage}%
+% \doifundefined{\@@layerbox#1\layerpage}
+% {\global\expandafter\newbox\csname\@@layerbox#1\layerpage\endcsname}}%
+% \global\setbox\csname\@@layerbox#1\layerpage\endcsname=\vbox
+% {\offinterlineskip
+% \ifvoid\csname\@@layerbox#1\layerpage\endcsname\else
+% \ht\csname\@@layerbox#1\layerpage\endcsname\zeropoint
+% \dp\csname\@@layerbox#1\layerpage\endcsname\zeropoint
+% \wd\csname\@@layerbox#1\layerpage\endcsname\zeropoint
+% \doifnotvalue{\??ll#1\c!richting}{\v!omgekeerd}
+% {\box\csname\@@layerbox#1\layerpage\endcsname}%
+% \fi
+% \setbox\nextbox=\hbox
+% {\alignedbox[\getvalue{\??ll#1\c!plaats}]\vbox{\box\nextbox}}%
+% \smashbox\nextbox
+% \scratchdimen=\getvalue{\??ll#1\c!y}%
+% \advance\scratchdimen\getvalue{\??ll#1\c!voffset}%
+% \vskip\scratchdimen
+% \hskip\getvalue{\??ll#1\c!x}%
+% \hskip\getvalue{\??ll#1\c!hoffset}%
+% \box\nextbox % \hfill
+% \ifvoid\csname\@@layerbox#1\layerpage\endcsname
+% % already flushed
+% \else
+% % the reverse case
+% \vskip-\scratchdimen
+% \box\csname\@@layerbox#1\layerpage\endcsname
+% \fi}%
+% \ifvoid\layerbox\else\box\layerbox\fi}
+
+\newdimen\@@layerxsiz \newdimen\@@layerxoff \newdimen\@@layerxpos
+\newdimen\@@layerysiz \newdimen\@@layeryoff \newdimen\@@layerypos
+
+\def\dododosetlayer[#1][#2]% will be sped up
{\getparameters[\??ll#1][#2]%
- \doifvalue{\??ll#1\c!positie}{\v!overlay}
+ \doifvalue{\??ll#1\c!positie}\v!overlay % slow
{\getparameters[\??ll#1]
- [\c!positie=\v!ja,
- \c!breedte=\!!zeropoint,
- \c!hoogte=\!!zeropoint]}%
- \doifelsevalue{\??ll#1\c!positie}{\v!ja}
+ [\c!breedte=\!!zeropoint,
+ \c!hoogte=\!!zeropoint,
+ \c!positie=\v!ja]}%
+ \@@layerxsiz\getvalue{\??ll#1\c!breedte}%
+ \@@layerysiz\getvalue{\??ll#1\c!hoogte }%
+ \@@layerxpos\getvalue{\??ll#1\c!x}%
+ \@@layerypos\getvalue{\??ll#1\c!y}%
+ \@@layerxoff\getvalue{\??ll#1\c!hoffset}%
+ \@@layeryoff\getvalue{\??ll#1\c!voffset}%
+ \advance\@@layerxoff \getvalue{\??ll#1\c!offset}%
+ \advance\@@layeryoff \getvalue{\??ll#1\c!offset}%
+ \@@layerxpos\getvalue{\??ll#1\c!sx}\@@layerxpos
+ \@@layerypos\getvalue{\??ll#1\c!sy}\@@layerypos
+ \@@layerxoff\getvalue{\??ll#1\c!sx}\@@layerxoff
+ \@@layeryoff\getvalue{\??ll#1\c!sy}\@@layeryoff
+ \doifelsevalue{\??ll#1\c!positie}{\v!ja} % combine ^
{\edef\layerpage{\MPp{lyr:\currentlayerdata}}%
- \scratchdimen\MPx{lyr:#1:\layerpage}\scratchdimen-\scratchdimen
+ \scratchdimen\MPx{lyr:#1:\layerpage}%
+ \scratchdimen-\scratchdimen
\advance\scratchdimen\MPx{lyr:\currentlayerdata}%
- \setevalue{\??ll#1\c!x}{\the\scratchdimen}%
+ \@@layerxpos\scratchdimen
\scratchdimen\MPy{lyr:#1:\layerpage}%
\advance\scratchdimen-\MPy{lyr:\currentlayerdata}%
- \setevalue{\??ll#1\c!y}{\the\scratchdimen}%
+ \@@layerypos\scratchdimen
\setxvalue{\??ll#1\layerpage\c!positie}{\v!ja}%
\setxvalue{\??ll#1\c!status}{\v!start}% needed ?
- \setbox\layerbox\vbox to \getvalue{\??ll#1\c!hoogte} % \ht\nextbox
- {\hbox to \getvalue{\??ll#1\c!breedte} % \wd\nextbox
- {\xypos{lyr:\currentlayerdata}\hss}%
- \vss}}
+ \setbox\layerbox\vbox to \@@layerysiz
+ {\hbox to \@@layerxsiz{\xypos{lyr:\currentlayerdata}\hss}\vss}}
{\setbox\layerbox=\emptybox
+ \doifvalue{\??ll#1\c!hoek}{\v!onder}
+ {\ifdim\@@layerysiz>\zeropoint
+ \advance\@@layerypos-\@@layerysiz
+ \@@layerypos-\@@layerypos
+ \@@layeryoff-\@@layeryoff
+ \fi}%
\edef\layerpage{\getvalue{\??ll#1\c!pagina}}}%
\doifsomething{\layerpage}
{\edef\layerpage{:\layerpage}%
@@ -167,17 +249,17 @@
\setbox\nextbox=\hbox
{\alignedbox[\getvalue{\??ll#1\c!plaats}]\vbox{\box\nextbox}}%
\smashbox\nextbox
- \scratchdimen=\getvalue{\??ll#1\c!y}%
- \advance\scratchdimen\getvalue{\??ll#1\c!voffset}%
- \vskip\scratchdimen
- \hskip\getvalue{\??ll#1\c!x}%
- \hskip\getvalue{\??ll#1\c!hoffset}%
- \box\nextbox % \hfill
+ \vskip\@@layerypos
+ \vskip\@@layeryoff
+ \hskip\@@layerxpos
+ \hskip\@@layerxoff
+ \box\nextbox
\ifvoid\csname\@@layerbox#1\layerpage\endcsname
- % already flushed
- \else
- % the reverse case
- \vskip-\scratchdimen
+ % already flushed
+ \else
+ % the reverse case % check !
+ \vskip-\@@layerypos
+ \vskip-\@@layeryoff
\box\csname\@@layerbox#1\layerpage\endcsname
\fi}%
\ifvoid\layerbox\else\box\layerbox\fi}
@@ -207,7 +289,8 @@
{\ifundefined{\@@layerbox#3}%
\ifcase#1\else\writestatus{layer}{unknown layer #3}\fi
\else
- \doifvalue{\??ll#2\c!optie}{\v!test}\tracelayerstrue
+ \doifvalue{\??ll#2\c!optie}{\v!test}
+ {\traceboxplacementtrue\tracelayerstrue}%
\iftracelayers \ruledvbox \else \vbox \fi to \overlayheight
{\forgetall
\hbox to \overlaywidth
@@ -241,7 +324,7 @@
\def\doresetlayer#1%
{\ifundefined{\@@layerbox#1}\else
- \global\@EA\setbox\csname\@@layerbox#1\endcsname\emptybox
+ \global\setbox\csname\@@layerbox#1\endcsname\emptybox
\fi}
\def\resetlayer[#1]%
@@ -309,18 +392,18 @@
\def\startpositioning%
{\bgroup
- \xposition \!!zeropoint \yposition\!!zeropoint
- \xdimension\!!zeropoint \ydimension\!!zeropoint
- \xoffset \!!zeropoint \yoffset \!!zeropoint
+ \xposition \zeropoint \yposition \zeropoint
+ \xdimension\zeropoint \ydimension\zeropoint
+ \xoffset \zeropoint \yoffset \zeropoint
\hfuzz \papierbreedte \vfuzz \papierhoogte
\setbox\positionbox\hbox\bgroup}
\def\stoppositioning%
- {\doifnot{\@@psoffset}{\v!ja}
- {\global\xoffset=\!!zeropoint
- \global\yoffset=\!!zeropoint}%
- \global\advance\xdimension by \xoffset
- \global\advance\ydimension by \yoffset
+ {\doifnot\@@psoffset\v!ja
+ {\global\xoffset\zeropoint
+ \global\yoffset\zeropoint}%
+ \global\advance\xdimension \xoffset
+ \global\advance\ydimension \yoffset
\egroup
\vbox to \ydimension
{\vskip\yoffset
diff --git a/tex/context/base/page-mak.tex b/tex/context/base/page-mak.tex
index 239707ecb..7578020ef 100644
--- a/tex/context/base/page-mak.tex
+++ b/tex/context/base/page-mak.tex
@@ -56,6 +56,7 @@
\c!tekststatus=\v!normaal,
\c!hoofdstatus=\v!stop,
\c!voetstatus=\v!stop,
+ \c!paginastatus=\v!stop,
\c!kleur=,
#2]%
\setvalue{\e!start#1\e!opmaak}{\startmakeup[#1]}%
@@ -75,6 +76,10 @@
%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%
@@ -82,6 +87,7 @@
\def\dostartmakeup[#1][#2]%
{\bgroup
+ \the\everymakeup
\edef\currentmakeup{#1}%
\iffirstargument
\setupmakeup[\currentmakeup][#2]%
@@ -102,6 +108,7 @@
\def\donostopmakeup%
{\egroup
+ \flushmarks % new, here, else empty pages
\pagina
\egroup}
@@ -126,7 +133,8 @@
{\endgraf
\makeupparameter\c!onder
\egroup
-\stopregistercolor
+ \flushmarks % new, here, else empty pages
+ \stopregistercolor
\doflushmakeup
\egroup
\calculatehsizes
@@ -149,20 +157,26 @@
\fi}
\def\doshipoutmakeup%
- {\makeupparameter\c!voor
+ {\pushmacro\@@pnstatus % new
+ \makeupparameter\c!voor
\vbox{\hbox{\color[\makeupparameter\c!kleur]{\box\makeupbox}}}%
+ \stelpaginanummerin[\c!status=\makeupparameter\c!paginastatus]%
\setupmakeuplayout
\pagina
\makeupparameter\c!na
\ifdubbelzijdig \ifodd\realpageno\else
\processaction
[\makeupparameter\c!dubbelzijdig]
- [ \v!ja=>\null\pagina\verlaagpaginanummer,
+ [ \v!ja=>\null
+ \pagina,
+ % \verlaagpaginanummer, % new
\v!leeg=>\setupmakeuplayout
- \pagebodyornamentsfalse % hm, an old forgotten option
- \null\pagina\verlaagpaginanummer]%
+ \pagebodyornamentsfalse
+ \null\pagina]%
+ % \verlaagpaginanummer]% % new
\fi \fi
- \verlaagpaginanummer}
+ % \verlaagpaginanummer % new
+ \popmacro\@@pnstatus} % new
%D The text surrounding the main body text can be influenced
%D by setting their associated status variables. The
@@ -174,7 +188,7 @@
\setuptext [\c!status=\makeupparameter\c!tekststatus]%
\setupbottom[\c!status=\makeupparameter\c!onderstatus]%
\setuptop [\c!status=\makeupparameter\c!bovenstatus]}
-
+
%D The standard page template is defined as follows:
\definemakeup
diff --git a/tex/context/base/page-mar.tex b/tex/context/base/page-mar.tex
index 4a163ed23..6dbd27198 100644
--- a/tex/context/base/page-mar.tex
+++ b/tex/context/base/page-mar.tex
@@ -254,7 +254,7 @@
\def\flushmargincontents%
{\restoreinterlinepenalty % here?
- \ifnum\margincontent>0 % called quite often, so we
+ \ifcase\margincontent\else % called quite often, so we
\expandafter\doflushmargincontents % speed up the \fi scan by
\fi} % using a \do..
@@ -296,13 +296,13 @@
\def\doflushmargincontents% % links + rechts
{\bgroup
\forgetall
- \global\marginheight\!!zeropoint
+ \global\marginheight\zeropoint
\dorecurse{\margincontent}
{\bgroup
\edef\margetekstafstand {\getvalue{\??im\recurselevel\c!afstand}}%
\edef\margetekstregels {\getvalue{\??im\recurselevel\c!regel}}%
\edef\margetekstscheider{\getvalue{\??im\recurselevel\c!scheider}}%
- \let\margetekstnummer=\recurselevel
+ \let\margetekstnummer\recurselevel
\getvalue{\??im\recurselevel}%
\global\setvalue{\??im\recurselevel}{}%
\egroup}%
@@ -314,12 +314,12 @@
\donefalse % how needed
\fi\fi
\ifdone
- \advance\marginheight by \pagetotal
- \advance\marginheight by \lineheight % a sort of bonus
+ \advance\marginheight \pagetotal
+ \advance\marginheight \lineheight % a sort of bonus
\ifdim\marginheight>\pagegoal
\xdef\restoreinterlinepenalty%
{\global\let\restoreinterlinepenalty\relax
- \global\interlinepenalty=\the\interlinepenalty}%
+ \global\interlinepenalty=\the\interlinepenalty}% keep = here
\global\interlinepenalty=10000
\fi
\else % We need the above because interlinepenalties overrule vadjusted \nobreaks.
@@ -381,6 +381,12 @@
\getboxheight\dimen0\of\box0
\vskip-\dimen0\
\box0}}
+
+\def\resetmargincontent % quick hack
+ {\doglobal\newcounter\margincontent}
+
+\def\resetmargetitels
+ {\resetmargincontent}
%D \macros
%D {inleftside,inleftmargin,inrightmargin,inrightside}
@@ -474,12 +480,12 @@
\ifnum\realpageno>1
\bgroup
\pagebodyornamentsfalse
- \setbox\facingpage=\vbox to \zethoogte
+ \setbox\facingpage\vbox to \zethoogte
{\unvbox\facingpage\vfil}%
\myshipout{\buildpagebody\box\facingpage}%
\egroup
\else
- \global\setbox\facingpage=\box\voidb@x
+ \global\setbox\facingpage\emptybox
\fi
\fi}
@@ -491,17 +497,16 @@
\def\startnaast% beter: \dowithnextbox
{\iffacingpages
- \global\setbox\facingbox=\vbox
+ \global\setbox\facingbox\vbox
\bgroup
- \hsize=\zetbreedte
+ \hsize\zetbreedte
\else
- \def\next{\gobbleuntil\stopnaast}%
- \expandafter\next
+ \@EA\gobbleuntil\@EA\stopnaast
\fi}
\def\stopnaast%
{\egroup
- \global\setbox\facingpage=\vbox
+ \global\setbox\facingpage\vbox
{\ifvoid\facingpage
\vskip\openstrutdepth % \dp\strutbox
\else
diff --git a/tex/context/base/page-mul.tex b/tex/context/base/page-mul.tex
index ca8d8aea7..eb01d4e67 100644
--- a/tex/context/base/page-mul.tex
+++ b/tex/context/base/page-mul.tex
@@ -299,16 +299,16 @@
\global\vsize=-\columntextoffset
\global\multiply\vsize by 2
\global\advance\vsize by \columntextheight
- \ifdim\precolumnboxheight>\!!zeropoint
+ \ifdim\precolumnboxheight>\zeropoint
\global\advance\vsize by -\precolumnboxheight
\fi
\getinsertionheights\to\dimen0\\%
\global\advance\vsize by -\dimen0
- \ifgridsnapping % evt altijd, nog testen
+%%%\ifgridsnapping % evt altijd, nog testen, testing now, see columned tocs
\getnoflines\vsize
\vsize=\noflines\openlineheight
\advance\vsize by .5\openlineheight % collect enough data
- \fi
+%%%\fi
\global\vsize=\nofcolumns\vsize
\global\pagegoal=\vsize} % let's do it only here
@@ -365,7 +365,7 @@
\hangafter=0
\hangindent=\!!zeropoint
\everypar{}%
- \ifdim\pagetotal=\!!zeropoint \else
+ \ifdim\pagetotal=\zeropoint \else
\vbox{\forgetall\strut}%
\vskip-\openlineheight
\fi
@@ -439,7 +439,7 @@
\def\checkbegincolumnfootnotes%
{\ifcleverfootnotes
\doflushfootnotes
- \ifdim\ht\footins>\!!zeropoint % hm, actually unknown
+ \ifdim\ht\footins>\zeropoint % hm, actually unknown
\global\setbox\savedfootins=\box\footins
\else
\global\setbox\savedfootins=\box\voidb@x
@@ -572,12 +572,13 @@
\global\precolumnboxheight=\!!zeropoint
\setvsize
\dosomebreak\nobreak
- \ifgridsnapping \else
- \scratchdimen=\topskip
- \advance\scratchdimen by -\openstrutheight
- \nointerlineskip
- \vskip-\scratchdimen
- \fi
+% wrong ! ! ! ! !
+% \ifgridsnapping \else
+% \scratchdimen=\topskip
+% \advance\scratchdimen by -\openstrutheight
+% \nointerlineskip
+% \vskip-\scratchdimen
+% \fi
\prevdepth\openstrutdepth
\nointerlineskip
\dp\columnpagebox=\!!zeropoint
@@ -732,7 +733,7 @@
\def\splitcolumn#1from \box#2to \dimen#3 top \box#4%
{\bgroup
- \ifdim\ht#4>\!!zeropoint
+ \ifdim\ht#4>\zeropoint
\dimen0=\dimen#3\relax
\dimen2=\dimen0
\advance\dimen0 by -\ht#4%
@@ -780,7 +781,7 @@
{\relax
\ifcleverfootnotes
\ifnum#1=\lastcolumnbox
- \ifdim\ht\footins>\!!zeropoint
+ \ifdim\ht\footins>\zeropoint
\vskip1\skip\footins % remove stretch and shrink
\kern\ht\footins % a \vskip would be is discarded!
\fi
@@ -791,7 +792,7 @@
{\relax
\ifcleverfootnotes
\ifnum#1=\lastcolumnbox\relax
- \ifdim\ht\footins>\!!zeropoint
+ \ifdim\ht\footins>\zeropoint
\advance#2 by -\ht\footins
\advance#2 by -\skip\footins
\fi
@@ -800,7 +801,7 @@
\def\overlaycolumnfootnotes% VERVANGEN !!!
{\relax
- \ifcleverfootnotes\ifdim\ht\footins>\!!zeropoint
+ \ifcleverfootnotes\ifdim\ht\footins>\zeropoint
\bgroup
\scratchdimen=\ht\firstcolumnbox
\advance\scratchdimen by -\openstrutdepth % \dp\strutbox
@@ -1387,7 +1388,7 @@
\else
% \showmessage{\m!columns}{13}{}%
\fi
- \ifdim\ht\floatbox>\!!zeropoint\relax
+ \ifdim\ht\floatbox>\zeropoint\relax
\global\setbox\currenttopcolumnbox=\vbox
{\snaptogrid\vbox
{\copy\currenttopcolumnbox
@@ -1455,7 +1456,7 @@
\def\linebetweencolumns%
{\bgroup
\startcolorpage
- \ifdim\@@klafstand>\!!zeropoint
+ \ifdim\@@klafstand>\zeropoint
\dimen0=\@@klafstand
\else
\dimen0=\linewidth
@@ -1489,6 +1490,8 @@
\let\restorecolumnsettings\relax
+\definecomplexorsimpleempty\startkolommen
+
\def\complexstartkolommen[#1]% %% \startkolommen
{\bgroup
\let\stopkolommen=\egroup
@@ -1536,7 +1539,7 @@
\edef\minbalancetoplines{\@@klnboven}%
\steltolerantiein[\@@kltolerantie]% %% \startkolommen
\stelblankoin[\@@klblanko]%
- \ifdim\tussenwit>\!!zeropoint
+ \ifdim\tussenwit>\zeropoint\relax
\stelwitruimtein[\@@klblanko]%
\fi
\def\stopkolommen%
@@ -1549,8 +1552,6 @@
\fi
\fi}
-\definecomplexorsimpleempty\startkolommen
-
%\def\kolom%
% {\ifbinnenkolommen
% \ejectcolumn
diff --git a/tex/context/base/page-num.tex b/tex/context/base/page-num.tex
index e7f0a2109..b2eab250c 100644
--- a/tex/context/base/page-num.tex
+++ b/tex/context/base/page-num.tex
@@ -58,7 +58,7 @@
\processaction
[\@@snstatus]
[ \v!stop=>\ifsubpaging
-\resetsubpaginanummer % new, see sync
+ \resetsubpaginanummer % new, see sync
\else
\subpagingfalse
\fi
@@ -77,21 +77,21 @@
\def\stelsubpaginanummerin%
{\dosingleargument\dostelsubpaginanummerin}
-\def\newnofsubpages {0}
-\def\nofsubpages {0}
-\def\firstsubpage {1}
-\def\prevsubpage {1}
-\def\nextsubpage {1}
-\def\lastsubpage {1}
+\def\newnofsubpages{0}
+\def\nofsubpages {0}
+\def\firstsubpage {1}
+\def\prevsubpage {1}
+\def\nextsubpage {1}
+\def\lastsubpage {1}
-\def\nextpage {1}
-\def\prevpage {1}
+\def\nextpage {1}
+\def\prevpage {1}
-\definetwopasslist{\s!subpage}
+\definetwopasslist\s!subpage
\def\savenofsubpages%
{\ifsubpaging
- \showmessage{\m!layouts}{6}{\newnofsubpages,\the\subpageno}%
+ \showmessage\m!layouts6{\newnofsubpages,\the\subpageno}%
\immediatewriteutilitycommand%
{\twopassentry%
{\s!subpage}%
@@ -104,8 +104,8 @@
\bgroup
\xdef\nofsubpages{\twopassdata}%
\xdef\firstsubpage{\realfolio}%
- \advance\realpageno by \nofsubpages
- \advance\realpageno by -1
+ \advance\realpageno \nofsubpages
+ \advance\realpageno -1
\xdef\lastsubpage{\realfolio}%
\egroup
\else
@@ -113,7 +113,7 @@
\fi}
\def\gotonextsubpage% overlapt behoorlijk met realpage macro
- {\global\let\checksubpages=\relax
+ {\global\let\checksubpages\relax
\ifresettingsubpagenumber
\resetnummer[\s!subpage]%
\global\resettingsubpagenumberfalse
@@ -121,12 +121,12 @@
\ifsubpaging
\edef\oldsubpage{\the\subpageno}%
\verhoognummer[\s!subpage]%
- \global\subpageno=\ruwenummer[\s!subpage]\relax
+ \global\subpageno\ruwenummer[\s!subpage]\relax
\ifnum\subpageno=1
- \gettwopassdata{\s!subpage}%
+ \gettwopassdata\s!subpage
\setsubpagenumbers
\ifnum\oldsubpage>0
- \showmessage{\m!layouts}{6}{\newnofsubpages,\oldsubpage}%
+ \showmessage\m!layouts6{\newnofsubpages,\oldsubpage}%
\edef\next%
{\writeutilitycommand%
{\twopassentry%
@@ -137,34 +137,34 @@
\fi
\doglobal\increment\newnofsubpages\relax
\fi
- \setglobalsystemreference\rt!page{\v!eerstesubpagina}\firstsubpage
- \setglobalsystemreference\rt!page{\v!laatstesubpagina}\lastsubpage
+ \setglobalsystemreference\rt!page\v!eerstesubpagina\firstsubpage
+ \setglobalsystemreference\rt!page\v!laatstesubpagina\lastsubpage
\bgroup
\ifnum\realpageno=\firstsubpage\relax
- \global\let\prevsubpage=\firstsubpage
-\setglobalsystemreference\rt!page{\v!sub\v!achteruit}\lastsubpage
+ \global\let\prevsubpage\firstsubpage
+ \setglobalsystemreference\rt!page{\v!sub\v!achteruit}\lastsubpage
\else
\xdef\prevsubpage{\realfolio}%
\doglobal\decrement\prevsubpage
-\setglobalsystemreference\rt!page{\v!sub\v!achteruit}\prevsubpage
+ \setglobalsystemreference\rt!page{\v!sub\v!achteruit}\prevsubpage
\fi
- \setglobalsystemreference\rt!page{\v!vorigesubpagina}\prevsubpage
+ \setglobalsystemreference\rt!page\v!vorigesubpagina\prevsubpage
\ifnum\realpageno=\lastsubpage\relax
- \global\let\nextsubpage=\lastsubpage
-\setglobalsystemreference\rt!page{\v!sub\v!vooruit}\firstsubpage
+ \global\let\nextsubpage\lastsubpage
+ \setglobalsystemreference\rt!page{\v!sub\v!vooruit}\firstsubpage
\else
\xdef\nextsubpage{\realfolio}%
\doglobal\increment\nextsubpage
-\setglobalsystemreference\rt!page{\v!sub\v!vooruit}\nextsubpage
+ \setglobalsystemreference\rt!page{\v!sub\v!vooruit}\nextsubpage
\fi
- \setglobalsystemreference\rt!page{\v!volgendesubpagina}\nextsubpage
+ \setglobalsystemreference\rt!page\v!volgendesubpagina\nextsubpage
\egroup
\fi}
\def\checksubpages%
- {\getfromtwopassdata{\s!subpage}{1}%
+ {\getfromtwopassdata\s!subpage1%
\setsubpagenumbers
- \global\let\checksubpages=\relax}
+ \global\let\checksubpages\relax}
% Omdat \gotonextrealpage gebruik maakt van de hulpfile,
% moet het initialiseren van \realpageno plaatsvinden in
@@ -195,79 +195,79 @@
\def\currentpage {\the\realpageno}
\def\gotonextrealpage%
- {\global\advance\realpageno by 1
+ {\global\advance\realpageno 1
\ifnum\realpageno>\lastpage
\xdef\lastpage{\realfolio}%
\fi
- \setglobalsystemreference\rt!page{\v!eerstepagina}\firstpage
- \setglobalsystemreference\rt!page{\v!laatstepagina}\lastpage
+ \setglobalsystemreference\rt!page\v!eerstepagina\firstpage
+ \setglobalsystemreference\rt!page\v!laatstepagina\lastpage
\bgroup
\ifnum\realpageno>1
- \advance\realpageno by -1
+ \advance\realpageno -1
\xdef\prevpage{\realfolio}%
- \setglobalsystemreference\rt!page{\v!achteruit}\prevpage
+ \setglobalsystemreference\rt!page\v!achteruit\prevpage
\else
- \global\let\prevpage=\firstpage
- \setglobalsystemreference\rt!page{\v!achteruit}\lastpage
+ \global\let\prevpage\firstpage
+ \setglobalsystemreference\rt!page\v!achteruit\lastpage
\fi
- \setglobalsystemreference\rt!page{\v!vorigepagina}\prevpage
+ \setglobalsystemreference\rt!page\v!vorigepagina\prevpage
\egroup
\bgroup
\ifnum\realpageno<\lastpage\relax
- \advance\realpageno by 1
+ \advance\realpageno 1
\xdef\nextpage{\realfolio}%
- \setglobalsystemreference\rt!page{\v!pagina}\nextpage
- \setglobalsystemreference\rt!page{\v!vooruit}\nextpage
+ \setglobalsystemreference\rt!page\v!pagina\nextpage
+ \setglobalsystemreference\rt!page\v!vooruit\nextpage
\bgroup
\xdef\nextnextpage{\realfolio}%
\ifodd\realpageno
- \setglobalsystemreference\rt!page{\v!volgendeonevenpagina}\nextnextpage
+ \setglobalsystemreference\rt!page\v!volgendeonevenpagina\nextnextpage
\else
- \setglobalsystemreference\rt!page{\v!volgendeevenpagina}\nextnextpage
+ \setglobalsystemreference\rt!page\v!volgendeevenpagina\nextnextpage
\fi
- \advance\realpageno by 1
+ \advance\realpageno 1
\xdef\nextnextpage{\realfolio}%
\ifnum\realpageno>\lastpage\relax
%\ifodd\realpageno
- % \setglobalsystemreference\rt!page{\v!volgendeonevenpagina}\lastpage
+ % \setglobalsystemreference\rt!page\v!volgendeonevenpagina\lastpage
%\else
- % \setglobalsystemreference\rt!page{\v!volgendeevenpagina}\lastpage
+ % \setglobalsystemreference\rt!page\v!volgendeevenpagina\lastpage
%\fi
\else
\ifodd\realpageno
- \setglobalsystemreference\rt!page{\v!volgendeonevenpagina}\nextnextpage
+ \setglobalsystemreference\rt!page\v!volgendeonevenpagina\nextnextpage
\else
- \setglobalsystemreference\rt!page{\v!volgendeevenpagina}\nextnextpage
+ \setglobalsystemreference\rt!page\v!volgendeevenpagina\nextnextpage
\fi
\fi
\egroup
\else
- \global\let\nextpage=\lastpage
- \setglobalsystemreference\rt!page{\v!pagina}\firstpage
- \setglobalsystemreference\rt!page{\v!vooruit}\firstpage
- \setglobalsystemreference\rt!page{\v!volgendeonevenpagina}\lastpage
- \setglobalsystemreference\rt!page{\v!volgendeevenpagina}\lastpage
+ \global\let\nextpage\lastpage
+ \setglobalsystemreference\rt!page\v!pagina\firstpage
+ \setglobalsystemreference\rt!page\v!vooruit\firstpage
+ \setglobalsystemreference\rt!page\v!volgendeonevenpagina\lastpage
+ \setglobalsystemreference\rt!page\v!volgendeevenpagina\lastpage
\fi
- \setglobalsystemreference\rt!page{\v!volgendepagina}\realfolio
+ \setglobalsystemreference\rt!page\v!volgendepagina\realfolio
\egroup}
-\def\checkrealpage%
- {\global\realpageno=0
+\def\checkrealpage
+ {\global\realpageno0
\gotonextrealpage
- \global\let\checkrealpage=\relax}
+ \global\let\checkrealpage\relax}
-\def\savenofpages%
- {\advance\realpageno by -1
+\def\savenofpages
+ {\advance\realpageno -1
\savecurrentvalue\lastpage{\realfolio}}%
-\def\totaalaantalpaginas%
+\def\totaalaantalpaginas
{\lastpage}
-\def\setpagecounters%
+\def\setpagecounters
{\setuserpageno{\ruwenummer[\s!page]}%
- \doifelse{\@@snstatus}{\v!stop}
- {\global\subpageno=0}
- {\global\subpageno=\ruwenummer[\s!subpage]}}
+ \doifelse\@@snstatus\v!stop
+ {\global\subpageno\zerocount}
+ {\global\subpageno\ruwenummer[\s!subpage]}}
% Standaard is \count0 in Plain TeX de paginateller. Omwille
% van de afhandeling van lokaal nummeren, definieren we
@@ -389,7 +389,7 @@
\def\dostelnummeringin[#1]%
{\getparameters[\??nm][#1]%
- \preparepaginaprefix{\??nm}%
+ \preparepaginaprefix\??nm
\enkelzijdigfalse
\dubbelzijdigfalse
\ExpandFirstAfter\processallactionsinset
@@ -429,42 +429,82 @@
%
% best, beware, chapter (yes) can be followed by title (no)
+%\def\preparepaginaprefix#1%
+% {\def\dopreparepaginaprefix##1%
+% {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!nee}}% %v
+% \processcommacommand[\@@kolijst]\dopreparepaginaprefix
+% \def\dopreparepaginaprefix##1%
+% {\doifvalue{#1##1\v!nummer}{\v!ja} %v
+% {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!ja}}}%
+% \processcommacommand[\@@kolijst]\dopreparepaginaprefix}
+
\def\preparepaginaprefix#1%
{\def\dopreparepaginaprefix##1%
- {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!nee}}% %v
- \processcommacommand[\@@kolijst]\dopreparepaginaprefix
+ {\letvalue{#1\getvalue{\??by##1}\v!nummer}\v!nee}% %v
+ \rawprocesscommalist[\@@kolijst]\dopreparepaginaprefix
\def\dopreparepaginaprefix##1%
- {\doifvalue{#1##1\v!nummer}{\v!ja} %v
- {\setvalue{#1\getvalue{\??by##1}\v!nummer}{\v!ja}}}%
- \processcommacommand[\@@kolijst]\dopreparepaginaprefix}
-
-\def\dopaginaprefix#1#2%
+ {\doifvalue{#1##1\v!nummer}\v!ja %v
+ {\letvalue{#1\getvalue{\??by##1}\v!nummer}\v!ja}}%
+ \rawprocesscommalist[\@@kolijst]\dopreparepaginaprefix}
+
+% \def\dopaginaprefix#1#2%
+% {\let\normaluchar\uchar\let\uchar\relax % ugly but needed
+% \doifelsevalue{#1#2\v!nummer}{\v!ja} % \v! and no \c!
+% {\@EA\beforesplitstring\@EA{\postprefix}\at:\to\preprefix
+% \@EA\aftersplitstring\@EA{\postprefix}\at:\to\postprefix
+% \let\uchar\normaluchar % ugly but needed
+% \doifsomething{\preprefix}
+% {\doifnot{\preprefix}{0}{\preprefix\@@nmnummerscheider}}}%
+% {\@EA\aftersplitstring\@EA{\postprefix}\at:\to\postprefix
+% \let\uchar\normaluchar}} % ugly but needed
+%
+% \def\paginaprefix#1[#2::#3::#4]% kan wat sneller ####1:0:
+% {\bgroup
+% \edef\postprefix{#3}%
+% \def\donexttrackcommando##1%
+% {\dopaginaprefix{#1}{##1}%
+% \donexttracklevel{##1}}%
+% \donexttrackcommando\firstsection
+% \egroup}
+
+\def\dodopaginaprefix#1%
{\let\normaluchar\uchar\let\uchar\relax % ugly but needed
- \doifelsevalue{#1#2\v!nummer}{\v!ja} % \v! and no \c!
- {\@EA\beforesplitstring\@EA{\postprefix}\at:\to\preprefix
- \@EA\aftersplitstring\@EA{\postprefix}\at:\to\postprefix
+ \doifelsevalue{\paginatype#1\v!nummer}\v!ja % \v! and no \c!
+ {\@EA\beforesplitstring\postprefix\at:\to\preprefix
+ \@EA\aftersplitstring\postprefix\at:\to\postprefix
\let\uchar\normaluchar % ugly but needed
- \doifsomething{\preprefix}
- {\doifnot{\preprefix}{0}{\preprefix\@@nmnummerscheider}}}%
- {\@EA\aftersplitstring\@EA{\postprefix}\at:\to\postprefix
+ \ifx\preprefix\empty \else
+ \ifx\preprefix\zerocountervalue\else
+ \preprefix\@@nmnummerscheider
+ \fi
+ \fi}
+ {\@EA\aftersplitstring\postprefix\at:\to\postprefix
\let\uchar\normaluchar}} % ugly but needed
+\def\dopaginaprefix#1%
+ {\dodopaginaprefix{#1}%
+ \donexttracklevel{#1}}
+
\def\paginaprefix#1[#2::#3::#4]% kan wat sneller ####1:0:
{\bgroup
+ \edef\paginatype{#1}%
\edef\postprefix{#3}%
- \def\donexttrackcommando##1%
- {\dopaginaprefix{#1}{##1}%
- \donexttracklevel{##1}}%
+ \let\donexttrackcommando\dopaginaprefix
\donexttrackcommando\firstsection
\egroup}
+%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{\@@pnstatus}{\v!start}
{\doif{\@@nmstatus\@@pnstatus}{\v!start\v!start}
- {{\@@nmcommando{\doattributes\??nm\c!letter\c!kleur{\volledigepaginanummer}}}}}
+ {{\doif{\@@nmstrut}{\v!ja}{\strut}%
+ \@@nmcommando{\doattributes\??nm\c!letter\c!kleur
+ {\volledigepaginanummer}}}}}
\def\@@plaatspaginascheider% still used ?
- %{\doif{\@@pnstatus}{\v!start}%
{\doif{\@@nmstatus\@@pnstatus}{\v!start\v!start}
{\@@nmtekstscheider}}
diff --git a/tex/context/base/page-one.tex b/tex/context/base/page-one.tex
index e2fd95d14..9bf96232b 100644
--- a/tex/context/base/page-one.tex
+++ b/tex/context/base/page-one.tex
@@ -25,17 +25,17 @@
\newtoks\OTRONEoutput
\def\OTRONEsethsize%
- {\global\hsize=\tekstbreedte}
+ {\global\hsize\tekstbreedte}
\def\OTRONEsetvsize%
{\ifdim\vsize=\teksthoogte \else
\bgroup
- \scratchdimen=-\vsize
- \advance\scratchdimen by \teksthoogte
- \global\advance\vsize by \scratchdimen
+ \scratchdimen-\vsize
+ \advance\scratchdimen \teksthoogte
+ \global\advance\vsize \scratchdimen
\ifdim\pagegoal<\maxdimen
- \advance\scratchdimen by \pagegoal
- \global\pagegoal=\scratchdimen
+ \advance\scratchdimen \pagegoal
+ \global\pagegoal\scratchdimen
\fi
\egroup
\fi}
@@ -64,30 +64,30 @@
\kern\maxdepth
\dobotinsertions
\fi\fi\fi
- \ifdim\ht\footins>\!!zeropoint % beter dan \ifvoid\footins\else
+ \ifdim\ht\footins>\zeropoint % beter dan \ifvoid\footins\else
\kern\skip\footins
\kern\ht\footins
\fi}%
\ifbottomnotes
\ifgridsnapping
\getnoflines\teksthoogte
- \advance\noflines by -1
- \scratchdimen=\noflines\lineheight
- \advance\scratchdimen by \topskip
+ \advance\noflines -1
+ \scratchdimen\noflines\lineheight
+ \advance\scratchdimen \topskip
\else
- \scratchdimen=\ht0
+ \scratchdimen\ht0
\fi
\else
- \scratchdimen=\!!zeropoint
+ \scratchdimen\zeropoint
\fi
\setbox2=\hbox
{\ifvoid\savedfootins \else
- \setbox\footins=\box\savedfootins
+ \setbox\footins\box\savedfootins
\fi
\lower\scratchdimen\vbox{\placefootnotes}}%
\smashbox2% % needed here
\ifbottomnotes
- \ht0=\!!zeropoint
+ \ht0\zeropoint
\fi
\vbox to \teksthoogte
{\box0\box2\ifbottomnotes\else\vfill\fi}%
@@ -109,15 +109,15 @@
\def\OTRONEdosettopinserts%
{\bgroup
\ifsomefloatwaiting
- \noffloatinserts=0
- \let\totaltopinserted=\!!zeropoint
+ \noffloatinserts0
+ \let\totaltopinserted\!!zeropoint
\OTRONEdodosettopinserts
\ifnum\@@bknonder=0
\ifnum\@@bknregels>0
- \ifdim\totaltopinserted>\!!zeropoint\relax
+ \ifdim\totaltopinserted>\zeropoint\relax
\dimen0=\lineheight
\dimen0=\@@bknregels\dimen0
- \advance\dimen0 by \totaltopinserted\relax
+ \advance\dimen0 \totaltopinserted\relax
\ifdim\dimen0>\teksthoogte
\showmessage{\m!floatblocks}{8}{\@@bknregels}%
\vfilll\eject
@@ -136,15 +136,16 @@
\else
\topofinsertfalse
\fi
- \global\advance\topinserted by \ht\floatbox
- \global\advance\topinserted by \dp\floatbox
- \global\advance\topinserted by \floatbottomskip\relax
+ \global\advance\topinserted \ht\floatbox
+ \global\advance\topinserted \dp\floatbox
+ \global\advance\topinserted \floatbottomskip\relax
\ifdim\topinserted<\teksthoogte\relax
\xdef\totaltopinserted{\the\topinserted}%
\insert\topins
{\forgetall
\iftopofinsert
- \kern-\lineskip\par\prevdepth=\maxdimen
+ \kern-\lineskip\par
+ \prevdepth\maxdimen
\else
%\blanko[-\@@bknawit,\@@bkvoorwit]% inserts can't look back
\betweenfloatblanko
@@ -152,27 +153,27 @@
\flushfloatbox
\blanko[\@@bknawit]}%
\ifsomefloatwaiting
- \advance\noffloatinserts by 1
+ \advance\noffloatinserts 1
\else
- \noffloatinserts=\noftopfloats\relax
+ \noffloatinserts\noftopfloats\relax
\fi
\dofloatflushedinfo
\else
\doresavefloat
- \noffloatinserts=\noftopfloats\relax
+ \noffloatinserts\noftopfloats\relax
\fi
\else
\ifsomefloatwaiting
- \showmessage{\m!floatblocks}{6}{\the\noftopfloats}%
+ \showmessage\m!floatblocks6{\the\noftopfloats}%
\fi
- \let\OTRONEdodosettopinserts=\relax
+ \let\OTRONEdodosettopinserts\relax
\fi
\OTRONEdodosettopinserts}
\def\OTRONEdosetbotinserts%
{\bgroup
\ifsomefloatwaiting
- \noffloatinserts=0
+ \noffloatinserts0
\OTRONEdodosetbotinserts
\fi
\egroup}
@@ -180,40 +181,40 @@
\def\OTRONEdodosetbotinserts%
{\ifnum\noffloatinserts<\nofbotfloats\relax
\dogetfloat
- \global\advance\botinserted by \ht\floatbox\relax
- \global\advance\botinserted by \dp\floatbox\relax
- \global\advance\botinserted by \floattopskip\relax
+ \global\advance\botinserted \ht\floatbox\relax
+ \global\advance\botinserted \dp\floatbox\relax
+ \global\advance\botinserted \floattopskip\relax
\ifdim\botinserted<\pagegoal\relax
\insert\botins
{\forgetall
\blanko[\@@bkvoorwit]%
\flushfloatbox}%
\ifsomefloatwaiting
- \advance\noffloatinserts by 1
+ \advance\noffloatinserts 1
\else
- \noffloatinserts=\nofbotfloats
+ \noffloatinserts\nofbotfloats
\fi
\dofloatflushedinfo
\else
\doresavefloat
- \noffloatinserts=\nofbotfloats\relax
+ \noffloatinserts\nofbotfloats\relax
\fi
\global\nofloatpermittedtrue % vgl topfloats s!
\else
\ifsomefloatwaiting
- \showmessage{\m!floatblocks}{7}{\the\nofbotfloats}%
+ \showmessage\m!floatblocks7{\the\nofbotfloats}%
\fi
- \let\OTRONEdodosetbotinserts=\relax
+ \let\OTRONEdodosetbotinserts\relax
\fi
\OTRONEdodosetbotinserts}
\def\OTRONEdosetbothinserts%
{\ifflushingfloats
- \global\topinserted=\zeropoint
- \global\botinserted=\zeropoint
+ \global\topinserted\zeropoint
+ \global\botinserted\zeropoint
\else
- \global\topinserted=\zeropoint \OTRONEdosettopinserts
- \global\botinserted=\zeropoint \OTRONEdosetbotinserts
+ \global\topinserted\zeropoint \OTRONEdosettopinserts
+ \global\botinserted\zeropoint \OTRONEdosetbotinserts
\fi}
\def\OTRONEdotopinsertions%
@@ -225,7 +226,7 @@
\unvbox\topins
\fi
\fi
- \global\topinserted=\!!zeropoint\relax}
+ \global\topinserted\zeropoint}
\def\OTRONEdobotinsertions%
{\ifvoid\botins\else
@@ -235,7 +236,7 @@
\unvbox\botins
\fi
\fi
- \global\botinserted=\!!zeropoint\relax
+ \global\botinserted\zeropoint
\global\nofloatpermittedfalse}
\def\OTRONEdoflushfloats%
@@ -245,13 +246,13 @@
\ifvmode\prevdepth=\maxdimen\fi % prevents whitespace
\OTRONEdodoflushfloats
\fi
- \global\savednoffloats=0
+ \global\savednoffloats0
\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}%
+ \setbox\floatbox\hbox to \hsize{\hss\box\floatbox\hss}%
\fi \fi
\snaptogrid\hbox{\iftestfloatbox\ruledhbox\fi{\copy\floatbox}}}
@@ -271,23 +272,23 @@
\centerfloatboxfalse
\dogetfloat
\ifdim\wd\floatbox>\zetbreedte
- \global\setbox\floatbox=\hbox to \zetbreedte{\hss\box\floatbox\hss}%
+ \global\setbox\floatbox\hbox to \zetbreedte{\hss\box\floatbox\hss}%
\fi
\OTRONEsetvsize
- \!!widtha=\wd\floatbox
+ \!!widtha\wd\floatbox
\dofloatflushedinfo
\doloop
{\ifsomefloatwaiting
\dosavefloatstatus
\dogetfloat
- \advance\!!widtha by 1em % variable
- \advance\!!widtha by \wd\floatbox\relax
+ \advance\!!widtha 1em % variable
+ \advance\!!widtha \wd\floatbox\relax
\ifdim\!!widtha>\hsize
\dorestorefloatstatus
\global\somefloatwaitingtrue
\exitloop
\else
- \global\setbox\floatbox=\hbox
+ \global\setbox\floatbox\hbox
{\ifcase\columndirection % nog document wide
\ifvoid\savedfloatbox\else
\ifhbox\savedfloatbox\unhbox\else\box\fi\savedfloatbox\hfil
@@ -322,10 +323,10 @@
\global\roomforfloatfalse
\else
\dimen0=\pagetotal
- \advance\dimen0 by \ht\floatbox
- \advance\dimen0 by \dp\floatbox
- \advance\dimen0 by \floattopskip
- \advance\dimen0 by -\pageshrink % toegevoegd
+ \advance\dimen0 \ht\floatbox
+ \advance\dimen0 \dp\floatbox
+ \advance\dimen0 \floattopskip
+ \advance\dimen0 -\pageshrink % toegevoegd
%\message{c:\the\mofcolumns,t:\the\pagetotal,g:\the\pagegoal}%\wait
\ifdim\dimen0>\pagegoal
\global\roomforfloatfalse
@@ -338,21 +339,21 @@
{\baselinecorrection
\doplacefloatbox
\doinsertfloatinfo
- \doif{\@@bkspringvolgendein}{\v!nee}{\noindentation}} % new
+ \doif\@@bkspringvolgendein\v!nee\noindentation} % new
-\def\OTRONEsomefixdfloat[#1]%
+\def\OTRONEsomefixdfloat% [#1]%
{\docheckiffloatfits
\ifroomforfloat\else
\goodbreak
\fi
- \showmessage{\m!floatblocks}{9}{}%
- \someherefloat}
+ \showmessage\m!floatblocks9\empty
+ \someherefloat} % [#1]}%
\def\OTRONEsomesidefloat[#1]% links, rechts NOG TESTEN EN AANPASSEN
{\ifbinnenkolommen
\someelsefloat[\v!hier]%
\else
- \checkwaitingfloats{#1}%
+ %\checkwaitingfloats{#1}%
\def\logsidefloat%
{\doinsertfloatinfo}%
\setbox\floatbox=\vbox{\box\floatbox}%
@@ -369,14 +370,16 @@
{\flushsidefloatsafterpar}%
\fi}
-\def\OTRONEsomepagefloat[#1]% links, rechts, midden, hoog, midden, laag
- {\checkwaitingfloats{#1}%
- \vbox to \teksthoogte
- {\doifnotinset{\v!hoog}{#1}{\vfill}%
- \box\floatbox
- \doifnotinset{\v!laag}{#1}{\vfill}}%
- \doinsertfloatinfo
- \pagina} % toegevoegd
+\def\OTRONEsomepagefloat[#1]%
+ {%\checkwaitingfloats{#1}%
+ \global\setbox\collectedpagefloats=\vbox
+ {\unvbox\collectedpagefloats
+ \vbox to \teksthoogte
+ {\doifnotinset{\v!hoog}{#1}{\vfill}
+ \box\floatbox
+ \doifnotinset{\v!laag}{#1}{\vfill}}
+ \goodbreak}%
+ \doinsertfloatinfo}
\def\OTRONEsometopsfloat[#1]%
{\ifdim\topinserted=\!!zeropoint\relax
diff --git a/tex/context/base/page-run.tex b/tex/context/base/page-run.tex
index 4301f460c..469900b9f 100644
--- a/tex/context/base/page-run.tex
+++ b/tex/context/base/page-run.tex
@@ -133,6 +133,52 @@
\fi
+% \startinterface english % english is fallback
+
+\gdef\showsetups%
+ {\noindent
+ \vbox
+ {\forgetall
+ \mindermeldingen
+ \switchtobodyfont[\v!klein]
+ \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
+ \showsetupC{topdistance} \topdistance
+ \showsetupA{header} \headerheight
+ \showsetupC{headerdistance} \headerdistance
+ \showsetupA{textheight} \textheight
+ \showsetupC{footerdistance} \footerdistance
+ \showsetupA{footer} \footerheight
+ \showsetupC{bottomdistance} \bottomdistance
+ \showsetupA{bottom} \bottomheight
+ \showsetupA{leftedge} \leftedgewidth
+ \showsetupC{leftedgedistance} \leftedgedistance
+ \showsetupA{leftmargin} \leftmarginwidth
+ \showsetupC{leftmargindistance} \leftmargindistance
+ \showsetupA{textwidth} \textwidth
+ \showsetupC{rightmargindistance}\rightmargindistance
+ \showsetupA{rightmargin} \rightmarginwidth
+ \showsetupC{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%
@@ -317,52 +363,6 @@
\stopinterface
-\ifx\showsetups\undefined
-
- \gdef\showsetups% english is fallback
- {\noindent
- \vbox
- {\forgetall
- \mindermeldingen
- \switchtobodyfont[\v!klein]
- \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
- \showsetupC{topdistance} \topdistance
- \showsetupA{header} \headerheight
- \showsetupC{headerdistance} \headerdistance
- \showsetupA{textheight} \textheight
- \showsetupC{footerdistance} \footerdistance
- \showsetupA{footer} \footerheight
- \showsetupC{bottomdistance} \bottomdistance
- \showsetupA{bottom} \bottomheight
- \showsetupA{leftedge} \leftedgewidth
- \showsetupC{leftedgedistance} \leftedgedistance
- \showsetupA{leftmargin} \leftmarginwidth
- \showsetupC{leftmargindistance} \leftmargindistance
- \showsetupA{textwidth} \textwidth
- \showsetupC{rightmargindistance}\rightmargindistance
- \showsetupA{rightmargin} \rightmarginwidth
- \showsetupC{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}}}
-
-\fi
-
\gdef\showlayout% interfereert lelijk met een \typefile er na
{\bgroup
\pagina
diff --git a/tex/context/base/page-set.tex b/tex/context/base/page-set.tex
index a0509bba0..1b7bee5f8 100644
--- a/tex/context/base/page-set.tex
+++ b/tex/context/base/page-set.tex
@@ -192,7 +192,7 @@
\else
\OTRSETdoifcellelse{#1}\columnfirstcell
{\global\advance\columnfirstcell 1 }
- {\exitloop}
+ {\exitloop}%
\fi}%
\global\columnlastcell=\columnfirstcell
\doloop
@@ -201,7 +201,7 @@
\else
\OTRSETdoifcellelse{#1}\columnlastcell
{\global\advance\columnlastcell -1 \exitloop}
- {\global\advance\columnlastcell 1 }
+ {\global\advance\columnlastcell 1 }%
\fi}%
\ifnum\columnfirstcell>\columnmaxcells
\global\columnfreecells=0
@@ -245,8 +245,64 @@
\OTRSETdomakegridbox{\nofcolumns}{1}{-1}%
\fi}
+%\def\OTRSETdomakegridbox#1#2#3%
+% {\hbox\bgroup
+% % test first !
+% \hbox to \zetbreedte
+% {\dostepwiserecurse{#1}{#2}{#3}
+% {\mofcolumns=\recurselevel
+% \localcolumnwidth=\OTRSETlocalwidth\mofcolumns
+% \setbox\scratchbox=\hbox\localframed
+% [\??mc\OTRSETidentifier\number\mofcolumns]%
+% [\c!breedte=\localcolumnwidth,\c!hoogte=\teksthoogte]%
+% {}%
+% \ifcase\columndirection
+% \hskip\OTRSETgetparameter\c!afstand\recurselevel\box\scratchbox
+% \else
+% \box\scratchbox\hskip\OTRSETgetparameter\c!afstand\recurselevel
+% \fi}}%
+% \hskip-\zetbreedte
+% % main text
+% \hbox to \zetbreedte
+% {\dostepwiserecurse{#1}{#2}{#3}
+% {\mofcolumns=\recurselevel
+% \localcolumnwidth=\OTRSETlocalwidth\mofcolumns
+% \offinterlineskip
+% \setbox\scratchbox=\vbox to \teksthoogte
+% {\topskipcorrection
+% \dorecurse{\columnmaxcells}
+% {\setbox\scratchbox=\hbox{\OTRSETgetgridcell\mofcolumns\recurselevel}%
+% \ht\scratchbox=\ht\strutbox
+% \dp\scratchbox=\dp\strutbox
+% \ifcase\columndirection
+% \box\scratchbox
+% \else
+% \hbox to \localcolumnwidth
+% {\hskip\localcolumnwidth\llap{\box\scratchbox}}
+% \fi
+% \par}}%
+% \wd\scratchbox=\localcolumnwidth % \tekstbreedte
+% \ifcase\columndirection
+% \hskip\OTRSETgetparameter\c!afstand\recurselevel\box\scratchbox
+% \else
+% \box\scratchbox\hskip\OTRSETgetparameter\c!afstand\recurselevel
+% \fi}}%
+% \egroup}
+
\def\OTRSETdomakegridbox#1#2#3%
{\hbox\bgroup
+%
+\ifbalancecolumns
+ \ifnum\realpageno=\balancingpageno\relax
+ \!!heighta \localcolumnmaxcells\lineheight
+\xdef\localcolumnmaxcells{0}%
+ \else
+ \!!heighta \teksthoogte
+ \fi
+\else
+ \!!heighta \teksthoogte
+\fi
+%
% test first !
\hbox to \zetbreedte
{\dostepwiserecurse{#1}{#2}{#3}
@@ -254,7 +310,7 @@
\localcolumnwidth=\OTRSETlocalwidth\mofcolumns
\setbox\scratchbox=\hbox\localframed
[\??mc\OTRSETidentifier\number\mofcolumns]%
- [\c!breedte=\localcolumnwidth,\c!hoogte=\teksthoogte]%
+ [\c!breedte=\localcolumnwidth,\c!hoogte=\!!heighta]% \teksthoogte]%
{}%
\ifcase\columndirection
\hskip\OTRSETgetparameter\c!afstand\recurselevel\box\scratchbox
@@ -268,7 +324,7 @@
{\mofcolumns=\recurselevel
\localcolumnwidth=\OTRSETlocalwidth\mofcolumns
\offinterlineskip
- \setbox\scratchbox=\vbox to \teksthoogte
+ \setbox\scratchbox=\vbox to \!!heighta % \teksthoogte
{\topskipcorrection
\dorecurse{\columnmaxcells}
{\setbox\scratchbox=\hbox{\OTRSETgetgridcell\mofcolumns\recurselevel}%
@@ -278,7 +334,7 @@
\box\scratchbox
\else
\hbox to \localcolumnwidth
- {\hskip\localcolumnwidth\llap{\box\scratchbox}}
+ {\hskip\localcolumnwidth\llap{\box\scratchbox}}%
\fi
\par}}%
\wd\scratchbox=\localcolumnwidth % \tekstbreedte
@@ -289,6 +345,11 @@
\fi}}%
\egroup}
+\def\OTRSETreducegridbox%
+ {\ifnum\localcolumnmaxcells>0
+ \let\columnmaxcells\localcolumnmaxcells
+ \fi}
+
\def\OTRSETflushfinalfootnotes
{\ifcase\lastcolumnlastcell \else
\setbox\scratchbox=\hbox
@@ -304,24 +365,52 @@
\global\lastcolumnlastcell=0
\fi}
+%\def\OTRSETdoflush
+% {\ifcollectingcontent
+% \global\mofcolumns=1
+% \else
+% \OTRSETdofinalflush
+% \OTRSETinitializecolumns
+% \OTRSETmanualbalance % or after \gotonextpage
+% %\OTRSETdoflushfloats
+% \OTRSETgotonextpage
+% \fi}
+
\def\OTRSETdoflush
{\ifcollectingcontent
\global\mofcolumns=1
\else
- \OTRSETdofinalflush
+ \OTRSETdofinalflush
+ \OTRSETdofinaloutput
\OTRSETinitializecolumns
\OTRSETmanualbalance % or after \gotonextpage
%\OTRSETdoflushfloats
\OTRSETgotonextpage
+\initializecolumntextareas
\fi}
+%\def\OTRSETdofinalflush % see \OTRSETdoflush
+% {\OTRSETflushfinalfootnotes
+% \placecolumntextareas
+% \OTRSETcentergridcells
+% \setbox\scratchbox=\OTRSETmakegridbox
+% \global\mofcolumns=\nofcolumns % otherwise problems in finaloutput
+% \finaloutput\box\scratchbox}
+
+\newbox\OTRfinalpagebox
+
\def\OTRSETdofinalflush % see \OTRSETdoflush
{\OTRSETflushfinalfootnotes
\placecolumntextareas
\OTRSETcentergridcells
- \setbox\scratchbox=\OTRSETmakegridbox
- \global\mofcolumns=\nofcolumns % otherwise problems in finaloutput
- \finaloutput\box\scratchbox}
+ \OTRSETreducegridbox
+ \global\setbox\OTRfinalpagebox=\OTRSETmakegridbox
+ \global\mofcolumns=\nofcolumns} % otherwise problems in finaloutput
+
+\def\OTRSETdofinaloutput
+ {\ifdim\ht\OTRfinalpagebox=\teksthoogte
+ \finaloutput\box\OTRfinalpagebox
+ \fi}
\let\OTRSETbalancinglist\empty
@@ -361,7 +450,7 @@
\allowbreak % hm
\fi
\ifdim\ht\footins>\zeropoint % updates vsize
- \insert\footins{\unvbox\footins}
+ \insert\footins{\unvbox\footins}%
\fi
\fi}
@@ -385,8 +474,8 @@
\def\OTRSETnextcolumn%
{\ifhmode
\bgroup
- \unskip\unskip\unskip
- \parfillskip\!!zeropoint
+ \removeunwantedspaces
+ \parfillskip\zeropoint
\OTRSETcolumnseparator
\par
\egroup
@@ -444,11 +533,11 @@
\vskip\lineheight
\prevdepth\dp\strutbox
\unvbox\normalpagebox
- \vfill}
+ \vfill}%
\setbox2=\hbox
- {\OTRSETplacefootnotes}
+ {\OTRSETplacefootnotes}%
\setbox\scratchbox=\hbox
- {\wd0=\!!zeropoint\box0\box2}
+ {\wd0=\zeropoint\box0\box2}%
\dp\scratchbox=\dp\strutbox
\OTRSEThandleflushedtext1}
@@ -579,9 +668,6 @@
\OTRSETsavebox{#1}%
\fi}
-\def\OTRSETstoreincolumnslotHERE%
- {\OTRSETflushtextsofar\OTRSETstoreincolumnslotTOPS}
-
\def\OTRSETstoreincolumnslotTOPS#1%
{\OTRSETcheckcolumnslot{#1}%
\ifenoughcolumncells
@@ -589,7 +675,7 @@
\fi
\ifenoughcolumncells
\OTRSETsetgridcells\mofcolumns\columnfirstcell\columnhcells\columnvcells
- {\hbox{\copy#1}}
+ {\hbox{\copy#1}}%
\OTRSETsetvsize
\else
\OTRSETsavebox{#1}%
@@ -620,7 +706,7 @@
\def\OTRSETcheckcolumnspace#1#2#3% col row box
{\columnhcells=1
- \totalcolumnspace=\!!zeropoint
+ \totalcolumnspace=\zeropoint
\scratchcounter=#1%
\enoughcolumncellstrue
\doloop
@@ -655,9 +741,9 @@
%\scratchcounter=#2\advance\scratchcounter-1\relax
%\ifnum\scratchcounter>0
% \dostepwiserecurse{#1}{\!!countd}{1}
-% {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\!!zeropoint
+% {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
% \def\columnspacetopoffset{1}%
-% \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\!!zeropoint
+% \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
% \def\columnspacetopoffset{1}%
% \fi\fi}%
% \advance\!!counte \columnspacetopoffset \relax
@@ -668,9 +754,9 @@
%\advance\scratchcounter \columnvcells \relax
%\ifnum\scratchcounter>\columnmaxcells\else
% \dostepwiserecurse{#1}{\!!countd}{1}
-% {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\!!zeropoint
+% {\ifdim\wd\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
% \def\columnspacebotoffset{1}%
-% \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\!!zeropoint
+% \else\ifdim\dp\OTRSETgridcell\recurselevel\scratchcounter>\zeropoint
% \def\columnspacebotoffset{1}%
% \fi\fi}%
% \advance\!!counte \columnspacebotoffset \relax
@@ -687,24 +773,17 @@
\fi}%
\fi}
-\def\OTRSETsetpreferedcolumnslot#1%
- {\doifsomething{#1}{\edef\preferedcolumn{#1}}}
+\def\OTRSETsetpreferedcolumnslot#1#2%
+ {\doifsomething{#1}{\edef\preferedcolumn{#1}}%
+ \doifsomething{#2}{\edef\preferedrow {#2}}}
-\OTRSETsetpreferedcolumnslot{\nofcolumns} % default ?
+\OTRSETsetpreferedcolumnslot{\nofcolumns}{1} % default ?
\let\pofcolumns\mofcolumns
\let\qofcolumns\mofcolumns
\newif\ifquitincurrentcolumn
-\def\OTRSETstoreincolumnslotFXTB% fixed column
- {\OTRSETstoreincolumnslotindeed
- \pofcolumns\pofcolumns+\currenthcell1\columnmaxcells+\currentvcell}
-
-\def\OTRSETstoreincolumnslotFXBT% fixed column
- {\OTRSETstoreincolumnslotindeed
- \pofcolumns\pofcolumns+\currenthcell\columnmaxcells1-\currentvcell}
-
\def\OTRSETstoreincolumnslotLRTB%
{\OTRSETstoreincolumnslotindeed
\mofcolumns\nofcolumns+\currenthcell1\columnmaxcells+\currentvcell}
@@ -737,6 +816,42 @@
{\OTRSETstoreincolumnslotindeed
\columnmaxcells1-\currentvcell\nofcolumns\qofcolumns-\currenthcell}
+\def\OTRSETstoreincolumnslotFXTB% fixed column
+ {\OTRSETstoreincolumnslotindeed
+ \pofcolumns\pofcolumns
+ +\currenthcell\preferedrow
+ \columnmaxcells+\currentvcell}
+
+\def\OTRSETstoreincolumnslotFXBT% fixed column
+ {\OTRSETstoreincolumnslotindeed
+ \pofcolumns\pofcolumns
+ +\currenthcell\columnmaxcells
+ \preferedrow-\currentvcell}
+
+%\def\OTRSETstoreincolumnslotHERE% fixed column
+% {\OTRSETflushtextsofar
+% \ifdim\pagetotal>\zeropoint
+% \@EA\OTRSETstoreincolumnslotEREH
+% \else
+% \@EA\OTRSETstoreincolumnslotTOPS
+% \fi}
+%
+%\def\OTRSETstoreincolumnslotEREH% fixed column
+% {\getnoflines\pagetotal
+% \OTRSETstoreincolumnslotindeed
+% \mofcolumns\mofcolumns
+% +\currenthcell\noflines
+% \columnmaxcells+\currentvcell}
+
+\def\OTRSETstoreincolumnslotHERE#1% fixed column
+ {\OTRSETflushtextsofar
+ \getnoflines\pagetotal \advance\noflines\columnfirstcell
+ \OTRSETstoreincolumnslotindeed
+ \mofcolumns\mofcolumns
+ +\currenthcell\noflines
+ \columnmaxcells+\currentvcell{#1}%
+ \OTRSETsetvsize}
+
\def\OTRSETstoreincolumnslotindeed#1#2#3#4#5#6#7#8#9%
{\OTRSETflushtextsofar
\ifnum\preferedcolumn<\mofcolumns
@@ -820,12 +935,12 @@
\def\columnslotspacing{2}
\def\OTRSETstoreincolumnslot#1#2% {method} {box} % alleen last
- {\dp#2=\!!zeropoint
+ {\dp#2=\zeropoint
\ifcase\columnslotspacing\else
\setbox#2=\vbox spread \columnslotspacing\lineheight
- {\vss\box#2\vss}
+ {\vss\box#2\vss}%
\fi
-%\dp#2=\!!zeropoint
+%\dp#2=\zeropoint
\doifdefinedelse{\strippedcsname\OTRSETstoreincolumnslot#1}
{\getvalue{\strippedcsname\OTRSETstoreincolumnslot#1}{#2}}
{\copy#2}}
@@ -834,10 +949,14 @@
% {\setbox\floatbox=\box#1\dosavefloat}
\def\OTRSETsavebox#1% clean up the skips
- {\setbox\scratchbox=\vbox
- {\unvbox#1\unskip\unskip\unskip
- \global\setbox\floatbox\lastbox
- }%\unskip\unskip\unskip\box\floatbox}%
+ {\ifhbox#1% spans and so
+ \global\setbox\floatbox=\vbox{\box#1}%
+ \else
+ \setbox\scratchbox=\vbox
+ {\unvbox#1\unskip\unskip\unskip
+ \global\setbox\floatbox\lastbox
+ }%\unskip\unskip\unskip\box\floatbox}%
+ \fi
\dosavefloat}
\def\OTRSETflushfloatbox% nog verder doorvoeren en meer info in marge
@@ -851,7 +970,7 @@
\dogetfloat
\ifdim\wd\floatbox>\zeropoint
\!!doneatrue
- \dp\floatbox=\!!zeropoint
+ \dp\floatbox=\zeropoint
\OTRSETstoreincolumnslot{TBLR}\floatbox
\if!!donea
%\message{[flu]}%
@@ -919,8 +1038,8 @@
\def\OTRSETinitializecolumns% once per page
{\columnspreadtrue % todo
\ifcolumnspread
- \global\rofcolumns=\getvalue{\??mc\OTRSETidentifier\c!nrechts}
- \global\lofcolumns=\getvalue{\??mc\OTRSETidentifier\c!nlinks}
+ \global\rofcolumns=\getvalue{\??mc\OTRSETidentifier\c!nrechts}%
+ \global\lofcolumns=\getvalue{\??mc\OTRSETidentifier\c!nlinks}%
\global\tofcolumns=\rofcolumns \relax
\ifodd\realpageno\relax
\global\nofcolumns=\rofcolumns
@@ -929,7 +1048,7 @@
\global\nofcolumns=\lofcolumns
\fi
\else
- \global\nofcolumns=\getvalue{\??mc\OTRSETidentifier\c!n}
+ \global\nofcolumns=\getvalue{\??mc\OTRSETidentifier\c!n}%
\global\rofcolumns=\nofcolumns
\global\lofcolumns=\nofcolumns
\global\tofcolumns=\nofcolumns
@@ -1024,22 +1143,45 @@
\binnenkolommentrue % will be different flag
%\let\redofloatorder\gobbleoneargument % will also be a flag
\let\kolom\OTRSETgotocolumn%
- \activateotr{SET}{ONE} % andere naam, activate or so
- \xdef\OTRSETlist{#1}
+ \activateotr{SET}{ONE}% andere naam, activate or so
+ \xdef\OTRSETlist{#1}%
\OTRSETgotonextpage
\OTRSETassignwidths
\else
\bgroup
\fi}
+%\def\stopcolumnset%
+% {\ifnum\columnsetlevel=1
+% \par
+% \OTRSETsetmanualbalance
+% \dostopcolumnset
+% \egroup
+% \global\footnotelimittrue
+% \dimen\footins\savedfootnotedimen % ugly
+% \ifsomefloatwaiting \setvsize \pagina \setvsize \fi
+% \else
+% \egroup
+% \fi
+% \decrement\columnsetlevel\relax}
+
\def\stopcolumnset%
- {\ifnum\columnsetlevel=1
+ {\relax
+ \ifnum\columnsetlevel=1
\par
\OTRSETsetmanualbalance
\dostopcolumnset
\egroup
\global\footnotelimittrue
\dimen\footins\savedfootnotedimen % ugly
+\setvsize
+\sethsize
+\ifvoid\OTRfinalpagebox\else
+ \dp\OTRfinalpagebox\zeropoint
+ \box\OTRfinalpagebox
+ \nobreak\vbox{\strut}\vskip-\lineheight
+\prevdepth\dp\strutbox
+\fi
\ifsomefloatwaiting \setvsize \pagina \setvsize \fi
\else
\egroup
@@ -1057,13 +1199,33 @@
\def\OTRSETdobalance
{\OTRSETnobalance}
+%\def\OTRSETmanualbalance
+% {\ifbalancecolumns
+% \ifnum\realpageno=\balancingpageno\relax
+% \ifnum\mofcolumns=1
+% \dorecurse\nofcolumns
+% {\!!counta=\recurselevel
+% \!!countb=\balancingcolumnmaxcells\!!counta
+% \advance\!!countb 1
+% \dostepwiserecurse\!!countb\columnmaxcells1
+% {\OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe}}%
+% \fi
+% \fi
+% \fi}
+
+\def\localcolumnmaxcells{0}
+
\def\OTRSETmanualbalance
{\ifbalancecolumns
+ \let\savedcolumnmaxcells\columnmaxcells
\ifnum\realpageno=\balancingpageno\relax
\ifnum\mofcolumns=1
\dorecurse\nofcolumns
{\!!counta=\recurselevel
- \!!countb=\balancingcolumnmaxcells\!!counta
+ \!!countb=\balancingcolumnmaxcells\!!counta\relax
+ \ifnum\!!countb>\localcolumnmaxcells
+ \xdef\localcolumnmaxcells{\the\!!countb}%
+ \fi
\advance\!!countb 1
\dostepwiserecurse\!!countb\columnmaxcells1
{\OTRSETsetgridcell\!!counta\recurselevel\copy\placeholderboxe}}%
@@ -1092,6 +1254,16 @@
\fi
\global\balancingcolumnsfalse}
+%\def\OTRSETnobalance
+% {\iflastcolumnfootnotes % testen ! optie
+% % inhibit flush of floats !
+% \dostepwiserecurse{\mofcolumns}{\nofcolumns}{1}
+% {\vskip-\lineheight\vbox{\strut}\vfill\eject}%
+% \else
+% \ifdim\pagetotal>\zeropoint
+% \vfill \eject \OTRSETdofinalflush
+% \fi
+% \fi}
\def\OTRSETnobalance
{\iflastcolumnfootnotes % testen ! optie
@@ -1100,7 +1272,14 @@
{\vskip-\lineheight\vbox{\strut}\vfill\eject}%
\else
\ifdim\pagetotal>\zeropoint
- \vfill \eject \OTRSETdofinalflush
+\ifnum\mofcolumns=\nofcolumns
+ \OTRSETflushfinalfootnotes
+ \vfill \eject
+\else
+ \vfill \eject
+ \OTRSETdofinalflush
+ \OTRSETdofinaloutput
+\fi
\fi
\fi}
@@ -1125,7 +1304,6 @@
\initializecolumntextareas % name !
\OTRSETsetvsize}
-
\OTRSEToutput
{\OTRSETnaturalflush
% \OTRSETgotonextpage
@@ -1134,11 +1312,11 @@
\def\OTRSETinitializefeatures%
{% number of lines
- \getnoflines\teksthoogte\xdef\columnmaxcells{\the\noflines}
+ \getnoflines\teksthoogte\xdef\columnmaxcells{\the\noflines}%
% direction
\doifelsevalue{\??mc\OTRSETidentifier\c!richting}{\v!rechts}
{\chardef\columndirection=0}
- {\chardef\columndirection=1}
+ {\chardef\columndirection=1}%
% balancing
\doifelsevalue{\??mc\OTRSETidentifier\c!balanceren}{\v!ja}
{\balancecolumnstrue}
@@ -1151,12 +1329,12 @@
\fi}
\def\OTRSEThandlepreposttext%
- {\getnoflines{\ht\precolumnbox}
+ {\getnoflines{\ht\precolumnbox}%
\doOTRSETsetgridcells
{\copy\placeholderboxe}
11\nofcolumns\noflines
- {\box\precolumnbox}
- \getnoflines{\ht\postcolumnbox}
+ {\box\precolumnbox}%
+ \getnoflines{\ht\postcolumnbox}%
\advance\columnfreecells -\noflines
\advance\columnfreecells 1
\doOTRSETsetgridcells
@@ -1195,7 +1373,7 @@
\def\OTRSETinhibitinserts%
{\global\count\footins=0
- \global\skip\footins=\!!zeropoint}
+ \global\skip\footins=\zeropoint}
% interface to footnotes
@@ -1269,9 +1447,9 @@
\fi
\hss}%
\ifcase#1\relax
- \ht\scratchbox\!!zeropoint
- \dp\scratchbox\!!zeropoint
- \wd\scratchbox\!!zeropoint
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
+ \wd\scratchbox\zeropoint
\else
\wd\scratchbox\hsize
\ht\scratchbox\ht\strutbox
@@ -1287,10 +1465,11 @@
\global\setbox\placeholderboxe\columnplaceholder0\magenta
\global\setbox\placeholderboxf\columnplaceholder1\darkgray}
+\def\doOTRSETshowstatus
+ {\llap{\tt\tfxx\blue(\number\columnfirstcell\#\number\columnfreecells)}}
+
\def\OTRSETshowstatus
- {\iftracecolumnset
- \llap{\tt\tfxx\blue(\number\columnfirstcell\#\number\columnfreecells)}%
- \fi}
+ {\iftracecolumnset \doOTRSETshowstatus \fi}
\appendtoks \OTRSETshowstatus \to \everypar
@@ -1325,7 +1504,7 @@
% {\ifsecondargument
% \doifundefinedelse{#4box}
% {\@EA\newbox\csname#4box\endcsname}
-% {\@EA\setbox\csname#4box\endcsname=\box\voidb@x}%
+% {\setbox\csname#4box\endcsname=\box\voidb@x}%
% \setvalue{\??mc#1#2\v!tekst#3}{\OTRSETflusharea{#1}{#2}{#3}}%
% \setxvalue{#1#2#3source}{#4}%
% \setgvalue{#4setup}%
@@ -1376,109 +1555,114 @@
\doifelse{#2}{\v!beide}
{\definecolumntextarea[#1][\v!links ][#3]%
\definecolumntextarea[#1][\v!rechts][#3]}
- {\presetlocalframed
- [\??mt#1#2]%
- \processaction[#2]
- [ \v!links=>\addtocommalist{#1}\columnleftareas,
- \v!rechts=>\addtocommalist{#1}\columnrightareas]%
- \getparameters[\??mt#1#2]
- [\c!x=1,\c!y=1,\c!nx=1,\c!ny=1,
- \c!offset=\v!overlay,\c!strut=\v!nee,\c!kader=\v!uit,
- \c!status=\v!stop,#3]}%
+ {\doifelse{#2}{\v!volgende}
+ {\doifonevenpaginaelse
+ {\definecolumntextarea[#1][\v!rechts][#3]}
+ {\definecolumntextarea[#1][\v!links][#3]}}
+ {\presetlocalframed
+ [\??mt#1#2]%
+ \processaction[#2] % \doglobal voorkomt stack build up
+ [ \v!links=>\doglobal\addtocommalist{#1}\columnleftareas,
+ \v!rechts=>\doglobal\addtocommalist{#1}\columnrightareas]%
+ \getparameters[\??mt#1#2]
+ [\c!x=1,\c!y=1,\c!nx=1,\c!ny=1,
+ \c!offset=\v!overlay,\c!strut=\v!nee,\c!kader=\v!uit,
+ \c!status=\v!stop,#3]}}%
\else
- \definecolumntextarea[#1][\v!beide][#2]%
+ \definecolumntextarea[#1][\v!volgende][#2]%
\fi}
\def\setupcolumntextarea%
{\dotripleempty\dosetupcolumntextarea}
-\def\dosetupcolumntextarea[#1][#2]%
- {\getparameters[\??mt#1#2]}
+\def\dosetupcolumntextarea[#1][#2][#3]%
+ {\ifthirdargument
+ \doifelse{#2}{\v!beide}
+ {\setupcolumntextarea[#1][\v!links ][#3]%
+ \setupcolumntextarea[#1][\v!rechts][#3]}
+ {\doifelse{#2}{\v!volgende}
+ {\doifonevenpaginaelse
+ {\setupcolumntextarea[#1][\v!rechts][#3]}
+ {\setupcolumntextarea[#1][\v!links][#3]}}
+ {\getparameters[\??mt#1#2][#3]}}%
+ \else
+ \setupcolumntextarea[#1][\v!volgende][#2]%
+ \fi}
+
+\def\initializecolumntextareas%
+ {\ifodd\realpageno
+ \doinitializecolumntextareas\columnrightareas\v!rechts
+ \else
+ \doinitializecolumntextareas\columnleftareas\v!links
+ \fi}
\def\doinitializecolumntextareas#1#2%
{\def\docommando##1%
- {\doifvalue{\??mt##1#2\c!status}{\v!start}
- {\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}}}%
+ {\doifelsevalue{\??mt##1#2\c!status}{\v!start}
+ {\dodoinitializecolumntextareas{##1}{#2}}
+ {\doifvalue{\??mt##1#2\c!status}{\v!herhaal}
+ {\dodoinitializecolumntextareas{##1}{#2}}}}%
\processcommacommand[#1]\docommando}
-\def\initializecolumntextareas%
+\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
- \doinitializecolumntextareas\columnrightareas\v!rechts
+ \doplacecolumntextareas\columnrightareas\v!rechts
\else
- \doinitializecolumntextareas\columnleftareas\v!links
+ \doplacecolumntextareas\columnleftareas\v!links
\fi}
-\def\doplacecolumntextareas#1#2%
+\def\doplacecolumntextareas#1#2% global ?
{\bgroup
\forgetall
\def\docommando##1%
- {\doifvalue{\??mt##1#2\c!status}{\v!start}
- {\!!counta=\getvalue{\??mt##1#2\c!x}%
- \!!countb=\getvalue{\??mt##1#2\c!nx}%
- \!!widtha=\!!countb\hsize
- \!!heighta=\getvalue{\??mt##1#2\c!ny}\lineheight
- \advance\!!countb \!!counta \advance\!!countb -1 \relax
- \ifnum\!!countb>\nofcolumns
- \!!countc=\!!countb
- \advance\!!countc -\nofcolumns
- \!!countb=\nofcolumns
- \else
- \!!countc=0
- \fi
- \advance\!!counta 1
- \dostepwiserecurse{\!!counta}{\!!countb}{1}
- {\advance\!!widtha\OTRSETgetparameter\c!afstand\recurselevel}%
- \!!widthc=\!!widtha
- \advance\!!widthc -\!!countc\hsize
-\!!widthb=\!!widthc
- \ifodd\realpageno \else
- \ifcase\!!countc\else
- \advance\!!widtha 2\rugwit
- \advance\!!widthc \rugwit
- \dorecurse{\!!countc}
- {\advance\!!widtha\OTRSETgetparameter\c!afstand\recurselevel}%
- \fi
- \fi
-% option
-\advance\!!heighta -\lineheight
- \setbox\scratchbox=\vbox
- {\localframed
- [\??mt##1#2]
- [\c!breedte=\!!widtha,\c!hoogte=\!!heighta]
- {\getvalue{\??mt##1#2}}}%
- \!!counta=\getvalue{\??mt##1#2\c!x}%
- \!!countb=\getvalue{\??mt##1#2\c!y}%
- \advance\!!countb \getvalue{\??mt##1#2\c!ny}%
- \advance\!!countb -1
- \OTRSETsetgridcell
- {\!!counta}{\!!countb}
- \hbox{\clip
- [\c!breedte=\!!widthc,\c!hoogte=\!!heighta]
- {\copy\scratchbox}}%
- \ifcase\!!countc\else
- \advance\!!counta \getvalue{\??mt##1#2\c!nx}%
- \advance\!!counta -\!!countc
- \advance\!!widtha -\!!widthc
- \OTRSETsetgridcell
- {\!!counta}{\!!countb}
- \hbox{\hskip-\rugwit
- \clip
- [\c!breedte=\!!widtha,\c!hoogte=\!!heighta,
- \c!hoffset=\!!widthc]
- {\copy\scratchbox}}%
- \fi}}%
+ {\doifelsevalue{\??mt##1#2\c!status}{\v!start}
+ {\doglobal\removefromcommalist{##1}#1%
+ \dodoplacecolumntextareas{##1}{#2}}
+ {\doifvalue{\??mt##1#2\c!status}{\v!herhaal}
+ {\dodoplacecolumntextareas{##1}{#2}}}}%
\processcommacommand[#1]\docommando
\egroup}
-\def\placecolumntextareas%
- {\ifodd\realpageno
- \doplacecolumntextareas\columnrightareas\v!rechts
- \else
- \doplacecolumntextareas\columnleftareas\v!links
+\def\dodoplacecolumntextareas#1#2%
+ {\!!counta\getvalue{\??mt#1#2\c!x}%
+ \!!countb\getvalue{\??mt#1#2\c!nx}%
+ \docalculatecolumnsetspan
+ \!!heighta=\getvalue{\??mt#1#2\c!ny}\lineheight
+ % option
+ \advance\!!heighta -\lineheight
+ \setbox\scratchbox=\vbox
+ {\localframed
+ [\??mt#1#2]
+ [\c!breedte=\!!widtha,\c!hoogte=\!!heighta]
+ {\getvalue{\??mt#1#2}}}%
+ \!!counta=\getvalue{\??mt#1#2\c!x}%
+ \!!countb=\getvalue{\??mt#1#2\c!y}%
+ \advance\!!countb \getvalue{\??mt#1#2\c!ny}%
+ \advance\!!countb -1
+ \OTRSETsetgridcell
+ {\!!counta}{\!!countb}
+ \hbox{\clip
+ [\c!breedte=\!!widthb,\c!hoogte=\!!heighta]
+ {\copy\scratchbox}}%
+ \ifcase\!!countc\else
+ \advance\!!counta \getvalue{\??mt#1#2\c!nx}%
+ \advance\!!counta -\!!countc
+ \advance\!!widtha -\!!widthb
+ \OTRSETsetgridcell
+ {\!!counta}{\!!countb}
+ \hbox
+ {\hskip-\rugwit
+ \clip
+ [\c!breedte=\!!widtha,\c!hoogte=\!!heighta,
+ \c!hoffset=\!!widthb]
+ {\copy\scratchbox}}%
\fi}
\def\setupcolumntextareatext%
@@ -1487,4 +1671,89 @@
\def\dosetupcolumntextareatext[#1][#2][#3]%
{\setvalue{\??mt#1#2}{#3}}
+\def\docalculatecolumnsetspan
+ {% \!!counta <= x
+ % \!!countb <= nx
+ % \!!widtha => total width
+ % \!!widthb => left width
+ % \!!countc => left cols
+ \!!widtha=\!!countb\hsize
+ \advance\!!countb \!!counta \advance\!!countb -1 \relax
+ \ifnum\!!countb>\nofcolumns
+ \!!countc=\!!countb
+ \advance\!!countc -\nofcolumns
+ \!!countb=\nofcolumns
+ \else
+ \!!countc=0
+ \fi
+ \advance\!!counta 1
+ \dostepwiserecurse{\!!counta}{\!!countb}{1}
+ {\advance\!!widtha\OTRSETgetparameter\c!afstand\recurselevel}%
+ \!!widthb=\!!widtha
+ \advance\!!widthb -\!!countc\hsize
+ \ifodd\realpageno \else
+ \ifcase\!!countc\else
+ \advance\!!widtha 2\rugwit
+ \advance\!!widthb \rugwit
+ \dorecurse{\!!countc}
+ {\advance\!!widtha\OTRSETgetparameter\c!afstand\recurselevel}%
+ \fi
+ \fi}
+
+\def\columnsetspanhsize{\hsize}
+
+\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!kader=\v!uit,
+ \c!voor=,
+ \c!na=,
+ \c!offset=\v!overlay,
+ \c!plaats=,
+ \c!dieptecorrectie=\v!uit,
+ \c!n=2,
+ #2]%
+ \else
+ \definecolumnspan[][#1]%
+ \fi}
+
+\def\setupcolumnsetspan%
+ {\dodoubleempty\dosetupcolumnsetspan}
+
+\def\dosetupcolumnsetspan[#1][#2]%
+ {\ifsecondargument
+ \setupframedtext[cs:#1][#2]%
+ \else
+ \setupcolumnsetspan[][#1]%
+ \fi}
+
+\def\startcolumnsetspan%
+ {\dotripleempty\dostartcolumnsetspan}
+
+\def\dostartcolumnsetspan[#1][#2][#3]% [#3] gobbles space
+ {\bgroup
+ \!!countc\getvalue{\??kd cs:#1\c!n} % \framedtextparameter{cs:\c!n}%
+ \!!countd\nofcolumns \advance\!!countd -\mofcolumns \advance\!!countd 1
+ \ifnum\!!countc>\!!countd \!!countc\!!countd \fi
+ \setcolumnsetspanhsize\mofcolumns\!!countc % a/b used
+ \hsize\columnsetspanhsize
+ \setupframedtexts[cs:#1][\c!breedte=\columnsetspanhsize,#2]
+ \setbox\scratchbox\ruledhbox \bgroup
+ \dostartframedtext[cs:#1][\v!geen]
+ \vskip-\lineheight\par\strut\par}
+
+\def\stopcolumnsetspan%
+ {\par\kern-\lineheight\prevdepth\dp\strutbox\strut
+ \dostopframedtext \egroup
+ \OTRSETstoreincolumnslotHERE\scratchbox
+ \egroup}
+
\protect \endinput
diff --git a/tex/context/base/page-sid.tex b/tex/context/base/page-sid.tex
index 894a91ac8..b2fe14f78 100644
--- a/tex/context/base/page-sid.tex
+++ b/tex/context/base/page-sid.tex
@@ -21,6 +21,9 @@
% Figures at Either Margin. De macro's zijn slechts op enkele
% punten door mij aangepast.
+% This module badly needs an update because it's now a
+% mixture of old and new macros.
+
% afhankelijke variabelen
%
% \overgap vervangen door \floatsidetopskip
@@ -46,6 +49,7 @@
\newdimen\sidefloatwidth
\newdimen\sidefloathsize
\newdimen\sidefloatvsize \def\nofloatvsize{-1pt }
+\newdimen\sidefloatprogress
\newbox\floatbottom
@@ -57,22 +61,57 @@
\newif\iffloatrighteqo
\newif\iffloatlefteqo
-\let\floatrighteqo=\eqno
-\let\floatleftleqo=\leqno
+% 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 by -\pagetotal
+ \!!heighta\sidefloatvsize
+ \advance\!!heighta -\pagetotal
\ifdim\!!heighta>\zeropoint
- \witruimte % nog checken op interferentie
+ % to be checked for interference
+ \witruimte
+ % will be option
+ \getnoflines\!!heighta
+ \!!heighta\noflines\lineheight
+ % so far for option
\kern\!!heighta
\fi
- \global\sidefloatvsize=\nofloatvsize
+ \global\sidefloatvsize\nofloatvsize
\global\floatflagfalse}
\def\flushsidefloatsafterpar%
@@ -80,7 +119,7 @@
\gdef\checksidefloat%
{\dochecksidefloat
\ifdim\oldpagetotal=\pagetotal \else
- \xdef\checksidefloat{\dochecksidefloat}%
+ \global\let\checksidefloat\dochecksidefloat
\flushsidefloats
\fi}}
@@ -103,8 +142,7 @@
\let\poppenalties=\relax
\def\restorepenalties%
- {\ifnum\outputpenalty=\!!tenthousand\relax
- \else
+ {\ifnum\outputpenalty=\!!tenthousand\else
\penalty\outputpenalty
\fi}
@@ -120,7 +158,7 @@
\else
\restoreleftindent
\ifdim\wd\floatbottom<\sidefloathsize
- \parskip=\!!zeropoint
+ \parskip=\zeropoint
%\noindent
\vadjust{\penalty-1}%
\iffloatlefteqo
@@ -152,17 +190,29 @@
\def\restoreleftindent%
{\ifrightfloat \else
- \parskip=\!!zeropoint
+ \parskip=\zeropoint
\noindent
\vadjust{\penalty-1}%
\hskip\sidefloatwidth
\fi}
-\def\eqno%
- {\iffloatshort
- \global\floatrighteqotrue
- \fi
- \floatrighteqo}
+\ifx\normaleqno\undefined
+
+ \def\normaleqno%
+ {\iffloatshort
+ \global\floatrighteqotrue
+ \fi
+ \floatrighteqo}
+
+\else
+
+ \def\eqno%
+ {\iffloatshort
+ \global\floatrighteqotrue
+ \fi
+ \floatrighteqo}
+
+\fi
\def\leftmarginfloat#1%
{\global\rightfloatfalse\marginfloattrue\putsidefloat{#1}}
@@ -176,49 +226,56 @@
\def\rightfloat#1%
{\global\rightfloattrue\marginfloatfalse\putsidefloat{#1}}
-\def\putsidefloat#1%
+\def\putsidefloat#1% crap macro
{\par
\witruimte
+ % moved here dec 2001
+ {\everypar\emptytoks\forgetall\vbox{\strut}\vskip-\lineheight}% moved
+ %
\previoussidefloat
\stallsidefloat
\setbox\floatbox=\hbox{\vbox % pretty ugly, will be rewritten
{\vskip\ifmarginfloat-\sidefloattopskip\else\sidefloattopoffset\fi#1}}
\measuresidefloat
- \ifroomforfloat \else
+ \ifroomforfloat
+ \else
\tosssidefloat
\measuresidefloat
\stallsidefloat
\fi
\setsidefloat}
+
\def\progresssidefloat%
- {\!!heighta=\sidefloatvsize
+ {\sidefloatprogress=\sidefloatvsize
\iffloatflag
- \advance\!!heighta by -\dimen3
+ \advance\sidefloatprogress -\sidefloatpagetotal
\global\floatflagfalse
\else
- \advance\!!heighta by -\pagetotal
+ \advance\sidefloatprogress -\pagetotal
\fi}
\def\tosssidefloat%
{\vfill\eject}
+\newdimen\sidefloatpagetotal
+
\def\measuresidefloat%
{\global\floatflagtrue
- \dimen3=\pagetotal % global
+ \global\sidefloatpagetotal \pagetotal % global
\ifmarginfloat
- \global\sidefloatwidth=\!!zeropoint
+ \global \sidefloatwidth \zeropoint
\else
- \global\sidefloatwidth=\wd\floatbox
- \global\advance\sidefloatwidth by \floatsideskip
+ \global \sidefloatwidth \wd\floatbox
+ \global\advance\sidefloatwidth \floatsideskip
\fi
- \global\sidefloathsize=\hsize
- \global\advance\sidefloathsize by -\sidefloatwidth
- \global\sidefloatheight=\ht\floatbox
- \global\advance\sidefloatheight by \dp\floatbox
- \global\advance\sidefloatheight by \sidefloattopskip
- \global\sidefloatvsize=\sidefloatheight
- \global\advance\sidefloatvsize by \dimen3
+ \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
\ifdim\dimen0>.99\pagegoal \relax
\roomforfloatfalse
@@ -238,13 +295,15 @@
\fi}
\def\setsidefloat% nilling everypar saves time and redudant pos's
- {{\everypar\emptytoks\vbox{\strut}}\vskip-\lineheight
+ {% removed here dec 2001
+ %{\everypar\emptytoks\forgetall\vbox{\strut}\vskip-\lineheight}%
+ %
\kern\sidefloattopskip
\edef\presidefloatdepth{\the\prevdepth}%
\nointerlineskip
\bgroup
- \everypar=\emptytoks
- \parskip=\zeropoint
+ \everypar\emptytoks
+ \parskip\zeropoint
\logsidefloat
\ifrightfloat
\hfill
@@ -265,7 +324,7 @@
\egroup
\par
\kern-\sidefloatheight
- \penalty10001
+ \penalty10001 % oeps, this will change
\normalbaselines
\prevdepth=\presidefloatdepth
%\noindent
@@ -278,33 +337,33 @@
{\ifnum\sidefloatparagraph=1 }
\def\setsidefloatparagraph%
- {\global\advance\sidefloatparagraph by 1 }
+ {%\advance\sidefloatprogress by \sidefloatbottomskip
+ %\!!counta=\sidefloatprogress
+\scratchdimen=\sidefloatprogress
+\advance\scratchdimen \ht\strutbox
+\!!counta=\scratchdimen
+ \divide\!!counta by \baselineskip
+ \ifnum\!!counta>0
+ \ifrightfloat
+ \hangindent=-\sidefloatwidth
+ \else
+ \hangindent=\sidefloatwidth
+ \fi
+ \hangafter=-\!!counta
+ \fi
+ \global\advance\sidefloatparagraph 1 }
\def\resetsidefloatparagraph%
{\global\sidefloatparagraph=0 }
\def\dochecksidefloat%
{\progresssidefloat
- \ifdim\!!heighta>\zeropoint
-% \advance\!!heighta by \sidefloatbottomskip
-% \!!counta=\!!heighta
-\scratchdimen=\!!heighta
-\advance\scratchdimen \ht\strutbox
-\!!counta=\scratchdimen
- \divide\!!counta by \baselineskip
- \ifnum\!!counta>0
- \ifrightfloat
- \hangindent=-\sidefloatwidth
- \else
- \hangindent=\sidefloatwidth
- \fi
- \hangafter=-\!!counta
- \fi
+ \ifdim\sidefloatprogress>\zeropoint
\setsidefloatparagraph
\else
\resetsidefloatparagraph
\fi
- \parskip=\tussenwit}
+ \parskip\tussenwit}
\def\checksidefloat%
{\dochecksidefloat}
@@ -320,20 +379,20 @@
\def\previoussidefloat%
{\progresssidefloat
- \ifdim\!!heighta>\!!zeropoint \relax
+ \ifdim\sidefloatprogress>\zeropoint \relax
\iffloatshort
\global\floatshortfalse
\tosssidefloat
\else
- \kern\!!heighta
+ \kern\sidefloatprogress
\fi
\fi}
\def\stallsidefloat%
{\!!counta=\pageshrink
- \divide\!!counta by \baselineskip
- \advance\!!counta by 1
- \parskip=\!!zeropoint
+ \divide\!!counta \baselineskip
+ \advance\!!counta 1
+ \parskip=\zeropoint
\dorecurse{\!!counta}{\line{}}
\kern-\!!counta\baselineskip
\penalty0 }
diff --git a/tex/context/base/page-txt.tex b/tex/context/base/page-txt.tex
index 89abd3f15..cafc15ed4 100644
--- a/tex/context/base/page-txt.tex
+++ b/tex/context/base/page-txt.tex
@@ -19,7 +19,7 @@
\let\dodummypageskip\gobbleoneargument % obsolete
-%D Interfainge between this and other modules is handled by
+%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
@@ -188,7 +188,8 @@
\doifsomething{\ascii}
{\doattributes{#1#2}#3#4%
{\doifvalue{#1\v!tekst\c!strut}{\v!ja}{\setstrut\strut}% here!
- \doifdefinedelse{\??mk\ascii\c!koppeling} % brrr
+ %\doifdefinedelse{\??mk\ascii\c!koppeling} % brrr
+ \doifelsemarking\ascii
{\dolimitatetexts{#1#2#5}{\haalmarkering[\ascii][\v!eerste]}}
{\ConvertConstantAfter\doifelse{\v!paginanummer}{#6}
{\@@plaatspaginanummer}
@@ -201,7 +202,7 @@
%D length.
\def\dolimitatetexts#1#2%
- {\doifelsevaluenothing{#1}{#2}{\limitatetext{#2}{\getvalue{#1}}{...}}}
+ {\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.
@@ -230,11 +231,24 @@
%D Instead we will map the values of status onto macro
%D expansions.
-\def\placelayouttextline#1#2% % handelt o.b.v. tekst
- {\edef\textlinestatus{\getvalue{\??tk#1\v!tekst\c!status}}%
- \doifdefinedelse{\string\placelayouttextline\textlinestatus}
- {\getvalue{\string\placelayouttextline\textlinestatus}{#1}{#2}}
- {\getvalue{\string\placelayouttextline\s!unknown}{#1}{#2}}}
+%\def\placelayouttextline#1#2% % handelt o.b.v. tekst
+% {\edef\textlinestatus{\getvalue{\??tk#1\v!tekst\c!status}}%
+% \doifdefinedelse{\string\placelayouttextline\textlinestatus}
+% {\getvalue{\string\placelayouttextline\textlinestatus}{#1}{#2}}
+% {\getvalue{\string\placelayouttextline\s!unknown}{#1}{#2}}}
+%
+%\def\placelayouttextline#1% #2
+% {\edef\textlinestatus{\getvalue{\??tk#1\v!tekst\c!status}}%
+% \doifundefined{\string\placelayouttextline\textlinestatus}
+% {\let\textlinestatus\s!unknown}%
+% \getvalue{\string\placelayouttextline\textlinestatus}{#1}} % {#2}
+
+\def\placelayouttextline#1% #2
+ {\edef\textlinestatus{\csname\??tk#1\v!tekst\c!status\endcsname}%
+ \ifundefined{\string\placelayouttextline\textlinestatus}%
+ \let\textlinestatus\s!unknown
+ \fi
+ \csname\string\placelayouttextline\textlinestatus\endcsname{#1}} % {#2}
\letvalue{\string\placelayouttextline\v!normaal}\doplacelayouttextline
\letvalue{\string\placelayouttextline }\doplacelayouttextline
@@ -243,14 +257,14 @@
\setvalue{\string\placelayouttextline\v!leeg}#1#2%
{\setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}%
- \vskip#2\relax}
+ }% oeps, bug: \vskip#2\relax}
\setvalue{\string\placelayouttextline\v!start}#1#2%
{\setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}%
\doplacelayouttextline{#1}{#2}}
\setvalue{\string\placelayouttextline\v!stop}#1#2%
- {\vskip#2\relax}
+ {}% oeps, bug:\vskip#2\relax}
\setvalue{\string\placelayouttextline\v!geenmarkering}#1#2%
{\bgroup
@@ -262,22 +276,27 @@
\setvalue{\string\placelayouttextline\s!unknown}#1#2%
{\bgroup % new
\setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}%
- \setlocallayoutline{#1\textlinestatus}%
- \setlocallayoutline{#1\v!tekst\textlinestatus}%
- \setlocallayoutline{#1\v!marge\textlinestatus}%
- \setlocallayoutline{#1\v!rand\textlinestatus}%
+ %\setlocallayoutline{#1\textlinestatus}%
+ %\setlocallayoutline{#1\v!tekst\textlinestatus}%
+ %\setlocallayoutline{#1\v!marge\textlinestatus}%
+ %\setlocallayoutline{#1\v!rand\textlinestatus}%
+ \getvalue{\??tk#1\textlinestatus}%
+ \getvalue{\??tk#1\v!tekst\textlinestatus}%
+ \getvalue{\??tk#1\v!marge\textlinestatus}%
+ \getvalue{\??tk#1\v!rand\textlinestatus}%
\doplacelayouttextline{#1}{#2}%
\egroup}
-\def\setlocallayoutline#1%
- {\ifundefined{\??tk#1}\else\getvalue{\??tk#1}\fi}
+% \def\setlocallayoutline#1%
+% {\ifundefined{\??tk#1}\else\getvalue{\??tk#1}\fi}
%D The following macro has to be called after a page
%D is flushed.
\def\resetlayoutline#1% beware: global assignment
- {\doifvalue{\??tk#1\v!tekst\c!status}{\v!hoog}
- {\setgvalue{\??tk#1\v!tekst\c!status}{\v!normaal}\donetrue}}
+ {\doifvalue{\??tk#1\v!tekst\c!status}\v!hoog
+ {\global\letvalue{\??tk#1\v!tekst\c!status}\v!normaal
+ \donetrue}}
\def\resetlayoutlines%
{\donefalse
@@ -335,6 +354,8 @@
\smashbox\scratchpagebox
\box\scratchpagebox}
+\let\maintextcolor\empty
+
\def\getmainbox#1#2%
{\setbox\scratchpagebox=\vbox
{\offinterlineskip % na \paginaletter !
@@ -361,7 +382,11 @@
\settextpagecontent\scratchpagebox{#1}{#2}%
\addtextbackground\scratchpagebox
\addtextgridlayer\scratchpagebox
- \box\scratchpagebox
+ \ifx\maintextcolor\empty
+ \box\scratchpagebox
+ \else
+ \color[\maintextcolor]{\box\scratchpagebox}%
+ \fi
\bgroup
\hskip\rechtermargeafstand
\ifdim\rechtermargebreedte>\zeropoint
@@ -394,7 +419,7 @@
\hss}%
\dp#1=\zeropoint}
-\def\addtextgridlayer#1%
+\def\addtextgridlayer#1%
{\ifshowgrid
\setgridbox\scratchbox\zetbreedte\teksthoogte
\setbox#1=\hbox
diff --git a/tex/context/base/ppchtex.tex b/tex/context/base/ppchtex.tex
index d3da5174e..2b8729597 100644
--- a/tex/context/base/ppchtex.tex
+++ b/tex/context/base/ppchtex.tex
@@ -3,6 +3,9 @@
% 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, mybe ...
%D \module
%D [ file=ppchtex (m-chemie),
@@ -291,14 +294,14 @@
\newif\ifloweredsubscripts
% Due to some upward incompatibality of LaTeX to LaTeX2.09
-% and/or LaTeX2e we had to force \@@chemicalletter. Otherwise
+% and/or LaTeX2e we had to force \@@dochemicalstyle. Otherwise
% some weird \nullfont error comes up.
\def\beginlatexmathmodehack%
{\ifmmode
\let\endlatexmathmodehack=\relax
\else
- \def\endlatexmathmodehack{$}$\@@chemicalletter
+ \def\endlatexmathmodehack{$}$\@@dochemicalstyle\empty
\fi}
\def\setsubscripts%
@@ -308,10 +311,10 @@
\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}{\textfont 2}{##2}%
+ \dosetsubscript{##1}{\scriptfont 2}{##2}%
\dosetsubscript{##1}{\scriptscriptfont2}{##2}}%
- %\dodosetsubscript{\fontdimen14}{?}%
+ %\dodosetsubscript{\fontdimen14}{?}%
\dodosetsubscript{\fontdimen16}{.7}%
\dodosetsubscript{\fontdimen17}{.7}%
\global\loweredsubscriptstrue
@@ -410,6 +413,8 @@
\newif\ifsmallchemicaltext
+\let\@@localchemicalstyle\empty
+
\def\setupchemicalformat[#1]%
{\processaction
[\getvalue{#1\c!formaat}]
@@ -450,13 +455,20 @@
\doifelse{\@@chemicalchemicaloffset}{LOW}
{\setlowsubscripts}
{\sethighsubscripts}%
- \setupchemicalformat[\??chemical\s!chemical]}
+ \setupchemicalformat[\??chemical\s!chemical]%
+ \ignorespaces}
\def\setupchemical%
{\dosingleargument\dosetupchemical}
-\def\@@chemicalletter% % $inner-style$
- {\@@chemicalchemicalletter} % $$outer-style$$
+\def\@@dochemicalstyle% % default mapping
+ {\@@chemicalletter}
+
+\def\@@dochemicalcolor% % no mapping yet
+ {}
+
+\def\@@chemicalletter % $inner-style$ % (overloaded)
+ {\@@chemicalchemicalletter} % $$outer-style$$
\def\@@writechemicalstatus#1#2%
{}
@@ -470,7 +482,7 @@
\pushMPdrawing
\startMPdrawing
%prologues := 1 ;
- input mp-tool ;
+ %input mp-tool ;
u := 10*\@@chemicalunit;
bboxmargin := 0pt ;
pickup pencircle scaled 2u ; % ???
@@ -485,7 +497,8 @@
\endpspicture
\or
\resetchemicalcoordinates
- \setbox2=\hbox{\MPshiftdrawingtrue\getMPdrawing}%
+ \setbox2=\hbox
+ {\MPshiftdrawingtrue\MPstaticgraphictrue\getMPdrawing}%
\wd2=\!!zeropoint\ht2=\!!zeropoint\dp2=\!!zeropoint
\put {\box2} at 0 0
\endpicture
@@ -524,7 +537,8 @@
\put {\box\chemicalsymbols} at 0 0 % elders
\ifMPdrawingdone
\resetchemicalcoordinates
- \setbox2=\hbox{\MPshiftdrawingtrue\getMPdrawing}%
+ \setbox2=\hbox
+ {\MPshiftdrawingtrue\MPstaticgraphictrue\getMPdrawing}%
\wd2=\!!zeropoint\ht2=\!!zeropoint\dp2=\!!zeropoint
\put {\box2} at 0 0 %
\fi
@@ -540,7 +554,7 @@
\or
\setcoordinatesystem units <\@@chemicalunit,\@@chemicalunit> %
\startMPdrawing
- input mp-tool ;
+ %input mp-tool ;
%prologues := 1 ;
u := 10*#1;
bboxmargin := 0pt ;
@@ -587,7 +601,7 @@
\newcount \currentchemical
%\newif \ifskipchemical
-%
+
\def\setchemicaldimensions#1#2#3%
{\bgroup
\global\advance\currentchemical by 1
@@ -597,7 +611,7 @@
\setxvalue{chemical::\the\currentchemical}%
{\noexpand\docommando{\the\dimen0}{\the\dimen2}{\the\dimen4}}%
\egroup}
-%
+
%\def\getchemicaldimensions#1#2#3%
% {\global\advance\currentchemical by 1
% \def\docommando##1##2##3%
@@ -643,7 +657,7 @@
% \fi
% \egroup
% \global\let\loadchemicaldimensions=\relax}
-
+
\ifx\normalchemicalframe\undefined
\let\normalchemicalframe\hbox % hook for educational purposes
\fi
@@ -653,7 +667,8 @@
[\??chemical][\??chemical\s!chemical]
[\c!breedte,\c!hoogte,\c!links,\c!rechts,\c!boven,\c!onder,
\c!korps,\c!formaat,\c!schaal,\c!status,\c!kader,\c!assenstelsel,
- \c!plaats,\c!optie,\c!variant,\c!resolutie,\c!offset,\c!letter]%
+ \c!plaats,\c!optie,\c!variant,\c!resolutie,\c!offset,\c!letter,
+ \c!kleur,\c!lijnkleur,\c!lijndikte]%
\getparameters
[\??chemical]
[#1]%
@@ -667,6 +682,9 @@
\doif{\@@chemicalvariant}{2}
{\@@setsecondchemicalplotsymbol}%
%
+ \doif{\@@chemicalassenstelsel}{\v!aan}
+ {\let\chemicalframe\hbox}%
+ %
\!!counta=250000
\divide\!!counta by \@@localchemicalscale
\!!widtha=\@@chemicalkorps
@@ -830,14 +848,10 @@
\def\checkchemicaldirection#1#2%
{\ifchemicaldirection
- % \ifnum#1>0 \advance\horchemical by +\chemicaldirection \fi
- % \ifnum#1<0 \advance\horchemical by -\chemicaldirection \fi
- % \ifnum#2>0 \advance\verchemical by +\chemicaldirection \fi
- % \ifnum#2<0 \advance\verchemical by -\chemicaldirection \fi
- \ifnum#1>0 \advance\horchemical by -\chemicaldirection \fi
- \ifnum#1<0 \advance\horchemical by +\chemicaldirection \fi
- \ifnum#2>0 \advance\verchemical by -\chemicaldirection \fi
- \ifnum#2<0 \advance\verchemical by +\chemicaldirection \fi
+ \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}
@@ -845,8 +859,8 @@
{\chemicaldirectiontrue\processchemicaltranslate}
\def\setchemicalcoordinates#1#2%
- {\advance\horchemical by #1\relax
- \advance\verchemical by #2\relax
+ {\advance\horchemical #1\relax
+ \advance\verchemical #2\relax
\checkchemicaldirection{#1}{#2}%
\!!counta=-\horchemical\edef\chemicalxoffset{\the\!!counta}%
\!!countb=-\verchemical\edef\chemicalyoffset{\the\!!countb}%
@@ -955,7 +969,7 @@
\def\chemicaloffset{0}
\def\processchemicaloffset#1%
- {\dimen0=62500 sp % real calc on cardinals
+ {\dimen0=62500 sp % real calc on cardinals, funny number
\dimen0=\chemicalrepeat\dimen0
\divide\dimen0 by \@@localchemicalscale
\!!counta=\dimen0
@@ -982,7 +996,7 @@
\def\processchemicalphantom#1#2%
{\setbox0=\hbox
{\def\splitoff##1????{##1}%
- $\@@chemicalletter{\@@localchemicalformat\splitoff#2}$}%
+ $\@@dochemicalstyle{\@@localchemicalformat\splitoff#2}$}%
\dimen0=.25\wd0
\divide\dimen0 by \@@localchemicalscale
\!!counta=\dimen0
@@ -1127,8 +1141,8 @@
\def\doputchemicaltext#1 [#2] at #3 #4 %
{\ifnum\chemicaldrawingmode=1
\rput
- {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
- {\expanded{\rput[#2]{-\chemicalangle}(#3,#4){#1}}}%
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\expanded{\rput[#2]{\chemicalangle}(#3,#4){#1}}}%
\else
\put {#1} [#2] at {#3} {#4} %
\fi}
@@ -1148,14 +1162,14 @@
{\def\@@chemicalframe{\chemicalframe}}
{\def\@@chemicalframe{}}%
\dosetsubscripts
- \setbox2=\hbox{$\@@chemicalletter{\@@localchemicalformat \chemicaltext}$}%
- \setbox4=\hbox{$\@@chemicalletter{\@@localchemicalformat C_2^2}$}%
- \setbox6=\hbox{$\@@chemicalletter{\@@localchemicalformat O}$}% or C
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@localchemicalformat \chemicaltext}$}%
+ \setbox4=\hbox{$\@@dochemicalstyle{\@@localchemicalformat C_2^2}$}%
+ \setbox6=\hbox{$\@@dochemicalstyle{\@@localchemicalformat O}$}% or C
\doresetsubscripts
\doifnot{\@@chemicalplaats}{\v!intekst}
{\ht2=\ht4
\dp2=\dp4}%
- \setbox2=\hbox{\@@chemicalframe{\box2}}%
+ \setbox2=\hbox{\@@chemicalframe{\@@dochemicalcolor\box2}}%
\ifdim\wd2>\wd6
\doifelse{#1}{0}
{\doifnot{#2}{0}{\wd2=\wd6}}
@@ -1229,8 +1243,8 @@
\def\doputchemicaltext##1 [##2] at ##3 ##4 %
{\ifnum\chemicaldrawingmode=1
\rput
- {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
- {\rput{-\chemicalangle}(\@@xxx,\@@yyy){\expanded{\rput[##2](##3,##4){##1}}}}%
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\rput{\chemicalangle}(\@@xxx,\@@yyy){\expanded{\rput[##2](##3,##4){##1}}}}%
\else
\put
{\stoprotation \setcoordinatesystem point at 0 0
@@ -1287,29 +1301,30 @@
\or
\ifcase\chemicallinetype
\rput
- {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
{\psline(\!!counta,\!!countb)(\!!countc,\!!countd)}%
\or
\rput
- {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
{\psline{->}(\!!counta,\!!countb)(\!!countc,\!!countd)}%
\or
\rput
- {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
{\psline{<-}(\!!counta,\!!countb)(\!!countc,\!!countd)}%
\or
\rput
- {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
{\expanded{\rput[\chemicallineposition]{-\chemicalangle}%
(\!!counta,\!!countb){\psline(0,0)(\!!counte,\!!countf)}}}%
\else
\psset{linestyle=dashed}%
\rput
- {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
{\psline(\!!counta,\!!countb)(\!!countc,\!!countd)}%
\fi
\or
\global\MPdrawingdonetrue
+ \setchemicalattributes
\startMPdrawing
x0 := \MPdivten[\chemicalxoffset]u ;
y0 := \MPdivten[\chemicalyoffset]u ;
@@ -1339,7 +1354,8 @@
\else
% 4 : dashed line
draw ((z1--z2) rotatedaround(origin,-\chemicalangle))
- shifted z0 dashed evenly ;
+% shifted z0 dashed evenly ;
+ shifted z0 dashed dashpattern(on 5.5u off 6u) ;
\fi
\stopMPdrawing
\fi
@@ -1355,6 +1371,7 @@
{\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
\ifnum\chemicaldrawingmode=2
\global\MPdrawingdonetrue
+ \setchemicalattributes
\startMPdrawing
x0 := \MPdivten[\chemicalxoffset]u ;
y0 := \MPdivten[\chemicalyoffset]u ;
@@ -1399,6 +1416,7 @@
{\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
\ifnum\chemicaldrawingmode=2
\global\MPdrawingdonetrue
+ \setchemicalattributes
\startMPdrawing
x0 := \MPdivten[\chemicalxoffset]u ;
y0 := \MPdivten[\chemicalyoffset]u ;
@@ -1515,12 +1533,13 @@
1050 0 /
\endpicture
\or
- \rput{\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ \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 ;
@@ -1559,10 +1578,11 @@
\psset{linestyle=dashed}%
\fi
\rput
- {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
{\psarc(0,0){#3}{#1}{#2}}%
\or
\global\MPdrawingdonetrue
+ \setchemicalattributes
\startMPdrawing
r := \MPdivten[#3]*2u;
x0 := \MPdivten[\chemicalxoffset]u ;
@@ -1624,8 +1644,8 @@
\egroup
\ifnum\chemicaldrawingmode=1
\rput
- {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
- {\expanded{\rput[\chemicalloca]{-\chemicalangle}(#1,#2){\box\nextbox}}}%
+ {-\chemicalangle}(\chemicalxoffset,\chemicalyoffset)%
+ {\expanded{\rput[\chemicalloca]{\chemicalangle}(#1,#2){\box\nextbox}}}%
\else
\expanded{\put{\box\nextbox}[\chemicalloca] at {#1} {#2} }
\fi
@@ -1754,9 +1774,9 @@
{#1[#2][#3]}% % experiment
\def\complexdododochemical[##1]% % experiment
{\def\dowithchemical% % experiment
- {\localthisischemical{#2}}% % experiment
+ {\localthisischemical{#2}}% % experiment
#1[#3][##1]}% % experiment
- \complexorsimple\dododochemical} % experiment
+ \complexorsimple\dododochemical} % experiment
\def\dodochemical[#1][#2]%
{\ignorespaces
@@ -1860,46 +1880,52 @@
\def\dochemicaltop#1#2#3#4%
{\vbox
- {\baselineskip=\chemicaltfraction\baselineskip \lineskip0pt
+ {\@@dochemicalcolor
+ \baselineskip=\chemicaltfraction\baselineskip \lineskip0pt
\halign
{#1###2\cr
- $\@@chemicalletter{\scriptscriptstyle#3}$\cr
- $\@@chemicalletter{\@@currentchemicalformat#4}$\cr}}}
+ $\@@dochemicalstyle{\scriptscriptstyle#3}$\cr
+ $\@@dochemicalstyle{\@@currentchemicalformat#4}$\cr}}}
\def\dochemicalbottom#1#2#3#4%
{\vtop
- {\baselineskip=\chemicalbfraction\baselineskip \lineskip0pt
+ {\@@dochemicalcolor
+ \baselineskip=\chemicalbfraction\baselineskip \lineskip0pt
\halign
{#1###2\cr
- $\@@chemicalletter{\@@currentchemicalformat#4}$\cr
- $\@@chemicalletter{\scriptscriptstyle#3}$\cr}}}
+ $\@@dochemicalstyle{\@@currentchemicalformat#4}$\cr
+ $\@@dochemicalstyle{\scriptscriptstyle#3}$\cr}}}
\def\chemicalleft#1#2%
{\hbox
- {$\@@chemicalletter{\scriptscriptstyle#1}$%
- $\@@chemicalletter{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\scriptscriptstyle#1}$%
+ $\@@dochemicalstyle{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}
\def\chemicalright#1#2%
{\hbox
- {$\@@chemicalletter{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$%
- $\@@chemicalletter{\scriptscriptstyle#1}$}}
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$%
+ $\@@dochemicalstyle{\scriptscriptstyle#1}$}}
\def\chemicalcentered#1%
- {\setbox0=\hbox{$\@@chemicalletter{\scriptscriptstyle#1}$}%
- \setbox2=\hbox{$\@@chemicalletter{\@@currentchemicalformat C}$}%
+ {\setbox0=\hbox{$\@@dochemicalstyle{\scriptscriptstyle#1}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
\dimen0=.5\ht2
\advance\dimen0 by -.5\ht0
\advance\dimen0 by \dp0
- \raise\dimen0\box0}
+ \hbox{\@@dochemicalcolor\raise\dimen0\box0}}
\def\chemicalleftcentered#1#2%
{\hbox
- {\chemicalcentered{#1}%
- $\@@chemicalletter{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}
+ {\@@dochemicalcolor
+ \chemicalcentered{#1}%
+ $\@@dochemicalstyle{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}
\def\chemicalrightcentered#1#2%
{\hbox
- {$\@@chemicalletter{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$%
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$%
\chemicalcentered{#1}}}
\def\chemicaltop {\dochemicaltop \hss \hss }
@@ -1915,24 +1941,27 @@
\def\chemicalbottomright#1{\chemicalright{\chemicalleftbottom{#1}{}}}
\def\chemicalsmashedleft#1%
- {\bgroup
- \setbox0=\hbox{$\@@chemicalletter{\@@currentchemicalformat C}$}%
- \setbox2=\hbox{$\@@chemicalletter{\@@currentchemicalformat#1}$}%
+ {\hbox\bgroup
+ \@@dochemicalcolor
+ \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
\wd2=\wd0
\box2
\egroup}
\def\chemicalsmashedmiddle#1%
- {\bgroup
- \setbox0=\hbox{$\@@chemicalletter{\@@currentchemicalformat C}$}%
- \setbox2=\hbox{$\@@chemicalletter{\@@currentchemicalformat#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%
- {\bgroup
- \setbox0=\hbox{$\@@chemicalletter{\@@currentchemicalformat C}$}%
- \setbox2=\hbox{$\@@chemicalletter{\@@currentchemicalformat#1}$}%
+ {\hbox\bgroup
+ \@@dochemicalcolor
+ \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}%
+ \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}%
\hbox to \wd0{\hskip-\wd2\hskip\wd0\box2}%
\egroup}
@@ -1940,7 +1969,9 @@
\def\chemicalforever#1#2%
{\bgroup
- \setbox0=\hbox{$\@@chemicalletter{\scriptscriptstyle\hskip-.15em#2}$}%
+ \setbox0=\hbox
+ {\@@dochemicalcolor
+ $\@@dochemicalstyle{\scriptscriptstyle\hskip-.15em#2}$}%
\wd0=0pt
\big#1_{\hskip.1em\box0}%
\egroup}
@@ -2064,22 +2095,22 @@
{{\setbox0=\hbox{$#1+$}%
\raise\dp0\hbox{$#1#2$}}}
-\def\chemicalinnersign#1%
+\def\chemicalinnersign#1% todo: \@@chemicaltextcolor
{\chemicalraise{\@@localchemicalstyle}{#1}}
\def\chemicaloutersign#1%
- {\chemicalraise{}{#1}}
+ {\chemicalraise{}{\@@dochemicalcolor#1}}
\def\chemicalsingleinnerarrow#1#2%
{\chemicalraise{\@@localchemicalstyle}{\longrightarrow}}
-\def\chemicaldoubleinnerarrow#1#2%
+\def\chemicaldoubleinnerarrow#1#2% todo: \@@chemicaltextcolor
{\lower.2ex\hbox
{\setbox0=\hbox{$\@@localchemicalstyle\longrightarrow$}%
\setbox2=\hbox{$\@@localchemicalstyle\longleftarrow$}%
\wd0=0pt\raise\ht0\box0\box2}}
-\def\chemicaltwintipinnerarrow#1#2%
+\def\chemicaltwintipinnerarrow#1#2% todo: \@@chemicaltextcolor
{\hbox
{\setbox0=\hbox{\chemicalraise{\@@localchemicalstyle}{\longrightarrow}}%
\setbox2=\hbox{\chemicalraise{\@@localchemicalstyle}{\longleftarrow}}%
@@ -2088,8 +2119,8 @@
\def\dochemicalouterarrow#1#2#3%
{\bgroup
\setbox0=\hbox{$\longrightarrow$}%
- \setbox2=\hbox{$\@@chemicalletter{\scriptstyle\quad#2\quad}$}%
- \setbox4=\hbox{$\@@chemicalletter{\scriptstyle\quad#3\quad}$}%
+ \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
@@ -2117,61 +2148,54 @@
\hskip-\dimen2
\hbox to \dimen2{\leftarrowfill}}}}
-\def\chemicalinnermolecule#1#2#3% #3 vergeten
- {\chemicalspace
- %\mathop % onnodig en genereert spatie aan het begin van een regel
- {\dosetsubscripts
- \hbox{$\@@chemicalletter{\@@localchemicalstyle\strut#1}$}%
- \doresetsubscripts}%
+\def\chemicalinnermolecule#1#2#3% no mathop here, can generate space
+ {\chemicalspace % todo: \@@chemicaltextcolor
+ \bgroup
+ \dosetsubscripts
+ \hbox{$\@@dochemicalstyle{\@@localchemicalstyle\strut#1}$}%
+ \doresetsubscripts
+ \egroup
\chemicalspace}
-%\def\chemicaloutermolecule#1#2#3%
-% {\chemicalspace
-% \setbox0=\hbox % else the font is reset
-% {\dosetsubscripts
-% \hbox{$\@@chemicalletter{\strut#1}$}%
-% \doresetsubscripts}%
-% \mathop{\box0}%
-% \doifnot{#2}{}
-% {_{\@@chemicalletter{\strut\ifthirdargument#3\else#2\fi}}}%
-% \doifnot{#3}{}
-% {^{\@@chemicalletter{\strut\ifthirdargument#2\else#3\fi}}}%
-% \chemicalspace}
-
\def\chemicaloutermolecule#1#2#3%
{\chemicalspace
+ \bgroup
+ \@@dochemicalcolor
\setbox0=\hbox % else the font is reset
{\dosetsubscripts
- \hbox{$\@@chemicalletter{\strut#1}$}%
+ \hbox{$\@@dochemicalstyle{\strut#1}$}%
\doresetsubscripts}%
\mathop{\box0}%
\ifthirdargument
\doifnot{#2}{}
- {^{\@@chemicalletter{\strut#2}}}%
+ {^{\@@dochemicalstyle{\strut#2}}}%
\doifnot{#3}{}
- {_{\@@chemicalletter{\strut#3}}}%
+ {_{\@@dochemicalstyle{\strut#3}}}%
\else
\doifnot{#2}{}
- {_{\@@chemicalletter{\strut#2}}}%
+ {_{\@@dochemicalstyle{\strut#2}}}%
\fi
+ \egroup
\chemicalspace}
\def\chemicalsinglepicturearrow#1%
{\lower.5ex\hbox
- {$\chemicalspace
+ {\@@dochemicalstyle
+ $\chemicalspace
\buildrel
- \@@chemicalletter{\scriptstyle\quad#1\quad}%
+ \@@dochemicalstyle{\scriptstyle\quad#1\quad}%
\over{\overrightarrow
{\hphantom{\@chemicalletter{\scriptstyle\quad#1\quad}}}}%
\chemicalspace$}}
\def\chemicaldoublepicturearrow#1%
{\lower.5ex\hbox
- {$\chemicalspace
+ {\@@dochemicalstyle
+ $\chemicalspace
\buildrel
- \@@chemicalletter{\scriptstyle\quad#1\quad}%
+ \@@dochemicalstyle{\scriptstyle\quad#1\quad}%
\over{\overrightarrow{\overleftarrow
- {\hphantom{\@@chemicalletter{\scriptstyle\quad#1\quad}}}}}%
+ {\hphantom{\@@dochemicalstyle{\scriptstyle\quad#1\quad}}}}}%
\chemicalspace$}}
% Bij de in-line bindingen wordt gebruik gemaakt van
@@ -2181,11 +2205,12 @@
\def\somechemicalbond%
{\hrule width \wd0 height .4pt}
-\def\dochemicalbonds#1#2#3%
+\def\dochemicalbonds#1#2#3% todo: \@@chemicaltextletter
{{\setbox0=\hbox
- {$\@@chemicalletter{\@@localchemicalstyle M}$}%
+ {${\@@localchemicalstyle M}$}%
\vbox to \ht0
- {\hsize\wd0
+ {\@@dochemicalcolor
+ \hsize\wd0
\vskip.1\wd0#1\vfill#2\vfill#3\vskip.1\wd0}}}
\def\singlechemicalbond%
@@ -3135,7 +3160,7 @@ RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
\dogetcommalistelement2\from#3\to\bottext
\def\dochemicaltext##1%
{\dosetsubscripts%
- $\@@chemicalletter{\@@localchemicalformat\strut##1}$%
+ $\@@dochemicalstyle{\@@localchemicalformat\strut##1}$%
\doresetsubscripts}%
\doifelse{\@@chemicalplaats}{\v!intekst}%
{#1{\dochemicaltext\toptext}}%
@@ -3164,12 +3189,12 @@ RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
\def\executechemicalsign#1[#2]%
{\doifelse{\@@chemicalplaats}{\v!intekst}
{\dosetsubscripts
- $\@@chemicalletter{\@@localchemicalformat#1}$%
+ $\@@dochemicalstyle{\@@localchemicalformat#1}$%
\doresetsubscripts}
{\setbox\chemicalsymbols=\hbox
{\box\chemicalsymbols
\dosetsubscripts
- $\@@chemicalletter{\@@localchemicalformat#1}$%
+ $\@@dochemicalstyle{\@@localchemicalformat#1}$%
\doresetsubscripts}}}
\def\executechemicalPLUS%
@@ -3191,7 +3216,7 @@ RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
{\doifnot{\@@chemicalplaats}{\v!intekst}%
{\setbox\chemicalsymbols=\hbox
{\box\chemicalsymbols
- $\@@chemicalletter{\@@localchemicalformat#1}$}}}
+ $\@@dochemicalstyle{\@@localchemicalformat#1}$}}}
\def\executechemicalTEXT[#1]%
{\doifnot{\@@chemicalplaats}{\v!intekst}%
@@ -3213,6 +3238,7 @@ RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
\bgroup
\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
\global\MPdrawingdonetrue
+ \setchemicalattributes
\startMPdrawing
x1 := \MPdivten[\the\!!counta]u ;
y1 := \MPdivten[\the\!!countb]u ;
@@ -3262,6 +3288,8 @@ RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
\def\executechemicalUPDOWNARROW[#1]%
{\executechemicalverticalsymbol\updownarrow{#1}}
+\let\setchemicalattributes\relax
+
\setupchemical
[\c!breedte=0,
\c!hoogte=0,
@@ -3281,7 +3309,10 @@ RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
\c!plaats=,
\c!optie=,
\c!offset=LOW,
- \c!variant=1]
+ \c!variant=1,
+ \c!kleur=,
+ \c!lijndikte=,
+ \c!lijnkleur=]
% Tijdelijk plaatsen we deze extra macro's hier.
%
@@ -3312,10 +3343,55 @@ RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
{\offinterlineskip
\halign
{\hss##\hss\cr
- $\@@chemicalletter{\@@localchemicalformat\scriptscriptstyle#1}$\cr
+ $\@@dochemicalstyle{\@@localchemicalformat\scriptscriptstyle#1}$\cr
\noalign{\vskip.5ex}%
- $\@@chemicalletter{\@@localchemicalformat#2}$\cr}}}
+ $\@@dochemicalstyle{\@@localchemicalformat#2}$\cr}}}
+
+%D Here are a couple of \CONTEXT\ goodies:
+%D
+%D \startopsomming
+%D \som styles hooked into \CONTEXT\ style mechanism
+%D \som support for color and rulethickness (mp mode only)
+%D \som position tracking
+%D \stopopsoming
+
+\ifCONTEXT
+
+\def\setchemicalattributes
+ {\scratchdimen=\@@chemicalchemicallijndikte
+ \def\chemicalattributes
+ {withpen pencircle scaled \the\scratchdimen\space
+ withcolor }%
+ \doifelsenothing{\@@chemicalchemicallijnkleur}
+ {\edef\chemicalattributes{\chemicalattributes black}}
+ {\edef\chemicalattributes
+ {\chemicalattributes \MPcolor{\@@chemicalchemicallijnkleur}}}%
+ \startMPdrawing
+ drawoptions (\chemicalattributes) ;
+ \stopMPdrawing}
+
+\let\@@chemicalkleur\empty
+
+\def\@@dochemicalcolor
+ {\doifsomething{\@@chemicalkleur}{\color[\@@chemicalkleur]}}
+
+\def\@@dochemicalstyle
+ {\doconvertfont{\@@chemicalletter}}
+
+\setupchemical
+ [\c!lijndikte=\linewidth,
+ \c!lijnkleur=,
+ \c!kleur=]
+\def\cpos#1#2%
+ {\bgroup
+ \pushmacro\dowithchemical
+ \gdef\dowithchemical##1{\hpos{#1}{##1}\popmacro\dowithchemical}%
+ #2%
+ \egroup}
+
+\fi
+
\protect
\endinput
diff --git a/tex/context/base/s-abr-01.tex b/tex/context/base/s-abr-01.tex
index 7d8e12ad5..a1347030a 100644
--- a/tex/context/base/s-abr-01.tex
+++ b/tex/context/base/s-abr-01.tex
@@ -89,6 +89,7 @@
\logo [MODULA] {Modula}
\logo [MOV] {mov}
\logo [MPS] {mps}
+\logo [MPTOPDF] {mptopdf}
\logo [MSDOS] {msdos}
\logo [MSWINDOWS] {MS~Windows}
\logo [NETPBM] {NetPBM}
@@ -114,6 +115,7 @@
\logo [PSCHECK] {pscheck}
\logo [PSTOPAGE] {pstopage}
\logo [PSTRICKS] {pstricks}
+\logo [PSTOEDIT] {pstoedit}
\logo [PS] {Post\-Script}
\logo [RGB] {rgb}
\logo [SGML] {sgml}
diff --git a/tex/context/base/s-faq-01.tex b/tex/context/base/s-faq-01.tex
index 6e73d70d4..8c116e0f7 100644
--- a/tex/context/base/s-faq-01.tex
+++ b/tex/context/base/s-faq-01.tex
@@ -129,7 +129,7 @@
[bottom 1]
[state=start]
-\def\EndAnswer%
+\def\EndAnswer
{\vfill
\bgroup
\tfx\setstrut
@@ -141,7 +141,7 @@
{\AuthorOfFAQ}
\egroup}
-\def\TitlePage%
+\def\TitlePage
{\startstandardmakeup
\blank[3*big]
\midaligned{\bfd \labeltext{FAQ}}
@@ -156,16 +156,22 @@
\blank[3*big]
\stopstandardmakeup}
-\def\FileWithFAQs%
+\def\StartReadingFAQ
{\setupinteractionmenu[bottom 1][state=stop]
\setupinteractionmenu[bottom 2][state=start]
- \page
- \input \FileNameOfFAQ \relax
- \page
+ \page}
+
+\def\StopReadingFAQ
+ {\page
\setupinteractionmenu[bottom 2][state=stop]
\setupinteractionmenu[bottom 1][state=start]}
-\def\IndexPage%
+\def\FileWithFAQs
+ {\StartReadingFAQ
+ \input \FileNameOfFAQ \relax
+ \StopReadingFAQ}
+
+\def\IndexPage
{\page
\def\CurrentIndexOfFAQ{}
\def\NameOfFAQ{}
@@ -173,19 +179,22 @@
\placeregister[index]
\page}
-\def\BeginFAQ%
+\def\BeginFAQ
{\doglobal\increment\CurrentNOfFAQ
\setbox0=\vbox\bgroup
\setupframedtexts[before=,after=,linecorrection=off]
\startframedtext}
-\def\EndFAQ%
+\def\EndFAQ
{\stopframedtext
\egroup
- \button[color=,contrastcolor=,frame=overlay,offset=overlay]{\copy0}[faq:\CurrentNOfFAQ]
+ \button
+ [color=,contrastcolor=,frame=overlay,offset=overlay]
+ {\copy0}
+ [faq:\CurrentNOfFAQ]
\vskip6pt}
-\def\AllFAQs%
+\def\AllFAQs
{\page
\def\CurrentIndexOfFAQ{}
\def\NameOfFAQ{}
diff --git a/tex/context/base/s-faq-02.tex b/tex/context/base/s-faq-02.tex
index 7247ee6a1..02287bde4 100644
--- a/tex/context/base/s-faq-02.tex
+++ b/tex/context/base/s-faq-02.tex
@@ -41,14 +41,23 @@
\blank[3*big]
\stopstandardmakeup}
-\def\FileWithFAQs%
- {\page
+\def\StartReadingFAQ
+ {\page}
+
+\def\StopReadingFAQ
+ {\page}
+
+\def\FileWithFAQs
+ {\StartReadingFAQ
\input \FileNameOfFAQ \relax
- \page}
+ \StopReadingFAQ}
-\def\IndexPage%
+\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
index 7d4b5edc4..4f556f713 100644
--- a/tex/context/base/s-faq-03.tex
+++ b/tex/context/base/s-faq-03.tex
@@ -11,6 +11,33 @@
%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}
@@ -38,17 +65,6 @@
\IndexPage
\stoptext}
-\def\DVIpaperFAQ \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-mod-00.tex b/tex/context/base/s-mod-00.tex
index b3f11e1a9..26720368c 100644
--- a/tex/context/base/s-mod-00.tex
+++ b/tex/context/base/s-mod-00.tex
@@ -22,7 +22,7 @@
\newprettytrue
-\gebruikmodule[eenheid]
+\usemodule[eenheid]
\mainlanguage[en]
@@ -39,10 +39,10 @@
% nog eens \interface \\ \\ verder doorvoeren
\def\resetmodule%
- {\getparameters
+ {\getrawparameters
[Module]
[ file=\jobname,
- version={\currentdate[jaar,{.},maand,{.},dag]},
+ version={\currentdate[\v!jaar,{.},\v!maand,{.},\v!dag]},
title=,
subtitle=,
author=Hans Hagen,
@@ -55,20 +55,20 @@
\def\dostartmodule[#1]%
{\newcounter\ParagraphNumber
\resetmodule
- \getparameters[Module][type=tex,#1]}
+ \getrawparameters[Module][type=tex,#1]}
\def\startmodule%
{\dosingleempty\dostartmodule}
\def\complexmodule[#1]%
- {\startglobaal % i.v.m. \bgroup in \startdocumentation
- \getparameters[Module][#1]
- \stopglobaal % i.v.m. \bgroup in \startdocumentation
+ {\startglobal % i.v.m. \bgroup in \startdocumentation
+ \getrawparameters[Module][#1]
+ \stopglobal % i.v.m. \bgroup in \startdocumentation
\moduletitel}
\def\stopmodule%
{\pagina
- \plaatsindex
+ \plaatsregister[\v!index]
[\c!balanceren=\v!ja,
\c!aanduiding=\v!nee,
\c!criterium=\v!tekst]}
@@ -78,55 +78,139 @@
\definecomplexorsimple\module
-\startmode[atpragma]
-
- \def\TitelPagina#1% can be done more efficient
- {\startMPrun
- mpgraph := #1 ;
- input mp-cont ;
- \stopMPrun
- \externalfigure
- [\bufferprefix mprun.#1]
- [\c!hoogte=\vsize,
- \c!breedte=\hsize]}
-
- \definieeroverlay[titelpagina][\TitelPagina{512}]
-
-\stopmode
+% \startmode[atpragma]
+%
+% \def\TitelPagina#1% can be done more efficient
+% {\startMPrun
+% mpgraph := #1 ;
+% input mp-cont ;
+% \stopMPrun
+% \externalfigure
+% [\bufferprefix mprun.#1]
+% [\c!hoogte=\vsize,
+% \c!breedte=\hsize]}
+%
+% \defineoverlay[titelpagina][\TitelPagina{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
+ [titelpagina]
+ [\useMPgraphic{titlepage}]
+
+% When run at \PRAGMA, we use a slightly difgferent graphic,
+% so that we can recognize an original. Users are not
+% supposed to mimick this feature.
+
+\doifmode{atpragma}{\readfile{s-mod-04.tex}{}{}}
+
+\defineframed
+ [TitleFrame]
+ [\c!achtergrond=\v!kleur,
+ \c!achtergrondkleur=wit,
+ \c!uitlijnen=\v!rechts,
+ \c!offset=12pt,
+ \c!strut=\v!nee,
+ \c!kader=\v!uit,
+ \c!onder=]
+
+\definelayout
+ [titlepage]
+ [\c!rugwit=0pt,
+ \c!kopwit=0pt,
+ \c!hoofd=0pt,
+ \c!voet=0pt,
+ \c!hoogte=\v!midden,
+ \c!breedte=\v!midden]
\def\moduletitel%
- {\ifx\ModuleNumber\undefined \else
+ {\stellayoutin[titlepage]
+ \ifx\ModuleNumber\undefined \else
\ifnum\ModuleNumber<10
- \edef\ModuleNumber{00\ModuleNumber}%
+ \edef\ModuleNumber{00\ModuleNumber}
\else\ifnum\ModuleNumber<100
- \edef\ModuleNumber{0\ModuleNumber}%
+ \edef\ModuleNumber{0\ModuleNumber}
\fi\fi
- \stelachtergrondenin
+ \setupbackgrounds
[\v!pagina]
[\c!achtergrond=titelpagina]
\fi
- \startstandaardopmaak[\c!hoofdstatus=\v!geen,\c!voetstatus=\v!geen]
- \switchnaarkorps[14.4pt,ss]
- \definefont[temp][SansBold at 72pt] % \font\temp=cmssbx10 at 72pt
+ \startmakeup[\v!standaard][\c!hoofdstatus=\v!geen,\c!voetstatus=\v!geen]
+ \switchtobodyfont[14.4pt,ss]
\bgroup
\def\CONTEXT {Con\kern-.15em\TeX t}
\def\TEXUTIL {\TeX Util}
\def\PPCHTEX {PPCH\TeX}
- \regellinks{\temp \CONTEXT} \vskip24pt
- \doifelse{\Modulesubtitle}{}
- {\regellinks{\bfd \Moduletitle} \vfill}
- {\regellinks{\bfd \Modulesubtitle} \vfill
- \doifnot{\Moduletitle}{}
- {\regellinks{\bf category: \Moduletitle} \vskip6pt}}
- \regellinks{\bf author: \Moduleauthor} \vskip6pt
- \regellinks{\bf date: \currentdate} \vskip6pt
- \doifnot{\Modulesuggestions}{}
- {\regellinks{\bs suggestions: \Modulesuggestions} \vskip6pt}
+ \def\METAPOST{MetaPost}
+ \hfill
+ {\definedfont[SansBold at 96pt]\setstrut
+ \TitleFrame{\CONTEXT}}
+ \vfill
+ \definetabulate[temp][|l|l|]%
+ \switchtobodyfont[17.3pt,ss]
+ \hfill
+ {\bf\setstrut
+ \TitleFrame
+ {\insidefloattrue\steltabulatiein[\c!voor=,\c!na=]%
+ \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
- \stopstandaardopmaak
+ \stopmakeup
\ifx\ModuleNumber\undefined \else
- \stelachtergrondenin[\v!pagina][\c!achtergrond=]
- \fi}
+ \setupbackgrounds
+ [\v!pagina]
+ [\c!achtergrond=]
+ \fi
+ \stellayoutin}
\let\stopdocumentation=\relax
@@ -142,41 +226,38 @@
\gdef\CompressDefinitions%
{\ifcompressdefinitions
- \switchnaarkorps[klein]%
+ \switchtobodyfont[\v!klein]%
\fi}
-\definieertypen
- [definition]
+\startnotmode[nocode]
+
+ \definetyping
+ [definition]
+
+ \setuptyping
+ [definition]
+ [\c!voor={\pagina[\v!voorkeur]}\blanko\PresetParagraphNumber\CompressDefinitions,
+ \c!na=\ResetParagraphNumber\blanko,
+ \c!optie=\Moduletype]
-\steltypenin
- [definition]
- [\c!voor={\pagina[\v!voorkeur]}\blanko\PresetParagraphNumber\CompressDefinitions,
- \c!na=\ResetParagraphNumber\blanko,
- \c!optie=\Moduletype]
+\stopnotmode
-\definieertypen
- [PL]
- [\c!optie=PL,
- \c!marge=\v!standaard]
+\startmode[nocode]
-\definieertypen
- [JV]
- [\c!optie=JV,
- \c!marge=\v!standaard]
+% \definieerbuffer[definition] % ignore
-\definieertypen
- [MP]
- [\c!optie=MP,
- \c!marge=\v!standaard]
+ \long\def\startdefinition#1\stopdefinition{}
+
+\stopmode
-\definieertypen
- [TEX]
- [\c!optie=TEX,
- \c!marge=\v!standaard]
+\definetyping [PL] [\c!optie=PL, \c!marge=\v!standaard]
+\definetyping [JV] [\c!optie=JV, \c!marge=\v!standaard]
+\definetyping [MP] [\c!optie=MP, \c!marge=\v!standaard]
+\definetyping [TEX] [\c!optie=TEX,\c!marge=\v!standaard]
-\steltypenin [\v!typen] [\c!marge=\v!standaard]
-\steltypenin [\v!file] [\c!marge=\v!standaard]
-\steltypenin [definition] [\c!marge=0pt]
+\setuptyping [\v!typen] [\c!marge=\v!standaard]
+\setuptyping [\v!file] [\c!marge=\v!standaard]
+\setuptyping [definition] [\c!marge=0pt]
\newcounter\NOfMarginLines
\newcounter\ParagraphNumber
@@ -230,7 +311,7 @@
\def\margeaanduidingen#1[#2]%
{\def\domargeaanduidingen##1##2%
{\margetitel[#2]%
- {\switchnaarkorps[klein]%
+ {\switchtobodyfont[\v!klein]%
\doglobal\newcounter\NOfMarginLines
\dodomargeaanduidingen[##1]#1%
\scratchcounter=\NOfMarginLines
@@ -241,14 +322,27 @@
\processcommalist[##2]\index}}%
\dodoublegroupempty\domargeaanduidingen}
-\def\complexmacros%
- {\margeaanduidingen\tex}
+\def\complexmacros{\margeaanduidingen\tex }
+\def\complexextras{\margeaanduidingen\relax}
-\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!status=\v!stop]
+ \showXSDcomponent[#1][#2]
+ \egroup}
% \macros{a,b}
% \macros{a,b}{b}
@@ -373,6 +467,7 @@
\VL \THREE{\bf subsentence symbol and quotes} \VL\SR
\HL
\VL \citaat{#3 #4} \VL \citeer{#2} \VL \let|=\normalbar |<||<|#3|>|#4|>| \VL\SR
+ \VL \citaat{#3 #4} \VL \citeer{#2} \VL |<||<|#3|>|#4|>| \VL\SR
\HL
\stoptabel
\egroup
@@ -404,7 +499,7 @@
{\doglobal\newcounter\CurrentArgument
\setup}
-\stelkadertekstenin
+\setupframedtexts
[setuptext]
[\c!achtergrond=\v!raster,
\c!kader=\v!uit]
diff --git a/tex/context/base/s-mod-01.tex b/tex/context/base/s-mod-01.tex
index f6426f976..bac50cc8e 100644
--- a/tex/context/base/s-mod-01.tex
+++ b/tex/context/base/s-mod-01.tex
@@ -18,10 +18,10 @@
\unprotect
-\stelkorpsin
+\setupbodyfont
[10pt,ams]
-\taal
+\mainlanguage
[en]
\stelwitruimtein
@@ -60,13 +60,13 @@
\stelnummeringin
[\c!plaats=]
-\stelvoettekstenin
+\setupfootertexts
[\v!rand]
[][\v!paginanummer]
\startmode[single]
- \stelvoettekstenin
+ \setupfootertexts
[\v!marge]
[\tt\Modulefile][]
@@ -74,19 +74,19 @@
\startnotmode[single]
- \stelvoettekstenin
+ \setupfootertexts
[\v!marge]
[\tt\Modulefile][]
[\tt\Modulefile][]
\stopnotmode
-\stelvoettekstenin
+\setupfootertexts
[\v!tekst]
[\CONTEXT]
[\Moduletitle]
-\stelhoofdtekstenin
+\setupheadertexts
[\v!tekst]
[]
[\Modulesubtitle]
@@ -104,7 +104,7 @@
\c!hoofd=\v!leeg]
\stelkopin
- [paragraaf]
+ [\v!paragraaf]
[\c!letter=\ssb,
\c!pagina=\v!rechts]
@@ -113,32 +113,34 @@
[\c!letter=\v!vet,
\c!na=\blanko]
-\stelinhoudin
+\stelsamengesteldelijstin
+ [\v!inhoud]
[\c!breedte=3em,
\c!titeluitlijnen=\v!ja]
-\stelindexin
+\stelregisterin
+ [\v!index]
[\c!balanceren=\v!ja,
\c!aanduiding=\v!nee]
\startnotmode[nocolor]
-\stelkleurenin
+\setupcolors
[\c!status=\v!start]
\stopnotmode
\startnotmode[color]
- \stelkleurenin
+ \setupcolors
[\c!conversie=\v!altijd]
- \steltypenin
+ \setuptyping
[\c!palet=graypretty]
\stopnotmode
-\stelinteractiein
+\setupinteraction
[\c!status=\v!start,
\c!kleur=,
\c!letter=]
diff --git a/tex/context/base/s-pre-19.tex b/tex/context/base/s-pre-19.tex
index e5477e1e6..d924d97bc 100644
--- a/tex/context/base/s-pre-19.tex
+++ b/tex/context/base/s-pre-19.tex
@@ -330,9 +330,6 @@ enddef ;
\starttext
-% \useenvironment[pre-organic]
-% \setupoutput[pdftex]
-
\setupMPvariables[page][alternative=3]
\TitlePage
diff --git a/tex/context/base/setupa.tex b/tex/context/base/setupa.tex
index cf4188b0d..220e3ba38 100644
--- a/tex/context/base/setupa.tex
+++ b/tex/context/base/setupa.tex
@@ -8,15 +8,15 @@
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
-\startmessages dutch library: setup
+\startmessages dutch library: setup
title: setup
formula: formule
number: getal
list: lijst
- dimension: maat
+ dimension: maat
mark: markering
reference: verwijzing
command: commando
@@ -24,6 +24,7 @@
name: naam
text: tekst
section: sectie
+sectionnumber: sectienummer
singular: naam enkelvoud
plural: naam meervoud
matrix: n*m
@@ -34,12 +35,12 @@
4: -- wordt nogmaals verwerkt
\stopmessages
-\startmessages english library: setup
+\startmessages english library: setup
title: setup
formula: formula
number: number
list: list
- dimension: dimension
+ dimension: dimension
mark: mark
reference: reference
command: command
@@ -47,10 +48,11 @@
name: name
text: text
section: section
- singular: singular name
- plural: plural name
+sectionnumber: sectionnumber
+ singular: singular name
+ plural: plural name
matrix: n*m
- see: see
+ see: see
1: the characters < and > are globally active!
2: -- is processed
3: -- is undefined
@@ -70,6 +72,7 @@
name: Name
text: Text
section: Abschnitt
+sectionnumber: Abschnittnummer
singular: singular
plural: plural
matrix: n*m
@@ -93,6 +96,7 @@
name: jmeno
text: text
section: sekce
+sectionnumber: sekcecislo % ?
singular: jmeno v singularu
plural: jmeno v pluralu
matrix: n*m
@@ -103,12 +107,12 @@
4: -- je zpracovano znovu
\stopmessages
-\startmessages italian library: setup
+\startmessages italian library: setup
title: setup
formula: formula
number: number
list: list
- dimension: dimension
+ dimension: dimension
mark: mark
reference: reference
command: command
@@ -116,16 +120,17 @@
name: name
text: text
section: section
- singular: singular name
- plural: plural name
+sectionnumber: sectionnumber
+ singular: singular name
+ plural: plural name
matrix: n*m
- see: see
+ see: see
1: the characters < and > are globally active!
2: -- is processed
3: -- is undefined
4: -- is processed again
\stopmessages
-
+
\startmessages romanian library: setup
title: setari
formula: formula
@@ -139,6 +144,7 @@
name: nume
text: text
section: sectiune
+ sectionnumber: sectiunenumar % ?
singular: nume singular
plural: nume pluram
matrix: n*m
@@ -149,9 +155,9 @@
4: -- este procesat din nou
\stopmessages
-% we need some more constants
+% we need some more constants
-\interfacetranslationtrue
+\interfacetranslationtrue
\input mult-sys
\input mult-con
@@ -179,15 +185,18 @@
% zitten, moeten we deze karakters bij verwijzingen
% converteren naar wat onschuldiger varianten.
-\catcode`\<=\active
-\catcode`\>=\active
+\def\stpt#1{{\tttf#1}}
+\def\stpr#1{#1*}
+\def\stpv#1{{\setupvarfont#1}}
-\def<{\lesscharacter}
-\def>{\morecharacter}
+\bgroup \catcode`\<=\active \catcode`\>=\other
-\def\protectmoreless{\def<{@}\def>{@}}
+\gdef \verbatimsetupvariablepart{\def<<##1>>{\stpr{##1}}}
+\gdef \protectsetupvariablepart{\def<<##1>>{\string\stpv{##1}}}
+\gdef\visualizesetupvariablepart{\def<<##1>>{\stpv{##1}}}
+\gdef \naturalsetupvariablepart{\def<<##1>>{\string<\string<##1\string>\string>}}
-\showmessage{setup}{1}{}
+\egroup
% \stelsetupin
% [verwijzing=<0,1,2,3>]
@@ -263,102 +272,40 @@
\def\c!setupref {stp}
\def\??stp {@@stp}
-\def\c!command!%
- {{\setupvarfont\getmessage{setup}{command}}}
-
-\def\c!dimension!%
- {{\setupvarfont\getmessage{setup}{dimension}}}
-
-\def\c!filename!%
- {{\setupvarfont\getmessage{setup}{file}}}
-
-\def\c!identifier!%
- {{\setupvarfont\getmessage{setup}{name}}}
-
-\def\c!character!%
- {{\setupvarfont\getmessage{setup}{character}}}
-
-\def\c!marker!%
- {{\setupvarfont\getmessage{setup}{mark}}}
-
-\def\c!number!%
- {{\setupvarfont\getmessage{setup}{number}}}
-
-\def\c!reference!%
- {{\setupvarfont\getmessage{setup}{reference}}}
-
-\def\c!plural!%
- {{\setupvarfont\getmessage{setup}{plural}}}
-
-\def\c!singular!%
- {{\setupvarfont\getmessage{setup}{singular}}}
-
-\def\c!text!%
- {{\setupvarfont\getmessage{setup}{text}}}
-
-\def\c!formula!%
- {{\setupvarfont\getmessage{setup}{formula}}}
-
-\def\c!font!%
- {{\setupvarfont\getmessage{setup}{file}}}
-
-\def\c!matrix!%
- {{\setupvarfont\getmessage{setup}{matrix}}}
-
-\def\c!list!%
- {{\setupvarfont\getmessage{setup}{list}}}
-
-\def\c!section!%
- {{\setupvarfont\getmessage{setup}{section}}}
-
-\def\c!noargument!%
- {{\setupvarfont\texescape\getmessage{setup}{command}}}
-
-\def\c!oneargument!%
- {{\setupvarfont\texescape\getmessage{setup}{command}\#1}}
-
-\def\c!twoarguments!%
- {{\setupvarfont\texescape\getmessage{setup}{command}\#1\#2}}
-
-\def\c!threearguments!%
- {{\setupvarfont\texescape\getmessage{setup}{command}\#1\#2\#3}}
-
-\def\c!repeat! {\c!opt!{{\setupvarfont n}*}}
-\def\c!arg! {\leftargument\c!dots!\rightargument}
-\def\c!args! {\leftargument..,\c!dots!,..\rightargument}
-\def\c!dis! {\$\$\c!dots!\$\$}
-\def\c!idx! {\leftargument\c!dots!\rightargument}
-\def\c!idxs! {\leftargument..+\c!dots!+..\rightargument}
-\def\c!mat! {\$\c!dots!\$}
-\def\c!nop! {\c!dots!}
-\def\c!fil! {~\c!dots!~}
-\def\c!pos! {(\c!dots!)}
-\def\c!poss! {(\c!dots!,\c!dots!)}
-\def\c!sep! {\texescape\texescape}
-\def\c!ref! {[{\setupvarfont ref}]}
-\def\c!refs! {[{\setupvarfont ref},..]}
-\def\c!val! {[\c!dots!]}
-\def\c!vals! {[..,\c!dots!,..]}
-\def\c!var! {[..=..]}
-\def\c!vars! {[..,..=..,..]}
-\def\c!cmd! {\c!noargument!}
-\def\c!dest! {[\leftargument..\c!ref!\rightargument]}
-\def\c!dests! {[..,\leftargument..\c!refs!\rightargument,..]}
-\def\c!trip! {[x:y:z=]}
-\def\c!trips! {[x:y:z=,..]}
-\def\c!wrd! {\leftargument\c!dots!\rightargument}
-\def\c!wrds! {\leftargument.. \c!dots!\ ..\rightargument}
-\def\c!par! {\texescape par}
-\def\c!opt! #1{{\setupoptfont{#1}}}
+\def\c!setup!variable!#1{{\setupvarfont\getmessage{setup}{#1}}}
+\def\c!setup!command! #1{{\setupvarfont\texescape\getmessage{setup}{command}#1}}
+
+\def\c!command! {\c!setup!variable!{command}}
+\def\c!dimension! {\c!setup!variable!{dimension}}
+\def\c!filename! {\c!setup!variable!{file}}
+\def\c!identifier! {\c!setup!variable!{name}}
+\def\c!character! {\c!setup!variable!{character}}
+\def\c!marker! {\c!setup!variable!{mark}}
+\def\c!number! {\c!setup!variable!{number}}
+\def\c!reference! {\c!setup!variable!{reference}}
+\def\c!plural! {\c!setup!variable!{plural}}
+\def\c!singular! {\c!setup!variable!{singula}}
+\def\c!text! {\c!setup!variable!{text}}
+\def\c!formula! {\c!setup!variable!{formula}}
+\def\c!font! {\c!setup!variable!{file}}
+\def\c!matrix! {\c!setup!variable!{matrix}}
+\def\c!list! {\c!setup!variable!{list}}
+\def\c!section! {\c!setup!variable!{section}}
+\def\c!sectionnumber!{\c!setup!variable!{sectionnumber}}
+
+\def\c!noargument! {\c!setup!command!{}}
+\def\c!oneargument! {\c!setup!command!{\#1}}
+\def\c!twoarguments! {\c!setup!command!{\#1\#2}}
+\def\c!threearguments!{\c!setup!command!{\#1\#2\#3}}
+
\def\c!tex! #1{\texescape#1}
\def\c!or! {\hbox spread .25em{\vl}}
\let\redefinesetupconstants=\relax
-% Test:
+% Test:
-\newif\ifbreaksetup
-\def\breaksetup{\ifbreaksetup\allowbreak\fi}
+\newif\ifbreaksetup \def\breaksetup{\ifbreaksetup\allowbreak\fi}
\def\c!repeat! {\breaksetup\c!opt!{{\setupvarfont n}*}\breaksetup}
\def\c!arg! {\breaksetup\leftargument\c!dots!\rightargument\breaksetup}
@@ -376,7 +323,7 @@
\def\c!refs! {\breaksetup[{\setupvarfont ref},\breaksetup..]\breaksetup}
\def\c!val! {\breaksetup[\c!dots!]\breaksetup}
\def\c!vals! {\breaksetup[..,\breaksetup\c!dots!,\breaksetup..]\breaksetup}
-\def\c!var! {\breaksetup[..=..]\breaksetup}
+\def\c!var! {\breaksetup[..=..]\breaksetup}
\def\c!vars! {\breaksetup[..,\breaksetup..=..,\breaksetup..]\breaksetup}
\def\c!cmd! {\breaksetup\c!noargument!\breaksetup}
\def\c!dest! {\breaksetup[\leftargument..\breaksetup\c!ref!\rightargument]\breaksetup}
@@ -410,10 +357,10 @@
[\c!commando=\@@stpcommando,
\c!criterium=\v!alles]
-% 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
+% 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
\newif\ifv!numberingdots!
\newif\ifv!alwaysinteractive!
@@ -482,10 +429,10 @@
{\writesetupparametervalues{#1}{#3}{}}}
{\writesetupparametervalues{#1}{#3}{#5}}}
-\unexpanded\def\inheritsetup#1%
+\unexpanded\def\inheritsetup#1%
{\setsetupreference#1\to\currentsetupinheritance
\ifcase\@@stpverwijzing
- \texescape#1% % njet
+ \texescape#1% % njet
\or
{\op{p}[\currentsetupinheritance]: \texescape#1}% zonder { } probleem
\or
@@ -499,8 +446,7 @@
\def\inheritsetupvalues[#1]#2[#3]%
{\bgroup
\ConvertToConstant\doifelse{#3}{}{\def\next{}}{\def\next{: }}%
- \def<<{\setupvarfont}\def>>{}%
- \protectmoreless
+ \verbatimsetupvariablepart
\value[\getmessage{setup}{see} \inheritsetup{#1}\next#3][]%
\egroup}
@@ -509,23 +455,28 @@
\def\inheritsetupvariables[#1]#2[#3]%
{\bgroup
\ConvertToConstant\doifelse{#3}{}{\def\next{}}{\def\next{: }}%
- \def<<{\setupvarfont}\def>>{}%
- \protectmoreless
+ \verbatimsetupvariablepart
\variable[..=..][\getmessage{setup}{see} \inheritsetup{#1}\next#3][]%
\egroup}
\def\stelsetupin%
{\dodoubleargument\getparameters[\??stp]}
-\def\dowritetexcommand#1<<#2>>#3\\%
+\bgroup \catcode`<=\active
+
+\gdef\dowritetexcommand#1<<#2>>#3\\%
{\texescape#1{\setupvarfont#2}#3}
-\def\writetexcommand#1%
+\gdef\writetexcommand#1%
{\setuptxtfont
- \doifinstringelse{<<}{#1}
+ \convertargument<<\to\asciia
+ \convertargument#1\to\asciib
+ \doifinstringelse{\asciia}{\asciib}
{\dowritetexcommand#1\\}
{\texescape#1}}
+\egroup
+
\xdef\currentsetupreference {}
\xdef\currentsetupinheritance {}
@@ -535,7 +486,7 @@
\def\setsetupreference#1\to#2%
{\bgroup
- \protectmoreless
+ \verbatimsetupvariablepart
\let\subsetup=\subsetupreference
\xdef#2{\c!setupref:#1}%
\egroup}
@@ -570,9 +521,16 @@
\dointeractivesetupsymbol\setupoptcolor
\fi}
-\@EA\def\@EA\c!dostp!\e!start#1<<#2>>#3\\%
+\bgroup \catcode`<=\active
+
+\@EA\gdef\@EA\c!dostp!\e!start#1<<#2>>#3\\%
{\breaksetup~...~\breaksetup\texescape\e!stop#1{\setupvarfont#2}}%
+\gdef\stripsetupstoppart#1%
+ {\@EA\def\@EA\c!stp!\@EA{\@EA\c!dostp!#1<<>>\\}}
+
+\egroup
+
\pushmacro\setuptext
\defineframedtext
@@ -583,15 +541,17 @@
\popmacro\setuptext
-\newif\ifshortsetup
+\newif\ifshortsetup
+
+\newcounter\currentsetupnumber
-\def\dosetupreference%
+\def\dosetupreference%
{\doifundefinedelse{done::\currentsetupreference}
{\pagereference[\currentsetupnumber]%
\pagereference[\currentsetupreference]%
\setgvalue{done::\currentsetupreference}{}}
{\showmessage{setup}{4}{\currentsetupreference}}}
-
+
\def\doprocesssetup\number[#1]\command[#2]\type[#3]#4%
{\bgroup
\showmessage{setup}{2}{#2}%
@@ -600,19 +560,15 @@
\let\variable=\setupvariable
\let\inheritvalues=\inheritsetupvalues
\let\inheritvariables=\inheritsetupvariables
- \@EA\def\@EA\c!stp!\@EA{\@EA\c!dostp!#2<<>>\\}%
+ \stripsetupstoppart{#2}%
\advance\hsize by -\leftskip
\advance\hsize by -\rightskip
\getvalue{\e!start setuptext}
\stelwitruimtein[\v!geen]%
\bgroup
- \def<{}%
- \def>{}%
- \edef\firstcommand{#2*}%
- \let<=\lesscharacter
- \let>=\morecharacter
- \edef\secondcommand{#2}%
- \expanded{\texmacro[\firstcommand]{\noexpand\tex{\secondcommand}}}%
+ \verbatimsetupvariablepart \edef\first {#2*}%
+ \protectsetupvariablepart \edef\second{#2}%
+ \expanded{\texmacro[\first]{\noexpand\stpt{\second}}}%
\egroup
\global\v!dotnumber!=0
\global\v!numberingdots!true
@@ -626,8 +582,8 @@
\fi
\global\v!dotnumber!=0
\ifbreaksetup
- \hangafter1
- \hangindent1em
+ \hangafter1
+ \hangindent1em
\veryraggedright
\else
\hbox to \hsize
@@ -635,6 +591,7 @@
{\let\subsetup=\gobbleoneargument
\redefinesetupconstants
\setuptxtfont\setstrut\strut
+ \visualizesetupvariablepart
\writetexcommand{#2}#3%
\ifbreaksetup\hfill\else\hss\fi
\ifnum\@@stpverwijzing>0
@@ -684,65 +641,66 @@
\fi
\getvalue{\e!stop setuptext}
\egroup}
-
-\newcounter\currentsetupnumber
-
-\def\startsetup#1\command[#2]#3\type[#4]#5\stopsetup%
- {\bgroup
- \def<{}%
- \def>{}%
- \doglobal\increment\currentsetupnumber\relax
- \def\!!stringa{\@@setup#2}%
- \expandafter\setgvalue\expandafter\!!stringa\expandafter
- {\expandafter\doprocesssetup
- \expandafter\number\expandafter[\currentsetupnumber]%
- \command[#2]%
- \type[#4]%
- {#5}}%
- \edef\firstcommand{#2*}%
- \let<=\lesscharacter
- \let>=\morecharacter
- \edef\secondcommand{#2}%
- % 'elk' comes first, else no 'gebruikt' entries are written
- \expanded{\elktexcommando[\firstcommand]{\secondcommand}}%
- % this uggly hack prevents messages
- \let\showmessage=\gobblethreearguments
- % here 'elk' is overruled
- \expanded{\texcommando[\firstcommand]{\secondcommand}}%
- \egroup}
-
+
\def\dosetup#1%
{\protect
- \@@stpvoor
- \bgroup
- \def<{}%
- \def>{}%
+ \verbatimsetupvariablepart
\xdef\globalsetupname{#1}%
- \gebruikcommandos{#1*}%
- \egroup
+ \expanded{\gebruikcommandos{#1*}}%
\doifdefinedelse{\@@setup\globalsetupname}
{\getvalue{\@@setup\globalsetupname}}
{\bgroup
\showmessage{setup}{3}{#1}%
\setuptxtfont [setup \makemessage{setup}{3}{#1}]\endgraf
\egroup}%
+ \egroup
\@@stpna}
\def\setup%
- {\shortsetupfalse
- \unprotect\dosetup}
+ {\@@stpvoor
+ \bgroup
+ \catcode`\<=\@@active
+ \catcode`\>=\@@other
+ \unprotect
+ \shortsetupfalse
+ \dosetup}
\def\shortsetup%
- {\shortsetuptrue
- \unprotect\dosetup}
-
+ {\@@stpvoor
+ \bgroup
+ \catcode`\<=\@@active
+ \catcode`\>=\@@other
+ \unprotect
+ \shortsetuptrue
+ \dosetup}
+
\def\startsetupfile%
- {\unprotect}
+ {\bgroup
+ \catcode`\<=\active
+ \unprotect}
\def\stopsetupfile%
{\protect
+ \egroup
\endinput}
+\def\startsetup#1\command[#2]#3\type[#4]#5\stopsetup%
+ {\bgroup
+ \verbatimsetupvariablepart
+ \doglobal\increment\currentsetupnumber\relax
+ \edef\!!stringa{\@@setup#2}%
+ \expandafter\setgvalue\expandafter\!!stringa\expandafter
+ {\expandafter\doprocesssetup\expandafter
+ \number\expandafter[\currentsetupnumber]%
+ \command[#2]\type[#4]{#5}}%
+ % 'elk' comes first, else no 'gebruikt' entries are written
+ \expanded{\elktexcommando[#2*]{#2}}%
+ % this uggly hack prevents messages
+ \let\showmessage\gobblethreearguments
+ % here 'elk' is overruled
+ \expanded{\texcommando[#2*]{#2}}%
+ \egroup}
+
\let\documenteduntilhere=\relax
\definieerblok [dutch, english, german, czech, italian]
@@ -756,7 +714,9 @@
\c!criterium=\v!gebruikt]
\def\plaatssetup%
- {\getvalue{\e!plaats\e!lijstmet texcommandos}}
+ {\bgroup
+ \getvalue{\e!plaats\e!lijstmet texcommandos}
+ \egroup}
\def\plaatselkesetup% for fun purposes only
{\bgroup
@@ -765,9 +725,14 @@
\getvalue{\e!plaats\e!lijstmet alletexcommandos}%
\egroup}
-\let\setupsetup = \stelsetupin
-\let\placesetup = \plaatssetup
-\let\placeeverysetup= \plaatselkesetup
+\let\setupsetup \stelsetupin
+\let\placesetup \plaatssetup
+\let\placeeverysetup\plaatselkesetup
+
+
+\bgroup \catcode`\<=\active \def<{\lesscharacter} \egroup
+
+% \showmessage{setup}{1}{} \catcode`\<=\active
\protect
diff --git a/tex/context/base/setupb.tex b/tex/context/base/setupb.tex
index 6cc744185..7cf6de973 100644
--- a/tex/context/base/setupb.tex
+++ b/tex/context/base/setupb.tex
@@ -13,7 +13,7 @@
% nieuw: oncomment plaatssamengesteldelijst
-% nog 'reductie=ja/nee' in \setupcolors
+% nog 'reductie=ja/nee' in \setupcolors
\startsetupfile
@@ -86,6 +86,9 @@
[\y!setuplanguage]
\type
[\c!val!\c!vars!]
+ \value
+ [\s!nl,\s!fr,\s!en,\s!uk,\s!de,\s!es,\s!cz,..]
+ [\s!nl]
\inheritvariables
[\y!installlanguage]
[]
@@ -484,16 +487,13 @@
\command
[\y!definecolorgroup]
\type
- [\c!val!\c!opt!\c!val!\c!vals!]
+ [\c!val!\c!opt!\c!val!\c!trips!]
\value
[\c!identifier!]
[]
\value
[\v!rgb,\v!cmyk,\v!grijs,\v!s]
[\v!rgb]
- \value
- [\c!trips!]
- []
\stopsetup
\startsetup
@@ -568,7 +568,7 @@
\command
[\y!setuptype]
\type
- [\c!var!]
+ [\c!vars!]
\variable
[\c!spatie]
[\v!aan,\v!uit]
@@ -886,6 +886,10 @@
[\c!bovenoffset]
[\c!dimension!]
[2.5pt]
+ \variable
+ [\c!lijnkleur]
+ [\c!identifier!]
+ []
\stopsetup
\startsetup
@@ -1988,7 +1992,8 @@
\startsetup
\command[\y!lohi]
- \type[\c!arg!\c!arg!]
+ \type[\c!opt!\c!val!\c!arg!\c!arg!]
+ \value[\v!laag][]
\value[\c!text!][]
\value[\c!text!][]
\stopsetup
@@ -3412,7 +3417,7 @@
[\c!text!]
[]
\variable
- [\c!section!\c!number!]
+ [\c!sectionnumber!]
[\v!ja,\v!nee]
[]
\variable
@@ -3420,6 +3425,10 @@
[\c!text!]
[--]
\variable
+ [\c!strut]
+ [\v!ja,\v!nee]
+ [\v!ja]
+ \variable
[\c!status]
[\v!start,\v!stop]
[\v!start]
@@ -3467,9 +3476,12 @@
\startsetup
\command
- [\y!definieerstartstop]
+ [\y!definestartstop]
\type
[\c!val!\c!vars!]
+ \value
+ [\c!identifier!]
+ []
\variable
[\c!voor]
[\c!command!]
@@ -3560,6 +3572,10 @@
[\c!wijze]
[\v!per\v!tekst,\v!per\c!section!]
[\v!per\v!tekst]
+ \variable
+ [\c!scheider]
+ [\c!text!]
+ [.]
\stopsetup
\startsetup
@@ -3809,13 +3825,13 @@
\command
[\y!setupreferencing]
\type
- [\c!var!]
+ [\c!vars!]
\variable
[\c!status]
[\v!start,\v!stop]
[\v!start]
\variable
- [\c!section!\c!number!]
+ [\c!sectionnumber!]
[\v!ja,\v!nee]
[]
\variable
@@ -4047,7 +4063,7 @@
[\v!uit]
\variable
[\c!criterium]
- [\c!section!,\v!lokaal,\v!vorige,\v!alles]
+ [\c!section!,\v!lokaal,\v!vorige,\v!huidige,\v!alles]
[\v!lokaal]
\variable
[\c!paginaovergangen]
@@ -4119,14 +4135,14 @@
[\v!nee]
\variable
[\c!prefix]
- [\v!ja,\v!nee]
+ [\v!ja,\v!nee,\v!geen]
[\v!ja]
\variable
[\c!paginanummer]
[\v!ja,\v!nee]
[\v!ja]
\variable
- [\c!section!\c!number!]
+ [\c!sectionnumber!]
[\v!ja,\v!nee]
[]
\variable
@@ -4160,6 +4176,10 @@
\variable
[\c!scheider]
[\c!text!]
+ [.]
+ \variable
+ [\c!afsluiter]
+ [\c!text!]
[]
\variable
[\c!symbool]
@@ -4311,6 +4331,10 @@
[\c!na]
[\c!dimension!]
[0pt]
+ \variable
+ [\c!scheider]
+ [\c!text!]
+ [.]
\stopsetup
\startsetup
@@ -4832,6 +4856,10 @@
[\c!oneargument!]
[]
\variable
+ [\c!scheider]
+ [\c!text!]
+ [.]
+ \variable
[\c!prefix]
[+,-,\c!text!]
[]
@@ -4927,7 +4955,7 @@
\startsetup
\command
- [\y!stelopsommingin]
+ [\y!setupitemize]
\type
[\c!opt!\c!val!\c!opt!\c!vals!\c!opt!\c!vars!]
\value
@@ -5036,7 +5064,7 @@
\startsetup
\command
- [\y!startopsomming]
+ [\y!startitemize]
\type
[\c!opt!\c!vals!\c!opt!\c!vars!\c!stp!]
\value
@@ -5046,15 +5074,15 @@
\v!kolommen]
[\v!standaard]
\inheritvariables
- [\y!stelopsommingin]
+ [\y!setupitemize]
[]
\stopsetup
-\startsetup \command[\y!som] \type[\c!opt!\c!refs!] \stopsetup
+\startsetup \command[\y!item]\type[\c!opt!\c!refs!] \stopsetup
\startsetup \command[\y!but] \type[\c!alwint!\c!ref!] \stopsetup
\startsetup \command[\y!its] \type[\c!opt!\c!refs!] \stopsetup
\startsetup \command[\y!ran] \type[\c!arg!] \stopsetup
-\startsetup \command[\y!kop] \type[\c!opt!\c!refs!] \stopsetup
+\startsetup \command[\y!head]\type[\c!opt!\c!refs!] \stopsetup
\startsetup \command[\y!mar] \type[\c!opt!\c!refs!\c!arg!] \stopsetup
\startsetup \command[\v!sub] \type[\c!opt!\c!refs!] \stopsetup % no \y!sub
\startsetup \command[\y!sym] \type[\c!arg!] \stopsetup
@@ -5117,7 +5145,7 @@
[\v!ja,\v!nee]
[\v!nee]
\variable
- [\c!section!\c!number!]
+ [\c!sectionnumber!]
[\v!ja,\v!nee]
[]
\variable
@@ -5533,6 +5561,10 @@
[\v!stop,\v!start]
[\v!stop]
\variable
+ [\c!paginastatus]
+ [\v!stop,\v!start]
+ [\v!stop]
+ \variable
[\c!kleur]
[\c!identifier!]
[]
@@ -5560,10 +5592,9 @@
[\y!currentdate]
\type
[\c!vals!]
- \value
- [\v!dag,\v!maand,\v!weekdag,\v!jaar, % \v!WEEKDAG,\v!MAAND,
- dd,mm,jj,yy,d,m,j,y,\v!kenmerk]
- [\v!dag,\v!maand,\v!jaar]
+ \inheritvalues
+ [\y!date]
+ []
\stopsetup
\startsetup
@@ -5583,9 +5614,10 @@
[y]
[\c!number!]
[]
- \inheritvalues
- [\y!currentdate]
- []
+ \value
+ [\v!dag,\v!maand,\v!weekdag,\v!jaar, % \v!WEEKDAG,\v!MAAND,
+ dd,mm,jj,yy,d,m,j,y,\v!kenmerk]
+ [\v!dag,\v!maand,\v!jaar]
\stopsetup
\startsetup
@@ -6397,6 +6429,14 @@
[\c!letter]
[\v!normaal,\v!vet,\v!schuin,\v!vet\v!schuin,\v!type,\v!kap,\v!klein...,\c!command!]
[\v!normaal]
+ \variable
+ [\c!kleur]
+ [\c!identifier!]
+ []
+ \variable
+ [\c!plaats]
+ [\v!tekst,\v!marge]
+ [\v!marge]
\stopsetup
\startsetup
@@ -7985,13 +8025,7 @@
\command
[\y!remark]
\type
- [\c!poss!\c!poss!\c!vars!\c!arg!]
- \value
- [\c!number!]
- []
- \value
- [\c!number!]
- []
+ [\c!pos!\c!pos!\c!vars!\c!arg!]
\value
[\c!number!]
[]
@@ -8272,9 +8306,6 @@
[\v!label,\v!horizontaal,\v!vertikaal,\v!kader]
[]
\inheritvariables
- [\y!framed]
- []
- \inheritvariables
[\y!setupfields]
[]
\stopsetup
@@ -8290,9 +8321,6 @@
\value
[\v!reset,\v!label,\v!horizontaal,\v!vertikaal,\v!kader]
[]
- \inheritvariables
- [\y!framed]
- []
\variable
[\c!n]
[\c!number!]
@@ -8374,6 +8402,9 @@
[\c!veldachtergrondkleur]
[\c!identifier!]
[]
+ \inheritvariables
+ [\y!framed]
+ []
\stopsetup
\startsetup
diff --git a/tex/context/base/setupd.tex b/tex/context/base/setupd.tex
index 0cd91b802..861efe0c4 100644
--- a/tex/context/base/setupd.tex
+++ b/tex/context/base/setupd.tex
@@ -1,7 +1,7 @@
%D \module
-%D [ file=setupa,
+%D [ file=setupd,
%D version=1998.07.20,
-%D title=\CONTEXT\ Setup Definitions,
+%D title=\CONTEXT\ Setup to TWS,
%D subtitle=Help Generation,
%D author=Hans Hagen,
%D date=\currentdate,
@@ -38,6 +38,7 @@
\copymessage \c!matrix! * {matrix}
\copymessage \c!list! * {list}
\copymessage \c!section! * {section}
+\copymessage \c!sectionnumber! * {sectionnumber}
\copymessage \c!noargument! \empty {command}
\copymessage \c!oneargument! \empty {command}
\copymessage \c!twoarguments! \empty {command}
@@ -149,6 +150,7 @@
\long\def\startsetup#1\stopsetup % the :'s serve as breakpoints
{\bgroup
+ \naturalsetupvariablepart
\long\def\command [##1]%
{\immediate\write\scratchwrite{com:##1:}}%
\long\def\type [##1]%
diff --git a/tex/context/base/setupe.tex b/tex/context/base/setupe.tex
new file mode 100644
index 000000000..2d3e4b60e
--- /dev/null
+++ b/tex/context/base/setupe.tex
@@ -0,0 +1,310 @@
+%D \module
+%D [ file=setupe,
+%D version=2001.10.24,
+%D title=\CONTEXT\ Setup to XML
+%D subtitle=Help 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.
+
+\let\wait\relax
+
+\input setupa
+
+\unprotect
+
+\def\SETUPnamespace{xmlns:cd="http://www.pragma-ade.com/commands"}
+
+\def\c!command! {cd:command}
+\def\c!dimension! {cd:dimension}
+\def\c!filename! {cd:file}
+\def\c!identifier! {cd:name}
+\def\c!character! {cd:character}
+\def\c!marker! {cd:mark}
+\def\c!number! {cd:number}
+\def\c!reference! {cd:reference}
+\def\c!plural! {cd:plural}
+\def\c!singular! {cd:singular}
+\def\c!text! {cd:text}
+\def\c!formula! {cd:formula}
+\def\c!font! {cd:file}
+\def\c!matrix! {cd:matrix}
+\def\c!list! {cd:list}
+\def\c!section! {cd:section}
+\def\c!sectionnumber! {cd:sectionnumber}
+\def\c!noargument! {cd:noargument}
+\def\c!oneargument! {cd:oneargument}
+\def\c!twoarguments! {cd:twoarguments}
+\def\c!threearguments! {cd:threearguments}
+
+\def\subsetup#1{*#1} % ?
+
+\beginTEX
+
+\def\getinterfaceconstant#1%
+ {\ifinterfacetranslation
+ \ifx\csname\x!prefix!#1\endcsname\relax
+ #1\else\csname\x!prefix!#1\endcsname
+ \fi
+ \else
+ #1%
+ \fi}
+
+\def\getinterfacevariable#1%
+ {\ifinterfacetranslation
+ \ifx\csname\y!prefix!#1\endcsname\relax
+ #1\else\csname\y!prefix!#1\endcsname
+ \fi
+ \else
+ #1%
+ \fi}
+
+\endTEX
+
+\beginETEX \ifcsname
+
+\def\getinterfaceconstant#1%
+ {\ifinterfacetranslation
+ \ifcsname\x!prefix!#1\endcsname
+ \csname\x!prefix!#1\endcsname\else#1%
+ \fi
+ \else
+ #1%
+ \fi}
+
+\def\getinterfacevariable#1%
+ {\ifinterfacetranslation
+ \ifcsname\y!prefix!#1\endcsname
+ \csname\y!prefix!#1\endcsname\else#1%
+ \fi
+ \else
+ #1%
+ \fi}
+
+\endETEX
+
+\let\typespec\empty
+
+\long\def\dovalvar#1%
+ {\increment\currentwhatever
+ \scratchcounter=0
+ \dostring{\space\space\space\space}{}{#1\typespec}
+ \let\typespec\empty
+ \currentsetup
+ \let\typespec\empty
+ \dostring{\space\space\space\space}{/}{#1}}
+
+\long\def\doanother#1%
+ {\dostring{\space\space\space\space}{}{#1\typespec/}
+ \let\typespec\empty}
+
+\long\def\addtypespec#1#2%
+ {\edef\typespec{\typespec\space#1="#2"}}
+
+\def\c!opt! {\addtypespec{optional}{yes}}
+\def\c!optint! {\addtypespec{interactive}{yes}}
+\def\c!alwint! {\addtypespec{interactive}{exclusive}}
+
+\def\c!val! {\dovalvar{keywords}}
+\def\c!var! {\dovalvar{assignments}}
+
+\def\c!vals! {\addtypespec{list}{yes}\dovalvar{keywords}}
+\def\c!vars! {\addtypespec{list}{yes}\dovalvar{assignments}}
+
+\def\c!arg! {\doanother{content}}
+\def\c!cmd! {\doanother{command}}
+\def\c!dest! {\doanother{reference}}
+\def\c!dis! {\doanother{displaymath}}
+\def\c!fil! {\doanother{file}}
+\def\c!idx! {\doanother{index}}
+\def\c!mat! {\doanother{math}}
+\def\c!nop! {\doanother{nothing}}
+\def\c!pos! {\doanother{position}}
+\def\c!ref! {\doanother{reference}}
+\def\c!trip! {\doanother{triplet}}
+\def\c!wrd! {\doanother{word}}
+
+\def\c!args! {\addtypespec{list}{yes}\c!arg!}
+\def\c!dests! {\addtypespec{list}{yes}\c!dest!}
+\def\c!idxs! {\addtypespec{list}{yes}\c!idx!}
+\def\c!poss! {\addtypespec{list}{yes}\c!pos!}
+\def\c!refs! {\addtypespec{list}{yes}\c!ref!}
+\def\c!wrds! {\addtypespec{list}{yes}\c!wrd!}
+\def\c!trips! {\addtypespec{list}{yes}\c!trip!}
+
+\def\c!par! {\addtypespec{delimiter}{par}} % \par
+\def\c!sep! {\addtypespec{separator}{backslash}} % \\
+\def\c!stp! {}
+
+\def\c!repeat! {}
+\def\c!tex! #1{\addtypespec{command}{#1}\doanother{tex}}
+\def\c!or! {}
+
+% wrapper
+
+\def\startsetupfile
+ {\immediate\openout\scratchwrite=cont-\currentlanguage.xml
+ \doline{\string<?xml version="1.0"?>}
+ \doline{}
+ \dostring{}{}{interface \SETUPnamespace\space name="context"}}
+
+\def\stopsetupfile
+ {\doline{}
+ \dostring{}{/}{interface}
+ \immediate\closeout\scratchwrite}
+
+\let\documenteduntilhere\relax
+
+\bgroup \catcode`\<=\@@other
+
+\unexpanded\gdef\dostring#1#2#3{\immediate\write\scratchwrite{#1<#2cd:#3>}}
+ \gdef\doline #1{\immediate\write\scratchwrite{#1}}
+
+\egroup
+
+\def\doval#1#2#3%
+ {\doifelse{#1}{#3}
+ {\def\valattr{ default="yes"}}
+ {\let\valattr\empty}%
+ \doifdefinedelse{c!#3!}
+ {\dostring{#2}{}{variable type="cd:#3"\valattr/}}
+ {\dostring{#2}{}{constant type="#3"\valattr/}}}
+
+\long\def\docommand[#1]%
+ {\def\currentname{#1}}
+
+\long\def\dotype[#1]%
+ {\def\currenttype{#1}}
+
+\long\def\dovalue[#1]#2[#3]%
+ {\advance\scratchcounter 1
+ \ifnum\scratchcounter=\currentwhatever\relax
+ \processcommalist[#1]{\doval{#3}{\space\space\space\space\space\space}}
+ \fi}
+
+\newif\ifinvariables
+
+\long\def\dovariable[#1]#2[#3]#4[#5]% comes as sequence
+ {\ifinvariables\else\advance\scratchcounter 1 \fi
+ \ifnum\scratchcounter=\currentwhatever\relax
+ \invariablestrue
+ \dostring{\space\space\space\space\space\space}{}%
+ {parameter name="\getinterfaceconstant{#1}"}
+ \processcommalist[#3]
+ {\doval{}{\space\space\space\space\space\space\space\space}}
+ \dostring{\space\space\space\space\space\space}{/}{parameter}
+ \fi}
+
+\long\def\doinheritvalues[#1]#2[#3]%
+ {\advance\scratchcounter 1
+ \ifnum\scratchcounter=\currentwhatever\relax
+ \dostring{\space\space\space\space\space\space}{}{inherit name="#1"/}
+ \fi}
+
+\long\def\doinheritvariables[#1]#2[#3]%
+ {\ifinvariables\else \advance\scratchcounter 1 \fi
+ \ifnum\scratchcounter=\currentwhatever\relax
+ \dostring{\space\space\space\space\space\space}{}{inherit name="#1"/}
+ \fi}
+
+\long\def\nocommand [#1]{}
+\long\def\notype [#1]{}
+\long\def\novalue [#1]#2[#3]{}
+\long\def\novariable [#1]#2[#3]#4[#5]{}
+\long\def\noinheritvalues [#1]#2[#3]{}
+\long\def\noinheritvariables[#1]#2[#3]{}
+
+\bgroup \catcode`\<=\active
+
+\gdef\cleanupcurrentname{\def<<##1>>{##1}}
+
+\gdef\findvariablename#1%
+ {\bgroup
+ \def<<##1>>{\gdef\varname{##1}}%
+ \global\let\varname\empty
+ \setbox\scratchbox=\hbox{#1}%
+ \egroup}
+
+\gdef\splitcurrentname{\@EA\dosplitcurrentname\currentname<<>><<>>\end}
+
+\gdef\dosplitcurrentname#1<<#2>>#3<<>>#4\end
+ {\def\prename{#1}\def\midname{#2}\def\posname{#3}}
+
+\egroup
+
+\newif\ifsetupisenvironment
+
+\long\def\startsetup#1\stopsetup
+ {\bgroup
+ \doline{}
+ % zero pass
+ \long\def\currentsetup{#1}
+ % first pass
+ \let\command \docommand
+ \let\type \dotype
+ \let\value \novalue
+ \let\variable \novariable
+ \let\inheritvalues \noinheritvalues
+ \let\inheritvariables\noinheritvariables
+ \currentsetup
+ % second pass
+ \convertargument\c!stp!\to\asciia
+ \convertcommand\currenttype\to\asciib
+ \let\envattr\empty
+ \let\prename\empty
+ \let\midname\empty
+ \let\posname\empty
+ \ExpandBothAfter\doifinstringelse{\asciia}{\asciib}
+ {\expandafter\aftersplitstring\currentname\at start\to\currentname
+ \def\envattr{ type="environment"}}
+ {} % \def\envattr{ type="standalone"}}
+ \convertargument<<\to\asciic
+ \convertcommand\currentname\to\asciid
+ \findvariablename\currentname
+ \ExpandBothAfter\doifinstringelse{\asciic}{\asciid}
+ {\edef\envattr{\envattr\space generated="yes"}}
+ {} % \edef\envattr{\envattr\space generated="no"}}
+ \splitcurrentname
+ \cleanupcurrentname
+ \dostring{}{}{command name="\currentname"\envattr}
+ \def\next##1%
+ {\ifx##1\empty
+ % skip
+ \else\ifx##1\varname
+ \dostring{\space\space\space\space}{}{variable value="##1"/}
+ \else
+ \dostring{\space\space\space\space}{}{string value="##1"/}
+ \fi\fi}
+ \dostring{\space\space}{}{sequence}
+ \next\prename
+ \next\midname
+ \next\posname
+ \dostring{\space\space}{/}{sequence}
+ \ifx\currenttype\empty \else
+ \dostring{\space\space}{}{arguments}
+ \let\command \nocommand
+ \let\type \notype
+ \let\value \dovalue
+ \let\variable \dovariable
+ \let\inheritvalues \doinheritvalues
+ \let\inheritvariables\doinheritvariables
+ \newcounter\currentwhatever \currenttype
+ \dostring{\space\space}{/}{arguments}
+ \fi
+ \dostring{}{/}{command}
+ \egroup}
+
+\let\stopsetup\relax
+
+\def\convertsetupdata#1#2% only accept #1=\v!whatever
+ {\doifsystemconstantelse{#1}{\edef#2{#1}}{\let#2\empty}}
+
+\input setupb
+
+\protect
+
+\end
diff --git a/tex/context/base/spec-def.tex b/tex/context/base/spec-def.tex
new file mode 100644
index 000000000..ea1fdd192
--- /dev/null
+++ b/tex/context/base/spec-def.tex
@@ -0,0 +1,893 @@
+%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}
+
+%D The following libraries are defined. Two postscript
+%D drivers are supported, as well as two mechanisms for
+%D interactive texts.
+%D
+%D \startregelcorrectie
+%D \starttabel[|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 \stoptabel
+%D \stopregelcorrectie
+
+%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 \startopsomming[opelkaar,n]
+%D \som insert driver specific commands
+%D \som pass instructions to the output device
+%D \stopopsomming
+%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 \startopsomming[opelkaar,n]
+%D \som let \TEX\ do the job
+%D \som let the driver handle things
+%D \stopopsomming
+%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 \kap{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 \kap{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 \kap{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 \starttypen
+%D \dostartgraymode {gray} ... \dostopgraymode
+%D \dostartrgbcolormode {red} {green} {blue} ... \dostopcolormode
+%D \dostartcmykcolormode {cyan} {magenta} {yellow} {black} ... \dostopcolormode
+%D \dostartgraycolormode {gray} ... \dostopcolormode
+%D \stoptypen
+%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 For some drivers, the stop special is of no use and can
+%D simply call the start one with zero arguments.
+
+%D \macros
+%D {doinsertfile}
+%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 \starttypen
+%D \doinsertfile {type,method} {file,label}
+%D {xscale} {yscale} {x} {y} {w} {h}
+%D {options}
+%D \stoptypen
+%D
+%D The scale is given percents, the other values are base
+%D points.
+%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 [\doinsertfile] [or] [9]
+
+%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 \starttypen
+%D \doinsertsoundtrack {file} {label} {options}
+%D \stoptypen
+
+\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 \starttypen
+%D \dogetnofinsertpages{filename}
+%D \stoptypen
+%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 \starttypen
+%D \dostartrotation {angle} ... \dostoprotation
+%D \stoptypen
+%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 \starttypen
+%D \dostartscaling {x} {y} ... \dostopscaling
+%D \stoptypen
+%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 \starttypen
+%D \dostartmirroring {x} {y} ... \dostopmirroring
+%D \stoptypen
+%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 {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 \starttypen
+%D \doovalbox {w} {h} {d} {linewidth} {radius} {stroke} {fill}
+%D \stoptypen
+%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] [7]
+
+%D \macros
+%D {dostartclipping,dostopclipping}
+%D
+%D Clipping is implemented in such a way that an arbitrary
+%D can be fed.
+%D
+%D \starttypen
+%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 \starttypen
+%D \dosetupidentity {title} {subject} {author} {creator} {date}
+%D \stoptypen
+%D
+%D All data is in string format.
+
+\installspecial [\dosetupidentity] [and] [5]
+
+%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 \starttypen
+%D \dosetuppaper {type} {width} {height}
+%D \stoptypen
+%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 \starttypen
+%D \dosetupprinter {type} {hoffset} {voffset} {width} {height}
+%D \stoptypen
+%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 {% dosetuppage,
+%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 \starttypen
+%D \dosetupinteraction
+%D \stoptypen
+%D
+%D Normally this command does nothing but giving a message
+%D that some scheme is supported.
+%D
+%D \starttypen
+%D \dosetupstartaction
+%D \dosetupstopaction
+%D \stoptypen
+%D
+%D These two setup the actions to be executed when the document
+%D is opened and closed.
+%D
+%D The next command sets up the screen. It takes five
+%D arguments:
+%D
+%D \starttypen
+%D \dosetupscreen {hoffset} {voffset} {width} {height} {options}
+%D \stoptypen
+%D
+%D The first four arguments are in points. Option~1 results in a
+%D full screen launch.
+%D
+%D \starttypen
+%D \dosetuppageview {keyword}
+%D \stoptypen
+%D
+%D For the moment we only support \type{fit}.
+
+\installspecial [\dosetupinteraction] [and] [0]
+\installspecial [\dosetupopenaction] [and] [0]
+\installspecial [\dosetupcloseaction] [and] [0]
+\installspecial [\dosetupopenpageaction] [and] [0]
+\installspecial [\dosetupclosepageaction] [and] [0]
+\installspecial [\dosetupscreen] [and] [5]
+\installspecial [\dosetuppageview] [and] [1]
+
+%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 \starttypen
+%D \dostarthide
+%D \dostophide
+%D \stoptypen
+
+\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 \startopsomming[opelkaar,n]
+%D \som let \TEX\ highlight the text
+%D \som let the driver show us where to click
+%D \stopopsomming
+%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 \starttypen
+%D \dostartgotolocation {w} {h} {url} {file} {label} {page}
+%D \dostartgotorealpage {w} {h} {url} {file} {page}
+%D \stoptypen
+%D
+%D Their counterparts are:
+%D
+%D \starttypen
+%D \dostopgotolocation
+%D \dostopgotorealpage
+%D \stoptypen
+%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 \starttypen
+%D \dostartgotoJS {w} {h} {script}
+%D \stoptypen
+%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 \starttypen
+%D \dostartthisislocation {label}
+%D \dostartthisisrealpage {page}
+%D \stoptypen
+%D
+%D These commands are accompanied by:
+%D
+%D \starttypen
+%D \dostopthisislocation
+%D \dostopthisisrealpage
+%D \stoptypen
+%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 \starttypen
+%D \dostartexecutecommand {w} {h} {command} {options}
+%D \stoptypen
+%D
+%D At least the next commands are supported (more examples
+%D can be found in \type {spec-fdf.tex}:
+%D
+%D \startregelcorrectie\steluitlijnenin[midden]\leavevmode
+%D \starttabel[|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 \stoptabel
+%D \stopregelcorrectie
+%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 \starttypen
+%D \dostartobject{class}{name}{width}{height}{depth}
+%D some typeset material
+%D \dostopobject
+%D \stoptypen
+%D
+%D \starttypen
+%D \doinsertobject{class}{name}
+%D \stoptypen
+%D
+%D The savings can be huge in interactive texts.
+%D
+%D \starttypen
+%D \doresetobjects
+%D \stoptypen
+
+\installspecial [\dostartobject] [or] [5]
+\installspecial [\dostopobject] [or] [0]
+\installspecial [\doinsertobject] [or] [2]
+\installspecial [\doresetobjects] [or] [0]
+
+%D \macros
+%D {doregisterfigure}
+%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]
+
+% %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 assiciated 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 \starttypen
+%D \doinstallbookmark {level} {nofsubentries} {text} {page} {open}
+%D \stoptypen
+%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 \starttypen
+%D \dosetpagetransition{dissolve}{0}
+%D \stoptypen
+%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 \starttypen
+%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 \stoptypen
+
+\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 \starttypen
+%D \dosetfieldstatus {mode} {parent} {kids} {root}
+%D \stoptypen
+
+\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 \starttypen
+%D \doregistercalculationset {set identifier}
+%D \stoptypen
+
+\installspecial [\doregistercalculationset] [or] [1]
+
+%D \macros
+%D {doinsertcomment}
+%D
+%D Not so much out of need, but to be complete, we also
+%D implement text annotations, so called comment:
+%D
+%D \starttypen
+%D \doinsertcomment
+%D {title} {width} {height} {color} {open} {symbol} {data}
+%D \stoptypen
+
+\installspecial[\doinsertcomment] [and] [7]
+
+%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 \starttypen
+%D \dosetposition {identifier}
+%D \dosetpositionwhd {identifier} {width} {height} {depth}
+%D \dosetpositionplus {identifier} {width} {height} {depth} {list}
+%D \dosetpositionpapersize {width} {height}
+%D \stoptypen
+%D
+%D This is one of the few specials where when using \PDFTEX\
+%D the driver directly deals with the utility file.
+
+\installspecial [\dosetposition] [or] [1]
+\installspecial [\dosetpositionwhd] [or] [4]
+\installspecial [\dosetpositionplus] [or] [5]
+\installspecial [\dosetpositionpapersize] [or] [2]
+
+%D \macros
+%D {dostarttransparency,dostoptransparency}
+%D
+%D \starttypen
+%D \dostarttransparency{fraction}{type}
+%D \dostoptransparency
+%D \stoptypen
+%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 Some suitable special collections are defined below.
+
+\defineoutput [dvipsone] [dvi,ps,yy]
+\defineoutput [dviwindo] [dvi,ps,yy,win]
+\defineoutput [dvips] [dvi,ps,tr]
+\defineoutput [dviview] [dvi,ps,tr,dv]
+\defineoutput [dvipdfm] [dpm]
+\defineoutput [pdftex] [tpd]
+\defineoutput [pdf] [tpd]
+\defineoutput [acrobat] [pdf,ps,tr]
+
+%D Please let me know if we need more. From now on we default
+%D to:
+
+\setupoutput [dvips]
+
+%D We don't enable \ACROBAT, because pure \POSTSCRIPT\ is not
+%D that strong on objects and \PDFTEX\ does a better job.
+%D Some reasonable alternatives are:
+%D
+%D \starttypen
+%D \setupoutput [dvipsone,acrobat]
+%D \setupoutput [dviwindo,acrobat]
+%D \stoptypen
+%D
+%D Although, better is:
+%D
+%D \starttypen
+%D \setupoutput [pdftex]
+%D \stoptypen
+
+\protect \endinput
diff --git a/tex/context/base/spec-dpm.tex b/tex/context/base/spec-dpm.tex
index de5b90329..e5d06f3b7 100644
--- a/tex/context/base/spec-dpm.tex
+++ b/tex/context/base/spec-dpm.tex
@@ -11,8 +11,6 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-% untested - sp as unit not supported
-
\unprotect
%D This driver is build on top of the general \PDF\ macros,
@@ -39,8 +37,8 @@
\def\doDPMsetuppaper#1#2#3%
{\bgroup
- \scratchdimen=#2\edef\width {\the\scratchdimen\space}%
- \scratchdimen=#3\edef\height{\the\scratchdimen\space}%
+ \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}
@@ -56,16 +54,10 @@
\definespecial\doinsertfile#1#2#3#4#5#6#7#8#9%
{\dodoinsertfile{dpm}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}
-%\definefileinsertion{dpm}{mps}#1#2#3#4#5#6#7#8#9%
-% {\hbox
-% {\convertMPcolors{#1}%
-% \scratchdimen=#3pt \PointsToReal{.01\scratchdimen}\xscale
-% \scratchdimen=#4pt \PointsToReal{.01\scratchdimen}\yscale
-% \convertMPtoPDF{#1}\xscale\yscale}}
-
\definefileinsertion{dpm}{mps}#1#2#3#4#5#6#7#8#9%
- {\ScaledPointsToWholeBigPoints{#7}\width
- \ScaledPointsToWholeBigPoints{#8}\height
+ {\PointsToWholeBigPoints{#7}\width
+ \PointsToWholeBigPoints{#8}\height
+ % brrr, should use #1->#9
\special
{PSfile="#1"\space
llx=\EPSllx\space lly=\EPSlly\space
@@ -74,15 +66,15 @@
\definefileinsertion{dpm}{pdf}#1#2#3#4#5#6#7#8#9%
{\bgroup
- \scratchdimen=#7sp\edef\width {\the\scratchdimen\space}%
- \scratchdimen=#8sp\edef\height{\the\scratchdimen\space}%
+ \scratchdimen#7\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#8\edef\height{\the\scratchdimen\space}%
\special{pdf: epdf width \width height \height (#1)}%
\egroup}
\definefileinsertion{dpm}{jpg}#1#2#3#4#5#6#7#8#9%
{\bgroup
- \scratchdimen=#7pt\edef\width {\the\scratchdimen\space}%
- \scratchdimen=#8pt\edef\height{\the\scratchdimen\space}%
+ \scratchdimen#7\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#8\edef\height{\the\scratchdimen\space}%
\special{pdf: image width \width height \height (#1)}%
\egroup}
@@ -130,8 +122,11 @@
%D Negation is not (yet) supported:
-\definespecial\dostartnegative {}
-\definespecial\dostopnegative {}
+% \definespecial\dostartnegative {}
+% \definespecial\dostopnegative {}
+% \definespecial\dostarttransparency {}
+% \definespecial\dostoptransparency {}
+
%D \macros
%D {dosetupinteraction,
@@ -213,8 +208,8 @@
\definespecial\dobeginofprofile#1#2#3#4%
{\bgroup
\setPDFdestination{#1}%
- \scratchdimen=#2sp\edef\width {\the\scratchdimen\space}%
- \scratchdimen=#3sp\edef\height{\the\scratchdimen\space}%
+ \scratchdimen#2\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#3\edef\height{\the\scratchdimen\space}%
\doifsomething{\PDFdestination}
{\special
{pdf: thread @ART::\PDFdestination\space
@@ -237,8 +232,8 @@
{\bgroup
\setbox\nextbox=\hbox\bgroup
\dosetobjectreference{#1}{#2}{#1::#2}%
- \scratchdimen=#3sp\edef\width {\the\scratchdimen\space}%
- \scratchdimen=#4sp\edef\height{\the\scratchdimen\space}%
+ \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%
@@ -311,15 +306,22 @@
\xdef\lastPDFaction{#3}%
\else
\bgroup
- \xdef\lastPDFaction{<<#3>>}%
- % this is yet untested
- % \ifcase\similarreference\relax\or\ifsharePDFactions
- % \global\advance\nofPDFsimilar by 1
- % \special{pdf: object @PDF::sim:\the\nofPDFsimilar\space\lastPDFaction}%
- % \xdef\lastPDFaction{@PDF::sim:\the\nofPDFsimilar}%
- % \fi\fi
- \scratchdimen=#1sp\edef\width {\the\scratchdimen\space}%
- \scratchdimen=#2sp\edef\height{\the\scratchdimen\space}%
+ % this is yet untested
+ %\ifsharePDFactions
+ % \ifcase\similarreference\relax
+ % \xdef\lastPDFaction{<<#3>>}%
+ % \or
+ % \global\advance\nofPDFsimilar by 1
+ % \special{pdf: object @PDF::sim:\the\nofPDFsimilar\space<<#3>>}%
+ % \xdef\lastPDFaction{@PDF::sim:\the\nofPDFsimilar}%
+ % \else
+ % % leave \lastPDFaction untouched
+ % \fi
+ %\else
+ \xdef\lastPDFaction{<<#3>>}%
+ %\fi
+ \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]
\ifhighlighthyperlinks \else /H /N \fi
@@ -329,8 +331,8 @@
\def\doPDFannotation width #1 height #2 data #3%
{\bgroup
- \scratchdimen=#1sp\edef\width {\the\scratchdimen\space}%
- \scratchdimen=#2sp\edef\height{\the\scratchdimen\space}%
+ \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}
@@ -340,8 +342,8 @@
\def\doPDFannotationobject class #1 name #2 width #3 height #4 data #5%
{\bgroup
- \scratchdimen=#3sp\edef\width {\the\scratchdimen\space}%
- \scratchdimen=#4sp\edef\height{\the\scratchdimen\space}%
+ \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}
@@ -358,6 +360,10 @@
\def\doPDFpagesattribute#1%
{\special{pdf: put @pages <<#1>>}}
+\def\doPDFpageresource#1%
+ {\message{[skipping PDF resource]}}
+
+\let\doPDFresetpageresources =\relax
\let\doPDFresetpageattributes=\relax
%D \macros
@@ -392,6 +398,4 @@
\stopspecials
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/spec-dvi.tex b/tex/context/base/spec-dvi.tex
index 97428cbb3..be8fdd73c 100644
--- a/tex/context/base/spec-dvi.tex
+++ b/tex/context/base/spec-dvi.tex
@@ -34,9 +34,9 @@
{\offinterlineskip
\forgetall
\unvbox\DVIobjects
- \setbox\nextbox=\hbox{\box\nextbox}
- \wd\nextbox=\!!zeropoint
- \dp\nextbox=\!!zeropoint
+ \setbox\nextbox\hbox{\box\nextbox}
+ \wd\nextbox\zeropoint
+ \dp\nextbox\zeropoint
\ht\nextbox=\!!onepoint
\allowbreak
\box\nextbox}%
@@ -48,13 +48,13 @@
\definespecial\doinsertobject#1#2%
{\bgroup
\dogetobjectreference{#1}{#2}\DVIobjectreference
- \splittopskip\!!zeropoint
+ \splittopskip\zeropoint
\setbox0=\copy\DVIobjects
\dimen0=\DVIobjectreference pt
- \advance\dimen0 by -\!!onepoint
+ \advance\dimen0 -\!!onepoint
\setbox2=\vsplit0 to \dimen0
\ifdim\ht0>\!!onepoint
- \setbox0=\vsplit0 to \!!onepoint
+ \setbox0=\vsplit0 \!!onepoint
\fi
\unvbox0\setbox0=\lastbox\unhbox0
\egroup}
@@ -106,6 +106,4 @@
\stopspecials
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/spec-fdf.tex b/tex/context/base/spec-fdf.tex
index ee5e75c86..1c8913957 100644
--- a/tex/context/base/spec-fdf.tex
+++ b/tex/context/base/spec-fdf.tex
@@ -31,25 +31,76 @@
%D characters from the destination name.
%D
%D The \ACROBAT\ programs are not bug free. By setting the next
-%D switch, we will at least try to prevent problems.
+%D switches, we will at least try to prevent problems.
-\newif\ifovercomePDFbugs \overcomePDFbugsfalse % true
-\newif\ifovercomePDFspace \overcomePDFspacetrue
+\newif\ifovercomePDFbugs \overcomePDFbugsfalse % dest sort problem / 3-
+\newif\ifovercomePDFspace \overcomePDFspacetrue % dest sort problem / 3-
+\newif\ifovercomePDFpage \overcomePDFpagetrue % pdf spec change / 5+
+
+\chardef\safePDFcode=`-
\def\setPDFdestination#1%
{\bgroup
\obeylccodes
- \lccode`\/=`-\lccode`\#=`-\lccode`\<=`-\lccode`\>=`-%
- \lccode`\[=`-\lccode`\]=`-\lccode`\(=`-\lccode`\)=`-%
- \ifovercomePDFspace
- \stripcharacter{ }\from#1\to\PDFdestination
+ \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
- \@EA\lowercase\@EA{\@EA\xdef\@EA\PDFdestination\@EA
- {\ifovercomePDFbugs'\fi\PDFdestination\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.
+
+% \beginETEX \scantokens
+%
+% \doifnotmode{atpragma}{\let\next\setPDFdestination} % experimental
+%
+% \bgroup
+%
+% \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
+%
+% \endETEX
+
%D \macros
%D {sanitizePDFstring}
%D
@@ -62,6 +113,8 @@
%D special characters, limit their number and finaly convert
%D some of the characters to save ones.
+%\beginTEX
+
\chardef\maxPDFstringsize=60
\def\sanitizePDFstring#1\to#2%
@@ -89,10 +142,49 @@
\fi}%
%\global\let#2=\empty
% or to permit #2 to be \ascii too:
- \@EA\global\@EA\let\@EA#2\@EA\empty
+ \global\@EA\let\@EA#2\@EA\empty
\@EA\handletokens\ascii\with\docommando
\egroup}
+%\endTEX
+%
+% \beginETEX \scantokens
+%
+% \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
+%
+% \endETEX
+
%D \macros
%D {doPDFdestination,
%D doPDFaction,
@@ -102,6 +194,7 @@
%D doPDFarrayobject,
%D doPDFaddtocatalog,
%D doPDFpageattribute,
+%D doPDFpageresource,
%D doPDFpagesattribute,
%D doPDFbookmark,
%D defaultobjectreference,
@@ -122,6 +215,7 @@
%D \doPDFarrayobject class #1 name #2 data #3
%D \doPDFaddtocatalog #1
%D \doPDFpageattribute #1
+%D \doPDFpageresource #1
%D \doPDFpagesattribute #1
%D \doPDFbookmark level #1 n #2 text #3 page #4 open #5
%D
@@ -138,20 +232,43 @@
%D Due to the fact that \PDFTEX\ has a different concept of
%D page attributes, we need:
-\let\doPDFresetpageattributes=\relax
+\let\doPDFresetpageattributes\relax
+\let\doPDFresetpageresources \relax
\appendtoksonce
\doPDFresetpageattributes
+ \doPDFresetpageresources
\to \everyshipout
\ifx\PDFcode\undefined
\ifx\pdfliteral\undefined
\def\PDFcode#1{\message{[ignored pdfliteral: #1]}}
\else
- \let\PDFcode=\pdfliteral
+ \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
+ \doPDFdictionaryobject class FDF name docuextgstates data
+ {\docuPDFextgstates}%
+ \fi
+ \doPDFgetobjectreference{FDF}{docuextgstates}\PDFobjectreference
+ \doPDFpageresource{/ExtGState \PDFobjectreference}%
+ \fi}
+
+\appendtoks \checkPDFextgstates \to \everyshipout
+
+\def\appendtoPDFdocumentextgstates#1%
+ {\xdef\docuPDFextgstates{\docuPDFextgstates\space#1}}
+
%D \macros
%D {doPDFsetupscreen}
%D
@@ -161,20 +278,20 @@
\def\doPDFsetupscreen#1#2#3#4#5#6% watch the extra argument
{\bgroup
- \!!widtha=#4sp
- \advance\!!widtha by #2sp
- \!!heighta=-#5sp
- \!!heightb=#1% extra argument
- \advance\!!heightb by -#3sp
- \advance\!!heighta by \!!heightb
- \ScaledPointsToWholeBigPoints{#2}\left
- \ScaledPointsToWholeBigPoints{\number\!!heighta}\bottom
- \ScaledPointsToWholeBigPoints{\number\!!widtha }\width
- \ScaledPointsToWholeBigPoints{\number\!!heightb}\height
-% \ScaledPointsToBigPoints{#2}\left
-% \ScaledPointsToBigPoints{\number\!!heighta}\bottom
-% \ScaledPointsToBigPoints{\number\!!widtha }\width
-% \ScaledPointsToBigPoints{\number\!!heightb}\height
+ \!!widtha#4%
+ \advance\!!widtha #2%
+ \!!heighta-#5%
+ \!!heightb#1% extra argument
+ \advance\!!heightb -#3%
+ \advance\!!heighta \!!heightb
+ \PointsToWholeBigPoints{#2}\left
+ \PointsToWholeBigPoints\!!heighta\bottom
+ \PointsToWholeBigPoints\!!widtha \width
+ \PointsToWholeBigPoints\!!heightb\height
+% \PointsToBigPoints{#2}\left
+% \PointsToBigPoints\!!heighta\bottom
+% \PointsToBigPoints\!!widtha \width
+% \PointsToBigPoints\!!heightb\height
\xdef\currentPDFcropbox% \doPDFpagesattribute
{/CropBox [\left\space\bottom\space\width\space\height]}%
\xdef\currentPDFpagemode% \doPDFaddtocatalog
@@ -238,17 +355,19 @@
\def\doPDFsetupclosepageaction%
{\global\let\PDFclosepageaction\lastPDFaction}
-\def\checkPDFpageactions%
- {\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}
+\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
@@ -266,8 +385,11 @@
\def\doPDFstartthisislocation#1%
{\bgroup
\setPDFdestination{#1}%
- \doifsomething{\PDFdestination}
- {\doPDFdestination name {\PDFdestination}}%
+ %\doifsomething{\PDFdestination}
+ % {\doPDFdestination name {\PDFdestination}}%
+ \ifx\PDFdestination\empty \else
+ \doPDFdestination name {\PDFdestination}%
+ \fi
\egroup}
%D \macros
@@ -316,31 +438,37 @@
\fi
\egroup}
-\def\doPDFstartgotorealpage#1#2#3#4#5%
+\def\PDFgotonewwindow{\ifgotonewwindow\space/NewWindow true \fi}
+
+\def\doPDFstartgotorealpage#1#2#3#4#5% watch the R append trick
{\bgroup
\doifelsenothing{#3}
{\scratchcounter=0#5\relax
\ifnum\scratchcounter>0
- \advance\scratchcounter by -1
- \edef\PDFdestination{\the\scratchcounter}%
+ \advance\scratchcounter -1 % pdf starts numbering at zero
\doifelsenothing{#4}
{\let\PDFfile\empty}
{\doifparentfileelse{#4}
{\let\PDFfile\empty}
{\setreferencefilename#4.\locationfilesuffix\to\PDFfile
- \edef\PDFfile%
- {R /F (\PDFfile)\ifgotonewwindow\space/NewWindow true \fi}}}%
- \edef\action%
- {/S /GoTo\PDFfile\space
- /D [\PDFdestination\PDFpageviewwrd]}%
+ \edef\PDFfile{R /F (\PDFfile)\PDFgotonewwindow}}}%
+ \ifx\PDFfile\empty
+ \ifovercomePDFpage % a named page ref
+ \edef\PDFdestination{(page:\the\scratchcounter)}%
+ \else % beware: optimizers remove this one
+ \edef\PDFdestination{[\the\scratchcounter\space\PDFpageviewwrd]}%
+ \fi
+ \else % across files it's a page number
+ \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)}}%
+ \edef\action{/S /URI /URI (#3\PDFfile)}}%
\ifx\action\empty\else
\ifsecondaryreference
\savesecondaryPDFreference\action
@@ -353,6 +481,18 @@
\fi
\egroup}
+\def\fakePDFpagedestination % as in pdf, we start numbering at zero
+ {\iflocation \ifovercomePDFpage \ifarrangingpages \else
+ \bgroup
+ \advance\realpageno -1 % is \expanded needed ?
+ \expanded{\doPDFdestination name {page:\realfolio}}%
+ \egroup
+ \fi \fi \fi}
+
+\appendtoksonce
+ \fakePDFpagedestination
+\to \everyshipout
+
\def\doPDFstartgotoJS#1#2#3%
{\bgroup
\doPSsanitizeJScode#3\to\sanitizedJScode
@@ -387,7 +527,7 @@
\def\PDFexecutestartsound {\PDFmoviecode1\currentsound0}
\def\PDFexecutestopsound {\PDFmoviecode1\currentsound1}
-\def\PDFexecutespausesound {\PDFmoviecode1\currentsound2}
+\def\PDFexecutepausesound {\PDFmoviecode1\currentsound2}
\def\PDFexecuteresumesound {\PDFmoviecode1\currentsound3}
\def\PDFformcode#1%
@@ -397,7 +537,13 @@
\def\PDFexecuteexportform {/Named /N /AcroForm:ExportFDF}
\def\PDFexecuteresetform {/ResetForm \PDFformcode\argumentA}
\def\PDFexecutesubmitform {/SubmitForm \PDFformcode\argumentB
- /Flags \ifnum\submitoutputformat=2 12\else4\fi
+ /Flags \ifcase\submitoutputformat\space
+ 4 % 0=unknown
+ \or 4 % 1=HTML
+ \or 0 % 2=FDF % was 12 ? ? ?
+ \or 32 % 3=XML
+ \else 4 % ?=unknown
+ \fi
/F (\argumentA)}
\def\PDFexecutehide {/Hide /T (\argumentA) /H true}
@@ -444,10 +590,10 @@
%D \macros
%D {doPDFstartrunprogram}
%D
-%D Running programs is possible, but rather non portable, and
-%D therefore ill advized.
+%D Running programs is possible, but is non that portable, and
+%D therefore dangerous.
-\def\doPDFstartrunprogram#1#2#3#4% new: #3 => #3#4
+\def\doPDFstartrunprogram#1#2#3#4% new: #3 => #3#4
{\bgroup
%\edef\string{#3}%
%\@EA\beforesplitstring\string\at{ }\to\program
@@ -551,8 +697,8 @@
\def\doPDFinsertmov#1#2#3#4#5#6#7#8#9%
{\bgroup
\xdef\currentmovie{#2}% label
- \ScaledPointsToBigPoints{#7}\width
- \ScaledPointsToBigPoints{#8}\height
+ \PointsToBigPoints{#7}\width
+ \PointsToBigPoints{#8}\height
\let\pdf@@options\empty
\let\pdf@@actions\empty
\donefalse
@@ -580,7 +726,7 @@
{\bgroup
\xdef\currentsound{#2}%
\flushatshipout % since it can be buried in a chained box
- {\doPDFannotation width 0 height 0 data
+ {\doPDFannotation width 0pt height 0pt data
{/Subtype /Movie
/T (sound \currentsound)
/Movie <</F (#1)>>}}%
@@ -597,7 +743,7 @@
{\bgroup
\sanitizePDFdocencoding#3\to\bookmarktext % uses scratchcounter
\scratchcounter=#4%
- \advance\scratchcounter by -1
+ \advance\scratchcounter -1
%\sanitizePDFstring#3\to\bookmarktext
\doPDFbookmark level #1 n #2 text {\bookmarktext}
page {\the\scratchcounter} open #5
@@ -665,13 +811,13 @@
\def\setFDFswitches[#1]%
{\bgroup
- \!!counta=0
- \!!countb=0
+ \!!counta\zerocount
+ \!!countb\zerocount
\def\docommando##1%
{\doifsomething{##1}
- {\advance\!!counta by 0\getvalue{\@@FDFflag##1}%
+ {\advance\!!counta 0\getvalue{\@@FDFflag##1}%
\setvalue{\@@FDFflag##1}{0}%
- \advance\!!countb by 0\getvalue{\@@FDFplus##1}%
+ \advance\!!countb 0\getvalue{\@@FDFplus##1}%
\setvalue{\@@FDFplus##1}{0}}}%
\processcommacommand[#1]\docommando
\xdef\FDFflag{\the\!!counta}%
@@ -745,7 +891,7 @@
\setbox\scratchbox=\hbox
\bgroup
\doconvertfont{#1}{}%
- \ScaledPointsToBigPoints{\number\bodyfontsize}\size % x/xx, so better the actual size
+ \PointsToBigPoints\bodyfontsize\size % x/xx, so better the actual size
\doifdefinedelse{FDF\fontstyle\fontalternative}
{\xdef\FDFattributes{\getvalue{FDF\fontstyle\fontalternative}}}
{\doifdefinedelse{FDF\fontstyle}
@@ -894,8 +1040,11 @@
\defineFDFfonts
\doPDFarrayobject class FDF name local:fields data \FDFcollection
\doPDFgetobjectreference{FDF}{local:fields}\PDFobjectreference
+ % The /NeedAppearances is pretty important because
+ % otherwise Acrobat 5 blows up on cloned radio widgets
\doPDFdictionaryobject class FDF name local:acroform data
{/Fields \PDFobjectreference\space
+ /NeedAppearances true
\doFDFiffieldset\PDFcalculationset{/CO [\doFDFgetfieldset\PDFcalculationset]}
/DR << /Font << \FDFfonts >> >>
/DA (/Helv 10 Tf 0 g)}%
@@ -966,7 +1115,7 @@
%D And a big one:
-\def\FDFencodingvector
+\def\FDFencodingvector
{/Type /Encoding
/Differences
[ 24 /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek
@@ -1194,9 +1343,11 @@
\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}%
- \doFDFdefault{#6}{#4}%
\doPDFannotationobject class FDF name #1 width #2 height #3 data
{/Subtype /Widget /T (#1) /FT /Btn
\ifFDFvalues
@@ -1210,7 +1361,6 @@
\FDFactions}%
\registerFDFobject{#1}%
\or
- \doFDFdefault{#6}{#4}%
\setFDFkids[kids:][\currentFDFkids]%
\doPDFdictionaryobject class FDF name #1 data
{/T (#1) /FT /Btn
@@ -1226,25 +1376,33 @@
\registerFDFobject{#1}%
\or
\doFDFappearance{On}{#6}{#8}%
- \doFDFdefault{#6}{#4}%
\doPDFgetobjectreference{FDF}{\currentFDFparent}\PDFobjectreference
\global\objectreferencingtrue
\doPDFannotationobject class FDF name kids:#1 width #2 height #3 data
{/Subtype /Widget
/Parent \PDFobjectreference\space
+ \ifFDFvalues
+ /DV /\FDFdefault\space
+ /V /\FDFdefault\space
+ /AS /\FDFdefault\space
+ \fi
/Ff \FDFflag\space
/F \FDFplus\space
\FDFappearance\space
\FDFactions}%
\or
\doFDFappearance{On}{#6}{#8}%
- \doFDFdefault{#6}{#4}%
\doPDFgetobjectreference{FDF}{\currentFDFparent}\PDFobjectreference
\global\objectreferencingtrue
\doPDFannotationobject class FDF name kids:#1 width #2 height #3 data
{/Subtype /Widget
/Parent \PDFobjectreference\space
/F \FDFplus\space
+ \ifFDFvalues
+ /DV /\FDFdefault\space
+ /V /\FDFdefault\space
+ /AS /\FDFdefault\space
+ \fi
\FDFappearance}%
\fi
\egroup}
@@ -1255,24 +1413,28 @@
\def\doFDFpresetcheckfield#1#2#3#4#5#6#7%
{\doFDFpresetpushcheckfield{#1}{#2}{#3}{#4}{#5}{#6}{#7}{1}}
-\def\doFDFpresetradiofield#1#2#3#4#5#6#7%
+\def\doFDFpresetradiofield#1#2#3#4#5#6#7#8%
{\bgroup
\FDFvaluestrue
- \setFDFswitches[#4]%
- \setFDFactions[#7]%
+ \setFDFswitches[#5]%
+ \setFDFactions[#8]%
+ \doifelsenothing{#4}
+ {\def\FDFdefault{Off}}
+ {\def\FDFdefault{#4}}%
\ifcase\currentFDFmode
- \doFDFappearance{#1}{#6}{1}%
- \doPDFgetobjectreference{FDF}{#5}\PDFobjectreference
+ \doFDFappearance{#1}{#7}{1}%
+ \doPDFgetobjectreference{FDF}{#6}\PDFobjectreference
\doPDFannotationobject class FDF name #1 width #2 height #3 data
{/Subtype /Widget
/Parent \PDFobjectreference\space
/F \FDFplus\space
+ /AS /\FDFdefault\space
\FDFappearance\space
\FDFactions}%
\registerFDFobject{#1}%
\or
\setFDFkids[kids:][\currentFDFkids]%
- \doPDFgetobjectreference{FDF}{#5}\PDFobjectreference
+ \doPDFgetobjectreference{FDF}{#6}\PDFobjectreference
\doPDFdictionaryobject class FDF name #1 data
{/Parent \PDFobjectreference\space
/Kids [\FDFkids]
@@ -1280,22 +1442,26 @@
\FDFactions}%
\registerFDFobject{#1}%
\or
- \doFDFappearance{#1}{#6}{1}%
+ %\doFDFappearance{#1}{#7}{1}%
+ \doFDFappearance{\currentFDFparent}{#7}{1}%
\doPDFgetobjectreference{FDF}{\currentFDFparent}\PDFobjectreference
- \global\objectreferencingtrue
+ \global\objectreferencingtrue % nb
\doPDFannotationobject class FDF name kids:#1 width #2 height #3 data
{/Subtype /Widget
/Parent \PDFobjectreference\space
+ /AS /\FDFdefault\space
/F \FDFplus\space
\FDFappearance\space
\FDFactions}%
\or
- \doFDFappearance{#1}{#6}{1}%
+ %\doFDFappearance{#1}{#7}{1}%
+ \doFDFappearance{\currentFDFparent}{#7}{1}%
\doPDFgetobjectreference{FDF}{\currentFDFparent}\PDFobjectreference
\global\objectreferencingtrue
\doPDFannotationobject class FDF name kids:#1 width #2 height #3 data
{/Subtype /Widget
/Parent \PDFobjectreference\space
+ /AS /\FDFdefault\space
/F \FDFplus\space
\FDFappearance\space}
\fi
@@ -1308,7 +1474,7 @@
\setFDFactions[#5]%
\doPDFdictionaryobject class FDF name #1 data
{/Subtype /Widget /FT /Btn /T (#1) /Rect [0 0 0 0]
- /DV /#2 /V /#2
+ /DV (#2) % /V (#2)
/H /N
/Ff \FDFflag\space /F \FDFplus\space /Kids [\FDFkids]
\FDFactions}%
@@ -1369,11 +1535,14 @@
\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%
- {\dogetcommacommandelement1\from#1,\to\commalistelement
- \dogetcommacommandelement1\from\commalistelement\to\commalistelement
- \doifelse{\commalistelement}{#2} % kan ook met \ifx
- {\def\FDFdefault{On}}{\def\FDFdefault{Off}}}
+ {\doifelse{#2}{1}{\def\FDFdefault{On}}{\def\FDFdefault{Off}}}
%D The three appearances {\em normal}, \type{roll over} and
%D \type{push down} are passed as comma separated triplets,
@@ -1417,16 +1586,22 @@
\doPDFresetgotowhereever % just to be sure
+% we can (in etex) share more by testing on this
+
\def\savesecondaryPDFreference#1%
- {\setxvalue{PDF-SR:\the\nofsecondaryreferences}{#1}}
+ %{\setxvalue{PDF-SR:\the\nofsecondaryreferences}{#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%
- {\ifnum\nofsecondaryreferences>0
+ {\ifcase\nofsecondaryreferences\else
%\doifdefined{PDF-SR:\the\nofsecondaryreferences}
\xdef\secondaryPDFreferences%
- {/Next << \getvalue{PDF-SR:\the\nofsecondaryreferences}\space
+ {/Next << \csname PDF-SR:\the\nofsecondaryreferences\endcsname\space
\secondaryPDFreferences >>}%
- \global\advance\nofsecondaryreferences by -1
+ \global\advance\nofsecondaryreferences \minusone
\expandafter\getsecondaryPDFreferences
\fi}
@@ -1512,7 +1687,7 @@
\global\let\normalslash=/
\catcode`\/=\@@escape
-\gdef\TEXloadFDFfields#1%
+\gdef\TEXloadFDFfields#1% will become obsolete due to XFDF
{\bgroup
\setbox0=\hbox
{\global\let\allFDFfields\empty
@@ -1639,9 +1814,9 @@
\PDFcomment
\PDFidentifier
\PDFattributes}}%
- \wd\scratchbox=\!!zeropoint
- \ht\scratchbox=\!!zeropoint
- \dp\scratchbox=\!!zeropoint
+ \wd\scratchbox\zeropoint
+ \ht\scratchbox\zeropoint
+ \dp\scratchbox\zeropoint
\box\scratchbox
\egroup}
@@ -1675,24 +1850,24 @@
%D implemented in the \POSTSCRIPT\ driver.
\def\doPDFovalcalc#1#2#3%
- {\dimen2=#1sp
- \advance\dimen2 by #2\relax
- \ScaledPointsToBigPoints{\number\dimen2}#3}
+ {\dimen2=#1%
+ \advance\dimen2 #2\relax
+ \PointsToBigPoints{\dimen2}#3}
-\def\doPDFovalbox#1#2#3#4#5#6#7%
+\def\doPDFovalbox#1#2#3#4#5#6#7% todo: \scratchdimen/\scatchbox
{\bgroup
- \dimen0=#4sp\divide\dimen0 by 2
+ \dimen0=#4\divide\dimen0 by 2
\doPDFovalcalc{0}{+\dimen0}\xmin
\doPDFovalcalc{#1}{-\dimen0}\xmax
\doPDFovalcalc{#2}{-\dimen0}\ymax
\doPDFovalcalc{-#3}{+\dimen0}\ymin
- \advance\dimen0 by #5sp
+ \advance\dimen0 by #5%
\doPDFovalcalc{0}{+\dimen0}\xxmin
\doPDFovalcalc{#1}{-\dimen0}\xxmax
\doPDFovalcalc{#2}{-\dimen0}\yymax
\doPDFovalcalc{-#3}{+\dimen0}\yymin
- \doPDFovalcalc{#4}{0pt}\stroke
- \doPDFovalcalc{#5}{0pt}\radius
+ \doPDFovalcalc{#4}{\zeropoint}\stroke
+ \doPDFovalcalc{#5}{\zeropoint}\radius
\edef\dostroke{#6}%
\edef\dofill{#7}%
\setbox0=\hbox
@@ -1716,7 +1891,7 @@
\ifnum\dofill=1 f \fi
Q}%
\fi}%
- \wd0=#1sp\ht0=#2sp\dp0=#3sp\box0
+ \wd0=#1\ht0=#2\dp0=#3\box0
\egroup}
%D \macros
@@ -1809,10 +1984,51 @@
\PDFcode{/GSpositive gs}%
\fi}
+%D Transparency support (experimental):
+
+\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>>}
+
+\newif\ifPDFtransparencysupported
+
+\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
+
+%D These use:
+
+\let\PDFtransparencyresetreference \empty
+\let\PDFtransparencyresetidentifier\empty
+
+\let\PDFtransparencyreference \empty
+\let\PDFtransparencyidentifier\empty
+
+\let\presetPDFtransparency \gobbletwoarguments
+\let\initializetransparency\relax
+
%D And that was all.
\stopspecials
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/spec-ini.tex b/tex/context/base/spec-ini.tex
index 8d6dbc70d..db56152e6 100644
--- a/tex/context/base/spec-ini.tex
+++ b/tex/context/base/spec-ini.tex
@@ -11,6 +11,8 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+\newif\ifsimplifyspecials \simplifyspecialstrue % see later
+
%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
@@ -252,11 +254,11 @@
%D We define some local constants and variables. They look a
%D bit horrible but we don't want conflicts.
-\def\@@specfil@@{@@specfil@@}
-\def\@@speclst@@{@@speclst@@}
-\def\@@speccat@@{@@speccat@@}
-\def\@@specarg@@{@@specarg@@}
-\def\@@specexc@@{@@specexc@@}
+\def\@@specfil@@{@@spcfil@@}
+\def\@@speclst@@{@@spclst@@}
+\def\@@speccat@@{@@spccat@@}
+\def\@@specarg@@{@@spcarg@@}
+\def\@@specexc@@{@@spcexc@@}
% not faster
%
@@ -266,9 +268,9 @@
% \def\@@specarg@@{@sp@a@}
% \def\@@specexc@@{@sp@e@}
-\let\currentspecial =\empty
-\let\currentspecialfile=\empty
-\let\preloadedspecials =\empty
+\let\currentspecial \empty
+\let\currentspecialfile\empty
+\let\preloadedspecials \empty
%D \macros
%D {preloadspecials}
@@ -291,34 +293,6 @@
%D The optional second argument can consist of a list of
%D libraries that are to be loaded first.
-% to fuzzy and error prone
-%
-% \def\dostartspecials[#1][#2]%
-% {\let\mainspecialfile=\currentspecialfile
-% \doifelsenothing{#2}
-% {\inheritspecialsfalse}
-% {\ifinheritspecials
-% \showmessage{\m!specials}{2}{(#2)}%
-% \else
-% \inheritspecialstrue
-% \processcommalist[#2]\dousespecials
-% \inheritspecialsfalse
-% \fi}%
-% \doifelsenothing{#1}
-% {\let\currentspecial\s!unknown}
-% {\def\currentspecial{#1}}%
-% \let\currentspecialfile=\mainspecialfile
-% \setevalue{\@@specfil@@\currentspecial}{\currentspecialfile}%
-% \unprotect
-% \addtocommalist{\currentspecial}\preloadedspecials}
-%
-% \def\startspecials%
-% {\dodoubleempty\dostartspecials}
-%
-% \def\stopspecials%
-% {\def\currentspecial{}%
-% \protect}
-
\def\dostartspecials[#1][#2]%
{\doifsomething{#2}
{\processcommalist[#2]\dousespecials}%
@@ -410,25 +384,25 @@
%D {usespecials}
%D
%D We use \type{\usespecials} to load a specific library.
-%D This command is only permitted outside de definition part.
+%D This command is only permitted outside the definition part.
-\def\dousespecials#1%
+\def\dousespecials#1%
{\doifelse{#1}{\v!reset}
{\resetspecials}
{\doifdefinedelse{\@@specfil@@#1}
{\edef\currentspecialfile{\getvalue{\@@specfil@@#1}}}
{\edef\currentspecialfile{#1}}%
\makeshortfilename[\f!specialprefix\currentspecialfile]%
- \showmessage{\m!specials}{5}{\currentspecialfile}%
+ \showmessage\m!specials5\currentspecialfile
\startreadingfile
- \readsysfile{\shortfilename}{}{}%
+ \readsysfile\shortfilename\donothing\donothing
\stopreadingfile
- \showmessage{\m!specials}{1}{\preloadedspecials}}}
+ \showmessage\m!specials1\preloadedspecials}}
\def\usespecials[#1]%
{\doifelsenothing{\currentspecial}
{\processcommalist[#1]\dousespecials}
- {\showmessage{\m!specials}{6}{}}}
+ {\showmessage\m!specials6\empty}}
%D \macros
%D {executespecials}
@@ -555,8 +529,8 @@
%D because we pass all those arguments to the specials support
%D macro.
-\let\openspecialfile = \relax
-\let\closespecialfile = \relax
+\let\openspecialfile \relax
+\let\closespecialfile \relax
%D \macros
%D {doifspecialavailableelse}
@@ -577,832 +551,56 @@
\def\doifspecialavailableelse#1#2#3%
{\doifelsevaluenothing{\@@speclst@@\string#1}{#3}{#2}}
-%D The following libraries are defined. Two postscript
-%D drivers are supported, as well as two mechanisms for
-%D interactive texts.
-%D
-%D \startregelcorrectie
-%D \starttabel[|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 \stoptabel
-%D \stopregelcorrectie
-
-%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 \startopsomming[opelkaar,n]
-%D \som insert driver specific commands
-%D \som pass instructions to the output device
-%D \stopopsomming
-%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 \startopsomming[opelkaar,n]
-%D \som let \TEX\ do the job
-%D \som let the driver handle things
-%D \stopopsomming
-%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 \kap{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 \kap{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 \kap{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 \starttypen
-%D \dostartgraymode {gray} ... \dostopgraymode
-%D \dostartrgbcolormode {red} {green} {blue} ... \dostopcolormode
-%D \dostartcmykcolormode {cyan} {magenta} {yellow} {black} ... \dostopcolormode
-%D \dostartgraycolormode {gray} ... \dostopcolormode
-%D \stoptypen
-%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 For some drivers, the stop special is of no use and can
-%D simply call the start one with zero arguments.
-
-%D \macros
-%D {doinsertfile}
-%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 \starttypen
-%D \doinsertfile {type,method} {file,label}
-%D {xscale} {yscale} {x} {y} {w} {h}
-%D {options}
-%D \stoptypen
-%D
-%D The scale is given percents, the other values are base
-%D points.
-%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 [\doinsertfile] [or] [9]
-
-%D No start||stop construction is needed here, because there in
-%D no further interference of \TEX. All dimensions are output
-%D as scaled points and scales as a number, where 100 equal
-%D 100\%.
-
-%D \macros
-%D {doinsertsoundtrack}
-%D
-%D Sounds are (for the moment) just files with
-%D associated options.
-%D
-%D \starttypen
-%D \doinsertsoundtrack {file} {label} {options}
-%D \stoptypen
-
-\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 \starttypen
-%D \dogetnofinsertpages{filename}
-%D \stoptypen
-%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 \starttypen
-%D \dostartrotation {angle} ... \dostoprotation
-%D \stoptypen
-%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 \starttypen
-%D \dostartscaling {x} {y} ... \dostopscaling
-%D \stoptypen
-%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 \starttypen
-%D \dostartmirroring {x} {y} ... \dostopmirroring
-%D \stoptypen
-%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 {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 \starttypen
-%D \doovalbox {w} {h} {d} {linewidth} {radius} {stroke} {fill}
-%D \stoptypen
-%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] [7]
-
-%D \macros
-%D {dostartclipping,dostopclipping}
-%D
-%D Clipping is implemented in such a way that an arbitrary
-%D can be fed.
-%D
-%D \starttypen
-%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 \starttypen
-%D \dosetupidentity {title} {subject} {author} {creator} {date}
-%D \stoptypen
-%D
-%D All data is in string format.
-
-\installspecial [\dosetupidentity] [and] [5]
-
-%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 \starttypen
-%D \dosetuppaper {type} {width} {height}
-%D \stoptypen
-%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 \starttypen
-%D \dosetupprinter {type} {hoffset} {voffset} {width} {height}
-%D \stoptypen
-%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 {% dosetuppage,
-%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 \starttypen
-%D \dosetupinteraction
-%D \stoptypen
-%D
-%D Normally this command does nothing but giving a message
-%D that some scheme is supported.
-%D
-%D \starttypen
-%D \dosetupstartaction
-%D \dosetupstopaction
-%D \stoptypen
-%D
-%D These two setup the actions to be executed when the document
-%D is opened and closed.
-%D
-%D The next command sets up the screen. It takes five
-%D arguments:
-%D
-%D \starttypen
-%D \dosetupscreen {hoffset} {voffset} {width} {height} {options}
-%D \stoptypen
-%D
-%D The first four arguments are in scaled points. Option~1
-%D results in a full screen launch.
-%D
-%D \starttypen
-%D \dosetuppageview {keyword}
-%D \stoptypen
-%D
-%D For the moment we only support \type{fit}.
-
-\installspecial [\dosetupinteraction] [and] [0]
-\installspecial [\dosetupopenaction] [and] [0]
-\installspecial [\dosetupcloseaction] [and] [0]
-\installspecial [\dosetupopenpageaction] [and] [0]
-\installspecial [\dosetupclosepageaction] [and] [0]
-\installspecial [\dosetupscreen] [and] [5]
-\installspecial [\dosetuppageview] [and] [1]
-
-%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 \starttypen
-%D \dostarthide
-%D \dostophide
-%D \stoptypen
-
-\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 \startopsomming[opelkaar,n]
-%D \som let \TEX\ highlight the text
-%D \som let the driver show us where to click
-%D \stopopsomming
-%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 \starttypen
-%D \dostartgotolocation {w} {h} {url} {file} {label} {page}
-%D \dostartgotorealpage {w} {h} {url} {file} {page}
-%D \stoptypen
-%D
-%D Their counterparts are:
-%D
-%D \starttypen
-%D \dostopgotolocation
-%D \dostopgotorealpage
-%D \stoptypen
-%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 \starttypen
-%D \dostartgotoJS {w} {h} {script}
-%D \stoptypen
-%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 \starttypen
-%D \dostartthisislocation {label}
-%D \dostartthisisrealpage {page}
-%D \stoptypen
-%D
-%D These commands are accompanied by:
-%D
-%D \starttypen
-%D \dostopthisislocation
-%D \dostopthisisrealpage
-%D \stoptypen
-%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 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 In \CONTEXT\ we don't use the \type{\stopsomething}
-%D macros because we let \TEX\ take care of typographic
-%D issues.
+%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.
-%D \macros
-%D {doresetgotowhereever}
-%D
-%D These and others need:
+\ifsimplifyspecials
-\installspecial [\doresetgotowhereever] [and] [0]
+ \def\doinstallspecial[#1][#2][#3]%
+ {\appendtoks\forgetspecial#1{#3}\to\everyresetspecials
+ \@EA\chardef\csname\@@speclst@@\string#1\endcsname0
+ \forgetspecial#1{#3}}
-%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 \starttypen
-%D \dostartexecutecommand {w} {h} {command} {options}
-%D \stoptypen
-%D
-%D At least the next commands are supported (more examples
-%D can be found in \type {spec-fdf.tex}:
-%D
-%D \startregelcorrectie\steluitlijnenin[midden]\leavevmode
-%D \starttabel[|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 \stoptabel
-%D \stopregelcorrectie
-%D
-%D Options are to be passed as a comma separated list of
-%D assignments.
+ \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}
-\installspecial [\dostartexecutecommand] [and] [4]
-\installspecial [\dostopexecutecommand] [and] [0]
+ \def\resetspecials%
+ {\the\everyresetspecials
+ \let\preloadedspecials\empty}
-%D \macros
-%D {dostartobject,
-%D dostopobject,
-%D doinsertobject}
-%D
-%D Reuse of object can reduce the output filesize
-%D considerably. Reusable objects are implemented with:
-%D
-%D \starttypen
-%D \dostartobject{class}{name}{width}{height}{depth}
-%D some typeset material
-%D \dostopobject
-%D \stoptypen
-%D
-%D \starttypen
-%D \doinsertobject{class}{name}
-%D \stoptypen
-%D
-%D The savings can be huge in interactive texts.
-
-\installspecial [\dostartobject] [or] [5]
-\installspecial [\dostopobject] [or] [0]
-\installspecial [\doinsertobject] [or] [2]
-
-%D \macros
-%D {doregisterfigure}
-%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]
-
-% %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 assiciated value.
+ \def\definespecial#1%
+ {\@EA\chardef\csname\@@speclst@@\string#1\endcsname=1
+ \def#1}
-%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.
+ \def\doifspecialavailableelse#1%
+ {\ifcase\csname\@@speclst@@\string#1\endcsname
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
-\installspecial [\doinsertbookmark] [and] [5]
+\fi
-%D This special is called as:
+%D For quite some time the \CONTEXT\ way of specifying the
+%D output format has been:
%D
%D \starttypen
-%D \doinstallbookmark {level} {nofsubentries} {text} {page} {open}
-%D \stoptypen
-%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 \starttypen
-%D \dosetpagetransition{dissolve}{0}
-%D \stoptypen
-%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 \starttypen
-%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}
-%D {options} {parent} {values} {actions}
-%D
-%D \dopresetradiorecord
-%D {name} {top} {options} {kids} {actions}
-%D \stoptypen
-
-\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] [7]
-\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 \starttypen
-%D \dosetfieldstatus {mode} {parent} {kids} {root}
-%D \stoptypen
-
-\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 \starttypen
-%D \doregistercalculationset {set identifier}
-%D \stoptypen
-
-\installspecial [\doregistercalculationset] [or] [1]
-
-%D \macros
-%D {doinsertcomment}
-%D
-%D Not so much out of need, but to be complete, we also
-%D implement text annotations, so called comment:
-%D
-%D \starttypen
-%D \doinsertcomment
-%D {title} {width} {height} {color} {open} {symbol} {data}
-%D \stoptypen
-
-\installspecial[\doinsertcomment] [and] [7]
-
-%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 \starttypen
-%D \dosetposition {identifier}
-%D \dosetpositionwhd {identifier} {width} {height} {depth}
-%D \dosetpositionplus {identifier} {width} {height} {depth} {list}
-%D \dosetpositionpapersize {width} {height}
-%D \stoptypen
-%D
-%D This is one of the few specials where when using \PDFTEX\
-%D the driver directly deals with the utility file.
-
-\installspecial [\dosetposition] [or] [1]
-\installspecial [\dosetpositionwhd] [or] [4]
-\installspecial [\dosetpositionplus] [or] [5]
-\installspecial [\dosetpositionpapersize] [or] [2]
-
-%D So far for the installation. For quite some time the
-%D \CONTEXT\ way of specifying the output format has been:
-%D
-%D \starttypen
%D \usespecials[ps,yy,win,pdf]
%D \stoptypen
%D
@@ -1428,7 +626,7 @@
%D \setupoutput[name,...]
%D \stoptypen
%D
-%D In a few lines, we will see some examples.
+%D In a \type {spec-def} you can find some examples.
\def\defineoutput%
{\dodoubleargument\dodefineoutput}
@@ -1446,37 +644,4 @@
\def\setupoutput[#1]%
{\resetspecials\processcommacommand[#1]\dosetupoutput}
-%D Some suitable definitions are:
-
-\defineoutput [dvipsone] [dvi,ps,yy]
-\defineoutput [dviwindo] [dvi,ps,yy,win]
-\defineoutput [dvips] [dvi,ps,tr]
-\defineoutput [dviview] [dvi,ps,tr,dv]
-\defineoutput [dvipdfm] [dpm]
-\defineoutput [pdftex] [tpd]
-\defineoutput [pdf] [tpd]
-\defineoutput [acrobat] [pdf,ps,tr] % use: [acrobat,dvipsone]
-
-%D Please let me know if we need more. From now on we default
-%D to:
-
-\setupoutput [dvips]
-
-%D We don't enable \ACROBAT, because pure \POSTSCRIPT\ is not
-%D that strong on objects and \PDFTEX\ does a better job.
-%D Some reasonable alternatives are:
-%D
-%D \starttypen
-%D \setupoutput [dvipsone,acrobat]
-%D \setupoutput [dviwindo,acrobat]
-%D \stoptypen
-%D
-%D Although, better is:
-%D
-%D \starttypen
-%D \setupoutput [pdftex]
-%D \stoptypen
-
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/spec-mis.tex b/tex/context/base/spec-mis.tex
index ae7c61e44..b05832085 100644
--- a/tex/context/base/spec-mis.tex
+++ b/tex/context/base/spec-mis.tex
@@ -79,7 +79,7 @@
%D All driver modules use the same scheme for file insertion,
%D and therefore have the next macro in common:
-\def\dododoinsertfile[#1][#2,#3][#4,#5]%
+\def\dododoinsertfile[#1][#2,#3][#4,#5]% \next kan weg
{\def\fileinsertionclass{do#1insert}%
\doifdefinedelse{\fileinsertionclass#3}
{\def\next{\getvalue{\fileinsertionclass#3}}}
@@ -123,13 +123,13 @@
%D When submitting forms, we need to communicate the format.
-\chardef\submitoutputformat=0 % 0=unknown 1=HTML 2=FDF
+\chardef\submitoutputformat=0 % 0=unknown 1=HTML 2=FDF 3=XML
\def\setsubmitoutputformat#1%
{\doifinsetelse{#1}{FDF,fdf}
{\chardef\submitoutputformat=2}
- {\chardef\submitoutputformat=1}}
+ {\doifinsetelse{#1}{XML,xml}
+ {\chardef\submitoutputformat=3}
+ {\chardef\submitoutputformat=1}}}
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/spec-pdf.tex b/tex/context/base/spec-pdf.tex
index 576d99925..6c8215c1f 100644
--- a/tex/context/base/spec-pdf.tex
+++ b/tex/context/base/spec-pdf.tex
@@ -167,8 +167,8 @@
{\bgroup
\setPDFdestination{#1}%
\doifsomething{\PDFdestination}
- {\ScaledPointsToBigPoints{#2}\width
- \ScaledPointsToBigPoints{#3}\height
+ {\PointsToBigPoints{#2}\width
+ \PointsToBigPoints{#3}\height
\special
{\@@insertpostscriptretain
[ /Title (\PDFdestination)
@@ -208,9 +208,9 @@
{\bgroup
\setbox\nextbox=\hbox\bgroup
\bgroup
- \ScaledPointsToBigPoints{#3}\width
- \ScaledPointsToBigPoints{#4}\height
- \ScaledPointsToBigPoints{#5}\depth
+ \PointsToBigPoints{#3}\width
+ \PointsToBigPoints{#4}\height
+ \PointsToBigPoints{#5}\depth
\dosetobjectreference{#1}{#2}{#1::#2}%
\special
{\@@insertpostscriptretain
@@ -331,18 +331,25 @@
\xdef\lastPDFaction{#3}%
\else
\bgroup
- \xdef\lastPDFaction{<<#3>>}%
- % does not work well with distiller 4
- % \ifcase\similarreference\relax\or\ifsharePDFactions
- % \global\advance\nofPDFsimilar by 1
- % \special
- % {\@@insertpostscriptretain
- % [ /_objdef {PDF::sim:\the\nofPDFsimilar} /type /dict /OBJ pdfmark
- % [ {PDF::sim:\the\nofPDFsimilar} \lastPDFaction\space /PUT pdfmark}%
- % \xdef\lastPDFaction{{PDF::sim:\the\nofPDFsimilar}}%
- % \fi\fi
- \ScaledPointsToBigPoints{#1}\width
- \ScaledPointsToBigPoints{#2}\height
+ % does not work well with distiller 4
+ %\ifsharePDFactions
+ % \ifcase\similarreference\relax
+ % \xdef\lastPDFaction{<<#3>>}%
+ % \or
+ % \global\advance\nofPDFsimilar by 1
+ % \special
+ % {\@@insertpostscriptretain
+ % [ /_objdef {PDF::sim:\the\nofPDFsimilar} /type /dict /OBJ pdfmark
+ % [ {PDF::sim:\the\nofPDFsimilar} <<#3>>\space /PUT pdfmark}%
+ % \xdef\lastPDFaction{{PDF::sim:\the\nofPDFsimilar}}%
+ % \else
+ % % leave \lastPDFaction untouched
+ % \fi
+ %\else
+ \xdef\lastPDFaction{<<#3>>}%
+ %\fi
+ \PointsToBigPoints{#1}\width
+ \PointsToBigPoints{#2}\height
\special
{\@@insertpostscriptretain
[ /Action \lastPDFaction\space
@@ -357,8 +364,8 @@
\def\doPDFannotation width #1 height #2 data #3%
{\bgroup
- \ScaledPointsToBigPoints{#1}\width
- \ScaledPointsToBigPoints{#2}\height
+ \PointsToBigPoints{#1}\width
+ \PointsToBigPoints{#2}\height
\special
{\@@insertpostscriptretain
[ /Rect [0 0 \width\space \height] #3
@@ -368,8 +375,8 @@
\def\doPDFannotationobject class #1 name #2 width #3 height #4 data #5%
{\bgroup
- \ScaledPointsToBigPoints{#3}\width
- \ScaledPointsToBigPoints{#4}\height
+ \PointsToBigPoints{#3}\width
+ \PointsToBigPoints{#4}\height
\special
{\@@insertpostscriptretain
[ /_objdef {#1::#2}
@@ -415,12 +422,16 @@
{\@@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
@@ -455,6 +466,4 @@
\stopspecials
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/spec-ps.tex b/tex/context/base/spec-ps.tex
index 9a5a81490..b31a4e4c0 100644
--- a/tex/context/base/spec-ps.tex
+++ b/tex/context/base/spec-ps.tex
@@ -20,7 +20,6 @@
%D dostartnegative,dostopnegative,
%D doselectfirstpaperbin,
%D doselectsecondpaperbin}
-%D {}
%D
%D This implementation is straightforward and can be used as
%D a default with postscript||drivers. We use \type{ps:} as
@@ -116,7 +115,6 @@
%D \macros
%D {doovalbox}
-%D {}
%D
%D This implementation is a mixture of several possible
%D implementations. We use some constants that may not be
@@ -144,14 +142,14 @@
\def\@@insertpostscriptretain {postscript } % unknown
\def\dosomeovalcalc#1#2#3%
- {\dimen2=#1sp%
- \advance\dimen2 by #2%
- \ScaledPointsToBigPoints{\number\dimen2}#3}
+ {\dimen2=#1%
+ \advance\dimen2 #2%
+ \PointsToBigPoints{\dimen2}#3}
\def\dosomeovalbox#1#2#3#4#5#6#7%
{\bgroup
- \dimen0=#4sp\divide\dimen0 by 2
- \dosomeovalcalc {0}{+\dimen0}\xmin
+ \dimen0=#4\divide\dimen0 2
+ \dosomeovalcalc{0pt}{+\dimen0}\xmin
\dosomeovalcalc{#1}{-\dimen0}\xmax
\dosomeovalcalc{#2}{-\dimen0}\ymax
\dosomeovalcalc{-#3}{+\dimen0}\ymin
@@ -183,7 +181,7 @@
{fill} if
grestore}%
\fi}%
- \wd0=#1sp\ht0=#2sp\dp0=#3sp\box0
+ \wd0=#1\ht0=#2\dp0=#3\box0
\egroup}
%D The indirect call permits a (rather) dirty hack, needed
@@ -198,8 +196,8 @@
%D These two specials are not yet working as expected.
\definespecial\dostartclipping#1#2#3%
- {\ScaledPointsToBigPoints{#2}\width
- \ScaledPointsToBigPoints{#3}\height
+ {\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
diff --git a/tex/context/base/spec-tpd.tex b/tex/context/base/spec-tpd.tex
index 7dba68e6f..5b9d66613 100644
--- a/tex/context/base/spec-tpd.tex
+++ b/tex/context/base/spec-tpd.tex
@@ -138,8 +138,8 @@
%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}
+ {\global\pdfpagewidth #2\relax
+ \global\pdfpageheight#3\relax}
%D \macros
%D {doinsertfile,dogetnofinsertpages}
@@ -195,7 +195,7 @@
%D {\beforesplitstring#1\at.\to\filename
%D \scratchdimen=#3pt \PointsToReal{.01\scratchdimen}\xscale
%D \scratchdimen=#4pt \PointsToReal{.01\scratchdimen}\yscale
-%D \convertPDFtoPDF{\filename.pdf}\xscale\yscale{#5sp}{#6sp}{#7sp}{#8sp}}
+%D \convertPDFtoPDF{\filename.pdf}\xscale\yscale{#5}{#6}{#7}{#8}}
%D \stoptypen
%D
%D superseded by the next macros.
@@ -246,14 +246,14 @@
\doifvalidpdfimagefileelse{#1}
{\checkpdfimagepagenumber{#9}%
\immediate\pdfximage
- \ifcase#7 \else \!!width #7sp\fi
- \ifcase#8 \else \!!height #8sp\fi
+ \ifdim#7>\zeropoint \!!width #7\fi
+ \ifdim#8>\zeropoint \!!height #8\fi
\pdfimagepagenumber
{#1}%
\xdef\PDFimagereference{\the\pdflastximage}%
\xdef\nofinsertpages{\the\pdflastximagepages}%
\pdfrefximage\pdflastximage}
- {\framed[\c!breedte=#7sp,\c!hoogte=#8sp]{#1}}%
+ {\framed[\c!breedte=#7,\c!hoogte=#8]{#1}}%
\egroup}
\else
@@ -262,10 +262,10 @@
{\bgroup
\doifvalidpdfimagefileelse{#1}
{\pdfimage
- \ifcase#7 \else \!!width #7sp\fi
- \ifcase#8 \else \!!height #8sp\fi
+ \ifdim#7>\zeropoint \!!width #7\fi
+ \ifdim#8>\zeropoint \!!height #8\fi
{#1}}%
- {\framed[\c!breedte=#7sp,\c!hoogte=#8sp]{#1}}%
+ {\framed[\c!breedte=#7,\c!hoogte=#8]{#1}}%
\egroup}
\fi
@@ -314,8 +314,8 @@
\def\dogetTPDfiguresize#1#2#3#4#5#6#7%
{\ifmeasureTPDfiguresize
- #4=\!!zeropoint
- #5=\!!zeropoint
+ #4=\zeropoint
+ #5=\zeropoint
\doifvalidpdfimagefileelse{#2}
{\ifvoid\foundexternalfigure
\donetrue
@@ -338,8 +338,8 @@
\global\let\PDFfigurereference\empty
\global\let\PDFimageattributes\empty
\else
- #6=\!!zeropoint
- #7=\!!zeropoint
+ #6=\zeropoint
+ #7=\zeropoint
\fi
\else
#1{#2}{#3}{#4}{#5}{#6}{#7}% \normaldogetfiguresize...
@@ -349,14 +349,14 @@
\def\dogetTPDfiguresize#1#2#3#4#5#6#7%
{\ifmeasureTPDfiguresize
- #4=\!!zeropoint
- #5=\!!zeropoint
+ #4=\zeropoint
+ #5=\zeropoint
\doifvalidpdfimagefileelse{#2}
{\global\setbox\foundexternalfigure=\vbox{\pdfimage{#2}}%
#6=\wd\foundexternalfigure
#7=\ht\foundexternalfigure}
- {#6=\!!zeropoint
- #7=\!!zeropoint}%
+ {#6=\zeropoint
+ #7=\zeropoint}%
\else
#1{#2}{#3}{#4}{#5}{#6}{#7}% \normaldogetfiguresize...
\fi}
@@ -432,21 +432,66 @@
\definespecial\dostopnegative {\doPDFstopnegative}
%D \macros
+%D {dostarttransparency,dostoptransparency}
+%D
+%D For transparency, we need to implement a couple of
+%D auxiliary macros. If needed, we will generalize tham later.
+
+\definespecial\dostarttransparency {\doPDFstarttransparency}
+\definespecial\dostoptransparency {\doPDFstoptransparency}
+
+\PDFtransparencysupportedtrue
+
+\def\@@PDT{@PDT@}
+
+\newcount\PDFcurrenttransparency \PDFcurrenttransparency=0 % -1
+
+\def\assignPDFtransparency#1#2%
+ {\def\PDFtransparencyidentifier{/Tr#1}%
+ \def\PDFtransparencyreference{#2 0 R}}
+
+\def\presetPDFtransparency#1#2%
+ {\initializePDFtransparency
+ \executeifdefined{\@@PDT#1:#2}{\dopresetPDFtransparency{#1}{#2}}}
+
+\def\dopresetPDFtransparency#1#2%
+ {\global\advance\PDFcurrenttransparency 1
+ \immediate\pdfobj{\PDFtransparancydictionary{#1}{#2}{}}%
+ \edef\PDFtransparencyidentifier{/Tr\the\PDFcurrenttransparency}%
+ \edef\PDFtransparencyreference {\the\pdflastobj\space 0 R}%
+ \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{\the\pdflastobj\space 0 R}%
+ \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%
- {\ScaledPointsToBigPoints{#2}\width
- \ScaledPointsToBigPoints{#3}\height
+ {\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}}
\definespecial\dostopclipping%
- {\pdfliteral{Q}}
+ {\pdfliteral{Q n}}
%D \macros
%D {dosetupinteraction,
@@ -584,7 +629,7 @@
{\setPDFdestination{#1}%
\doifsomething{\PDFdestination}
{\pdfthread
- width #2sp height #3sp
+ width #2 height #3
attr {/Title (\PDFdestination)} % can be omitted
name {\PDFdestination}}}
@@ -650,12 +695,15 @@
\else
\dosetobjectreference{#1}{#2}{-\PDFimagereference}%
\global\let\PDFimagereference\empty
- \fi}}
+ \fi}}
\definespecial\dostopobject%
{\dodostopobject
\egroup}
+ \definespecial\doresetobjects
+ {\global\let\PDFimagereference\empty}
+
\definespecial\doinsertobject#1#2%
{\bgroup
\doifobjectreferencefoundelse{#1}{#2}
@@ -822,24 +870,62 @@
\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 width #1 height #2 action #3%
{\ifcollectreferenceactions
\xdef\lastPDFaction{#3}%
\else
- \xdef\lastPDFaction{<<#3>>}%
- \ifcase\similarreference\relax\or\ifsharePDFactions
- \immediate\pdfobj{\lastPDFaction}%
- \xdef\lastPDFaction{\the\pdflastobj\space0 R}%
- \fi\fi
+ \ifsharePDFactions
+ \ifcase\similarreference\relax
+ \xdef\lastPDFaction{<<#3>>}%
+ \or
+ \immediate\pdfobj{<<#3>>}%
+ \xdef\lastPDFaction{\the\pdflastobj\space0 R}%
+ \else
+ % leave \lastPDFaction untouched
+ \fi
+ \else
+ \xdef\lastPDFaction{<<#3>>}%
+ \fi
\pdfannot
- width #1sp height #2sp depth 0sp
+ width #1 height #2 depth \zeropoint
{/Subtype /Link
/Border [0 0 0]
\ifhighlighthyperlinks \else /H /N \fi
/A \lastPDFaction}%
- \fi}
+ \fi}
+
+ % less #2 passing
+
+ \def\doPDFaction width #1 height #2 action #3%
+ {\xdef\lastPDFcontent{#3}%
+ \ifcollectreferenceactions
+ \global\let\lastPDFaction\lastPDFcontent
+ \else
+ \ifsharePDFactions
+ \ifcase\similarreference\relax
+ \xdef\lastPDFaction{<<\lastPDFcontent>>}%
+ \or
+ \immediate\pdfobj{<<\lastPDFcontent>>}%
+ \xdef\lastPDFaction{\the\pdflastobj\space0 R}%
+ \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
@@ -847,13 +933,20 @@
{\ifcollectreferenceactions
\xdef\lastPDFaction{#3}%
\else
- \xdef\lastPDFaction{<<#3>>}%
- \ifcase\similarreference\relax\or\ifsharePDFactions
- \immediate\pdfobj{\lastPDFaction}%
- \xdef\lastPDFaction{\the\pdflastobj\space0 R}%
- \fi\fi
+ \ifsharePDFactions
+ \ifcase\similarreference\relax
+ \xdef\lastPDFaction{<<#3>>}%
+ \or
+ \immediate\pdfobj{<<#3>>}%
+ \xdef\lastPDFaction{\the\pdflastobj\space0 R}%
+ \else
+ % leave \lastPDFaction untouched
+ \fi
+ \else
+ \xdef\lastPDFaction{<<#3>>}%
+ \fi
\pdfannotlink % could be \pdfannot if not the - problem was there
- width #1sp height #2sp depth 0sp
+ width #1 height #2 depth \zeropoint
user {/Subtype /Link
/Border [0 0 0]
\ifhighlighthyperlinks \else /H /N \fi
@@ -866,7 +959,7 @@
% pdftex and viewers give problems with this one (printing forms)
%
%\def\doPDFannotation width #1 height #2 data #3%
-% {\pdfannot width #1sp height -#2sp depth 0sp {#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.
@@ -874,12 +967,12 @@
\ifnum\pdftexversion>13
\def\doPDFannotation width #1 height #2 data #3%
- {\pdfannot width #1sp height #2sp depth 0sp {#3}}
+ {\pdfannot width #1 height #2 depth \zeropoint{#3}}
\else
\def\doPDFannotation width #1 height #2 data #3%
- {\hbox{\raise#2sp\hbox{\pdfannot width #1sp height #2sp depth 0sp {#3}}}}
+ {\hbox{\raise#2\hbox{\pdfannot width #1 height #2 depth \zeropoint{#3}}}}
\fi
@@ -891,10 +984,6 @@
%D the last annotation object number directly), we take the
%D save route.
-%\def\doPDFannotationobject class #1 name #2 width #3 height #4 data #5%
-% {\pdfannot width #3sp height -#4sp depth 0sp {#5}%
-% \dosetobjectreference{#1}{#2}{\the\pdflastannot}}
-
\def\doPDFannotationobject class #1 name #2 width #3 height #4 data #5%
{\doPDFannotation width #3 height #4 data {#5}%
\dosetobjectreference{#1}{#2}{\the\pdflastannot}}
@@ -911,15 +1000,17 @@
\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\doPDFresetattributes%
- {\global\pdfpageattr{}}
+\def\doPDFresetpageattributes%
+ {\global\pdfpageattr\emptytoks}
-\appendtoksonce
- \doPDFresetattributes
-\to \everyaftershipout
+\def\doPDFresetpageresources%
+ {\global\pdfpageresources\emptytoks}
%D \macros
%D {doPDFbookmark}
@@ -975,19 +1066,13 @@
%D Here follow some rather obscure macros. They will only
%D come into action when one wants negated output.
-\let\PDFextgstates\empty
-
-\def\initializePDFnegative%
- {%\bgroup
- %\pdfcompresslevel=0
- \immediate\pdfobj stream attr {/FunctionType 4 /Range [0 1] /Domain [0 1]} {{1 exch sub}}%
+\def\initializePDFnegative
+ {\immediate\pdfobj stream attr {/FunctionType 4 /Range [0 1] /Domain [0 1]} {{1 exch sub}}%
\immediate\pdfobj{<</Type /ExtGState /TR \the\pdflastobj\space0 R>>}%
- \xdef\PDFextgstates{\PDFextgstates/GSnegative \the\pdflastobj\space0 R}%
+ \appendtoPDFdocumentextgstates{/GSnegative \the\pdflastobj\space0 R}%
\immediate\pdfobj{<</Type /ExtGState /TR /Identity>>}%
- \xdef\PDFextgstates{\PDFextgstates/GSpositive \the\pdflastobj\space0 R}%
- \global\let\initializePDFnegative\relax
- %\egroup
- \expanded{\global\pdfpageresources{/ExtGState <<\PDFextgstates>>}}}
+ \appendtoPDFdocumentextgstates{/GSpositive \the\pdflastobj\space0 R}%
+ \global\let\initializePDFnegative\relax}
% %D We can set \METAPOST\ prologues to~2:
@@ -997,6 +1082,4 @@
\stopspecials
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/spec-tr.tex b/tex/context/base/spec-tr.tex
index 1d12a80b5..5d52e0abd 100644
--- a/tex/context/base/spec-tr.tex
+++ b/tex/context/base/spec-tr.tex
@@ -28,8 +28,8 @@
\def\@@insertpostscriptretain {" }
%\definefileinsertion{tr}{eps}#1#2#3#4#5#6#7#8#9%
-% {\ScaledPointsToBigPoints{#5}\width
-% \ScaledPointsToBigPoints{#6}\height
+% {\PointsToBigPoints{#5}\width
+% \PointsToBigPoints{#6}\height
% \special
% {psfile=#1
% hscale=#3\space
@@ -40,8 +40,8 @@
%D Ugly but useful:
\definefileinsertion{tr}{eps}#1#2#3#4#5#6#7#8#9%
- {\ScaledPointsToWholeBigPoints{#7}\width
- \ScaledPointsToWholeBigPoints{#8}\height
+ {\PointsToWholeBigPoints{#7}\width
+ \PointsToWholeBigPoints{#8}\height
\special
{PSfile="#1"\space
llx=\EPSllx\space
@@ -53,7 +53,7 @@
\definefileinsertion{tr}{mps}#1#2#3#4#5#6#7#8#9%
{\hbox
- {\includeMPfonts{#1}%
+ {%\includeMPfonts{#1}% dvips know mp
\convertMPcolors{#1}%
\dofileinsertion{tr}{eps}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}}
diff --git a/tex/context/base/spec-win.tex b/tex/context/base/spec-win.tex
index 1633fcc65..77b88d005 100644
--- a/tex/context/base/spec-win.tex
+++ b/tex/context/base/spec-win.tex
@@ -42,11 +42,12 @@
{\doifparentfileelse{#4}
{\!!doneafalse}
{\!!doneatrue}}%
- %\hsmash{[l:#5]}%
\setreferencefilename#4\to\DVIfile
+ \scratchdimen#1\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#2\edef\height{\the\scratchdimen\space}%
\special
{button:
- #1 #2
+ \width \height
\if!!donea
file: \DVIfile,
\fi
@@ -62,11 +63,12 @@
{\doifparentfileelse{#4}
{\!!doneafalse}
{\!!doneatrue}}%
- %\hsmash{[p:#5]}%
\setreferencefilename#4\to\DVIfile
+ \scratchdimen#1\edef\width {\the\scratchdimen\space}%
+ \scratchdimen#2\edef\height{\the\scratchdimen\space}%
\special
{button:
- #1 #2
+ \width \height
\if!!donea
file: \DVIfile,
\fi
@@ -77,20 +79,21 @@
\egroup}
\definespecial\dostartthisislocation#1%
- {%\hsmash{[m:#1]}%
- \special{mark: "#1"}}
+ {\special{mark: "#1"}}
\definespecial\dostartthisisrealpage#1%
{}
\definespecial\dostartrunprogram#1#2#3#4%
- {\special{button: #1 #2 launch: #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
+\protect \endinput
diff --git a/tex/context/base/spec-yy.tex b/tex/context/base/spec-yy.tex
index e96ff4005..9d09b6e35 100644
--- a/tex/context/base/spec-yy.tex
+++ b/tex/context/base/spec-yy.tex
@@ -44,8 +44,8 @@
{\special{color gray 0}}
\definefileinsertion{yy}{eps}#1#2#3#4#5#6#7#8#9%
- {\ScaledPointsToBigPoints{#5}\width
- \ScaledPointsToBigPoints{#6}\height
+ {\PointsToBigPoints{#5}\width
+ \PointsToBigPoints{#6}\height
\special
{psfile=#1
hscale=#3\space
diff --git a/tex/context/base/supp-box.tex b/tex/context/base/supp-box.tex
index 9ee5cfa91..0b6320502 100644
--- a/tex/context/base/supp-box.tex
+++ b/tex/context/base/supp-box.tex
@@ -19,7 +19,8 @@
\unprotect
-%D First a hack to make this module loadable in plain \TEX.
+%D First a couple of hacks to make this module loadable
+%D in plain \TEX.
\ifx\myalloc@\undefined % seems like we're not in context
\def\newbox{\alloc@4\box\chardef\insc@unt}
@@ -27,6 +28,11 @@
\ifx \scratchbox\undefined \newbox \scratchbox \fi
\ifx\globalscratchbox\undefined \newbox\globalscratchbox \fi
+
+\ifx\normalhbox \undefined \let\normalhbox \hbox \fi
+\ifx\normalvbox \undefined \let\normalvbox \vbox \fi
+\ifx\normalvtop \undefined \let\normalvtop \vtop \fi
+\ifx\normalvcenter\undefined \let\normalvcenter\vcenter \fi
%D \macros
%D {resetbox, emptybox}
@@ -55,9 +61,9 @@
%D one is presented first.
\def\smashbox#1%
- {\wd#1=\zeropoint
- \ht#1=\zeropoint
- \dp#1=\zeropoint}
+ {\wd#1\zeropoint
+ \ht#1\zeropoint
+ \dp#1\zeropoint}
%D \macros
%D {hsmashbox,vsmashbox}
@@ -66,35 +72,56 @@
%D the mode, horizontal or vertical, one can use:
\def\hsmashbox#1%
- {\wd#1=\zeropoint}
+ {\wd#1\zeropoint}
\def\vsmashbox#1%
- {\ht#1=\zeropoint
- \dp#1=\zeropoint}
+ {\ht#1\zeropoint
+ \dp#1\zeropoint}
%D The next implementation is less sensitive for spurious
%D spaces.
\newcount\registercount
-\def\dowithregister#1%
- {\def\dodowithregister{#1}%
- \afterassignment\dodowithregister\registercount}
+% \def\dowithregister#1%
+% {\def\dodowithregister{#1}%
+% \afterassignment\dodowithregister\registercount}
+%
+% \def\smashbox%
+% {\dowithregister
+% {\wd\registercount\zeropoint
+% \ht\registercount\zeropoint
+% \dp\registercount\zeropoint}}
+%
+% \def\hsmashbox%
+% {\dowithregister
+% {\wd\registercount\zeropoint}}
+%
+% \def\vsmashbox%
+% {\dowithregister
+% {\ht\registercount\zeropoint
+% \dp\registercount\zeropoint}}
\def\smashbox%
- {\dowithregister
- {\wd\registercount\zeropoint
- \ht\registercount\zeropoint
- \dp\registercount\zeropoint}}
+ {\afterassignment\dosmashbox\registercount}
+
+\def\dosmashbox
+ {\wd\registercount\zeropoint
+ \ht\registercount\zeropoint
+ \dp\registercount\zeropoint}
\def\hsmashbox%
- {\dowithregister
- {\wd\registercount\zeropoint}}
+ {\afterassignment\dohsmashbox\registercount}
+
+\def\dohsmashbox
+ {\wd\registercount\zeropoint}
\def\vsmashbox%
- {\dowithregister
- {\ht\registercount\zeropoint
- \dp\registercount\zeropoint}}
+ {\afterassignment\dovsmashbox\registercount}
+
+\def\dovsmashbox
+ {\ht\registercount\zeropoint
+ \dp\registercount\zeropoint}
%D \macros
%D {hsmash,vsmash,
@@ -137,18 +164,14 @@
%D math module (although the \type {\leavevmode} is not added
%D here).
-\def\smash%
+\def\smash
{\futurelet\nexttoken\dosmash}
-\def\dosmash%
- {\ifx\nexttoken[%
- \@EA\dodosmash
- \else
- \@EA\dodosmash\@EA[\@EA h\@EA d\@EA]%
- \fi}
+\def\dosmash
+ {\ifx\nexttoken[\@EA\dodosmash\else\@EA\donosmash\fi}
-% \def\smash% test
-% {\doifnextcharelse{[}{\dodosmash}{\dodosmash[hd]}}
+\def\donosmash
+ {\dodosmash[hd]}
\def\dodosmash[#1]%
{\edef\@@smash{#1}\futurelet\nexttoken\dododosmash}
@@ -175,7 +198,7 @@
\def\finsm@sh% redefined plain macro
{\dowithnextbox
- {\@EA\handletokens\@@smash\with\makesm@sh\box\nextbox}\hbox}
+ {\@EA\handletokens\@@smash\with\makesm@sh\box\nextbox}\normalhbox}
%D \starttabulatie[|l|l|]
%D \NC w \NC \ruledhbox{\smash [w]{This is some great smashing, isn't it?}} \NC \NR
@@ -219,7 +242,7 @@
\ht\scratchbox\ht#1\dp\scratchbox\dp#2\wd\scratchbox\wd#3%
\box\scratchbox
\endgroup}
- \hbox}
+ \normalhbox}
% used in table
%
@@ -228,12 +251,9 @@
\let\finph@nt\undefined
-% %D We have to redefine plain's \type {\mathstrut}. Well,
-% %D this is not longer needed.
-% %D
-% %D \starttypen
-% %D \def\mathstrut{\vphantom{(}}
-% %D \stoptypen
+%D We also define plain's \type {\mathstrut}.
+
+\def\mathstrut{\vphantom{(}}
%D \macros
%D {getboxheight}
@@ -259,7 +279,7 @@
%D \stoptypen
\def\getboxheight#1\of#2\box#3%
- {#1=\ht#3\advance#1\dp#3\relax}
+ {#1\ht#3\advance#1\dp#3\relax}
%D \macros
%D {doiftextelse, doiftext}
@@ -273,17 +293,26 @@
%D \doiftext {data} {then branch}
%D \stoptypen
-\def\doiftextelse#1#2#3%
+%\def\doiftextelse#1#2#3%
+% {\bgroup
+% \setbox0=\normalhbox{#1}%
+% \ifdim\wd0>\zeropoint
+% \egroup#2%
+% \else
+% \egroup#3%
+% \fi}
+
+\def\doiftextelse#1%
{\bgroup
- \setbox0=\hbox{#1}%
+ \setbox0\normalhbox{#1}%
\ifdim\wd0>\zeropoint
- \egroup#2%
+ \egroup\@EA\firstoftwoarguments
\else
- \egroup#3%
+ \egroup\@EA\secondoftwoarguments
\fi}
\def\doiftext#1#2%
- {\doiftextelse{#1}{#2}{}}
+ {\doiftextelse{#1}{#2}\donothing}
%D \macros
%D {dowithnextbox,nextbox}
@@ -309,7 +338,7 @@
%D \starttypen
%D \def\getfloat%
%D {\def\handlefloat{...\box\nextbox...}
-%D \dowithnextbox\handlefloat\vbox}
+%D \dowithnextbox\handlefloat\normalvbox}
%D \stoptypen
%D
%D instead of:
@@ -333,13 +362,6 @@
\def\dododowithnextbox%
{\aftergroup\dodowithnextbox}
-% Better but first to be checked:
-%
-%\long\def\dowithnextbox#1%
-% {\bgroup\long\def\dodowithnextbox{#1\egroup}%
-% \afterassignment\dododowithnextbox
-% \setbox\nextbox}
-
%D So in fact we get:
%D
%D \starttypen
@@ -357,13 +379,13 @@
%D \starttypen
%D \long\def\dowithnextbox#1#2%
%D {\long\def\dodowithnextbox{#1}%
-%D \ifx#2\hbox
+%D \ifx#2\normalhbox
%D \afterassignment\dododowithnextbox
-%D \else\ifx#2\vbox
+%D \else\ifx#2\normalvbox
%D \afterassignment\dododowithnextbox
-%D \else\ifx#2\vtop
+%D \else\ifx#2\normalvtop
%D \afterassignment\dododowithnextbox
-%D \else\ifx#2\vcenter
+%D \else\ifx#2\normalvcenter
%D \afterassignment\dododowithnextbox
%D \else
%D \afterassignment\dodowithnextbox
@@ -384,6 +406,8 @@
%D \starttypen
%D \dowithnextboxcontent{inside}{after}{box content}
%D \stoptypen
+%D
+%D {\em todo: Search source for potential usage!}
\long\def\dowithnextboxcontent#1#2% inside, after
{\long\def\dodowithnextbox{#2}%
@@ -399,7 +423,8 @@
%D \macros
%D {llap, rlap, tlap, blap}
%D
-%D Some well known friends.
+%D Some well known friends, but we implement them our own
+%D way.
\def\rlap{\begingroup\dowithnextbox{\normalhbox to \zeropoint
{\box\nextbox\normalhss}\endgroup}\normalhbox}
@@ -458,7 +483,7 @@
%D
%D \reshapebox
%D {\doglobal\increment\LineNumber
-%D \hbox{\llap{\LineNumber\hskip2em}\box\shapebox}}
+%D \normalhbox{\llap{\LineNumber\hskip2em}\box\shapebox}}
%D
%D \flushshapebox
%D \stopbuffer
@@ -480,7 +505,7 @@
%D
%D \reshapebox
%D {\doglobal\increment\LineNumber
-%D \hbox
+%D \normalhbox
%D {\llap{\LineNumber\ (\NumberOfLines)\hskip2em}%
%D \box\shapebox}%
%D \doglobal\decrement\NumberOfLines}
@@ -503,7 +528,7 @@
%D
%D \reshapebox
%D {\doglobal\increment\LineNumber
-%D \hbox{\llap{$\star$\hskip1em}\box\shapebox}%
+%D \normalhbox{\llap{$\star$\hskip1em}\box\shapebox}%
%D \doglobal\decrement\NumberOfLines}
%D
%D \flushshapebox
@@ -556,67 +581,16 @@
{\kern \shapekern }
{\vskip \shapeskip }}
-%\def\doreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
-% {\setbox\newshapebox=\normalvbox
-% \bgroup
-% \unvcopy\oldshapebox
-% \resetbox\newshapebox
-% \shapecounter=0
-% \doloop{\dodoreshapebox{#1}{#2}{#3}{#4}}%
-% \unvbox\newshapebox
-% \egroup}
-%
-%\def\dodoreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
-% {\ifdim\lastskip=\zeropoint\relax
-% \ifdim\lastkern=\zeropoint\relax
-% \ifnum\lastpenalty=0
-% \setbox\shapebox=\lastbox
-% \ifvoid\shapebox
-% \unskip\unpenalty\unkern
-% \else
-% \ifdim\wd\shapebox=\shapesignal\relax
-% \exitloop
-% \else
-% \shapecounter=0
-% \setbox\newshapebox=
-% \normalvbox{#1\unvbox\newshapebox}
-% \fi
-% \fi
-% \else
-% \shapepenalty=\lastpenalty
-% \setbox\newshapebox=
-% \normalvbox{#2\unvbox\newshapebox}
-% \unpenalty
-% \fi
-% \else
-% \shapekern=\lastkern
-% \setbox\newshapebox=
-% \normalvbox{#3\unvbox\newshapebox}
-% \unkern
-% \fi
-% \else
-% \shapeskip=\lastskip
-% \setbox\newshapebox=
-% \normalvbox{#4\unvbox\newshapebox}
-% \unskip
-% \fi
-% \ifnum\shapecounter>100 % can be less
-% \message{<<forced exit from shapebox>>}%
-% \exitloop
-% \else
-% \advance\shapecounter by 1
-% \fi}
-
\newbox\tmpshapebox
\def\doreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
{\ifdim\ht\oldshapebox=\zeropoint
- \setbox\newshapebox=\normalvbox{}%
+ \setbox\newshapebox\normalvbox{}%
\else
- \setbox\newshapebox=\normalvbox
+ \setbox\newshapebox\normalvbox
{\unvcopy\oldshapebox
\resetbox\newshapebox
- \shapecounter=0
+ \shapecounter\zerocount
\doloop{\dodoreshapebox{#1}{#2}{#3}{#4}}}%
\setbox\newshapebox\box\tmpshapebox
\fi}
@@ -624,56 +598,52 @@
\def\dodoreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip
{\ifdim\lastskip=\zeropoint\relax
\ifdim\lastkern=\zeropoint\relax
- \ifnum\lastpenalty=0
- \setbox\shapebox=\lastbox
+ \ifcase\lastpenalty % =\zerocount
+ \setbox\shapebox\lastbox
\ifvoid\shapebox
\unskip\unpenalty\unkern
\else
\ifdim\wd\shapebox=\shapesignal\relax
\exitloop
\else
- \shapecounter=0
- \global\setbox\tmpshapebox=
- \normalvbox{#1\unvbox\tmpshapebox}
+ \shapecounter\zerocount
+ \global\setbox\tmpshapebox\normalvbox{#1\unvbox\tmpshapebox}
\fi
\fi
\else
- \shapepenalty=\lastpenalty
- \global\setbox\tmpshapebox=
- \normalvbox{#2\unvbox\tmpshapebox}
+ \shapepenalty\lastpenalty
+ \global\setbox\tmpshapebox\normalvbox{#2\unvbox\tmpshapebox}
\unpenalty
\fi
\else
- \shapekern=\lastkern
- \global\setbox\tmpshapebox=
- \normalvbox{#3\unvbox\tmpshapebox}
+ \shapekern\lastkern
+ \global\setbox\tmpshapebox\normalvbox{#3\unvbox\tmpshapebox}
\unkern
\fi
\else
- \shapeskip=\lastskip
- \global\setbox\tmpshapebox=
- \normalvbox{#4\unvbox\tmpshapebox}
+ \shapeskip\lastskip
+ \global\setbox\tmpshapebox\normalvbox{#4\unvbox\tmpshapebox}
\unskip
\fi
\ifnum\shapecounter>100 % can be less
\message{<<forced exit from shapebox>>}%
- \global\setbox\tmpshapebox=\copy\oldshapebox
+ \global\setbox\tmpshapebox\copy\oldshapebox
\exitloop
\else
- \advance\shapecounter by 1
+ \advance\shapecounter \plusone
\fi}
%\def\beginofshapebox%
% {\setbox\oldshapebox=\normalvbox
% \bgroup
% \reshapingboxtrue
-% \hbox to \shapesignal{\hss}}
+% \normalhbox to \shapesignal{\hss}}
\def\beginofshapebox%
- {\setbox\oldshapebox=\normalvbox
+ {\setbox\oldshapebox\normalvbox
\bgroup
\reshapingboxtrue
- \hbox to \shapesignal{\strut\hss} % plus \strut
+ \normalhbox to \shapesignal{\strut\hss}% plus \strut
\prevdepth\dp\strutbox % hm
}%\nointerlineskip} % suppress parskip
@@ -684,40 +654,6 @@
\let\beginshapebox=\beginofshapebox
\let\endshapebox =\endofshapebox
-%\def\flushshapebox%
-% {\ifdim\ht\newshapebox=\zeropoint\relax
-% \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=-1000pt
-% \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
-% \vbox{\forgetall\strut}\nobreak\kern-\lineheight % geen \vskip
-% \vskip-\dp\strutbox
-% \fi\fi\fi
-% \unvcopy\newshapebox\relax
-% % \prevdepth=0pt and \dp\newshapebox depend on last line
-% \kern-\dp\newshapebox\relax
-% % now \prevdepth=0pt
-% \ifdone
-% \kern\dp\strutbox
-% \prevdepth\dp\strutbox
-% \fi
-% \fi}
-
\def\flushshapebox%
{\bgroup
\ifdim\ht\newshapebox=\zeropoint\relax
@@ -727,7 +663,7 @@
\ifdim\parskip>\zeropoint\vskip\parskip\else\par\fi
% and take a look
\ifdim\prevdepth=-1000pt
- \prevdepth=\zeropoint
+ \prevdepth\zeropoint
\fi
\ifdim\prevdepth<\zeropoint\relax
% something like a line or a signal or ...
@@ -740,7 +676,7 @@
\else
% give the previous line a normal depth
\donetrue
- {\everypar\emptytoks\vbox{\strut}}\nobreak
+ {\everypar\emptytoks\normalvbox{\strut}}\nobreak
\kern-\lineheight % geen \vskip
\kern-\parskip
% \vskip-\dp\strutbox
@@ -770,8 +706,7 @@
% \omlijnd[offset=0pt,hoogte=8mm,uitlijnen={rechts,laho}]{\bfa test}
\def\innerflushshapebox%
- {\ifdim\ht\newshapebox=\zeropoint\relax
- \else
+ {\ifdim\ht\newshapebox=\zeropoint\relax \else
\unvcopy\newshapebox\relax
% \kern-\dp\newshapebox\relax
\fi}
@@ -792,15 +727,15 @@
%D
%D When constructing a new box, using the content of \type
%D {\shapebox}, one can best use \type {\shapedhbox} instead
-%D of \type {\hbox}, since it manages the height and depth of
+%D of \type {\normalhbox}, since it manages the height and depth of
%D the line.
\def\shapedhbox%
{\dowithnextbox
- {\ht\nextbox=\zeropoint
- \dp\nextbox=\zeropoint
+ {\ht\nextbox\zeropoint
+ \dp\nextbox\zeropoint
\box\nextbox}
- \hbox}
+ \normalhbox}
%D \macros
%D {hyphenatedword,
@@ -842,30 +777,30 @@
\def\dohyphenateword#1#2#3%
{\bgroup
- \setbox0=\hbox
+ \setbox0=\normalhbox
{\mindermeldingen
\widowpenalty=0
\clubpenalty=0
- \setbox0=\vbox
+ \setbox0=\normalvbox
{\hsize\zeropoint \ #3}%
\ifnum#1>0
\dorecurse{#1}
- {\setbox2=\hbox
+ {\setbox2=\normalhbox
{\splittopskip=\openstrutheight
\vsplit0 to \baselineskip}}%
#2%
\fi
\loop
- \setbox2=\hbox
+ \setbox2=\normalhbox
{\splittopskip=\openstrutheight
\vsplit0 to \baselineskip}%
- \hbox
+ \normalhbox
{\unhbox2
\setbox2=\lastbox
- \vbox
+ \normalvbox
{\unvbox2
\setbox2=\lastbox
- \hbox{\unhbox2}}}%
+ \normalhbox{\unhbox2}}}%
\ifdim\ht0>\zeropoint
\repeat}%
\ht0=\ht\strutbox
@@ -895,7 +830,7 @@
%D complex macro than needed at first sight.
% \def\dodoboundtext#1%
-% {\setbox0=\hbox{\unhcopy0 #1}%
+% {\setbox0=\normalhbox{\unhcopy0 #1}%
% \ifdim\wd0>\dimen0
% \let\dodoboundtext=\gobbleoneargument
% \else
@@ -903,13 +838,13 @@
% \fi}
%
% \def\doboundtext#1#2#3%
-% {\hbox
-% {\setbox0=\hbox{#1}%
+% {\normalhbox
+% {\setbox0=\normalhbox{#1}%
% \dimen0=#2\relax
% \ifdim\wd0>\dimen0
-% \setbox2=\hbox{#3}%
+% \setbox2=\normalhbox{#3}%
% \advance\dimen0 by -\wd2
-% \setbox0=\hbox{}%
+% \setbox0=\normalhbox{}%
% \processtokens
% {\dodoboundtext}
% {\dodoboundtext}
@@ -922,17 +857,17 @@
% \fi}}
\def\dodoboundtext#1%
- {\setbox2=\hbox{#1}%
- \advance\dimen0 by -\wd2
+ {\setbox2=\normalhbox{#1}%
+ \advance\dimen0 -\wd2
\ifdim\dimen0>\zeropoint\relax#1\fi}%
\def\doboundtext#1#2#3%
- {\hbox
- {\setbox0=\hbox{#1}%
+ {\normalhbox
+ {\setbox0=\normalhbox{#1}%
\dimen0=#2\relax
\ifdim\wd0>\dimen0
- \setbox0=\hbox{#3}%
- \advance\dimen0 by -\wd0
+ \setbox0=\normalhbox{#3}%
+ \advance\dimen0 -\wd0
\handletokens#1\with\dodoboundtext
\fi
\box0}}
@@ -946,7 +881,8 @@
%D on text that cannot be hyphenated.
%D
%D \starttypen
-%D \limitatetext {text} {width} {sentinel}
+%D \limitatetext {text} {width} {sentinel}
+%D \limitatetext {text} {-width} {prelude}
%D \stoptypen
%D
%D When no width is given, the whole text comes available. The
@@ -959,8 +895,9 @@
%D \starttypen
%D \unexpanded\def\limitatetext%
%D {\bgroup % evt \setstrut
+%D \forgetall
%D \fakecompoundhyphen % dangerous ! ! ! ! ! ! ! ! !
-%D \dowithnextbox\dolimitatetext\hbox}
+%D \dowithnextbox\dolimitatetext\normalhbox}
%D
%D \def\dolimitatetext#1#2%
%D {\doifelsenothing{#1}
@@ -969,9 +906,9 @@
%D \clubpenalty=0
%D \scratchdimen=#1\relax
%D \ifdim\wd\nextbox>\scratchdimen
-%D \setbox\scratchbox=\hbox{ #2}%
+%D \setbox\scratchbox=\normalhbox{ #2}%
%D \advance\scratchdimen by -\wd\scratchbox
-%D \setbox\nextbox=\vbox
+%D \setbox\nextbox=\normalvbox
%D {\hsize=\scratchdimen
%D \hfuzz\maxdimen
%D \veryraggedright
@@ -979,12 +916,12 @@
%D \ifdim\ht\nextbox>\ht\strutbox \else
%D \setbox\scratchbox\null % overfull and not split
%D \fi
-%D \setbox\nextbox=\vbox % if omitted: missing brace reported
+%D \setbox\nextbox=\normalvbox % if omitted: missing brace reported
%D {\splittopskip=\openstrutheight
%D \setbox\nextbox=\vsplit\nextbox to \ht\strutbox
%D \unvbox\nextbox
%D \setbox\nextbox=\lastbox
-%D \global\setbox1=\hbox
+%D \global\setbox1=\normalhbox
%D {\unhbox\nextbox\unskip\kern\zeropoint\box\scratchbox\unskip}}%
%D \unhbox1
%D \else
@@ -999,49 +936,52 @@
\unexpanded\def\limitatetext%
{\bgroup % evt \setstrut
+ \forgetall % otherwise indentation and so
+ %\def\limitatetext##1##2##3{##1}% \def !
+ \let\limitatetext\firstofthreearguments
\fakecompoundhyphen % dangerous ! ! ! ! ! ! ! ! !
- \dowithnextbox\dolimitatetext\hbox}
+ \dowithnextbox\dolimitatetext\normalhbox}
\def\dolimitatetext#1#2%
{\doifelsenothing{#1}
{\unhbox\nextbox}
- {\widowpenalty=0
- \clubpenalty=0
- \scratchdimen=#1\relax
+ {\widowpenalty\zerocount
+ \clubpenalty\zerocount
+ \scratchdimen#1\relax
\ifdim\scratchdimen<\zeropoint\relax % we'll take the last line
\donefalse
- \scratchdimen=-\scratchdimen
+ \scratchdimen-\scratchdimen
\else
\donetrue
\fi
\ifdim\wd\nextbox>\scratchdimen
- \setbox\scratchbox=\hbox{\ifdone\space#2\else#2\space\fi}%
- \advance\scratchdimen by -\wd\scratchbox
- \setbox0=\box\nextbox
- \setbox\nextbox=\vbox
- {\hsize=\scratchdimen
+ \setbox\scratchbox\normalhbox{\ifdone\space#2\else#2\space\fi}%
+ \advance\scratchdimen -\wd\scratchbox
+ \setbox0\box\nextbox
+ \setbox\nextbox\normalvbox
+ {\hsize\scratchdimen
\hfuzz\maxdimen
\veryraggedright
\strut
\ifdone \else
- \parfillskip=\zeropoint
- \rightskip=\zeropoint
+ \parfillskip\zeropoint
+ \rightskip\zeropoint
\hskip\zeropoint \!!plus 1\!!fill % \hsize
\fi
\unhcopy0}%
\ifdim\ht\nextbox>\ht\strutbox
- \setbox\nextbox=\vbox % if omitted: missing brace reported
- {\splittopskip=\openstrutheight
+ \setbox\nextbox\normalvbox % if omitted: missing brace reported
+ {\splittopskip\openstrutheight
\ifdone
- \setbox\nextbox=\vsplit\nextbox to \ht\strutbox
+ \setbox\nextbox\vsplit\nextbox to \ht\strutbox
\else
\doloop
- {\setbox0=\vsplit\nextbox to \ht\strutbox
+ {\setbox0\vsplit\nextbox to \ht\strutbox
\ifdim\ht\nextbox>\ht\strutbox \else \exitloop \fi}%
\fi
\unvbox\nextbox
- \setbox\nextbox=\lastbox
- \global\setbox1=\hbox
+ \setbox\nextbox\lastbox
+ \global\setbox1\normalhbox
{\ifdone
\unhbox\nextbox\unskip\kern\zeropoint\box\scratchbox
\else
@@ -1056,6 +996,44 @@
\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%
+ {\beforesplitstring#2\at,\to\leftlimit
+ \aftersplitstring #2\at,\to\rightlimit
+ \ifx\rightlimit\empty
+ \normallimitatetext{#1}{\leftlimit}{#3}%
+ \else
+ \speciallimitatetext{#1}{\leftlimit}{\rightlimit}{#3}%
+ \fi}
%D \macros
%D {processisolatedwords,
@@ -1094,7 +1072,7 @@
%D \startbuffer
%D \processisolatedwords{some more words} \ruledhbox \par
%D \processisolatedwords{and some $x + y = z$ math} \ruledhbox \par
-%D \processisolatedwords{and a \hbox{$x + y = z$}} \ruledhbox \par
+%D \processisolatedwords{and a \normalhbox{$x + y = z$}} \ruledhbox \par
%D \stopbuffer
%D
%D \typebuffer
@@ -1131,8 +1109,8 @@
%D strange and|/|or complicated arguments or simply boxes
%D whose dimensions are to be left intact.
%D
-%D First we build a \type{\hbox}. This enables us to save the
-%D last skip. Next we fill a \type{\vbox} without hyphenating
+%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
@@ -1159,40 +1137,40 @@
\fakecompoundhyphen
\mindermeldingen
\forgetall
- \widowpenalty=0
- \clubpenalty=0
+ \widowpenalty\zerocount
+ \clubpenalty\zerocount
\def\processisolatedwords##1##2{##2{##1}}% we split only once
\global\let\localbetweenisolatedwords\betweenisolatedwords
- \setbox0=\hbox % we default to spaces, but from inside out
+ \setbox0\normalhbox % we default to spaces, but from inside out
{\ignorespaces#1% \localbetweenisolatedwords can be overruled
\global\isolatedlastskip\lastskip}%
- \setbox2=\vbox
- {%\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
+ \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{\unhcopy0}% == #2{#1}
+ #2{\unhbox0}% == #2{#1} % was \unhcopy0
\else
\isolatedwordstrue
- \setbox0=\hbox
+ \setbox0=\normalhbox
{\ignorespaces
\loop
- \setbox4=\hbox
- {\splittopskip=\openstrutheight
+ \setbox4\normalhbox
+ {\splittopskip\openstrutheight
\vsplit2 to \baselineskip}%
- \hbox
+ \normalhbox
{\unhbox4\unskip % recently added
- \setbox4=\lastbox
- \vbox % outer \hbox needed
+ \setbox4\lastbox
+ \normalvbox % outer \normalhbox needed
{\unvbox4 % for nested use
- \setbox4=\lastbox
- \hbox{#2{\hbox
+ \setbox4\lastbox
+ \normalhbox{#2{\normalhbox
{\unhbox4
\unskip\unpenalty % remove end of line stuff
- \global\dimen1=\lastkern}}}}}%
+ \global\dimen1\lastkern}}}}}%
\ifdim\ht2>\zeropoint\relax
\ifdim\dimen1=\compoundbreakpoint
\allowbreak
@@ -1202,7 +1180,7 @@
\repeat
\unskip}%
\unhbox0\unskip
- \ifdim\isolatedlastskip=\zeropoint\relax\else % added
+ \ifdim\isolatedlastskip=\zeropoint\else % added
\hskip\isolatedlastskip
\fi
\fi
@@ -1247,14 +1225,21 @@
\def\sbox% in handleiding, voorbeeld \inlinker{xx} \extern..
{\dowithnextbox
- {\setbox0=\hbox
+ {\setbox\scratchbox\normalhbox
{\strut
- \dp\nextbox=0pt
+ \dp\nextbox\zeropoint
\lower\strutdepth\box\nextbox}%
- \dp0=\strutdepth
- \ht0=\strutheight
- \box0}%
- \vbox}
+ \dp\scratchbox\strutdepth
+ \ht\scratchbox\strutheight
+ \box\scratchbox}%
+ \normalvbox}
+
+\def\struttedbox
+ {\dowithnextbox
+ {\dp\nextbox\strutdepth
+ \ht\nextbox\strutheight
+ \box\nextbox}%
+ \normalhbox}
%D \macros
%D {centeredbox, centerednextbox}
@@ -1304,19 +1289,19 @@
\def\centeredbox#1#% height +/-dimen width +/-dimen
{\bgroup
- \setbox0=\vbox to \vsize
+ \setbox0\normalvbox to \vsize
\bgroup
\mindermeldingen
\forgetall
- \setbox0=\hbox{\vrule\!!width \zeropoint#1}%
- \setbox2=\vbox{\hrule\!!height\zeropoint#1}%
- \advance\vsize by \ht2
- \advance\hsize by \wd0
- \vbox to \vsize
+ \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
- \hbox to \hsize
+ \normalhbox to \hsize
\bgroup
\dowithnextbox
{\hskip-\wd0
@@ -1327,11 +1312,11 @@
\vss
\egroup
\egroup
- \wd0=\hsize
- \ht0=\vsize
+ \wd0\hsize
+ \ht0\vsize
\box0
\egroup}
- \hbox}
+ \normalhbox}
%D For those who don't want to deal with \type {\hsize}
%D and \type {\vsize}, we have:
@@ -1350,7 +1335,7 @@
\vsize\ht\nextbox
\centeredbox#1{\box\nextbox}%
\egroup}
- \hbox}
+ \normalhbox}
%D \macros
%D {centerbox}
@@ -1368,13 +1353,13 @@
{\bgroup
\dowithnextbox
{\setlocalhsize
- \setbox0=\hbox{\vrule\!!width\zeropoint#1}%
- \setbox2=\vbox{\hrule\!!height\zeropoint#1}%
+ \setbox0\normalhbox{\vrule\!!width \zeropoint#1}%
+ \setbox2\normalvbox{\hrule\!!height\zeropoint#1}%
\hsize\ifdim\wd0=\zeropoint\hsize\else\wd0\fi
\vsize\ifdim\ht2=\zeropoint\vsize\else\ht2\fi
- \vbox to \vsize{\vss\hbox to \hsize{\hss\box\nextbox\hss}\vss}%
+ \normalvbox to \vsize{\vss\normalhbox to \hsize{\hss\box\nextbox\hss}\vss}%
\egroup}%
- \hbox}
+ \normalhbox}
%D \macros
%D {setrigidcolumnhsize,rigidcolumnbalance}
@@ -1401,13 +1386,13 @@
\def\setrigidcolumnhsize#1#2#3%
{\xdef\savedrigidhsize{\the\hsize}%
- \hsize=#1\relax
+ \hsize#1\relax
\global\chardef\rigidcolumns=#3\relax
- \scratchdimen=-#2\relax
- \multiply\scratchdimen by #3\relax
- \advance\scratchdimen by #2\relax
- \advance\hsize by \scratchdimen
- \divide\hsize by #3\relax}
+ \scratchdimen -#2\relax
+ \multiply\scratchdimen #3\relax
+ \advance\scratchdimen #2\relax
+ \advance\hsize \scratchdimen
+ \divide\hsize #3\relax}
\newbox\rigidcolumnbox
@@ -1415,34 +1400,34 @@
{\ifnum\rigidcolumns=1 % tzt ook h/d correctie
\ifinner\ifhmode\box\else\unvbox\fi\else\unvbox\fi#1\relax
\else
- \vbox
+ \normalvbox
{\forgetall
\dontcomplain
- \setbox\rigidcolumnbox=\vbox
+ \setbox\rigidcolumnbox\normalvbox
{\line{}\goodbreak\unvbox#1\removebottomthings}%
- \splittopskip=\openstrutheight
- \setbox\scratchbox=\vsplit\rigidcolumnbox to \zeropoint
- \scratchdimen=\ht\rigidcolumnbox
- \divide\scratchdimen by \rigidcolumns
+ \splittopskip\openstrutheight
+ \setbox\scratchbox\vsplit\rigidcolumnbox to \zeropoint
+ \scratchdimen\ht\rigidcolumnbox
+ \divide\scratchdimen \rigidcolumns
\getnoflines\scratchdimen
- \scratchdimen=\noflines\lineheight
- \setbox\scratchbox=\hbox to \savedrigidhsize
- {\dorecurse{\rigidcolumns}
+ \scratchdimen\noflines\lineheight
+ \setbox\scratchbox\normalhbox to \savedrigidhsize
+ {\dorecurse\rigidcolumns
{\setbox\scratchbox=\vsplit\rigidcolumnbox to \scratchdimen
\dp\scratchbox=\openstrutdepth
- \setbox\scratchbox=\vtop
+ \setbox\scratchbox=\normalvtop
\ifalignrigidcolumns to
\ifstretchrigidcolumns\vsize\else\scratchdimen\fi
\fi
- {\unvbox\scratchbox}%
+ {\unvbox\scratchbox}%
\wd\scratchbox=\hsize
\box\scratchbox
\hfill}%
\hfillneg}%
- \advance\scratchdimen by -\openstrutdepth
- \setbox\scratchbox\hbox{\raise\scratchdimen\box\scratchbox}
- \dp\scratchbox=\openstrutdepth
- \ht\scratchbox=\scratchdimen
+ \advance\scratchdimen -\openstrutdepth
+ \setbox\scratchbox\normalhbox{\raise\scratchdimen\box\scratchbox}
+ \dp\scratchbox\openstrutdepth
+ \ht\scratchbox\scratchdimen
\box\scratchbox}
\fi}
@@ -1454,14 +1439,14 @@
%D like:
%D
%D \starttypen
-%D \vbox
+%D \normalvbox
%D \bgroup
%D \startvboxtohbox ... \stopvboxtohbox
%D \startvboxtohbox ... \stopvboxtohbox
%D \startvboxtohbox ... \stopvboxtohbox
%D \egroup
%D
-%D \vbox
+%D \normalvbox
%D \bgroup
%D \converthboxtovbox
%D \egroup
@@ -1481,18 +1466,18 @@
\fi
\divide\dimen0 by \hsize
\multiply\dimen0 by 64
- \xdef\vboxtohboxfactor{\expandafter\withoutpt\the\dimen0}%
+ \xdef\normalvboxtohboxfactor{\expandafter\withoutpt\the\dimen0}%
\egroup}
\def\startvboxtohbox%
{\bgroup
\setvboxtohbox
- \setbox0=\hbox\bgroup}
+ \setbox0=\normalhbox\bgroup}
\def\stopvboxtohbox%
{\egroup
\dp0=\zeropoint
- \ht0=\vboxtohboxfactor\wd0
+ \ht0=\normalvboxtohboxfactor\wd0
\box0
\egroup}
@@ -1501,16 +1486,16 @@
%
% \def\stopvboxtohbox%
% {\egroup
-% \setbox2=\vbox
+% \setbox2=\normalvbox
% {\forgetall\unhcopy0\par\xdef\globalvhlines{\the\prevgraf}}%
-% \setbox2=\vbox
+% \setbox2=\normalvbox
% {\unvbox2
% \setbox2=\lastbox
-% \setbox2=\hbox{\unhbox2}%
+% \setbox2=\normalhbox{\unhbox2}%
% \xdef\globalvhwidth{\the\wd2}}%
% \decrement\globalvhlines
% \dimen0=\globalvhwidth
-% \dimen0=\vboxtohboxfactor\dimen0
+% \dimen0=\normalvboxtohboxfactor\dimen0
% \advance\dimen0 by \globalvhlines\lineheight
% \dp0=\zeropoint
% \ht0=\dimen0
@@ -1526,15 +1511,15 @@
\def\convertvboxtohbox%
{\setvboxtohbox
\makehboxofhboxes
- \setbox0=\hbox{\unhbox0 \removehboxes}%
+ \setbox0=\normalhbox{\unhbox0 \removehboxes}%
\noindent\unhbox0\par}
\def\makehboxofhboxes%
- {\setbox0=\hbox{}%
+ {\setbox0=\normalhbox{}%
\loop % \doloop { .. \exitloop .. }
\setbox2=\lastbox
\ifhbox2
- \setbox0=\hbox{\box2\unhbox0}%
+ \setbox0=\normalhbox{\box2\unhbox0}%
\repeat}
\def\removehboxes%
@@ -1561,16 +1546,16 @@
\clubpenalty=0
\mindermeldingen
\forgetall
- \setbox\unhhedbox=\vbox{\hskip\hhboxindent\strut\unhbox#1}% => \hsize
+ \setbox\unhhedbox=\normalvbox{\hskip\hhboxindent\strut\unhbox#1}% => \hsize
\doloop
{\setbox\hhbox=\vsplit\unhhedbox to \lineheight
\ifvoid\unhhedbox
- \setbox\hhbox=\hbox{\strut\hboxofvbox\hhbox}%
+ \setbox\hhbox=\normalhbox{\strut\normalhboxofvbox\hhbox}%
\fi
\ht\hhbox=\ht\strutbox
\dp\hhbox=\dp\strutbox
\ifdim\hhboxindent=\zeropoint\else
- \setbox\hhbox=\hbox{\hskip-\hhboxindent\box\hhbox}%
+ \setbox\hhbox=\normalhbox{\hskip-\hhboxindent\box\hhbox}%
\hhboxindent=\zeropoint
\fi
\global\lasthhboxwidth=\wd\hhbox
@@ -1583,11 +1568,11 @@
\egroup}
\def\dohboxofvbox%
- {\setbox0=\vbox{\unvbox\scratchcounter\global\setbox1=\lastbox}%
+ {\setbox0=\normalvbox{\unvbox\scratchcounter\global\setbox1=\lastbox}%
\unhbox1
\egroup}
-\def\hboxofvbox%
+\def\normalhboxofvbox%
{\bgroup
\afterassignment\dohboxofvbox
\scratchcounter=}
@@ -1599,8 +1584,8 @@
%D headers.
%D
%D \startbuffer
-%D \setbox0=\hbox{\input tufte \relax}
-%D \setbox2=\hbox{\input knuth \relax}
+%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
@@ -1627,12 +1612,12 @@
%D \doifcontent{pre content}{post content}{no content}\somebox
%D \stoptypen
%D
-%D Where \type{\somebox} is either a \type{\hbox} or
-%D \type{\vbox}. If the dimension of this box suggest some
+%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.
-\def\doifcontent#1#2#3%
+\unexpanded\def\doifcontent#1#2#3%
{\dowithnextbox
{\ifhbox\nextbox
\ifdim\wd\nextbox>\zeropoint
@@ -1651,11 +1636,11 @@
%D So when we say:
%D
%D \startbuffer
-%D \doifcontent{[}{]}{}\hbox{content sensitive typesetting}
+%D \doifcontent{[}{]}{}\normalhbox{content sensitive typesetting}
%D
-%D \doifcontent{}{\pagina}{}\vbox{content sensitive typesetting}
+%D \doifcontent{}{\pagina}{}\normalvbox{content sensitive typesetting}
%D
-%D \doifcontent{}{}{\message{Didn't you forget something?}}\hbox{}
+%D \doifcontent{}{}{\message{Didn't you forget something?}}\normalhbox{}
%D \stopbuffer
%D
%D \typebuffer
@@ -1698,7 +1683,7 @@
{\dowithnextbox
{\ifhmode\unskip\fi\doprocessbox % takes \nextbox makes \processbox
\afterassignment\dogetprocessbox\let\next=}
- \hbox\bgroup}
+ \normalhbox\bgroup}
%D \macros
%D {startoverlay}
@@ -1722,10 +1707,10 @@
% \def\dooverlaybox%
% {\ifhmode\unskip\fi
% \ifdim\ht\nextbox>\ht\processbox
-% \setbox\processbox=\vbox to \ht\nextbox
+% \setbox\processbox=\normalvbox to \ht\nextbox
% {\vss\box\processbox\vss}%
% \else
-% \setbox\nextbox=\vbox to \ht\processbox
+% \setbox\nextbox=\normalvbox to \ht\processbox
% {\vss\box\nextbox\vss}%
% \fi
% \scratchdimen=\wd
@@ -1734,10 +1719,10 @@
% \else
% \processbox
% \fi
-% \setbox\processbox=\hbox to \scratchdimen
-% {\hbox to \scratchdimen{\hss\box\processbox\hss}%
+% \setbox\processbox=\normalhbox to \scratchdimen
+% {\normalhbox to \scratchdimen{\hss\box\processbox\hss}%
% \hskip-\scratchdimen
-% \hbox to \scratchdimen{\hss\box\nextbox\hss}}}
+% \normalhbox to \scratchdimen{\hss\box\nextbox\hss}}}
%
% \def\startoverlay%
% {\bgroup
@@ -1753,10 +1738,10 @@
\processbox
\fi
\ifdim\ht\nextbox>\ht\processbox
- \setbox\processbox=\vbox to \ht\nextbox
+ \setbox\processbox=\normalvbox to \ht\nextbox
{\dp\processbox=\zeropoint\vss\box\processbox\vss}%
\else
- \setbox\nextbox=\vbox to \ht\processbox
+ \setbox\nextbox=\normalvbox to \ht\processbox
{\dp\nextbox=\zeropoint\vss\box\nextbox\vss}%
\fi
\dp\nextbox=\scratchdimen
@@ -1767,10 +1752,10 @@
\else
\processbox
\fi
- \setbox\processbox=\hbox to \scratchdimen
- {\hbox to \scratchdimen{\hss\box\processbox\hss}%
+ \setbox\processbox=\normalhbox to \scratchdimen
+ {\normalhbox to \scratchdimen{\hss\box\processbox\hss}%
\hskip-\scratchdimen
- \hbox to \scratchdimen{\hss\box\nextbox\hss}}}
+ \normalhbox to \scratchdimen{\hss\box\nextbox\hss}}}
\def\startoverlay%
{\bgroup
@@ -1803,7 +1788,7 @@
% \def\dohspread{\hfil\box\nextbox}}
%
% \def\starthspread%
-% {\hbox to \hsize \bgroup
+% {\normalhbox to \hsize \bgroup
% \let\stophspread\egroup
% \processboxes\dohspread}
@@ -1813,7 +1798,7 @@
%D The next macro is a rather silly one, but saves space.
%D
%D \starttypen
-%D \hbox{\fakebox0}
+%D \normalhbox{\fakebox0}
%D \stoptypen
%D
%D returns an empty box with the dimensions of the box
@@ -1824,7 +1809,7 @@
\wd\scratchbox=\wd\scratchcounter
\ht\scratchbox=\ht\scratchcounter
\dp\scratchbox=\dp\scratchcounter
- \ifhbox\scratchcounter\hbox\else\vbox\fi{\box\scratchbox}%
+ \ifhbox\scratchcounter\normalhbox\else\normalvbox\fi{\box\scratchbox}%
\egroup}
\def\fakebox%
@@ -1842,7 +1827,7 @@
%D \rbox{text ...}
%D \stoptypen
%D
-%D Are similar to \type {\vbox}, which means that they also
+%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.
@@ -1852,7 +1837,7 @@
\def\rbox{\lrcbox\raggedright}
\def\lrcbox#1#2#%
- {\vbox#2\bgroup
+ {\normalvbox#2\bgroup
\let\\=\endgraf
\forgetall#1\let\next=}
@@ -1879,29 +1864,29 @@
\def\bbox{\tbbox\dp\ht}
\def\tbbox#1#2%
- {\hbox\bgroup
+ {\normalhbox\bgroup
\dowithnextbox
{\scratchdimen=\ht\nextbox
\advance\scratchdimen\dp\nextbox
\advance\scratchdimen-#1\strutbox
#1\nextbox=#1\strutbox
#2\nextbox=\scratchdimen
- \setbox\nextbox=\hbox
+ \setbox\nextbox=\normalhbox
{\lower\dp\nextbox\box\nextbox}%
#1\nextbox=#1\strutbox
#2\nextbox=\scratchdimen
\box\nextbox
\egroup}
- \hbox}
+ \normalhbox}
%D \macros
%D {lhbox,mhbox,rhbox}
%D
%D A few more boxes.
-\def\lhbox{\dowithnextbox{\hbox to \hsize{\box\nextbox\hss }}\hbox}
-\def\mhbox{\dowithnextbox{\hbox to \hsize{\hss\box\nextbox\hss}}\hbox}
-\def\rhbox{\dowithnextbox{\hbox to \hsize{\hss\box\nextbox }}\hbox}
+\def\lhbox{\dowithnextbox{\normalhbox to \hsize{\box\nextbox\hss }}\normalhbox}
+\def\mhbox{\dowithnextbox{\normalhbox to \hsize{\hss\box\nextbox\hss}}\normalhbox}
+\def\rhbox{\dowithnextbox{\normalhbox to \hsize{\hss\box\nextbox }}\normalhbox}
\let\lefthbox =\lhbox
\let\midhbox =\mhbox
@@ -1915,7 +1900,7 @@
%D additions, we can use:
%D
%D \starttypen
-%D \boxofsize \vbox 10cm 3cm -5cm {the text to be typeset}
+%D \boxofsize \normalvbox 10cm 3cm -5cm {the text to be typeset}
%D \stoptypen
%D
%D This example demonstrates that one can use positive and
@@ -1949,12 +1934,12 @@
{\dowithnextbox
{\dimen0=#1\hsize
\ifdim\wd\nextbox>\dimen0
- \setbox\nextbox=\hbox
+ \setbox\nextbox=\normalhbox
{\advance\dimen0 by -.1\hsize
\limitatetext{\unhbox\nextbox}{\dimen0}{\nobreak#2}}%
\fi
\unhbox\nextbox}
- \hbox}
+ \normalhbox}
\def\fittoptobaselinegrid% weg hier
{\dowithnextbox
@@ -1963,7 +1948,7 @@
\dimen0=\ht\nextbox
\ht\nextbox=\ht\strutbox
\dp\nextbox=\dp\strutbox
- \hbox{\box\nextbox}
+ \normalhbox{\box\nextbox}
\prevdepth\dp\strutbox
\doloop
{\advance\dimen0 by -\lineheight
@@ -1971,80 +1956,91 @@
\exitloop
\else
\nobreak
- \hbox{\strut}
+ \normalhbox{\strut}
\fi}
\egroup}
- \vbox}
+ \normalvbox}
%D Some more undocumented macros (used in m-chart).
\newif\iftraceboxplacement % \traceboxplacementtrue
-\def\boxcursor%
+\newbox\fakedboxcursor
+
+\setbox\fakedboxcursor\normalhbox
+ {\vrule\!!width\zeropoint\!!height\zeropoint\!!depth\zeropoint}
+
+\def\boxcursor% overloaded in core-vis
{\iftraceboxplacement
\bgroup
- \setbox0=\hbox
- {\hskip-1pt\vrule\!!width2pt\!!height2pt\!!depth2pt}%
- \smashbox0\box0
+ \scratchdimen2pt
+ \setbox\scratchbox\normalhbox to \zeropoint
+ {\hss
+ \vrule
+ \!!width \scratchdimen
+ \!!height\scratchdimen
+ \!!depth \scratchdimen
+ \hss}%
+ \smashbox\scratchbox
+ \box\scratchbox
\egroup
\else
- \hbox
- {\vrule\!!width\zeropoint\!!height\zeropoint\!!depth\zeropoint}%
+ \copy\fakedboxcursor
\fi}
\def\placedbox%
- {\iftraceboxplacement\ruledhbox\else\hbox\fi}
+ {\iftraceboxplacement\ruledhbox\else\normalhbox\fi}
\newdimen\boxoffset
\def\rightbox#1%
- {\hbox
+ {\normalhbox
{\setbox0=\placedbox{#1}%
- \dimen0=.5\ht0\advance\dimen0 by -.5\dp0
+ \dimen0=.5\ht0\advance\dimen0 -.5\dp0
\boxcursor\hskip\boxoffset\lower\dimen0\box0}}
\def\leftbox#1%
- {\hbox
+ {\normalhbox
{\setbox0=\placedbox{#1}%
- \dimen0=.5\ht0\advance\dimen0 by -.5\dp0
+ \dimen0=.5\ht0\advance\dimen0 -.5\dp0
\boxcursor\hskip-\wd0\hskip-\boxoffset\lower\dimen0\box0}}
\def\topbox#1%
- {\hbox
+ {\normalhbox
{\setbox0=\placedbox{#1}%
- \dimen0=\boxoffset\advance\dimen0 by \dp0
+ \dimen0=\boxoffset\advance\dimen0 \dp0
\boxcursor\hskip-.5\wd0\raise\dimen0\box0}}
\def\bottombox#1%
- {\hbox
+ {\normalhbox
{\setbox0=\placedbox{#1}%
- \dimen0=\boxoffset\advance\dimen0 by \ht0
+ \dimen0=\boxoffset\advance\dimen0 \ht0
\boxcursor\hskip-.5\wd0\lower\dimen0\box0}}
\def\lefttopbox#1%
- {\hbox
+ {\normalhbox
{\setbox0=\placedbox{#1}%
- \dimen0=\boxoffset\advance\dimen0 by \dp0
+ \dimen0=\boxoffset\advance\dimen0 \dp0
\advance\boxoffset\wd0
\boxcursor\hskip-\boxoffset\raise\dimen0\box0}}
\def\righttopbox#1%
- {\hbox
+ {\normalhbox
{\setbox0=\placedbox{#1}%
- \dimen0=\boxoffset\advance\dimen0 by \dp0
+ \dimen0=\boxoffset\advance\dimen0 \dp0
\boxcursor\hskip\boxoffset\raise\dimen0\box0}}
\def\leftbottombox#1%
- {\hbox
+ {\normalhbox
{\setbox0=\placedbox{#1}%
- \dimen0=\boxoffset\advance\dimen0 by \ht0
+ \dimen0=\boxoffset\advance\dimen0 \ht0
\advance\boxoffset\wd0
\boxcursor\hskip-\boxoffset\lower\dimen0\box0}}
\def\rightbottombox#1%
- {\hbox
+ {\normalhbox
{\setbox0=\placedbox{#1}%
- \dimen0=\boxoffset\advance\dimen0 by \ht0
+ \dimen0=\boxoffset\advance\dimen0 \ht0
\boxcursor\hskip\boxoffset\lower\dimen0\box0}}
\let\topleftbox \lefttopbox
@@ -2053,7 +2049,7 @@
\let\bottomrightbox\rightbottombox
\def\middlebox#1%
- {\hbox{\setbox0=\placedbox{#1}\boxoffset=-.5\wd0\rightbox{\box0}}}
+ {\normalhbox{\setbox0=\placedbox{#1}\boxoffset=-.5\wd0\rightbox{\box0}}}
%D \macros
%D {initializeboxstack,savebox,foundbox}
@@ -2068,11 +2064,11 @@
%D \savebox{one}{p}{test p}
%D \savebox{one}{q}{test q}
%D
-%D \hbox{a:\foundbox{one}{a}} \par
-%D \hbox{q:\foundbox{one}{q}} \par
-%D \hbox{p:\foundbox{one}{p}} \par
-%D \hbox{x:\foundbox{one}{x}} \par
-%D \hbox{y:\foundbox{two}{a}} \par
+%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 \stoptypen
% a first version
@@ -2085,7 +2081,7 @@
% {\ifundefined{\@@stackbox#1}%
% \@EA\newbox\csname\@@stackbox#1\endcsname
% \else
-% \@EA\global\@EA\setbox\csname\@@stackbox#1\endcsname\vbox{}%
+% \global\setbox\csname\@@stackbox#1\endcsname\normalvbox{}%
% \fi
% % actually we should erase the old values
% \setgvalue{\@@stackmax#1}{0}}
@@ -2095,22 +2091,22 @@
% {\doifdefined{\@@stackbox#1}
% {\@EA\doglobal\@EA\increment\csname\@@stackmax#1\endcsname
% \setxvalue{\@@stacktag#2}{\csname\@@stackmax#1\endcsname}%
-% \global\setbox\csname\@@stackbox#1\endcsname=\vbox
+% \global\setbox\csname\@@stackbox#1\endcsname=\normalvbox
% {\forgetall
-% \setbox\scratchbox=\vbox{\box\nextbox}
+% \setbox\scratchbox=\normalvbox{\box\nextbox}
% \ht\scratchbox=\!!onepoint
-% \dp\scratchbox=\!!zeropoint
+% \dp\scratchbox=\zeropoint
% \unvbox\csname\@@stackbox#1\endcsname
% \offinterlineskip
% \allowbreak
% \box\scratchbox}}}%
-% \vbox}
+% \normalvbox}
%
% \def\foundbox#1#2%
-% {\vbox
+% {\normalvbox
% {\doifdefined{\@@stackbox#1}
% {\doifdefined{\@@stacktag#2}
-% {\setbox\scratchbox=\vbox
+% {\setbox\scratchbox=\normalvbox
% {\splittopskip\zeropoint
% \setbox0=\copy\csname\@@stackbox#1\endcsname
% \dimen0=\getvalue{\@@stacktag#2}pt
@@ -2133,7 +2129,7 @@
{\ifundefined{\@@stackbox#1}%
\@EA\newbox\csname\@@stackbox#1\endcsname
\else
- \@EA\global\@EA\setbox\csname\@@stackbox#1\endcsname\vbox{}%
+ \global\setbox\csname\@@stackbox#1\endcsname\normalvbox{}%
\def\docommando##1{\global\letbeundefined{\@@stacktag#1:##1}}%
\processcommacommand[\getvalue{\@@stacklst#1}]\docommando
\fi
@@ -2146,22 +2142,22 @@
{\@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=\vbox
+ \global\setbox\csname\@@stackbox#1\endcsname=\normalvbox
{\forgetall
- \setbox\scratchbox=\vbox{\box\nextbox}
+ \setbox\scratchbox=\normalvbox{\box\nextbox}
\ht\scratchbox=\!!onepoint
- \dp\scratchbox=\!!zeropoint
+ \dp\scratchbox=\zeropoint
\unvbox\csname\@@stackbox#1\endcsname
\offinterlineskip
\allowbreak
\box\scratchbox}}}%
- \vbox}
+ \normalvbox}
\def\foundbox#1#2%
- {\vbox
+ {\normalvbox
{\doifdefined{\@@stackbox#1}
{\doifdefined{\@@stacktag#1:#2}
- {\setbox\scratchbox=\vbox
+ {\setbox\scratchbox=\normalvbox
{\splittopskip\zeropoint
\setbox0=\copy\csname\@@stackbox#1\endcsname
\dimen0=\getvalue{\@@stacktag#1:#2}pt
@@ -2187,7 +2183,7 @@
{\ifcsname\@@stackbox:#1:#2\endcsname\else
\expandafter\newbox\csname\@@stackbox:#1:#2\endcsname
\fi
- \global\setbox\csname\@@stackbox:#1:#2\endcsname\vbox}
+ \global\setbox\csname\@@stackbox:#1:#2\endcsname\normalvbox}
\def\initializeboxstack#1%
{\def\docommando##1{\setstackbox{#1}{##1}{}}%
@@ -2201,7 +2197,7 @@
\setstackbox{#1}{#2}}
\def\foundbox#1#2%
- {\vbox
+ {\normalvbox
{\ifcsname\@@stackbox:#1:#2\endcsname
\copy\csname\@@stackbox:#1:#2\endcsname
\fi}}
@@ -2247,15 +2243,15 @@
%D article.
%D
%D \starttypen
-%D \raisebox{100pt}\hbox{test}
-%D \raisebox50pt\hbox{test}
-%D \hsmash{\raisebox{100pt}\hbox{test}}
+%D \raisebox{100pt}\normalhbox{test}
+%D \raisebox50pt\normalhbox{test}
+%D \hsmash{\raisebox{100pt}\normalhbox{test}}
%D \stoptypen
\def\doraiselowerbox#1#2% a nice trick us used to accept
{\def\next% % both direct and {} dimensions
{\dowithnextbox
- {\setbox\nextbox=\hbox{#1\scratchdimen\box\nextbox}%
+ {\setbox\nextbox=\normalhbox{#1\scratchdimen\box\nextbox}%
\ht\nextbox=\ht\strutbox
\dp\nextbox=\dp\strutbox
\box\nextbox}}%
@@ -2270,7 +2266,7 @@
% {\bgroup
% \ifdim\prevdepth<\zeropoint
% \ifdim\pagetotal=\zeropoint
-% \setbox8=\vtop{\unvcopy#1}%
+% \setbox8=\normalvtop{\unvcopy#1}%
% \hrule\c!!height\zeropoint
% \kern-\ht8
% \box#1\relax
@@ -2280,7 +2276,7 @@
% \else
% \dimen0=\prevdepth
% \hrule\c!!height\zeropoint
-% \setbox8=\vtop{\unvcopy#1}%
+% \setbox8=\normalvtop{\unvcopy#1}%
% \dimen2=\baselineskip
% \advance\dimen2 by -\dimen0
% \advance\dimen2 by -\ht8
@@ -2313,15 +2309,15 @@
% \def\donormbox[#1][#2]%
% {\bgroup
% \doifinstringelse{v}{#2}
-% {\let\next\vbox}
-% {\let\next\hbox}%
+% {\let\next\normalvbox}
+% {\let\next\normalhbox}%
% \dowithnextbox
% {\ifvbox\nextbox
% \let\\=\par
-% \dodonormbox{#1}{#2}\vbox\ruledvbox\ht\vfil\unvbox
+% \dodonormbox{#1}{#2}\normalvbox\ruledvbox\ht\vfil\unvbox
% \else
% \let\\=\space
-% \dodonormbox{#1}{#2}\hbox\ruledhbox\wd\hfil\unhbox
+% \dodonormbox{#1}{#2}\normalhbox\ruledhbox\wd\hfil\unhbox
% \fi
% \egroup}%
% \next}
@@ -2334,16 +2330,34 @@
\def\halfwaybox%
{\dowithnextbox
{\dp\nextbox\zeropoint
- \setbox\nextbox=\hbox{\lower.5\ht\nextbox\box\nextbox}%
+ \setbox\nextbox=\normalhbox{\lower.5\ht\nextbox\box\nextbox}%
\box\nextbox}
- \hbox}
-
+ \normalhbox}
-% new
+%D New:
\def\setdimentoatleast#1#2%
{\ifdim#1>\zeropoint\else#1=#2\fi}
-
-\protect
+
+%D \macros
+%D {vcenter}
+%D
+%D Also new: tex mode \type {\vcenter}.
+
+\ifx \normalhbox \undefined \let \normalhbox = \hbox \fi
+\ifx \normalvbox \undefined \let \normalvbox = \vbox \fi
+\ifx \normalvtop \undefined \let \normalvtop = \vtop \fi
+\ifx \normalvcenter \undefined \let \normalvcenter = \vcenter \fi
+
+\let\verynormalvcenter \vcenter % since \vcenter can be visualized
+
+\def\vcenter%
+ {\normalvbox\bgroup
+ \dowithnextbox{\normalhbox{$\verynormalvcenter{\box\nextbox}$}\egroup}
+ \normalvbox}
+
+\prependtoks \let\vcenter\normalvcenter \to \everymath
+
+ \protect
\endinput
diff --git a/tex/context/base/supp-emp.tex b/tex/context/base/supp-emp.tex
index b8ff6dbf8..0a59a1970 100644
--- a/tex/context/base/supp-emp.tex
+++ b/tex/context/base/supp-emp.tex
@@ -11,6 +11,8 @@
%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
@@ -264,6 +266,8 @@
\ifx\dosetpositionpt\undefined \else % context part
+\edef\EMlinewd{\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
diff --git a/tex/context/base/supp-eps.tex b/tex/context/base/supp-eps.tex
index a7d84344f..7370c0fbc 100644
--- a/tex/context/base/supp-eps.tex
+++ b/tex/context/base/supp-eps.tex
@@ -56,25 +56,35 @@
\unprotect
-\let\EPSllx\!!zeropoint \let\MPllx\EPSllx % just in case these
-\let\EPSlly\!!zeropoint \let\MPlly\EPSlly % are used while running
-\let\EPSurx\!!zeropoint \let\MPurx\EPSurx % in fast mode we set
-\let\EPSury\!!zeropoint \let\MPury\EPSury % them to 0pt.
+\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
+\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=0
- \global\chardef\EPScreator=0
- \global\chardef\EPSspecial=0
- \global\chardef\EPSstatus=0
+ \global\chardef\EPSfound 0
+ \global\chardef\EPScreator0
+ \global\chardef\EPSspecial0
+ \global\chardef\EPSstatus 0
+ \global\let\EPScreatorstring\empty
+ \the\extraEPSpreambleresets
\uncatcodespecials
- \def\doprocessEPSline%
- {\expandafter\checkEPSboundingbox\fileline:. \end}%
+ \catcode`\^^M=\@@ignore
+ \def\doprocessEPSline
+ {\expandafter\checkEPSboundingbox\fileline\empty\empty:.:.\end}%
\doprocessfile\scratchread{#1}\doprocessEPSline
\egroup
\ifnum\EPSfound>0
@@ -82,77 +92,104 @@
#4=\EPSurx bp% \dimen0=1bp and \EPSllx\dimen0
#3=\EPSlly bp% is more accurate (.005pt).
#5=\EPSury bp%
- \scratchdimen=\EPSllx bp\advance#4 -\scratchdimen
- \scratchdimen=\EPSlly bp\advance#5 -\scratchdimen
+ \scratchdimen\EPSllx bp\advance#4 -\scratchdimen
+ \scratchdimen\EPSlly bp\advance#5 -\scratchdimen
\else
#2=\zeropoint
#3=\zeropoint
#4=\zeropoint
#5=\zeropoint
\fi
- %\message{[bbox #1: \EPSllx\space\EPSurx\space\EPSlly\space\EPSury]}%
+ %\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
-\global\let\EPSpercenttag =%
-\gdef\EPSboundingboxtag {%BoundingBox}
-\gdef\EPShiresboundingboxtag{%HiResBoundingBox}
-\gdef\EPSexactboundingboxtag{%ExactBoundingBox}
-\gdef\EPScreatortag {%Creator}
-\gdef\EPSmetaposttag { MetaPost :. }
-\gdef\EPSmetapostspecialtag {%MetaPostSpecial}
-\gdef\EPSmetapostspecialstag{%MetaPostSpecials}
-\gdef\EPSpagetag {%Page}
-\egroup
-
-\long\def\checkEPSboundingbox#1#2:#3\end%
- {\ifx#1\EPSpercenttag
- \def\!!stringa{#2}%
- \ifx\!!stringa\EPScreatortag
- \edef\!!stringa{#3}%
- \global\chardef\EPScreator=\ifx\!!stringa\EPSmetaposttag1 \else0 \fi
- \else\ifx\!!stringa\EPSboundingboxtag
- \expandafter \getEPSboundingbox #3 . . . \end
- \global\chardef\EPSfound=1
- \else\ifx\!!stringa\EPShiresboundingboxtag
- \expandafter \getEPSboundingbox #3 . . . \end
- \global\chardef\EPSfound=2
- \dofinishfile
- \else\ifx\!!stringa\EPSexactboundingboxtag
- \expandafter \getEPSboundingbox #3 . . . \end
- \global\chardef\EPSfound=2
- \dofinishfile
- \else\ifx\!!stringa\EPSmetapostspecialtag % only before finish!
- \global\chardef\EPSspecial=1 % ah, we've met some MP extensions
- \else\ifx\!!stringa\EPSmetapostspecialstag % only before finish!
- \global\chardef\EPSspecial=1 % ah, we've met some MP extensions
- \else\ifx\!!stringa\EPSpagetag
- \global\chardef\EPSstatus=1 % we passed MP font defs
- \fi\fi\fi\fi\fi\fi\fi
+\bgroup \catcode`\%=\@@other \gdef\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
+
+\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 1
+ \else\ifx\EPSspecialstring\EPShiresboundingboxtag
+ \getEPSboundingboxspec
+ \global\chardef\EPSfound 2
+ \dofinishEPSfile
+ \else\ifx\EPSspecialstring\EPSexactboundingboxtag
+ \getEPSboundingboxspec
+ \global\chardef\EPSfound 2
+ \dofinishEPSfile
+ \else\ifx\EPSspecialstring\EPSmetapostspecialtag % only before finish!
+ \global\chardef\EPSspecial 1 % ah, we've met some MP extensions
+ \else\ifx\EPSspecialstring\EPSmetapostspecialstag % only before finish!
+ \global\chardef\EPSspecial 1 % ah, we've met some MP extensions
+ \else\ifx\EPSspecialstring\EPSpagetag
+ \global\chardef\EPSstatus 1 % we passed MP font defs
+ \else
+ \the\extraEPSpreambleparsers
+ \fi\fi\fi\fi\fi\fi\fi
+ \fi
\else\ifnum\EPSfound>0
\ifnum\EPScreator=1 % that is, we are dealing with MP output
\ifcase\EPSstatus
% we've run into MP fontdefs
\or
- \dofinishfile
+ \dofinishEPSfile
\fi
\else
- \dofinishfile
+ \dofinishEPSfile
\fi
\fi\fi}
-\def\getEPSboundingbox #1 #2 #3 #4 #5\end%
+\def\getEPSboundingboxspec
+ {\edef\EPSspecialstring{\EPSspecialcontent\space . . . . }%
+ \expandafter\dogetEPSboundingboxspec\EPSspecialstring\end}
+
+\def\dogetEPSboundingboxspec#1 #2 #3 #4 #5\end
{\gdef\EPSllx{#1}%
\ifx\EPSllx\empty
- \getEPSboundingbox #2 #3 #4 #5 .\end
+ \dogetEPSboundingboxspec#2 #3 #4 #5\end
\else
\gdef\EPSlly{#2}%
\gdef\EPSurx{#3}%
\gdef\EPSury{#4}%
+ \fi}
+
+\def\getEPScreatorspec
+ {\edef\EPSspecialstring{\EPSspecialcontent. . .}%
+ \expandafter\dogetEPScreatorspec\EPSspecialstring\end}
+
+\def\dogetEPScreatorspec#1#2. . #3\end
+ {\edef\EPSspecialstring{#1}%
+ \ifx\EPSspecialstring\empty
+ \dogetEPScreatorspec#2. . #3\end
+ \else
+ \edef\EPScreatorstring{#1#2}%
+ \global\chardef\EPScreator
+ \ifx\EPScreatorstring\EPSmetaposttag1\else0\fi\relax
\fi}
-\protect
+\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}
-\endinput
+\protect \endinput
diff --git a/tex/context/base/supp-fil.tex b/tex/context/base/supp-fil.tex
index c7d447c29..bf5e6fed5 100644
--- a/tex/context/base/supp-fil.tex
+++ b/tex/context/base/supp-fil.tex
@@ -64,14 +64,14 @@
%D Just to be sure, we save the current meaning of \type{^^M}
%D in \type{\poppedendofline}.
-\chardef\poppedendofline=\the\catcode`\^^M
+\chardef\poppedendofline\catcode`\^^M
\def\pushendofline
- {\chardef\poppedendofline=\the\catcode`\^^M\relax
- \catcode`\^^M=\@@comment\relax}
+ {\chardef\poppedendofline\catcode`\^^M\relax
+ \catcode`\^^M\@@comment\relax}
\def\popendofline
- {\catcode`\^^M=\poppedendofline}
+ {\catcode`\^^M\poppedendofline}
%D \macros
%D {scratchread, scratchwrite}
@@ -122,10 +122,10 @@
\fileprocessedtrue
\gdef\dofinishfile%
{\closein#1\relax
- \global\let\doprocessline=\relax}%
+ \global\let\doprocessline\relax}%
\gdef\doprocessline%
{\ifeof#1%
- \dofinishfile
+ \expandafter\dofinishfile
\else
\global\read#1 to \fileline
#3\relax
@@ -149,24 +149,17 @@
\def\pathplusfile#1#2{#1\f!pathseparator#2}
%D This one constructs a filename from a (possible empty)
-%D path and filename. % The special \type {system} is ignored.
+%D path and filename.
\def\assignfullfilename#1#2\to#3%
{\doifelsenothing{#1}
{\edef#3{#2}}
{\edef#3{#1\f!pathseparator#2}}}
-% \def\assignfullfilename#1#2\to#3%
-% {\doifelsenothing{#1}
-% {\edef#3{#2}}
-% {\doifelse{#1}{system} % special case, honors default searching
-% {\edef#3{#2}}
-% {\edef#3{#1\f!pathseparator#2}}}}
-
%D For the moment, we limit sanitizing to taking care of
%D active \type {/}.
-\bgroup
+\bgroup % todo: _ cleanup
\catcode`\/=\@@active
@@ -236,9 +229,12 @@
%D \type{\input} when needed, for instance when loading third
%D party libraries.
-\newevery \everyreadfile \EveryReadFile
+\newevery \everybeforereadfile \EveryBeforeReadFile
+\newevery \everyafterreadfile \EveryAfterReadFile
+
+\let \everyreadfile \everybeforereadfile
-\let\normalinput=\input
+\ifx\normalinput\undefined \let\normalinput\input \fi
\def\maxreadlevel{3}
@@ -258,16 +254,18 @@
\fi
\next}
-\def\dodoreadfile%
- {\the\everyreadfile % hook, for instance for \enableXML
- \normalinput\readfilename\relax}
+\def\dodoreadfile % we provide hooks, for instance for \enableXML
+ {\the\everybeforereadfile
+ \normalinput\readfilename\relax
+ \the\everyafterreadfile}
-\def\readfile#1%
- {\let\readlevel=\maxreadlevel
- \doreadfile{#1}}
+\def\readfile% #1%
+ {\let\readlevel\maxreadlevel
+ \doreadfile} % {#1}
\def\ReadFile#1%
- {\readfile{#1}{}{}}
+ {\readfile{#1}\donothing\donothing}
+
%D \macros
%D {readjobfile,readlocfile,readsysfile,
@@ -384,15 +382,25 @@
%D \doiflocfileelse {filename} {before loading} {not found}
%D \stoptypen
-\def\doiffileelse#1#2#3%
+%\def\doiffileelse#1#2#3%
+% {\immediate\openin\scratchread=#1\relax
+% \ifeof\scratchread
+% \def\next{#3}%
+% \else
+% \def\next{#2}%
+% \fi
+% \immediate\closein\scratchread
+% \next}
+
+\def\doiffileelse#1%
{\immediate\openin\scratchread=#1\relax
\ifeof\scratchread
- \def\next{#3}%
+ \immediate\closein\scratchread
+ \expandafter\secondoftwoarguments
\else
- \def\next{#2}%
- \fi
- \immediate\closein\scratchread
- \next}
+ \immediate\closein\scratchread
+ \expandafter\firstoftwoarguments
+ \fi}
\def\doiflocfileelse#1%
{\doiffileelse{\pathplusfile{\f!currentpath}{#1}}}
@@ -506,7 +514,7 @@
\def\startreadingfile% beter een every
{\doglobal\increment\readingfilelevel
- \setxvalue{popfilecharacters::\readingfilelevel}%
+ \setxvalue{\string\readingfilelevel::\readingfilelevel}%
{\catcode`/ =\the\catcode`/%
\catcode`" =\the\catcode`"%
\catcode`< =\the\catcode`<%
@@ -525,7 +533,7 @@
\catcode`\%=\@@comment}
\def\stopreadingfile%
- {\getvalue{popfilecharacters::\readingfilelevel}%
+ {\getvalue{\string\readingfilelevel::\readingfilelevel}%
\doglobal\decrement\readingfilelevel}
%% % gebruikt voor normale (!) files, will change to proper
diff --git a/tex/context/base/supp-fun.tex b/tex/context/base/supp-fun.tex
index a2220996e..fd95d6691 100644
--- a/tex/context/base/supp-fun.tex
+++ b/tex/context/base/supp-fun.tex
@@ -550,6 +550,11 @@
\let\TheNormalizedFontSize\!!zeropoint
+%D Extra:
+
+\def\WidthSpanningText #1#2#3% text width font
+ {\hbox{\NormalizeFontWidth \temp{#1}{#2}{#3}\temp#1}}
+
%D Consider for instance:
%D
%D \startbuffer
diff --git a/tex/context/base/supp-ini.tex b/tex/context/base/supp-ini.tex
index 4eca9b051..15d80d5ab 100644
--- a/tex/context/base/supp-ini.tex
+++ b/tex/context/base/supp-ini.tex
@@ -8,11 +8,51 @@
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
\writestatus{loading}{Context Support Macros / Initializations}
-\newif\ifeightbitcharacters \eightbitcharactersfalse
+\unprotect
-\endinput
+%D If you want control, you can have it:
+
+\newif\ifeightbitcharacters \eightbitcharacterstrue
+
+%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=\@@begingroup
+\catcode`E=\@@endgroup
+\catcode`.=\@@escape
+
+
+.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 .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
+
+ .global .let .letterescape .letterbackslash
+ .global .let .letterbgroup .letteropenbrace
+ .global .let .letteregroup .letterclosebrace
+
+.egroup
+
+\protect \endinput
diff --git a/tex/context/base/supp-lan.tex b/tex/context/base/supp-lan.tex
index 5163f4636..50aec294b 100644
--- a/tex/context/base/supp-lan.tex
+++ b/tex/context/base/supp-lan.tex
@@ -11,6 +11,9 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+%D This module needs a drastic update: can be made simplier
+%D and faster.
+
%D \gdef\starttest%
%D {\blanko
%D \noindent
@@ -160,15 +163,16 @@
%D \macros
%D {compoundhyphen,
%D beginofsubsentence,endofsubsentence}
-%D {}
%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.
-\def\compoundhyphen {{-}\kern-.25ex{-}}
-\def\beginofsubsentence {---}
-\def\endofsubsentence {---}
+% I've added \hbox's so that in mathmode we get proper chars
+
+\def\compoundhyphen {\hbox{-\kern-.25ex-}}
+\def\beginofsubsentence {\hbox{---}}
+\def\endofsubsentence {\hbox{---}}
%D The last two variables are needed for subsentences
%D |<|like this one|>| which we did not yet mention.
@@ -298,8 +302,8 @@
\def\installdiscretionaries#1#2#3%
{\convertargument#1\to\ascii
- \setevalue{mathmodediscretionary\string#1}{\ascii}%
- \setvalue{textmodediscretionary\string#1}{#3}%
+ \setevalue{\strippedcsname\mathmodediscretionary\string#1}{\ascii}%
+ \setvalue{\strippedcsname\textmodediscretionary\string#1}{#3}%
\catcode`#1=\@@active
\scratchcounter=\the\uccode`~
\uccode`~=`#1
@@ -311,8 +315,8 @@
\beginETEX \detokenize
\def\installdiscretionaries#1#2#3%
- {\setevalue{mathmodediscretionary\string#1}{\detokenize{#1}}%
- \setvalue{textmodediscretionary\string#1}{#3}%
+ {\setevalue{\strippedcsname\mathmodediscretionary\string#1}{\detokenize{#1}}%
+ \setvalue{\strippedcsname\textmodediscretionary\string#1}{#3}%
\catcode`#1=\@@active
\scratchcounter=\the\uccode`~
\uccode`~=`#1
@@ -322,7 +326,7 @@
\endETEX
\def\dohandlemathmodebar#1%
- {\getvalue{mathmodediscretionary\string#1}}
+ {\getvalue{\strippedcsname\mathmodediscretionary\string#1}}
\def\discretionarycommand%
{\relax\ifmmode
@@ -384,18 +388,37 @@
%D The next alternative also supports character numbers:
\def\defineactivecharacter #1 #2%
- {\scratchcounter=\the\uccode`~
+ {\scratchcounter\the\uccode`~
\expandafter\doifnumberelse\expandafter{\string#1}
{\catcode #1=\@@active \uccode`~= #1\relax}
{\catcode`#1=\@@active \uccode`~=`#1\relax}%
\uppercase{\def\next{~}}%
%\expandafter\unexpanded\expandafter\def\next{#2}%
\expandafter\def\next{#2}% unexpanded goes wrong in pdfdoc
- \uccode`~=\scratchcounter}
+ \uccode`~\scratchcounter}
%D One reason for abusing the \type{~} is that it is already
%D an active character, so it is unlikely to appear as argument.
+%D The next implementation is about 20\% faster; 1M
+%D definitions on a 1Gig machine takes about 19 seconds
+%D (against 24 for the previous alternative).
+
+\chardef\activehackcode=`~
+
+\def\defineactivecharacter #1 %
+ {\scratchcounter\the\uccode\activehackcode
+ \uccode\activehackcode\expandafter\doifnumberelse\expandafter{\string#1}\empty`#1%
+ \catcode\uccode\activehackcode\@@active
+ \uppercase{\def\next{~}}%
+ \uccode\activehackcode\scratchcounter
+ \expandafter\def\next}% unexpanded goes wrong in pdfdoc
+
+%D A goody:
+
+\def\makecharacteractive #1 %
+ {\catcode`#1\active}
+
%D Although adapting character codes and making characters
%D active can interfere with other features of macropackages,
%D normally there should be no problems with things like:
@@ -415,7 +438,8 @@
{\def\betweendiscretionary{##1}%
\futurelet\nextnext\dododotextmodediscretionary}%
\let\discretionarycommand=#1%
- \def\textmodediscretionary{\getvalue{textmodediscretionary\string#1}}%
+ \def\textmodediscretionary%
+ {\getvalue{\strippedcsname\textmodediscretionary\string#1}}%
\futurelet\next\dodotextmodediscretionary}
\def\dododotextmodediscretionary%
@@ -572,7 +596,8 @@
\nextuccode##1@\relax
\futurelet\nextnext\dododotextmodediscretionary}%
\let\discretionarycommand=#1%
- \def\textmodediscretionary{\getvalue{textmodediscretionary\string#1}}%
+ \def\textmodediscretionary%
+ {\getvalue{\strippedcsname\textmodediscretionary\string#1}}%
\futurelet\next\dodotextmodediscretionary}
%D This time we use \type{\ifnum}:
@@ -662,7 +687,8 @@
\def\activedododotextmodediscretionary#1#2%
{\convertargument#2\to\discretionarytoken
- \def\textmodediscretionary{\getvalue{textmodediscretionary\string#1}}%
+ \def\textmodediscretionary%
+ {\getvalue{\strippedcsname\textmodediscretionary\string#1}}%
\ifx#1\nextnext % takes care of ||| and +++ and ......
\prewordbreak\discretionary{\hbox{$#1$}}{}{\hbox{$#1$}}%
\allowbreak\postwordbreak
@@ -720,17 +746,20 @@
\def\activedododotextmodediscretionary#1#2%
{\convertargument#2\to\discretionarytoken
- \def\textmodediscretionary{\getvalue{textmodediscretionary\string#1}}%
- \ifx#1\nextnext % takes care of ||| and +++ and ......
- \prewordbreak\discretionary{\hbox{$#1$}}{}{\hbox{$#1$}}%
- \allowbreak\postwordbreak
- \def\nextnextnext{\afterassignment\egroup\let\next=}%
- \else\ifx\discretionarytoken\empty
- \checkafterdiscretionary
- \bgroup
- \checkbeforediscretionary
- \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak\postwordbreak
- \egroup
+ \def\textmodediscretionary%
+ {\getvalue{\strippedcsname\textmodediscretionary\string#1}}%
+ \ifx\discretionarytoken\empty
+ \ifx#1\nextnext % takes care of ||| and +++ and ......
+ \prewordbreak\discretionary{\hbox{$#1$}}{}{\hbox{$#1$}}%
+ \allowbreak\postwordbreak
+ \def\nextnextnext{\afterassignment\egroup\let\next=}%
+ \else
+ \checkafterdiscretionary
+ \bgroup
+ \checkbeforediscretionary
+ \prewordbreak\hbox{\textmodediscretionary\nextnext}\allowbreak\postwordbreak
+ \egroup
+ \fi
\else\expandafter\ifx\csname @tmd@\discretionarytoken\endcsname\relax
\checkafterdiscretionary
\bgroup
@@ -741,7 +770,7 @@
\egroup
\else
\csname @tmd@\discretionarytoken\endcsname
- \fi\fi\fi
+ \fi\fi
\nextnextnext}
\def\definetextmodediscretionary #1
@@ -793,8 +822,8 @@
\definetextmodediscretionary ;
{\prewordbreak\kern.25em;\space\ignorespaces}
-\definetextmodediscretionary *
- {\prewordbreak\discretionary{-}{}{\kern.05em}\postwordbreak}
+\definetextmodediscretionary *
+ {\prewordbreak\discretionary{-}{}{\kern.05em}\prewordbreak}
%D Since we don't have to bother about active characters any
%D longer, we end up with a pretty simple activating macro:
@@ -874,7 +903,7 @@
%D \stoptypen
\def\restorecompoundcharacter#1% new
- {\catcode`#1=\getvalue{\@nn@\string#1}\relax}
+ {\catcode`#1=\csname\@nn@\string#1\endcsname\relax}
%D In handling the compound characters we have to take care of
%D \type{\bgroup} and \type{\egroup} tokens, so we end up with
@@ -934,7 +963,8 @@
\beginTEX
\long\def\handlecompoundcharacterone#1#2%
- {\ifx#1#2%
+% {\ifx#1#2%
+ {\if\string#1\string#2%
%\def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}}%
\def\next{\getvalue{\@nc@\string#1}}%
\else\expandafter\ifx\csname\@cc@\string#1\string#2\endcsname\relax
@@ -945,7 +975,8 @@
\next}
\long\def\handlecompoundcharactertwo#1#2#3%
- {\ifx#1#2%
+% {\ifx#1#2%
+ {\if\string#1\string#2%
%\def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}#3}%
\def\next{\getvalue{\@nc@\string#1}#3}%
\else\@EA\ifx\csname\@cs@\string#1\string#2\string#3\endcsname\relax
@@ -964,7 +995,8 @@
\beginETEX \ifcsname
\long\def\handlecompoundcharacterone#1#2%
- {\ifx#1#2%
+% {\ifx#1#2%
+ {\if\string#1\string#2%
%\def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}}%
\def\next{\getvalue{\@nc@\string#1}}%
\else\ifcsname\@cc@\string#1\string#2\endcsname
@@ -975,7 +1007,8 @@
\next}
\long\def\handlecompoundcharactertwo#1#2#3%
- {\ifx#1#2%
+% {\ifx#1#2%
+ {\if\string#1\string#2%
%\def\next{\getvalue{\@nc@\string#1}\getvalue{\@nc@\string#2}#3}%
\def\next{\getvalue{\@nc@\string#1}#3}%
\else\ifcsname\@cs@\string#1\string#2\string#3\endcsname
@@ -1081,20 +1114,9 @@
% 2 => alles na
% 3 => alles voor
-\bgroup
-\catcode`\&=12\gdef\ampercentletter {&}
-\catcode`\#=12\gdef\hashletter {#}
-\catcode`\_=12\gdef\underscoreletter {_}
-\catcode`\~=12\gdef\tildeletter {~}
-\catcode`\%=12\gdef\percentletter {%}
-\catcode`\?=12\gdef\questionmarkletter{?}
-\catcode`\@=12\gdef\atletter {@}
-\catcode`\/=12\gdef\slashletter {/}
-\egroup
-
\bgroup \catcode`\~=\active \catcode`\/=\active
-% why not convert to ascii first?
+% Why not convert to ascii first? I will redo this one!
% \unexpanded\gdef\hyphenatedurl#1% {}{} handles accents
% {\bgroup
@@ -1124,8 +1146,8 @@
% {\savedurl\let\savedurl\empty}%
% \def\\%
% {\spliturl\#}%
-% \let\~=\tildeletter \let~=\~%
-% \let\/=\slashletter \let/=\/%
+% \let\~=\lettertilde \let~=\~%
+% \let\/=\letterslash \let/=\/%
% \let\savedurl\empty
% \handletokens#1\with\scanurl
% \egroup}
@@ -1165,8 +1187,8 @@
{\savedurl\let\savedurl\empty}%
\def\\%
{\spliturl\#}%
- \let\~=\tildeletter \let~=\~%
- \let\/=\slashletter \let/=\/%
+ \let\~=\lettertilde\let~=\~%
+ \let\/=\letterslash\let/=\/%
\let\savedurl\empty
\handletokens#1\with\scanurl\savedurl
\egroup}
@@ -1201,18 +1223,18 @@
\flushurl\splitbefore\#%
\else\ifnum\catcode`#1=4
\flushurl\splitbefore\&%
- \else\if#1\tildeletter
+ \else\if#1\lettertilde
\flushurl\splitbefore\~%
- \else\if#1\percentletter
+ \else\if#1\letterpercent
\flushurl\splitbefore\%%
- \else\if#1\underscoreletter
+ \else\if#1\letterunderscore
\flushurl\splitbefore\_%
- \else\if#1\questionmarkletter
- \flushurl\splitafter\questionmarkletter
- \else\if#1\atletter
- \flushurl\splitafter\atletter
- \else\if#1\slashletter
- \edef\savedurl{\savedurl\slashletter}%
+ \else\if#1\letterquestionmark
+ \flushurl\splitafter\letterquestionmark
+ \else\if#1\letterat
+ \flushurl\splitafter\letterat
+ \else\if#1\letterslash
+ \edef\savedurl{\savedurl\letterslash}%
\else\if#1+%
\flushurl\splitafter+%
\else\if#1:%
@@ -1236,7 +1258,7 @@
%D {{\def~{\string~}\useURL[dummy][#1]\goto{\url[dummy]}[URL(dummy)]}}
%D
%D \def\whateverurl#1%
-%D {{\let~\tildeletter\useURL[dummy][#1]\goto{\url[dummy]}[URL(dummy)]}}
+%D {{\let~\lettertilde\useURL[dummy][#1]\goto{\url[dummy]}[URL(dummy)]}}
%D
%D \def\whateverurl#1%
%D {\convertargument#1\to\ascii
diff --git a/tex/context/base/supp-mat.tex b/tex/context/base/supp-mat.tex
index a2a436fee..fcd64b709 100644
--- a/tex/context/base/supp-mat.tex
+++ b/tex/context/base/supp-mat.tex
@@ -19,7 +19,7 @@
\unprotect
%D \macros
-%D {mathematics, startmathmode}
+%D {mathematics, 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
@@ -55,6 +55,9 @@
$\def\stopmathmode{$}% \let\stopmathmode=$
\fi}
+\def\nomathematics#1%
+ {\ifmmode\hbox{#1}\else#1\fi}
+
%D \macros
%D {dimension, nodimension}
%D
diff --git a/tex/context/base/supp-mis.tex b/tex/context/base/supp-mis.tex
index a2a7a925d..053497f47 100644
--- a/tex/context/base/supp-mis.tex
+++ b/tex/context/base/supp-mis.tex
@@ -17,6 +17,8 @@
\ifx \undefined \writestatus \else \expandafter \endinput \fi
+\ifx \undefined \pdfoutput \chardef\pdfoutput=0 \fi
+
%D Because \LATEX\ has no safe package loading mechanism, we
%D need to take care of possible interference.
@@ -417,6 +419,15 @@
%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%
@@ -441,7 +452,8 @@
\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
@@ -505,14 +517,17 @@
{\recursecounter=\maxdimen}
%D \macros
-%D {doifdefined,doifundefined,
+%D {ifundefined,doifdefined,doifundefined,
%D doifdefinedelse,doifundefinedelse}
%D
%D These alteratives are not robust but suitable for simple
-%D usage.
+%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}
diff --git a/tex/context/base/supp-mpe.tex b/tex/context/base/supp-mpe.tex
index 0becad3fc..6d8a8a18c 100644
--- a/tex/context/base/supp-mpe.tex
+++ b/tex/context/base/supp-mpe.tex
@@ -17,8 +17,8 @@
%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 extensions, we will generalize these macro. Some
+%D definitions will move to the special drivers.
\writestatus{loading}{MetaPost Special Extensions}
@@ -81,29 +81,26 @@
%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 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
-\newcount\currentPDFshade % 0 % global (document wide) counter
\chardef\inlineMPspecials = 1 % only needed for stack resetting
-\let\currentMPshades\empty
-
-%D This macro handles the special definitions that are
-%D passed as comment.
+%D This macro handles the special definitions that are
+%D passed as comment.
\def\dohandleMPspecialcomment#1
{\setMPargument{#1}%
- \advance\scratchcounter by -1\relax
+ \advance\scratchcounter -1
\ifcase\scratchcounter\relax
\handleMPspecialcommand
\donetrue
\doresetMPstack
- \let\handleMPsequence=\dohandleMPsequence
+ \let\handleMPsequence\dohandleMPsequence
\expandafter\handleMPsequence
\else
\expandafter\dohandleMPspecialcomment
@@ -113,69 +110,60 @@
{\doresetMPstack
\scratchcounter=#1\relax
\ifcase\scratchcounter % when zero, inline shading is used
- \chardef\inlineMPspecials=1
- \let\handleMPsequence=\dohandleMPsequence
+ \chardef\inlineMPspecials1
+ \let\handleMPsequence\dohandleMPsequence
\expandafter\handleMPsequence
\else
- \chardef\inlineMPspecials=0
+ \chardef\inlineMPspecials0
\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.
+%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 by -1 % pop the size
+ \advance\nofMParguments -1 % pop the size
+ \fi
+ \ifundefined\MPspecial
+ \message{[unknown \MPspecial]}%
+ \else
+ \csname\MPspecial\endcsname
\fi
- \doifundefinedelse{\MPspecial}
- {\message{[unknown \MPspecial]}}
- {\getvalue{\MPspecial}}%
\ifcase\inlineMPspecials
\doresetMPstack % 0
\else
\resetMPstack % 1
\fi}
-%D This macro triggers special support. Currently, the
+%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.
+%D greater than zero will enable special support.
\def\handleMPspecialscomment #1.#2 #3 % version.revision signal
{\doresetMPstack
- \chardef\MPspecialversion =#1
- \chardef\MPspecialrevision=#2
- \chardef\MPspecialsignal =#3
- \let\handleMPsequence=\dohandleMPsequence
+ \chardef\MPspecialversion #1
+ \chardef\MPspecialrevision#2
+ \chardef\MPspecialsignal #3
+ \let\handleMPsequence\dohandleMPsequence
\handleMPsequence}
-%D In case of \PDF, we need to prepare resourcs.
+%D In case of \PDF, we need to prepare resourcs.
+
+\newtoks\MPstartresources
+\newtoks\MPstopresources
\def\startMPresources%
- {\global\let\currentMPshades\empty
+ {\the\MPstartresources
\ifx\currentPDFresources\empty\else
- \message{[unused resources before shade \the\currentPDFshade]}%
+ \message{[unused resources]}%
\fi
\global\let\currentPDFresources\empty}
\def\stopMPresources%
- {\ifx\currentMPshades\empty
- \global\let\currentPDFresources\empty
- \else
- \xdef\currentPDFresources%
- {/Shading << \currentMPshades >>}%
- \fi}
-
-\def\startMPshading#1%
- {\edef\currentMPspecial{\gMPs{#1}}}
-
-\def\stopMPshading%
- {\global\advance\currentPDFshade by 1
- \setxvalue{obj:Sh:\currentMPspecial}%
- {/Sh\the\currentPDFshade\space\the\pdflastobj\space0 R }%
- \setxvalue{mps:Sh:\currentMPspecial}%
- {\the\currentPDFshade}}
+ {\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
@@ -183,7 +171,7 @@
%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\ifMPcmyk
+\newif\ifMPcmyk
\ifx\normalhandleMPrgbcolor\undefined % in case we reload this module
@@ -191,45 +179,45 @@
\let\normalhandleMPcmykcolor\handleMPcmykcolor
\let\normalhandleMPgraycolor\handleMPgraycolor
-\fi
+\fi
-%D When we are using \CONTEXT, we will fall back to the
+%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 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.
+%D we can (for efficiency reasons) turn off strokecolor,
+%D something we cannot do in \METAPOST\ converted code.
-\newif\ifPDFMPstrokecolor \PDFMPstrokecolortrue
+\newif\ifPDFMPstrokecolor \PDFMPstrokecolortrue
%D [This code should move to meta-ini.]
-\ifCONTEXT
+\ifCONTEXT % we can use this for a better xgstate handling
\def\checkPDFMPstrokecolor%
{\ifPDFMPstrokecolor \PDFstrokecolortrue \fi}
- \def\normalhandleMPrgbcolor%
- {{\checkPDFMPstrokecolor\dostartcolormodeR\gMPa1:\gMPa2:\gMPa3\od}}
+ \def\normalhandleMPrgbcolor
+ {{\checkPDFMPstrokecolor\execcolorR\gMPa1:\gMPa2:\gMPa3:0:0\od}}
- \def\normalhandleMPcmykcolor%
- {{\checkPDFMPstrokecolor\dostartcolormodeC\gMPa1:\gMPa2:\gMPa3:\gMPa4\od}}
+ \def\normalhandleMPcmykcolor
+ {{\checkPDFMPstrokecolor\execcolorC\gMPa1:\gMPa2:\gMPa3:\gMPa4:0:0\od}}
- \def\normalhandleMPgraycolor%
- {{\checkPDFMPstrokecolor\dostartcolormodeS\gMPa1\od}}
+ \def\normalhandleMPgraycolor
+ {{\checkPDFMPstrokecolor\execcolorS\gMPa1:0:0\od}}
\fi
% In the previous macros we use the special drivers. A more
-% direct approach would have been:
+% direct approach would have been:
%
-% \def\doPDFstartrgbcolormode#1#2#3%
+% \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%
+% \def\doPDFstartgraycolormode#1%
% {\PDFcode{#1 g #1 G}}
%
% \appendtoks
@@ -238,15 +226,15 @@
% \let\dostartgraycolormode\doPDFstartgraycolormode
% \to \everyMPtoPDFconversion
-%D Now we can handle special color signals. We only do this
-%D when special are detected.
+%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 The naive case looks like:
-%D
-%D \starttypen
+%D The naive case looks like:
+%D
+%D \starttypen
%D \def\handleMPrgbcolor%
%D {\setMPcolor
%D \ifcase\MPspecialversion
@@ -256,124 +244,150 @@
%D \else
%D \resetMPcolor\normalhandleMPrgbcolor
%D \fi\fi}
-%D \stoptypen
+%D \stoptypen
%D
-%D However, since we want \CMYK\ support, we will use the
-%D following implementation:
+%D However, since we want \CMYK\ support, we will use the
+%D following implementation:
-\def\handleMPrgbcolor%
- {\setMPcolor
- \ifcase\MPspecialversion
- \resetMPcolor\normalhandleMPrgbcolor
- \else\ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal\relax
- \ifMPcmyk \ifnum\MPrgbnumber\lastMPgvalue=1 % cmyk color spec
- \doifdefined{mps:k:\number\MPrgbnumber\lastMPbvalue}
- {\getvalue{mps:k:\number\MPrgbnumber\lastMPbvalue}%
- \resetMPcolor\normalhandleMPcmykcolor}%
- \fi \fi
- \else
- \resetMPcolor\normalhandleMPrgbcolor
- \fi\fi}
+% \def\setMPcolor
+% {\edef\lastMPrvalue{\gMPa1}%
+% \edef\lastMPgvalue{\gMPa2}%
+% \edef\lastMPbvalue{\gMPa3}}
+%
+% speed up:
-\def\handleMPcmykcolor%
- {\resetMPcolor\normalhandleMPcmykcolor}
+\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\handleMPrgbcolor%
+% {\ifcase\MPspecialversion
+% \normalhandleMPrgbcolor
+% \else
+% \setMPcolor
+% \ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal\relax
+% \ifMPcmyk \interceptMPcmykcolor \fi
+% \else
+% \resetMPcolor\normalhandleMPrgbcolor
+% \fi
+% \fi}
+
+\def\@@MPSK{@MPSK@}
+
+% \def\interceptMPcmykcolor
+% {\ifMPcmyk
+% \ifnum\MPrgbnumber\lastMPgvalue=1 % cmyk color spec
+% \doifdefined{\@@MPSK\number\MPrgbnumber\lastMPbvalue}
+% {\getvalue{\@@MPSK\number\MPrgbnumber\lastMPbvalue}%
+% \resetMPcolor\normalhandleMPcmykcolor}%
+% \fi
+% \fi}
+
+%\def\interceptMPcmykcolor % can be used often, so sped up
+% {\ifcase\MPrgbnumber\lastMPgvalue \or % 1 == cmyk color spec
+% \expandafter\dointerceptMPcmykcolor
+% \fi}
+
+\def\interceptMPcmykcolor % todo : \ifMPcmyk
+ {\ifcase\MPrgbnumber\lastMPgvalue
+ % cannot happen
+ \or
+ % 1 == cmyk color spec
+ \ifMPcmyk \dointerceptMPcmykcolor \fi
+ \or
+ % 2 == rgb transparency
+ \invokeMPtransparencyspecial
+ \else
+ % 3 == cmyk transparency
+ \ifMPcmyk \invokeMPtransparencyspecial \fi
+ \fi}
-\def\handleMPgraycolor%
- {\resetMPcolor\normalhandleMPgraycolor}
+%\def\dointerceptMPcmykcolor % can be used often, so sped up
+% {\@EA\ifx\csname\@@MPSK\number\MPrgbnumber\lastMPbvalue\endcsname\relax\else
+% \csname\@@MPSK\number\MPrgbnumber\lastMPbvalue\endcsname
+% \resetMPcolor\normalhandleMPcmykcolor
+% \fi}
+
+\def\dointerceptMPcmykcolor % can be used often, so sped up
+ {\revokeMPtransparencyspecial
+ \@EA\ifx\csname\@@MPSK\number\MPrgbnumber\lastMPbvalue\endcsname\relax\else
+ \csname\@@MPSK\number\MPrgbnumber\lastMPbvalue\endcsname
+ \normalhandleMPcmykcolor
+ \fi}
-\def\resetMPcolor%
- {\def\lastMPrvalue{0.0}%
- \def\lastMPgvalue{0.0}%
- \def\lastMPbvalue{0.0}}
+\def\handleMPrgbcolor
+ {\resetMPcolor
+ \ifcase\MPspecialversion
+ \normalhandleMPrgbcolor
+ \else
+ \setMPcolor
+ \ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal\relax
+ \interceptMPcmykcolor
+ \else
+ \revokeMPtransparencyspecial
+ \normalhandleMPrgbcolor
+ \fi
+ \fi}
-\def\setMPcolor%
- {\edef\lastMPrvalue{\gMPa1}%
- \edef\lastMPgvalue{\gMPa2}%
- \edef\lastMPbvalue{\gMPa3}}
+\def\handleMPgraycolor
+ {\resetMPcolor
+ \ifcase\MPspecialversion \else \revokeMPtransparencyspecial \fi
+ \normalhandleMPgraycolor}
-\resetMPcolor
+\def\handleMPcmykcolor
+ {\resetMPcolor
+ \ifcase\MPspecialversion \else \revokeMPtransparencyspecial \fi
+ \normalhandleMPcmykcolor}
-%D Specials are define and recalled using:
+%D Specials are define and recalled using:
-\def\MPspecial%
+\def\MPspecial
{MP special \gMPs\nofMParguments}
\def\defineMPspecial#1#2%
{\setvalue{MP special #1}{#2}}
-%D The path processing macro is slightly extended.
-
-% \def\processMPpath%
-% {\ifcase\MPspecialversion\else
-% \ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal
-% \scratchcounter=\MPrgbnumber\lastMPbvalue
-% \edef\currentMPspecial{\the\scratchcounter}%
-% \ifnum\finiMPpath=2
-% \doifdefined{mps:Sh:\currentMPspecial}
-% {\edef\currentMPshade{\getvalue{obj:Sh:\currentMPspecial}}%
-% \doifinstringelse{\currentMPshade}{\currentMPshades}
-% {}{\xdef\currentMPshades{\currentMPshades\currentMPshade}}%
-% \chardef\finiMPpath=4 \PDFcode{q /Pattern cs}}%
-% \fi
-% \fi
-% \fi
-% \flushMPpath
-% \closeMPpath
-% \PDFcode
-% {\ifcase\finiMPpath
-% W n\or S\or f\or B\or W n /Sh\getvalue{mps:Sh:\currentMPspecial} sh Q%
-% \fi}%
-% \let\handleMPsequence=\dohandleMPsequence
-% \resetMPstack
-% \nofMPsegments=0
-% \handleMPsequence}
+%D The path processing macro is slightly extended.
\newtoks \invokeMPspecials
-% \def\processMPpath%
-% {\let\extraMPpathcode\empty
-% \ifcase\MPspecialversion\else
-% \ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal
-% \scratchcounter=\MPrgbnumber\lastMPbvalue
-% \edef\currentMPspecial{\the\scratchcounter}%
-% \ifnum\finiMPpath=2 % to outer level
-% \the\invokeMPspecials
-% \fi
-% \fi
-% \fi
-% \flushMPpath
-% \closeMPpath
-% \PDFcode{\ifcase\finiMPpath W n\or S\or f\or B\else W n\fi \extraMPpathcode}%
-% \let\handleMPsequence=\dohandleMPsequence
-% \resetMPstack
-% \nofMPsegments=0
-% \handleMPsequence}
-
\def\finishMPpath%
{\PDFcode
- {\ifcase\finiMPpath W n\or S\or f\or B\else W n\fi
+ {\ifcase\finiMPpath W n\or S\or f\or B\else W n\fi
\extraMPpathcode}}
\def\processMPpath%
- {\checkMPpath % !
+ {\checkMPpath % !
\ifcase\nofMPsegments\else
\let\extraMPpathcode\empty
\ifcase\MPspecialversion\else
- \ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal
- \scratchcounter=\MPrgbnumber\lastMPbvalue
- \edef\currentMPspecial{\the\scratchcounter}%
- \ifnum\finiMPpath=2 % to outer level
- \the\invokeMPspecials
+ \ifnum\MPrgbnumber\lastMPrvalue=\MPspecialsignal
+ \ifnum\MPrgbnumber\lastMPgvalue>10 % really needed
+ \scratchcounter\MPrgbnumber\lastMPbvalue
+ \edef\currentMPspecial{\the\scratchcounter}%
+ \ifnum\finiMPpath=2 % to outer level
+ \the\invokeMPspecials
+ \fi
\fi
\fi
\fi
\flushMPpath
\closeMPpath
\finishMPpath
- \fi
- \let\handleMPsequence=\dohandleMPsequence
+ \fi
+ \let\handleMPsequence\dohandleMPsequence
\resetMPstack
- \nofMPsegments=0
+ \nofMPsegments0
\handleMPsequence}
%D Shading is an example of a more advanced graphic feature,
@@ -510,18 +524,42 @@
%D \NC /N \NC smaller values, bigger inner circles \NC \NR
%D \stoptabulatie
+\newcount\currentPDFshade % 0 % global (document wide) counter
+\let\currentMPshades\empty
+
+\def\startMPshading#1%
+ {\edef\currentMPspecial{\gMPs{#1}}}
+
+\def\stopMPshading%
+ {\global\advance\currentPDFshade 1
+ \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%
{\doifdefined{mps:Sh:\currentMPspecial}
- {\edef\currentMPshade{\getvalue{obj:Sh:\currentMPspecial}}%
+ {\edef\currentMPshade{\getvalue{obj:Sh:\currentMPspecial}}%
\doifinstringelse{\currentMPshade}{\currentMPshades}
- {}{\xdef\currentMPshades{\currentMPshades\currentMPshade}}%
+ {}{\xdef\currentMPshades{\currentMPshades\currentMPshade}}%
\def\extraMPpathcode{/Sh\getvalue{mps:Sh:\currentMPspecial} sh Q}%
- \chardef\finiMPpath=0
+ \chardef\finiMPpath=0
\PDFcode{q /Pattern cs}}}
\appendtoks \invokeMPshadespecial \to \invokeMPspecials
-\defineMPspecial{2}
+\defineMPspecial{30}
{\startMPshading{14}% type 2
\immediate\pdfobj
{<</FunctionType 2
@@ -537,7 +575,7 @@
/Extend [true true]>>}%
\stopMPshading}
-\defineMPspecial{3}
+\defineMPspecial{31}
{\startMPshading{16}% type 3
\immediate\pdfobj
{<</FunctionType 2
@@ -553,12 +591,12 @@
/Extend [true true]>>}%
\stopMPshading}
-%D Figure inclusion is kind of strange to \METAPOST, but when
+%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.
+%D to cook up a solution using specials.
\def\invokeMPfigurespecial%
- {\getvalue{mps:gr:\currentMPspecial}} % or \relax
+ {\getvalue{mps:gr:\currentMPspecial}} % or \relax
\appendtoks \invokeMPfigurespecial \to \invokeMPspecials
@@ -571,50 +609,50 @@
% \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}%
+% \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
+%
+% better, since xform reuse
-\def\handleMPfigurespecial#1#2#3#4#5#6#7%
- {\vbox to \!!zeropoint
+\def\handleMPfigurespecial#1#2#3#4#5#6#7% todo : combine with ext fig
+ {\vbox to \zeropoint
{\vss
- \hbox to \!!zeropoint
+ \hbox to \zeropoint
{\ifcase\pdfoutput\or % will be hooked into the special driver
\doiffileelse{#7}
{\doifundefinedelse{mps:x:#7}
- {\immediate\pdfximage width 1bp height 1bp {#7}%
+ {\immediate\pdfximage width 1bp height 1bp {#7}%
\setxvalue{mps:x:#7}{\pdfrefximage\the\pdflastximage}}%
- {\message{[reusing figure #7]}}%
- \pdfliteral{q #1 #2 #3 #4 #5 #6 cm}%
+ {\message{[reusing figure #7]}}%
+ \pdfliteral{q #1 #2 #3 #4 #5 #6 cm}%
\rlap{\getvalue{mps:x:#7}}%
\pdfliteral{Q}}
- {\message{[unknown figure #7]}}%
+ {\message{[unknown figure #7]}}%
\fi
\hss}}}
-%D An example of using both special features is the
-%D following.
+%D An example of using both special features is the
+%D following.
%D
-%D \starttypen
-%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 \starttypen
+%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 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 addto currentpicture also c ;
%D \stopMPpage
-%D \stoptypen
+%D \stoptypen
-%D This is some experimental hyperlink driver that I wrote
+%D This is some experimental hyperlink driver that I wrote
%D for Mark Wicks.
\defineMPspecial{20}
@@ -625,7 +663,7 @@
\def\handleMPhyperlink#1#2#3#4#5%
{%\ifcase\pdfoutput\or
- \setbox\scratchbox=\hbox
+ \setbox\scratchbox=\hbox
{\setbox\scratchbox=\null
\scratchdimen=#1bp\scratchdimen=-\scratchdimen
\advance\scratchdimen#3bp
@@ -633,10 +671,10 @@
\scratchdimen=#2bp\scratchdimen=-\scratchdimen
\advance\scratchdimen#4bp
\ht\scratchbox=\scratchdimen
- \incolorfalse
+ \incolorfalse
\gotobox{\box\scratchbox}[#5]}%
\setbox\scratchbox=\hbox
- {\scratchdimen\MPxoffset bp \advance\scratchdimen#1bp
+ {\scratchdimen\MPxoffset bp \advance\scratchdimen#1bp
\hskip\scratchdimen
\scratchdimen=\MPyoffset bp \advance\scratchdimen#2bp
\raise\scratchdimen\box\scratchbox}%
@@ -645,45 +683,45 @@
}%\fi}
\def\invokeMPhyperlinkspecial%
- {\getvalue{mps:hl:\currentMPspecial}} % or \relax
+ {\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 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
%D \startbuffer[cmyk]
%D \startcombinatie[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 {\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 \stopcombinatie
%D \stopbuffer
-%D
+%D
%D \plaatsfiguur
-%D {\CMYK\ support disabled,
+%D {\CMYK\ support disabled,
%D conversion to \RGB.}
%D {\setupcolors[cmyk=nee,status=start]\haalbuffer[cmyk]}
-%D
+%D
%D \plaatsfiguur
-%D {\CMYK\ support enabled,
+%D {\CMYK\ support enabled,
%D no support in \METAPOST.}
%D {\setupcolors[cmyk=ja,mpcmyk=nee,status=start]\haalbuffer[cmyk]}
-%D
+%D
%D \plaatsfiguur
-%D {\CMYK\ support enabled,
-%D no conversion to \RGB,
+%D {\CMYK\ support enabled,
+%D no conversion to \RGB,
%D support in \METAPOST}
%D {\setupcolors[cmyk=ja,status=start]\haalbuffer[cmyk]}
\defineMPspecial{1}
- {\ifMPcmyk
- \setxvalue{mps:k:\gMPs1}{\noexpand\setMPcmyk\gMPs2 \gMPs3 \gMPs4 \gMPs5 }%
+ {\ifMPcmyk
+ \setxvalue{\@@MPSK\gMPs1}{\noexpand\setMPcmyk\gMPs2 \gMPs3 \gMPs4 \gMPs5 }%
\fi}
\def\setMPcmyk#1 #2 #3 #4 %
@@ -692,67 +730,267 @@
\setvalue{\@@MP03}{#3}%
\setvalue{\@@MP04}{#4}}
-%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 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 \definelayer[test]
%D
%D \setlayer
%D [test]
%D [x=\MPx{somepos-1},y=\MPy{somepos-1}]
%D {Whatever we want here!}
-%D
+%D
%D \setlayer
%D [test]
%D [x=\MPx{somepos-2},y=\MPy{somepos-2}]
%D {Whatever we need there!}
-%D
+%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 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
%D \framed[background=test,offset=overlay]{\useMPgraphic{oeps}}
%D \stopbuffer
-%D
-%D \typebuffer
-%D
+%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 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 Later we will implement a more convenient macro:
%D
-%D \starttyping
+%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
+\defineMPspecial{50} % x y width height label
{\bgroup
- \scratchdimen\MPllx bp \scratchdimen=-\scratchdimen
- \advance\scratchdimen\gMPs1bp
+ \scratchdimen\MPllx bp \scratchdimen-\scratchdimen
+ \advance\scratchdimen\gMPs1bp
\edef\x{\number\scratchdimen}%
- \scratchdimen\gMPs2bp \scratchdimen=-\scratchdimen
- \advance\scratchdimen\MPury bp
+ \scratchdimen\gMPs2bp \scratchdimen-\scratchdimen
+ \advance\scratchdimen\MPury bp
\edef\y{\number\scratchdimen}%
- \scratchdimen=\gMPs3bp
+ \scratchdimen\gMPs3bp
\edef\w{\number\scratchdimen}%
- \scratchdimen=\gMPs4bp
+ \scratchdimen\gMPs4bp
\edef\h{\number\scratchdimen}%
\dosavepositionwhd{\gMPs5}{0}{\x}{\y}{\w}{\h}{0}%
\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 color cyan ; cyan := cmyk(1,0,0,0) ;
+%D color magenta ; magenta := cmyk(0,1,0,0) ;
+%D color yellow ; yellow := cmyk(0,0,1,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}}
+
+\defineMPspecial{2}
+ {\edef\currentMPspecial{\gMPs6}%
+ \presetPDFtransparency{\gMPs1}{\gMPs2}%
+ \setxvalue{\@@MPST\currentMPspecial}%
+ {\noexpand\assignMPStransparency
+ {\PDFtransparencyidentifier}%
+ {\PDFtransparencyreference}%
+ {\gMPs3 \gMPs4 \gMPs5 rg \gMPs3 \gMPs4 \gMPs5 RG}}}
+
+\defineMPspecial{3}
+ {\edef\currentMPspecial{\gMPs7}%
+ \presetPDFtransparency{\gMPs1}{\gMPs2}%
+ \setxvalue{\@@MPST\currentMPspecial}%
+ {\noexpand\assignMPStransparency
+ {\PDFtransparencyidentifier}%
+ {\PDFtransparencyreference}%
+ {\gMPs3 \gMPs4 \gMPs5 \gMPs6 k \gMPs3 \gMPs4 \gMPs5 \gMPs6 K}}}
+
+%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
+
+\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
+ {\presetPDFtransparency{1}{1}%
+ \xdef\PDFtransparencyresetidentifier{/Tr0}%
+ \xdef\PDFtransparencyresetreference{\the\pdflastobj\space 0 R}%
+ \global\initializePDFtransparency\relax}
+
+ \def\presetPDFtransparency#1#2%
+ {\initializePDFtransparency
+ \@EA\ifx\csname\@@MPSTO#1:#2\endcsname\relax
+ \global\advance\PDFcurrenttransparency 1
+ \immediate\pdfobj{\PDFtransparancydictionary{#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}}
+
+\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.
+
\protect \endinput
diff --git a/tex/context/base/supp-mps.tex b/tex/context/base/supp-mps.tex
index 6bde0b2c5..7f9ad6b7b 100644
--- a/tex/context/base/supp-mps.tex
+++ b/tex/context/base/supp-mps.tex
@@ -37,12 +37,15 @@
%D Ok then, let's start:
\ifx \undefined \writestatus \input supp-mis.tex \relax \fi
+\ifx \undefined \letterhash \else \input supp-ini.tex \relax \fi
\ifx \undefined \startMPgraphic \else \expandafter \endinput \fi
\writestatus{loading}{Context Support Macros / MetaPost Inclusion}
\unprotect
+\def\@@MPG{@MPG@}
+
%D \macros
%D {startMPgraphic}
%D
@@ -56,7 +59,7 @@
%D
%D This is implemented as:
-\long\def\startMPgraphic#1\stopMPgraphic%
+\long\def\startMPgraphic#1\stopMPgraphic
{\checkMPTEXgraphic{#1}%
\startwritingMPgraphic
\writeMPgraphic{#1}%
@@ -92,7 +95,7 @@
\ifCONTEXT
- \long\def\dostartMPrun#1#2\stopMPrun%
+ \long\def\dostartMPrun#1#2\stopMPrun
{\bgroup
\MPruntrue
\doifsomething{#1}{\def\MPgraphicfile{#1}}%
@@ -102,12 +105,12 @@
\stopwritingMPgraphic
\egroup}
- \def\startMPrun%
+ \def\startMPrun
{\dosinglegroupempty\dostartMPrun}
\else
- \long\def\startMPrun#1\stopMPrun%
+ \long\def\startMPrun#1\stopMPrun
{\MPruntrue
\checkMPTEXgraphic{#1}%
\startwritingMPgraphic
@@ -169,6 +172,7 @@
%D characterized bij a \COUNTER. This counter is available
%D in \type{\MPgraphic}.
+\newcount\nofMPgraphics
\newcount\currentMPgraphic
\def\MPgraphic{0}
@@ -199,8 +203,8 @@
\newtoks \MPinitializations
-\long\def\startMPinclusions#1\stopMPinclusions%
- {\long\def\theMPinclusions%
+\long\def\startMPinclusions#1\stopMPinclusions
+ {\long\def\theMPinclusions
{\@EA\expanded\@EA{\@EA\writeMPgraphic\@EA{\the\MPinitializations;}}%
\writeMPgraphic{#1}}}
@@ -232,27 +236,39 @@
\edef\currentwidth {\the\hsize \space}%
\edef\currentheight {\the\vsize \space}}
-\long\def\writeMPgraphic#1% \expanded testen
+\def\writeMPgraphic % no big #1 passing here
+ {\iflongMPlines
+ \expandafter\writeMPgraphiclong
+ \else
+ \expandafter\writeMPgraphicshort
+ \fi}
+
+\long\def\writeMPgraphiclong#1%
{\bgroup
\presetMPdefinitions
- \let\par=\space
- \iflongMPlines
- \long\def\flush##1##2\par%
- {\ifx##1\relax \else
- \immediate\write\MPwrite{##1##2}%
- \expandafter\flush
- \fi}%
- \flush#1\empty\par\relax\par
- \else
- \long\def\flush##1##2;%
- {\ifx##1\relax \else
- \dowriteMPgraphicline##1##2tex \relax etex\MPend
- \expandafter\flush
- \fi}%
- \flush#1\empty;\relax;%
- \fi
+ \let\par\space
+ \longMPflush#1\empty\par\relax\par
+ \egroup}
+
+\long\def\writeMPgraphicshort#1%
+ {\bgroup
+ \presetMPdefinitions
+ \let\par\space
+ \shortMPflush#1\empty;\relax;%
\egroup}
+\long\def\longMPflush#1#2\par
+ {\ifx#1\relax \else
+ \immediate\write\MPwrite{#1#2}%
+ \expandafter\longMPflush
+ \fi}
+
+\long\def\shortMPflush#1#2;%
+ {\ifx#1\relax \else
+ \dowriteMPgraphicline#1#2tex \relax etex\MPend
+ \expandafter\shortMPflush
+ \fi}
+
%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}
@@ -289,43 +305,70 @@
\newif\ifforceMPTEXgraphic
+\convertargument etex\to\MPasciiB
+\convertargument textext\to\MPasciiC % geen "text"
+\convertargument graphictext\to\MPasciiD % geen "text"
+
\long\def\checkMPTEXgraphic#1%
{\ifforceMPTEXgraphic
\global\MPTEXgraphictrue
\else
- \expandafter\convertargument #1\to\asciiA
- \convertargument etex\to\asciiB
- \convertargument textext\to\asciiC % geen "text"
- \convertargument graphictext\to\asciiD % geen "text"
- \expandtwoargsafter\doifinstringelse{\asciiB}{\asciiA}
+ \expandafter\convertargument#1\to\MPasciiA
+ \doifstringinstringelse\MPasciiB\MPasciiA
{\global\MPTEXgraphictrue}
- {\expandtwoargsafter\doifinstringelse{\asciiC}{\asciiA}
+ {\doifstringinstringelse\MPasciiC\MPasciiA
{\global\MPTEXgraphictrue}
- {\expandtwoargsafter\doifinstringelse{\asciiD}{\asciiA}
+ {\doifstringinstringelse\MPasciiD\MPasciiA
{\global\MPTEXgraphictrue}
{\global\MPTEXgraphicfalse}}}%
\fi}
-\def\flushMPTEXgraphic%
+\def\flushMPTEXgraphic
{\ifMPTEXgraphic \ifx\everyMPTEXgraphic\emptytoks \else
\immediate\write\MPwrite{verbatimtex \the\everyMPTEXgraphic\space etex;}%
\fi \fi}
-\long\def\dodowriteMPgraphicline#1tex #2#3etex#4\MPend%
+% \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}%
+% \long\def\flush##1##2;%
+% {\ifx##1\relax \else
+% \immediate\write\MPwrite{##1##2;}%
+% \expandafter\flush
+% \fi}%
+% \expandafter\flush\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}
+
+\long\def\flushMPgraphicline#1#2;%
+ {\ifx#1\relax \else
+ \immediate\write\MPwrite{#1#2;}%
+ \expandafter\flushMPgraphicline
+ \fi}
+
+\long\def\dodowriteMPgraphicline#1tex #2#3etex#4\MPend
{\ifx\next\empty\else\ifx\next\relax\else
\bgroup
- \let\par=\space
+ \let\par\space
\ifx#2\relax
\iflongMPlines
\immediate\write\MPwrite{#1;}%
\else
\edef\ascii{#1}%
- \long\def\flush##1##2;%
- {\ifx##1\relax \else
- \immediate\write\MPwrite{##1##2;}%
- \expandafter\flush
- \fi}%
- \expandafter\flush\ascii\empty;\relax;%
+ \expandafter\flushMPgraphicline\ascii\empty;\relax;%
\fi
\egroup
\else
@@ -347,57 +390,67 @@
%D Because some graphics interact with \TEX\ (i.e.\ \CONTEXT), we
%D provide a hook for additional actions: \type {\everyMPgraphic}.
-\bgroup
-\catcode`\%=12\gdef\percentletter{%}
-\egroup
-
\newtoks\everyMPgraphic
-\def\writeMPgraph%
+\def\writeMPgraph
{\immediate\write\MPwrite{mpgraph:=\the\currentMPgraphic;}}
-\def\startwritingMPgraphic%
+\newconditional\firstMPgraphic \settrue\firstMPgraphic
+
+\appendtoks
+ \let \# \letterhash
+ \let \_ \letterunderscore
+ \let \& \letterampersand
+ \let \{ \letteropenbrace
+ \let \} \letterclosebrace
+\to \everyMPgraphic
+
+\def\startwritingMPgraphic
{\bgroup
- % will go to \appendtoks ... \to \everyMPgraphic
- \let\#\hashletter
- \let\_\underscoreletter
- \let\&\ampercentletter
- \def\{{\iftrue \string{\else}\fi}% ook nog ....letter
- \def\}{\iffalse{\else\string}\fi}% ook nog ....letter
- %
+ \global\advance\nofMPgraphics 1
\ifMPrun \else
\allocateMPslot\currentMPgraphic
\fi
\enableincludeMPgraphics
+ \xdef\MPgraphic{\the\currentMPgraphic}%
+ \the\everyMPgraphic
\ifrunMPgraphics
- \the\everyMPgraphic
- \xdef\MPgraphic{\the\currentMPgraphic}%
- \immediate\openout\MPwrite=\MPgraphicfile.mp
- \immediate\write\MPwrite{\percentletter\space runtime generated graphics of job "\jobname"}%
- \writeMPgraph
- \setMPrandomseed
+ \openMPgraphicfile{1}{runtime}%
\theMPinclusions % no reset here !
\else
- \xdef\MPgraphic{\the\currentMPgraphic}%
- \the\everyMPgraphic % here ?
- \ifnum\currentMPgraphic<2 % mprun (0) or mpgraph (1)
- \immediate\openout\MPwrite=\MPgraphicfile.mp
- \immediate\write\MPwrite{\percentletter\space collected graphics of job "\jobname"}%
- \writeMPgraph
- \setMPrandomseed
- \fi
+ \openMPgraphicfile{0}{collected}%
\theMPinclusions \let\theMPinclusions\relax % reset here !
\fi
\flushMPTEXgraphic
\ifMPrun \else
+ \immediate\write\MPwrite{let mprunend = end ;}%
\immediate\write\MPwrite{beginfig(\the\currentMPgraphic);}%
\fi
\global\let\flushMPgraphics\dodostopwritingMPgraphic
\global\let\stopwritingMPgraphic=\dostopwritingMPgraphic}
+\def\openMPgraphicfile#1#2% #1=alwaysopen #2=message
+ {%\doifundefinedelse{\@@MPG\@@MPG\MPgraphicfile}
+ % {\donetrue
+ % \@EA\newwrite\csname\@@MPG\@@MPG\MPgraphicfile\endcsname}%
+ % {\ifcase#1\donefalse\else\donetrue\fi}%
+ \@EA\ifx\csname\@@MPG\@@MPG\MPgraphicfile\endcsname\relax
+ \donetrue \@EA\newwrite\csname\@@MPG\@@MPG\MPgraphicfile\endcsname
+ \else
+ \ifcase#1\relax\donefalse\else\donetrue\fi
+ \fi
+ \@EA\let\@EA\MPwrite\csname\@@MPG\@@MPG\MPgraphicfile\endcsname
+ \ifdone
+ \immediate\openout\MPwrite=\MPgraphicfile.mp
+ \immediate\write\MPwrite{\letterpercent\space #2 graphics of job "\jobname"}%
+ \writeMPgraph
+ \setMPrandomseed
+ \fi}
+
\def\dostopwritingMPgraphic%
{\ifMPrun \else
\immediate\write\MPwrite{endfig;}%
+ \immediate\write\MPwrite{let end = mprunend ;}%
\fi
\ifrunMPgraphics
\dodostopwritingMPgraphic
@@ -415,17 +468,17 @@
\ifdone
\immediate\write\MPwrite{end.}%
\immediate\closeout\MPwrite
- \runMPgraphic{\MPgraphicfile}%
+ \runMPgraphic\MPgraphicfile
\fi
- \global\let\flushMPgraphics=\relax}
+ \global\let\flushMPgraphics\relax}
-\let\stopwritingMPgraphic=\relax
-\let\flushMPgraphics =\relax
+\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 by 1 }
+\def \allocateMPslot#1{\global\advance#1 1 }
\def\deallocateMPslot#1{}
%D \macros
@@ -495,17 +548,29 @@
{\setbox\MPgraphicbox=\hbox
{\ifinsertMPgraphics\insertMPfile{#1}{#2}\fi}}
+\def\MPllx{0}
+\def\MPlly{0}
+
% \def\placeMPgraphic%
-% {\box\MPgraphicbox}
+% {\ifMPshiftdrawing
+% \hbox{\hskip\MPllx bp\raise\MPlly bp\box\MPgraphicbox}%
+% \else
+% \box\MPgraphicbox
+% \fi}
+%
+% experimental:
-\def\placeMPgraphic%
+\def\placeMPgraphic
{\ifMPshiftdrawing
- \dimen0=\MPllx bp
- \dimen2=\MPlly bp
- \hbox{\hskip\dimen0\raise\dimen2\box\MPgraphicbox}%
- \else
- \box\MPgraphicbox
- \fi}
+ \edef\next
+ {\wd\MPgraphicbox\the\wd\MPgraphicbox
+ \ht\MPgraphicbox\the\ht\MPgraphicbox
+ \dp\MPgraphicbox\the\dp\MPgraphicbox}%
+ \setbox\MPgraphicbox\hbox
+ {\hskip\MPllx bp\raise\MPlly bp\box\MPgraphicbox}%
+ \next
+ \fi
+ \box\MPgraphicbox}
%D \macros
%D {startreusableMPgraphic, reuseMPgraphic, useMPbox}
@@ -516,96 +581,94 @@
\newif\ifuseMPbox \useMPboxtrue
+%D We assume that one can set objects:
+%D
+%D \starttypen
+%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 \stoptypen
+%D
+%D More save is to use a number for {MP}{#1} which permits
+%D redefinition.
+
+\newcounter\MPobjectcounter
+
\def\douseMPbox#1%
- {\setobject{MP}{#1}
- \vbox
- {\forgetall
- \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
- \deallocateMPslot\currentMPgraphic
- \placeMPgraphic}%
- \setgvalue{#1}%
- {\getobject{MP}{#1}}}
-
-% More save is to use a number for {MP}{#1} which permits
-% redefinition. I have to test it first.
-%
-% \newcounter\MPobjectcounter
-%
-% \def\douseMPbox#1%
-% {\doglobal\increment\MPobjectcounter
-% \setobject{MP}{\MPobjectcounter}
-% \vbox
-% {\forgetall
-% \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
-% \deallocateMPslot\currentMPgraphic
-% \placeMPgraphic}%
-% \setxvalue{#1}%
-% {\noexpand\getobject{MP}{\MPobjectcounter}}}
+ {\doglobal\increment\MPobjectcounter
+ \setobject{MP}{\MPobjectcounter}\vbox
+ {\forgetall
+ \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \deallocateMPslot\currentMPgraphic
+ \placeMPgraphic}%
+ \setxvalue{#1}{\noexpand\getobject{MP}{\MPobjectcounter}}}
\def\nouseMPbox#1%
{\setxvalue{#1}%
{\noexpand\forgetall
\noexpand\loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
- \deallocateMPslot\currentMPgraphic
+ \noexpand\deallocateMPslot{\currentMPgraphic}%
\noexpand\placeMPgraphic}}
\ifCONTEXT \else \let\douseMPbox=\nouseMPbox \fi
\ifCONTEXT \else \let\doifobjectssupportedelse=\relax \fi
-% \long\def\startreusableMPgraphic#1#2\stopreusableMPgraphic%
-% {\ifundefined{MP:#1}%
-% \long\setgvalue{MP:#1}%
-% {\startMPgraphic#2\stopMPgraphic
-% \doifobjectssupportedelse{}{\useMPboxfalse}%
-% \ifuseMPbox
-% \douseMPbox{MP:#1}%
-% \else
-% \nouseMPbox{MP:#1}%
-% \fi
-% \getvalue{MP:#1}}%
-% \fi}
-
\long\def\handlereusableMPgraphic#1#2%
{\bgroup
\enableincludeMPgraphics
\startMPgraphic#2\stopMPgraphic
- \doifobjectssupportedelse{}{\useMPboxfalse}%
+ \doifobjectssupportedelse\donothing\useMPboxfalse
\ifuseMPbox
\expandafter \douseMPbox
\else
\expandafter \nouseMPbox
- \fi {MP:#1}%
- \getvalue{MP:#1}%
+ \fi {\@@MPG#1}%
+ \getvalue{\@@MPG#1}%
\egroup}
-\long\def\startreusableMPgraphic#1#2\stopreusableMPgraphic%
- {\ifundefined{MP:#1}%
- \long\setgvalue{MP:#1}{\handlereusableMPgraphic{#1}{#2}}%
- \fi}
+% \long\def\startreusableMPgraphic#1#2\stopreusableMPgraphic
+% {\ifundefined{\@@MPG#1}%
+% \long\setgvalue{\@@MPG#1}{\handlereusableMPgraphic{#1}{#2}}%
+% \fi}
+
+\long\def\dostartreusableMPgraphic#1#2\stopreusableMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handlereusableMPgraphic{#1}{#2}}}
\def\reuseMPgraphic#1%
- {\getvalue{MP:#1}}
+ {\getvalue{\@@MPG#1}}
%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
- \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \ifMPrun \else
+ \loadMPgraphic{\MPgraphicfile.\the\currentMPgraphic}{}%
+ \placeMPgraphic
+ \fi
\deallocateMPslot\currentMPgraphic
- \placeMPgraphic
\egroup}
-\long\def\startuseMPgraphic#1#2\stopuseMPgraphic%
- {\long\setgvalue{MP:#1}{\handleuseMPgraphic{#1}{#2}}}
+\long\def\startuseMPgraphic#1#2\stopuseMPgraphic
+ {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}}}
-\long\def\startusableMPgraphic#1#2\stopusableMPgraphic% dummy
- {\long\setgvalue{MP:#1}{\handleuseMPgraphic{#1}{#2}}} % unsafe {}{}
+\long\def\startusableMPgraphic#1#2\stopusableMPgraphicv% dummy
+ {\long\setgvalue{\@@MPG#1}{\handleuseMPgraphic{#1}{#2}}} % unsafe {}{}
\let\useMPgraphic=\reuseMPgraphic
@@ -615,7 +678,7 @@
%D For (mainly internal) pusposes we provide a test macro.
\def\doifMPgraphicelse#1%
- {\doifdefinedelse{MP:#1}}
+ {\doifdefinedelse{\@@MPG#1}}
%D \macros
%D {includeMPgraphic}
@@ -637,10 +700,9 @@
%D \stoptypen
\def\includeMPgraphic#1%
- %{\getvalue{MP:#1}}
- {\csname MP:#1\endcsname}
+ {\csname\@@MPG#1\endcsname}
-\def\enableincludeMPgraphics%
+\def\enableincludeMPgraphics
{\let\handleuseMPgraphic \secondoftwoarguments
\let\handlereusableMPgraphic\secondoftwoarguments}
@@ -659,7 +721,7 @@
%D
%D For faster running, one can generate a format, saying
%D
-%D \startypen
+%D \starttypen
%D mpost -ini context
%D \stoptypen
%D
@@ -708,15 +770,26 @@
--output=\MPOSTdriver\space
\ifuseMETAFUNformat --mpformat=metafun \fi --mptex --nomp --once #1}
- \def\executeMetaPost#1%
+% \def\executeMetaPost#1% @EA's
+% {\ifrunMPTEXgraphics
+% \ifMPTEXgraphic
+% \executeMPTEX{#1}%
+% \else
+% \executeMPOST{#1}%
+% \fi
+% \else
+% \executeMPOST{#1}%
+% \fi}
+
+ \def\executeMetaPost
{\ifrunMPTEXgraphics
\ifMPTEXgraphic
- \executeMPTEX{#1}%
+ \@EAEAEA\executeMPTEX
\else
- \executeMPOST{#1}%
+ \@EAEAEA\executeMPOST
\fi
\else
- \executeMPOST{#1}%
+ \@EA\executeMPOST
\fi}
\fi
@@ -812,10 +885,16 @@
%D \starttypen
%D \includeMPfontsfalse
%D \stoptypen
+%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%
+\def\includeMPfonts#1%
{\ifincludeMPfonts
\bgroup
\message{[MP fonts #1]}%
@@ -823,11 +902,11 @@
\endlinechar=-1
\setMPspecials
\obeyMPspecials
- \setbox0=\hbox
+ \setbox\scratchbox=\hbox
{\hskip-\maxdimen
\doprocessfile\scratchread{#1}\handleMPfont}%
- \smashbox0%
- \box0
+ \smashbox\scratchbox
+ \box\scratchbox
\egroup
\fi}
@@ -887,10 +966,10 @@
%D Font definitions specified in the preamble are simply
%D ignored. Only lines starting with \type{(} are interpreted.
-\def\dohandleMPfont#1#2\relax%
+\def\dohandleMPfont#1#2\relax
{\if#1(\expandafter\includeMPcharacters\fileline\relax\fi}
-\def\handleMPfont%
+\def\handleMPfont
{\expandafter\dohandleMPfont\fileline\relax}
%D Before we start scanning for data, we first change some
@@ -966,7 +1045,7 @@
\def\PSnfont{nfont}
-\def\includeMPcharacters(#1) #2 #3 #4#5#6#7#8#9\relax%
+\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=#3pt
@@ -1047,7 +1126,7 @@
\def\convertMPcolorpath{}
\def\convertMPcolorfile{metacmyk.tmp}
-\def\convertMPcolors#1%
+\def\convertMPcolors#1% todo: open on local path, no copy
{\bgroup
\ifforcegrayMPcolors
\donetrue
@@ -1101,18 +1180,18 @@
\immediate\write\scratchwrite
{\@@cl@@s \space setgray #4}%
\else
- \dimen0=1pt \advance\dimen0 by -#1pt
- \dimen2=1pt \advance\dimen2 by -#2pt
- \dimen4=1pt \advance\dimen4 by -#3pt
+ \dimen0=1pt \advance\dimen0 -#1pt
+ \dimen2=1pt \advance\dimen2 -#2pt
+ \dimen4=1pt \advance\dimen4 -#3pt
\ifreduceMPcolors
\dimen6=\dimen0
\ifdim\dimen2<\dimen6 \dimen6=\dimen2 \fi
\ifdim\dimen4<\dimen6 \dimen6=\dimen4 \fi
- \advance\dimen0 by -\dimen6
- \advance\dimen2 by -\dimen6
- \advance\dimen4 by -\dimen6
+ \advance\dimen0 -\dimen6
+ \advance\dimen2 -\dimen6
+ \advance\dimen4 -\dimen6
\else
- \dimen6=\!!zeropoint
+ \dimen6=\zeropoint
\fi
\immediate\write\scratchwrite
{\withoutpt{\the\dimen0} \space
@@ -1271,29 +1350,29 @@
\newif\ifMPdrawingdone \MPdrawingdonefalse
\newif\ifMPshiftdrawing \MPshiftdrawingfalse
-\def\resetMPdrawing%
+\def\resetMPdrawing
{\global\let\MPdrawingdata\empty
\global\MPdrawingdonefalse}
-\def\pushMPdrawing%
+\def\pushMPdrawing
{\pushmacro\MPdrawingdata
\global\let\MPdrawingdata\empty}
-\def\popMPdrawing%
+\def\popMPdrawing
{\popmacro\MPdrawingdata}
-\def\getMPdrawing%
+\def\getMPdrawing
{\ifMPdrawingdone
\expandafter\startMPgraphic\MPdrawingdata\stopMPgraphic
\loadcurrentMPgraphic\empty
- \deallocateMPslot\currentMPgraphic % new
+ \deallocateMPslot\currentMPgraphic
\placeMPgraphic
\fi}
-\def\startMPdrawing%
+\def\startMPdrawing
{\dosingleempty\dostartMPdrawing}
-\long\def\dostartMPdrawing[#1]#2\stopMPdrawing%
+\long\def\dostartMPdrawing[#1]#2\stopMPdrawing
{\relax
\bgroup
\enableincludeMPgraphics
@@ -1402,6 +1481,45 @@
\newif\ifrecycleMPslots \recycleMPslotsfalse
+% \def\allocateMPslot#1%
+% {\ifrunMPgraphics
+% \ifcase\pdfoutput \recycleMPslotsfalse \fi
+% \else
+% \recycleMPslotsfalse
+% \fi
+% \ifrecycleMPslots
+% \doloop % slow but used seldom
+% {\doifundefined{\recurselevel MP}
+% {\global\letvalue{\recurselevel MP}=\empty
+% \global#1=\recurselevel\exitloop}}%
+% %\message{[MP slot + \number#1]%
+% \else
+% \global\advance#1 1
+% \fi}
+
+%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 graphcis. 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
+
\def\allocateMPslot#1%
{\ifrunMPgraphics
\ifcase\pdfoutput \recycleMPslotsfalse \fi
@@ -1409,13 +1527,21 @@
\recycleMPslotsfalse
\fi
\ifrecycleMPslots
- \doloop
+ \doloop % slow but used seldom
{\doifundefined{\recurselevel MP}
- {\global\letvalue{\recurselevel MP}=\empty
- \global#1=\recurselevel\exitloop}}%
- %\message{[MP slot + \number#1]%
+ {\global\letvalue{\recurselevel MP}\empty
+ \global#1=\recurselevel
+ \exitloop}}%
+ % \message{[MP slot + \number#1]%
+ \else\ifMPstaticgraphic
+ \global#1\maxnofMPgraphics
+ \global\advance\maxnofMPgraphics -1
\else
- \global\advance#1 by 1
+ \global#1\minnofMPgraphics
+ \global\advance\minnofMPgraphics 1
+ \fi\fi
+ \ifnum\minnofMPgraphics<\maxnofMPgraphics \else
+ \writestatus{\m!systems}{increase \string\maxnofMPgraphics}%
\fi}
\def\deallocateMPslot#1%
@@ -1460,6 +1586,4 @@
\long\def\startMPcode#1\stopMPcode%
{\startuseMPgraphic{@@}#1\stopuseMPgraphic\useMPgraphic{@@}}
-\protect
-
-\endinput
+\protect \endinput
diff --git a/tex/context/base/supp-mrk.tex b/tex/context/base/supp-mrk.tex
index 40458a621..8be8dd18f 100644
--- a/tex/context/base/supp-mrk.tex
+++ b/tex/context/base/supp-mrk.tex
@@ -14,72 +14,9 @@
%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.
-
-% for testing etex, can be much faster than normal
-%
-% \unprotect
-%
-% \newif\ifexpandmarks \expandmarkstrue
-%
-% \let\normalmark = \mark
-% \let\normaltopmark = \topmark
-% \let\normalbotmark = \botmark
-% \let\normalfirstmark = \firstmark
-% \let\normalsplitbotmark = \splitbotmark
-% \let\normalsplitfirstmark = \splitfirstmark
-%
-% \let\normalmarks = \marks
-% \let\normaltopmarks = \topmarks
-% \let\normalbotmarks = \botmarks
-% \let\normalfirstmarks = \firstmarks
-% \let\normalsplitbotmarks = \splitbotmarks
-% \let\normalsplitfirstmarks = \splitfirstmarks
-%
-% \def\newmark #1{\setgvalue{mrk\strippedcsname#1}{0}\newmarks#1}
-%
-% \def\gettopmark {\getmark\topmarks}
-% \def\getbottommark {\getmark\botmarks}
-% \def\getfirstmark {\getmark\firstmarks}
-% \def\getsplitbottommark{\getmark\splitbotmarks}
-% \def\getsplitfirstmark {\getmark\splitfirstmarks}
-%
-% \def\getbotmark {\getmark\botmarks}
-% \def\getsplitbotmark {\getmark\splitbotmarks}
-% \def\getsplittopmark {\getmark\splitfirstmarks}
-%
-% \def\getmark#1#2%
-% {\ifcase\csname mrk\strippedcsname#2\endcsname\else
-% \expandafter#1\expandafter#2%
-% \fi}
-%
-% \long\def\setmark#1#2%
-% {\setgvalue{mrk\strippedcsname#1}{0}%
-% \ifexpandmarks
-% \expanded{\normalmarks#1{#2}}%
-% \else
-% \normalmarks#1{#2}%
-% \fi}
-%
-% \def\resetmark#1%
-% {\setgvalue{mrk\strippedcsname#1}{1}\marks#1{}}
-%
-% \def\noninterferingmarks%
-% {\let\savedsetmark\setmark
-% \let\noninterferingmarks\relax
-% \long\def\setmark##1##2%
-% {\ifhmode\prewordbreak\hbox\fi{\savedsetmark{##1}{##2}}}}
-%
-% \let\getmarks \gobbleoneargument
-% \let\getallmarks \relax
-% \let\getsplitmarks \gobbleoneargument
-% \let\getallsplitmarks\relax
-%
-% \let\newpersistentmark \newmark % checken
-% \newif\ifnofirstmarker % checken
-%
-% \protect \endinput
+%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
@@ -96,9 +33,58 @@
\writestatus{loading}{Context Support Macros / Marks}
+\let\normalmark = \mark
+\let\normaltopmark = \topmark
+\let\normalbotmark = \botmark
+\let\normalfirstmark = \firstmark
+\let\normalsplitbotmark = \splitbotmark
+\let\normalsplitfirstmark = \splitfirstmark
+
+\beginETEX \marks cum suis
+
+\let\normalmarks = \marks
+\let\normaltopmarks = \topmarks
+\let\normalbotmarks = \botmarks
+\let\normalfirstmarks = \firstmarks
+\let\normalsplitbotmarks = \splitbotmarks
+\let\normalsplitfirstmarks = \splitfirstmarks
+
+\endETEX
+
\unprotect
-%% \beginTEX
+%D We start with the presetting the interface macros.
+%D
+%D \starttabulatie[|||]
+%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 \stoptabulatie
+%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
@@ -178,19 +164,19 @@
%D our scratch counter.
%D
%D \starttypen
-%D % \newcount\topmarker
-%D % \newcount\botmarker
-%D % \newcount\foundmarker
+%D \newcount\topmarker
+%D \newcount\botmarker
+%D \newcount\foundmarker
%D \stoptypen
%D
%D We've also introduced some constants, one for the lists and
%D three for composing the mark commands.
-\def\@@marklist@@ {marklist}
-\def\@@marktop@@ {top}
-\def\@@markbot@@ {bot}
-\def\@@markfirst@@ {first}
-\def\@@markcurrent@@ {current}
+\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
@@ -198,25 +184,6 @@
\let\allmarks=\empty
-%D \macros
-%D {expandmarks}
-%D
-%D There are two booleans. The first one handles the first
-%D marks, the second concerns expansion. This second one is
-%D new.
-
-\newif\ifnofirstmarker
-\newif\ifexpandmarks \expandmarkstrue
-
-%D We use an indirect call to the mark mechanism.
-
-\let\normalmark = \mark
-\let\normaltopmark = \topmark
-\let\normalbotmark = \botmark
-\let\normalfirstmark = \firstmark
-\let\normalsplitbotmark = \splitbotmark
-\let\normalsplitfirstmark = \splitfirstmark
-
%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).
@@ -254,7 +221,13 @@
\def\newmark#1%
{\definenewmark#1{\doglobal\addtocommalist\markname\allmarks}}
-\let\setmark\empty
+%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:
@@ -266,16 +239,6 @@
\def\getsplitbottommark#1{\getvalue{\@@markbot@@ \strippedcsname#1}}
\def\getsplitfirstmark #1{\getvalue{\@@markfirst@@ \strippedcsname#1}}
-\let\getbotmark \getbottommark
-\let\getsplitbotmark\getsplitbottommark
-\let\getsplittopmark\getsplitfirstmark
-
-%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}
-
%D \macros
%D {setmark}
%D
@@ -296,14 +259,14 @@
\setgvalue{\@@markcurrent@@\markname}{#2}%
\global\advance\currentmarker by 1
\normalmark{\the\currentmarker}%
- \@EA\!!toksa\@EA=\@EA\@EA\@EA{\csname\marklist\endcsname}%
+ \!!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
+ \!!toksb\@EA{#2}% one level, why ? handy for cs
\setxvalue{\marklist}%
{\the\!!toksa
\noexpand\domark
@@ -334,47 +297,55 @@
\let\normalelse \else % replaces \@else
\let\normalor \or % replaces \@or
+% 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}%
- \!!toksb={}%
- \nofirstmarkertrue
-% does more worse than good
- \let\fi=\relax
- \let\or=\relax
- \let\else=\relax
-%
- \let\domark=\doscanmarks
+ \!!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\getallmarks%
- {\processcommacommand[\allmarks]\getmarks}
-
\def\getsplitmarks#1%
{\bgroup
\makemarknames{#1}%
-% \@EA\let\@EA\savedmarklist\@EA=\csname\marklist\endcsname
+ % \@EA\let\@EA\savedmarklist\@EA\csname\marklist\endcsname
\edef\topmarker{0\normalsplitfirstmark}%
\edef\botmarker{0\normalsplitbotmark}%
- \!!toksb={}%
+ \!!toksa\emptytoks
+ \!!toksb\emptytoks
\nofirstmarkertrue
-% does more worse than good
- \let\fi=\relax
- \let\or=\relax
- \let\else=\relax
-%
- \let\domark=\doscanmarks
+ % does more worse than good
+ \let\fi\relax
+ \let\or\relax
+ \let\else\relax
+ %
+ \let\domark\doscanmarks
\getvalue{\marklist}\lastmark
-% \@EA\global\@EA\let\csname\marklist\endcsname=\savedmarklist
+ % \global\@EA\let\csname\marklist\endcsname\savedmarklist
\egroup}
-\def\getallsplitmarks%
- {\processcommacommand[\allmarks]\getsplitmarks}
+\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
@@ -382,8 +353,8 @@
\long\setgvalue{\@@marktop@@\markname}{#1}%
\normalfi
\ifnum\scratchcounter>\botmarker\relax
- \let\domark=\dorecovermarks
- \!!toksb=\@EA{\@EA\domark\the\scratchcounter{#1}}%
+ \let\domark\dorecovermarks
+ \!!toksb\@EA{\@EA\domark\the\scratchcounter{#1}}%
\normalelse
\ifnofirstmarker
\long\setgvalue{\@@markfirst@@\markname}{#1}%
@@ -392,204 +363,245 @@
\normalfi
\normalfi
\long\setgvalue{\@@markbot@@\markname}{#1}%
- \!!toksa=\@EA{\@EA\domark\the\scratchcounter{#1}}%
+ \!!toksa\@EA{\@EA\domark\the\scratchcounter{#1}}%
\normalfi}
\def\doscanmarks%
{\afterassignment\dodoscanmarks\scratchcounter=}
-\long\def\dorecovermarks#1\lastmark%
- {\!!toksc={\domark#1}}
+\long\def\dorecovermarks#1\lastmark% nice trick
+ {\!!toksc{\domark#1}}
-\def\lastmark%
- {\!!toksc={}}
+\def\lastmark% rest of trick
+ {\!!toksc\emptytoks}
-%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.
+\endTEX
+
+% %D Here starts the \ETEX\ alternative.
+%
+% \beginETEX \marks cum suis
+%
+% \newtoks \listofmarks
+%
+% \def\@@mrk{mrk:}
+% \def\@@trk{trk:}
+% \def\@@crk{crk:}
+%
+% \def\getcurrentmark {\getsomemark\thecurrentmarks}
+% \def\gettopmark {\getsomemark\checkedtopmarks}
+% \def\getbottommark {\getsomemark\normalbotmarks}
+% \def\getfirstmark {\getsomemark\normalfirstmarks}
+% \def\getsplitbottommark{\getsomemark\normalsplitbotmarks}
+% \def\getsplitfirstmark {\getsomemark\normalsplitfirstmarks}
+%
+% \def\getbotmark {\getsomemark\normalbotmarks}
+% \def\getsplitbotmark {\getsomemark\normalsplitbotmarks}
+% \def\getsplittopmark {\getsomemark\normalsplitfirstmarks}
+%
+% %D \starttypen
+% %D \def\getsomemark#1#2%
+% %D {\ifnum\getvalue{\@@mrk\string#2}=0\else % still reset
+% %D \expandafter\gobbletwoarguments
+% %D \fi#1#2}
+% %D \stoptypen
+% %D
+% %D We need a fully expandable (in \type {\edef}) version of
+% %D this one ...
+%
+% \letvalue{@@0}\empty
+% \letvalue{@@1}\gobbletwoarguments
+%
+% \def\getsomemark#1#2% (0,min(1,savedpage))
+% {\csname
+% @@\ifcase\csname\@@mrk\string#2\endcsname\space0\else1\fi
+% \endcsname#1#2}
+%
+% %D ... and so we have another ugly but useful hack.
+% %D
+% %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\thecurrentmarks#1{\csname\@@crk\string#1\endcsname}
+%
+% \long\def\setmark#1%
+% {\global\@EA\let\csname\@@mrk\string#1\endcsname\zerocountervalue
+% \ifexpandmarks
+% \expandafter\setexpandedmark
+% \else
+% \expandafter\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
+% {\scratchtoks{#2}%
+% \@EA\xdef\csname\@@crk\string#1\endcsname{\the\scratchtoks}%
+% \normalmarks#1{\the\scratchtoks}} % one level expansion
+%
+% \def\checktopmark#1% is called often, so its minimized
+% {\ifcase\csname\@@mrk\string#1\endcsname\else
+% \@EA\dochecktopmark\@EA#1%
+% \fi}
+%
+% \def\dochecktopmark#1%
+% {\ifnum\realpageno>\csname\@@mrk\string#1\endcsname\relax
+% \@EA\xdef\csname\@@trk\string#1\endcsname{\normalbotmarks#1}%
+% \fi}
+%
+% \def\resetmark#1% we cannot use \normalmarks#1{}}
+% {\@EA\xdef\csname\@@mrk\string#1\endcsname{\realfolio}%
+% \global\@EA\let\csname\@@trk\string#1\endcsname\empty}
+%
+% \def\definenewmark#1%
+% {\ifcsname\@@mrk\string#1\endcsname\else % this is etex -)
+% \newmarks#1%
+% \appendtoks\checktopmark#1\to\listofmarks
+% \fi
+% \global\@EA\let\csname\@@crk\string#1\endcsname\empty
+% \global\@EA\let\csname\@@mrk\string#1\endcsname\zerocountervalue
+% \@EA\gdef\csname\@@trk\string#1\endcsname{\normaltopmarks#1}}%
+%
+% \let \newmark \definenewmark
+% \let \newpersistentmark \definenewmark
+% \let \normalsetmark \setmark
+%
+% \def\setallmarks{\the\listofmarks}
+%
+% %D In \type {page-ini} or \type {core-mar} we should say:
+% %D
+% %D \starttypen
+% %D \appendtoks \getallmarks \to \everybeforepagebody
+% %D \appendtoks \setallmarks \to \everyafterpagebody
+% %D \stoptypen
+%
+% \endETEX
-\def\noninterferingmarks%
- {\let\savednormalmark\normalmark
- \let\noninterferingmarks\relax
- \def\normalmark##1%
- {\ifhmode\prewordbreak\hbox\fi{\savednormalmark{##1}}}}
+\beginETEX \marks cum suis
-%D This macro is for instance used in the inline headings
-%D postprocessing, as needed when we want to make those
-%D clickable.
+\newtoks \listofmarks
-%% \endTEX
+\def\@@mrk{mrk:} \def\@@trk{trk:} \def\@@crk{crk:}
-\protect \endinput
+%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.
-%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.
+\def\checkedtopmarks#1{\csname\@@trk\string#1\endcsname}
+\def\thecurrentmarks#1{\csname\@@crk\string#1\endcsname}
-\beginETEX \marks \topmarks \botmarks \firstmarks
+\long\def\setmark#1%
+ {\global\@EA\mathchardef\csname\@@mrk\string#1\endcsname\zerocount
+ \ifexpandmarks\@EA\setexpandedmark\else\@EA\setnormalmark\fi#1}
-\let\normalmark = \mark
-\let\normaltopmark = \topmark
-\let\normalbotmark = \botmark
-\let\normalfirstmark = \firstmark
-\let\normalsplitbotmark = \splitbotmark
-\let\normalsplitfirstmark = \splitfirstmark
+\def\setexpandedmark#1#2% % marks expand anyway
+ {\@EA\xdef\csname\@@crk\string#1\endcsname{#2}%
+ \normalmarks#1{#2}}
-\let\normalmarks\marks
+\def\setnormalmark#1#2% using a tok prevents unwanted expansion in mark
+ {\scratchtoks{#2}%
+ \@EA\xdef\csname\@@crk\string#1\endcsname{\the\scratchtoks}%
+ \normalmarks#1{\the\scratchtoks}} % one level expansion
-%D The 100\% compatible solution is:
-%D
-%D \starttypen
-%D \def\@@marktop@@ {top}
-%D \def\@@markbot@@ {bot}
-%D \def\@@markfirst@@ {first}
-%D \def\@@marksplitbot@@ {splitbot}
-%D \def\@@marksplitfirst@@ {splitfirst}
-%D
-%D \def\newmark#1% temporary 5 \cs's, will be rewritten ; global needed
-%D {\newmarks#1%
-%D \setxvalue{\@@marktop@@ \strippedcsname#1}{\noexpand\topmarks \the#1 }%
-%D \setxvalue{\@@markbot@@ \strippedcsname#1}{\noexpand\botmarks \the#1 }%
-%D \setxvalue{\@@markfirst@@ \strippedcsname#1}{\noexpand\firstmarks\the#1 }%
-%D \setxvalue{\@@marksplitbot@@ \strippedcsname#1}{\noexpand\splitbotmarks \the#1 }%
-%D \setxvalue{\@@marksplitfirst@@\strippedcsname#1}{\noexpand\splitfirstmarks\the#1 }%
-%D \xdef#1{\noexpand\donormalmarks{\the#1}}}
-%D
-%D \def\gettopmark #1{\getvalue{\@@marktop@@ \strippedcsname#1}}
-%D \def\getbottommark #1{\getvalue{\@@markbot@@ \strippedcsname#1}}
-%D \def\getfirstmark #1{\getvalue{\@@markfirst@@ \strippedcsname#1}}
-%D \def\getsplitbottommark#1{\getvalue{\@@marksplitbot@@ \strippedcsname#1}}
-%D \def\getsplitfirstmark #1{\getvalue{\@@marksplitfirst@@\strippedcsname#1}}
-%D
-%D \def\getsplitmarks#1%
-%D {\setvalue{\@@markbot@@\strippedcsname#1}%
-%D {\getvalue{\@@marksplitbot@@\strippedcsname#1}}%
-%D \setvalue{\@@marktop@@\strippedcsname#1}%
-%D {\getvalue{\@@marksplitfirst@@\strippedcsname#1}}%
-%D \setvalue{\@@markfirst@@\strippedcsname#1}%
-%D {\getvalue{\@@marksplitfirst@@\strippedcsname#1}}}
-%D
-%D \def\noninterferingmarks%
-%D {\let\saveddonormalmarks\donormalmarks
-%D \let\noninterferingmarks\relax
-%D \long\def\donormalmarks##1##2%
-%D {\ifhmode\prewordbreak\hbox\fi{\saveddonormalmarks{##1}{##2}}}}
-%D
-%D \long\def\donormalmarks#1#2%
-%D {\bgroup
-%D \scratchcounter=#1\relax
-%D \ifexpandmarks
-%D \expanded{\normalmarks\scratchcounter{#2}}%
-%D \else
-%D \normalmarks\scratchcounter{#2}%
-%D \fi
-%D \egroup}
-%D
-%D \let\setmark\empty
-%D \def\resetmark#1{#1{}}
-%D \stoptypen
-%D
-%D However, I prefer the less \type{\cs} hungry ones. Beware,
-%D these ones (and the next) do no longer support direct marks.
-%D
-%D \starttypen
-%D \newif\ifexpandmarks \expandmarkstrue
-%D
-%D \let\newmark \newmarks
-%D \let\gettopmark \topmarks
-%D \let\getbottommark \botmarks
-%D \let\getfirstmark \firstmarks
-%D \let\getsplitbottommark\splitbotmarks
-%D \let\getsplitfirstmark \splitfirstmarks
-%D
-%D \let\getbotmark \botmarks
-%D \let\getsplitbotmark \splitbotmarks
-%D \let\getsplittopmark \splitfirstmarks
-%D
-%D \long\def\setmark#1#2%
-%D {\ifexpandmarks
-%D \expanded{\normalmarks#1{#2}}%
-%D \else
-%D \normalmarks#1{#2}%
-%D \fi}
-%D \stoptypen
+\def\checktopmark#1% is called often, so its minimized
+ {\ifcase\csname\@@mrk\string#1\endcsname\else
+ \@EA\dochecktopmark\@EA#1%
+ \fi}
-%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 \starttypen
-%D \def\resetmark#1%
-%D {\marks#1{}}
-%D \stoptypen
+\def\dochecktopmark#1%
+ {\ifnum\realpageno>\csname\@@mrk\string#1\endcsname\relax
+ \global\@EA\let\csname\@@trk\string#1\endcsname\normalbotmarks
+ \fi}
-%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. Although suitable, a
-%D more natural low level solution would be better. So, for the
-%D moment, we could end up with a solution similar to the macro
-%D based multiple marks as implemented before. Alas, this
-%D alternative is useless too, because it does not synchronize
-%D well with previous values.
+\def\resetmark#1% we cannot use \normalmarks#1{}}
+ {\@EA\mathchardef\csname\@@mrk\string#1\endcsname\realfolio
+ \global\@EA\let\csname\@@trk\string#1\endcsname\gobbleoneargument}
-\def\@m@{@m@}
+\def\definenewmark#1%
+ {\ifcsname\@@mrk\string#1\endcsname\else % this is etex -)
+ \newmarks#1\appendtoks\checktopmark#1\to\listofmarks
+ \fi
+ \global\@EA\let\csname\@@crk\string#1\endcsname\empty
+ \global\@EA\mathchardef\csname\@@mrk\string#1\endcsname\zerocount
+ \global\@EA\let\csname\@@trk\string#1\endcsname\normaltopmarks}
-\def\newmark#1%
- {\newmarks#1%
- \global\letvalue{\@@markcurrent@@\string#1}\empty
- \expandafter\gdef\csname\@m@\number#1\endcsname{0}}
+\let \newmark \definenewmark
+\let \newpersistentmark \definenewmark
+\let \normalsetmark \setmark
-\long\def\setmark#1#2%
- {\setgvalue{\@m@\number#1}{1}%
- \setgvalue{\@@markcurrent@@\string#1}{#2}%
- \ifexpandmarks
- \expanded{\normalmarks#1{#2}}%
- \else
- \normalmarks#1{#2}%
- \fi}
+\def\setallmarks{\the\listofmarks}
+
+%D In \type {page-ini} or \type {core-mar} we should say:
+%D
+%D \starttypen
+%D \appendtoks \getallmarks \to \everybeforepagebody
+%D \appendtoks \setallmarks \to \everyafterpagebody
+%D \stoptypen
-\def\getcurrentmark #1{\getvalue{\@@markcurrent@@\strippedcsname#1}}
+\let\getcurrentmark \thecurrentmarks
+\let\gettopmark \checkedtopmarks
+\let\getbottommark \normalbotmarks
+\let\getfirstmark \normalfirstmarks
+\let\getsplitbottommark \normalsplitbotmarks
+\let\getsplitfirstmark \normalsplitfirstmarks
-\def\gettopmark {\getsomemark\topmarks}
-\def\getbottommark {\getsomemark\botmarks}
-\def\getfirstmark {\getsomemark\firstmarks}
-\def\getsplitbottommark{\getsomemark\splitbotmarks}
-\def\getsplitfirstmark {\getsomemark\splitfirstmarks}
+\let\getbotmark \normalbotmarks
+\let\getsplitbotmark \normalsplitbotmarks
+\let\getsplittopmark \normalsplitfirstmarks
-\def\getsomemark#1#2%
- {\ifnum\csname\@m@\number#2\endcsname=1 #1#2\fi}
+\endETEX
-\def\clearmarks#1%
- {\expandafter\gdef\csname\@m@\number#1\endcsname{0}}
+%D A couple of goodies:
-\def\resetmark%
- {\clearmarks}
+\let\getbotmark \getbottommark
+\let\getsplitbotmark\getsplitbottommark
+\let\getsplittopmark\getsplitfirstmark
-\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.
-%D Hm.
+\let\normalsetmark\setmark
-\def\noninterferingmarks%
- {\let\savedsetmark\setmark
- \let\noninterferingmarks\relax
- \long\def\setmark##1##2%
- {\ifhmode\prewordbreak\hbox\fi{\savedsetmark{##1}{##2}}}}
+\def\noninterferingsetmark#1#2%
+ {\ifhmode\prewordbreak\hbox\fi{\normalsetmark{#1}{#2}}}
-\let\getmarks \gobbleoneargument
-\let\getallmarks \relax
-\let\getsplitmarks \gobbleoneargument
-\let\getallsplitmarks\relax
+\def\noninterferingmarks
+ {\let\noninterferingmarks\relax
+ \let\setmark\noninterferingsetmark}
-\let\newpersistentmark \newmark % checken
-\newif\ifnofirstmarker % checken
+%D This macro is for instance used in the inline headings
+%D postprocessing, as needed when we want to make those
+%D clickable.
-\endETEX
+%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 \starttypen
+%D \def\resetmark#1{\marks#1{}}
+%D \stoptypen
+%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
@@ -626,20 +638,11 @@
%D
%D \typebuffer\blanko\haalbuffer\blanko
-%D Because we used an indirect call to the mark mechanism
-%D we can redefine the original \type{\mark} command.
-
-\beginTEX
-
-\newmark\mark
-
-\endTEX
-
%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.
-\protect
+\readfile{supp-nmk}{}{}
-\endinput
+\protect \endinput
diff --git a/tex/context/base/supp-num.tex b/tex/context/base/supp-num.tex
index 8b30500eb..a39733ceb 100644
--- a/tex/context/base/supp-num.tex
+++ b/tex/context/base/supp-num.tex
@@ -165,7 +165,10 @@
% {\def\saveddigits{#1}}%
\fi\fi\fi\fi
\grabdigit}
-
+
+\let\handlemathdigits\firstofoneargument
+\let\handletextdigits\mathematics
+
\def\handledigits%
{%\ifcase\powerdigits
% \edef\collecteddigits{\collecteddigits\saveddigits}%
@@ -173,9 +176,9 @@
% \edef\savedpowerdigits{\savedpowerdigits\saveddigits}%
%\fi
\ifmmode
- \dohandledigits
+ \handlemathdigits{\dohandledigits}%
\else
- \dontleavehmode\hbox{$\dohandledigits$}%
+ \dontleavehmode\hbox{\handletextdigits{\dohandledigits}}%
\fi
\egroup}
@@ -321,9 +324,9 @@
%D \digits 123.222,00^10
%D \stoptypen
%D
-%D The seperator is defined as:
+%D The separator is defined as:
-\def\digitpowerseperator%
+\def\digitpowerseparator%
{\cdot10} % {\times10}
%D \macros
diff --git a/tex/context/base/supp-pdf.tex b/tex/context/base/supp-pdf.tex
index 387c208da..a8db878b6 100644
--- a/tex/context/base/supp-pdf.tex
+++ b/tex/context/base/supp-pdf.tex
@@ -11,6 +11,17 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
+% This method is not that accurate with small files that use
+% penshapes. I tried several methods but so far I could not
+% come up with a better alternative. \TEX's real calculation
+% options are simply to simple. Using \ETEX's expression
+% mechanism does not lead to better results.
+
+% beware, we cannot use \zeropoint here since it may be
+% defined in the range \dimen 0 - 20 which we happen to use
+% as scratch registers ; inside context we may consider
+% using dedicated registers
+
%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
@@ -344,6 +355,12 @@
%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}
@@ -442,10 +459,21 @@
\def\@@MP{@@MP}
-\def\setMPargument#1%
- {\advance\nofMParguments by 1
+\def\setMPargument% #1%
+ {\advance\nofMParguments 1
\expandafter\def
- \csname\@@MP\the\nofMPsegments\the\nofMParguments\endcsname{\do#1}}
+ \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}
@@ -453,10 +481,13 @@
\def\gMPs#1%
{\csname\@@MP\the\nofMPsegments\number#1\endcsname}
-\def\setMPkeyword#1
+\def\dogMPa#1%
+ {\@EAEAEA\do\csname\@@MP0\number#1\endcsname}
+
+\def\setMPkeyword#1 %
{\expandafter\def\csname\@@MP\the\nofMPsegments0\endcsname{#1}%
- \advance\nofMPsegments by 1
- \nofMParguments=0\relax}
+ \advance\nofMPsegments1
+ \nofMParguments0 }
\def\getMPkeyword#1%
{\csname\@@MP#10\endcsname}
@@ -469,11 +500,11 @@
%D when dealing with comments.
\def\doresetMPstack%
- {\nofMParguments=0 }
+ {\nofMParguments0 }
\def\resetMPstack%
{\catcode`\%=\@@active
- \let\handleMPgraphic=\handleMPendgraphic
+ \let\handleMPgraphic\handleMPendgraphic
\let\resetMPstack\doresetMPstack
\resetMPstack}
@@ -574,105 +605,120 @@
%D speed up the conversion by handling the \type{path}
%D seperately.
-\def\dohandleMPsequence#1#2 %
+\def\@EAEAEA{\expandafter\expandafter\expandafter} % to be sure
+
+\def\dohandleMPsequence#1%
{\ifdone
- \ifnum\lccode`#1=0
- \setMPargument{#1#2}%
+ \ifcase\lccode`#1\relax
+ \@EAEAEA\dohandleMPsequenceA
\else
- \edef\somestring{#1#2}%
- \ifx\somestring\PSmoveto
- \edef\lastMPmoveX{\gMPa1}%
- \edef\lastMPmoveY{\gMPa2}%
- \PDFcode{\!MP{\gMPa1} \!MP{\gMPa2} m}%
- \resetMPstack
- \else\ifx\somestring\PSnewpath
- \let\handleMPsequence=\handleMPpath
- \else\ifx\somestring\PSgsave
- \PDFcode{q}%
- \resetMPstack
- \else\ifx\somestring\PSgrestore
- \PDFcode{Q}%
- \resetMPstack
- \else\ifx\somestring\PSdtransform % == setlinewidth
- \let\handleMPsequence=\handleMPdtransform
- \else\ifx\somestring\PSconcat
- \PDFcode{\gMPa1 \gMPa2 \gMPa3 \gMPa4 \gMPa5 \gMPa6 cm}%
- \resetMPstack
- \else\ifx\somestring\PSsetrgbcolor
- \handleMPrgbcolor
- \resetMPstack
- \else\ifx\somestring\PSsetcmykcolor
- \handleMPcmykcolor
- \resetMPstack
- \else\ifx\somestring\PSsetgray
- \handleMPgraycolor
- \resetMPstack
- \else\ifx\somestring\PStranslate
- \PDFcode{1 0 0 1 \gMPa1 \gMPa2 cm}%
- \resetMPstack
- \else\ifx\somestring\PSsetdash
- \handleMPsetdash
- \resetMPstack
- \else\ifx\somestring\PSsetlinejoin
- \PDFcode{\gMPa1 j}%
- \resetMPstack
- \else\ifx\somestring\PSsetmiterlimit
- \PDFcode{\gMPa1 M}%
- \resetMPstack
- \else\ifx\somestring\PSfshow
- \PDFcode{n}%
- \handleMPfshow
- \resetMPstack
- \else\ifx\somestring\PSsetlinecap
- \PDFcode{\gMPa1 J}%
- \resetMPstack
- \else\ifx\somestring\PSrlineto
- \PDFcode{\!MP{\lastMPmoveX} \!MP{\lastMPmoveY} l S}%
- \resetMPstack
- \else\ifx\somestring\PSscale
- \PDFcode{\gMPa1 0 0 \gMPa2 0 0 cm}%
- \resetMPstack
- \else\ifx\somestring\PSspecial
- \handleMPspecialcommand
- \resetMPstack
- \else
- \handleMPgraphic{#1#2}%
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \@EAEAEA\dohandleMPsequenceB
\fi
\else
- \edef\somestring{#1#2}%
- \handleMPgraphic{#1#2}%
- \fi
+ \@EA\dohandleMPsequenceC
+ \fi#1}
+
+%\def\dohandleMPsequenceA#1 %
+% {\setMPargument{#1}%
+% \handleMPsequence}
+
+\let\dohandleMPsequenceA\setMPsequence
+
+\def\dohandleMPsequenceB#1 %
+ {\edef\somestring{#1}%
+ \ifx\somestring\PSmoveto
+ \edef\lastMPmoveX{\gMPa1}%
+ \edef\lastMPmoveY{\gMPa2}%
+ \PDFcode{\!MPgMPa1 \!MPgMPa2 m}%
+ \resetMPstack
+ \else\ifx\somestring\PSnewpath
+ \let\handleMPsequence\handleMPpath
+ \else\ifx\somestring\PSgsave
+ \PDFcode{q}%
+ \resetMPstack
+ \else\ifx\somestring\PSgrestore
+ \PDFcode{Q}%
+ \resetMPstack
+ \else\ifx\somestring\PSdtransform % == setlinewidth
+ \let\handleMPsequence\handleMPdtransform
+ \else\ifx\somestring\PSconcat
+ \PDFcode{\gMPa1 \gMPa2 \gMPa3 \gMPa4 \gMPa5 \gMPa6 cm}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetrgbcolor
+ \handleMPrgbcolor
+ \resetMPstack
+ \else\ifx\somestring\PSsetcmykcolor
+ \handleMPcmykcolor
+ \resetMPstack
+ \else\ifx\somestring\PSsetgray
+ \handleMPgraycolor
+ \resetMPstack
+ \else\ifx\somestring\PStranslate
+ \PDFcode{1 0 0 1 \gMPa1 \gMPa2 cm}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetdash
+ \handleMPsetdash
+ \resetMPstack
+ \else\ifx\somestring\PSsetlinejoin
+ \PDFcode{\gMPa1 j}%
+ \resetMPstack
+ \else\ifx\somestring\PSsetmiterlimit
+ \PDFcode{\gMPa1 M}%
+ \resetMPstack
+ \else\ifx\somestring\PSfshow
+ \PDFcode{n}%
+ \handleMPfshow
+ \resetMPstack
+ \else\ifx\somestring\PSsetlinecap
+ \PDFcode{\gMPa1 J}%
+ \resetMPstack
+ \else\ifx\somestring\PSrlineto
+ \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l S}%
+ \resetMPstack
+ \else\ifx\somestring\PSscale
+ \PDFcode{\gMPa1 0 0 \gMPa2 0 0 cm}%
+ \resetMPstack
+ \else\ifx\somestring\PSspecial
+ \handleMPspecialcommand
+ \resetMPstack
+ \else
+ \handleMPgraphic% {#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \handleMPsequence}
+
+\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{\!MP{\gMPa1} \!MP{\gMPa2} \!MP{\gMPa3} rg
- \!MP{\gMPa1} \!MP{\gMPa2} \!MP{\gMPa3} RG}}
+\def\handleMPrgbcolor
+ {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 rg
+ \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 RG}}
-\def\handleMPcmykcolor%
- {\PDFcode{\!MP{\gMPa1} \!MP{\gMPa2} \!MP{\gMPa3} \!MP{\gMPa4} k
- \!MP{\gMPa1} \!MP{\gMPa2} \!MP{\gMPa3} \!MP{\gMPa4} K}}
+\def\handleMPcmykcolor
+ {\PDFcode{\!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 k
+ \!MPgMPa1 \!MPgMPa2 \!MPgMPa3 \!MPgMPa4 K}}
-\def\handleMPgraycolor%
- {\PDFcode{\!MP{\gMPa1} g
- \!MP{\gMPa1} G}}
+\def\handleMPgraycolor
+ {\PDFcode{\!MPgMPa1 g
+ \!MPgMPa1 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%
+\def\handleMPendgraphic % #1%
{\ifx\somestring\PSshowpage
- \let\handleMPsequence=\finishMPgraphic
+ \let\handleMPsequence\finishMPgraphic
\else
- \setMPargument{#1}%
+ \letMPargument\somestring % {#1}%
\fi}
-\def\handleMPbegingraphic#1%
+\def\handleMPbegingraphic % #1%
{\ifx\somestring\PSBoundingBox
\def\handleMPsequence{\handleMPboundingbox1}%
\else\ifx\somestring\PSHiResBoundingBox
@@ -680,15 +726,15 @@
\else\ifx\somestring\PSExactBoundingBox
\def\handleMPsequence{\handleMPboundingbox3}%
\else\ifx\somestring\PSshowpage
- \let\handleMPsequence=\finishMPgraphic
+ \let\handleMPsequence\finishMPgraphic
\else\ifx\somestring\PSPage
- \let\handleMPsequence=\handleMPpage
+ \let\handleMPsequence\handleMPpage
\else\ifx\somestring\PSMetaPostSpecials
- \let\handleMPsequence=\handleMPspecialscomment
+ \let\handleMPsequence\handleMPspecialscomment
\else\ifx\somestring\PSMetaPostSpecial
- \let\handleMPsequence=\handleMPspecialcomment
+ \let\handleMPsequence\handleMPspecialcomment
\else
- \setMPargument{#1}% kan weg
+ \letMPargument\somestring % {#1}%
\fi\fi\fi\fi\fi\fi\fi}
\let\handleMPgraphic=\handleMPbegingraphic
@@ -729,8 +775,8 @@
\chardef\currentMPboundingbox=#1\relax
\fi
\doresetMPstack
- \let\handleMPsequence=\dohandleMPsequence
- \let\next=\handleMPsequence
+ \let\handleMPsequence\dohandleMPsequence
+ \let\next\handleMPsequence
\ifskipemptyMPgraphic
\ifdim\MPheight=\!!zeropoint\relax\ifdim\MPwidth=\!!zeropoint\relax
\def\next{\endinput\finishMPgraphic}%
@@ -742,7 +788,7 @@
\def\handleMPspecialcomment%
{\doresetMPstack
- \let\handleMPsequence=\dohandleMPsequence
+ \let\handleMPsequence\dohandleMPsequence
\handleMPsequence}
\let\handleMPspecialscomment\handleMPspecialcomment
@@ -753,14 +799,14 @@
\def\handleMPpage #1 #2
{\doresetMPstack
\donetrue
- \let\handleMPsequence=\dohandleMPsequence
+ \let\handleMPsequence\dohandleMPsequence
\handleMPsequence}
%D The same applies to the special extensions.
\def\handleMPspecialcommand
{\doresetMPstack
- \let\handleMPsequence=\dohandleMPsequence
+ \let\handleMPsequence\dohandleMPsequence
\handleMPsequence}
%D \METAPOST\ draws its dots by moving to a location and
@@ -789,41 +835,43 @@
{\obeyMPspecials
\edef\size{\gMPa\nofMParguments}%
\ifx\size\PSnfont % round font size (to pt)
- \advance\nofMParguments by -1
+ \advance\nofMParguments -1
\expandafter\scratchdimen\gMPa\nofMParguments pt\relax
\ifdim\scratchdimen<1pt
\def\size{1pt}%
\else
- \advance\scratchdimen by .5pt
+ \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 by -1
+ \advance\nofMParguments -1
%\font\temp=\gMPa\nofMParguments\space at \size
+ \let\temp\relax % to be sure
\setMPfshowfont{\gMPa\nofMParguments}\size
- \advance\nofMParguments by -1
+ \advance\nofMParguments -1
\temp
\MPfshowcommand
{\ifnum\nofMParguments=1
\def\do(##1){##1}%
- \gMPa1%
+ \dogMPa1%
\else
+ % we need to catch ( a ) (a a a) (\123 \123 \123) etc
\scratchcounter=1
- \def\dodo##1%
- {\edef\!!stringa{##1}\ifx\!!stringa\space\MPspacechar\else##1\fi}%
+ \def\dodo##1% Andreas Fieger's bug: (\304...)
+ {\ifx##1\MPspacechar\MPspacechar\else\expandafter##1\fi}%
\def\do(##1{\dodo{##1}}%
- \gMPa\scratchcounter\MPspacechar
+ \dogMPa\scratchcounter\MPspacechar
\let\do\relax
\loop
- \advance\scratchcounter by 1
+ \advance\scratchcounter 1
\ifnum\scratchcounter<\nofMParguments\relax
\gMPa\scratchcounter\MPspacechar
\repeat
\def\do##1){\dodo{##1}}%
- \gMPa\scratchcounter
+ \dogMPa\scratchcounter
\fi
\unskip}}%
%
@@ -851,8 +899,7 @@
%D You could consider the following definition to be the most
%D natural one.
-\def\MPspacechar% normal case
- {\space}
+\def\MPspacechar{\space} % normal case
%D However, the following implementation is more robust, since
%D some fonts have funny visible spaces in the space slot. This
@@ -864,8 +911,7 @@
%D safely assume that \METAPOST\ considers \type {\char32} to
%D be the space.
-\def\MPspacechar%
- {\setbox\scratchbox=\hbox{\char32}\kern\wd\scratchbox}%
+\def\MPspacechar{\setbox\scratchbox=\hbox{\char32}\kern\wd\scratchbox}
%D Most operators are just converted and keep their
%D arguments. Dashes however need a bit different treatment,
@@ -881,9 +927,9 @@
\def\somestring{[}%
\scratchcounter=1
\loop
- \ifnum\scratchcounter<\nofMParguments
- \edef\somestring{\somestring\space\gMPa\scratchcounter}%
- \advance\scratchcounter by 1
+ \ifnum\scratchcounter<\nofMParguments
+ \edef\somestring{\somestring\space\gMPa\scratchcounter}%
+ \advance\scratchcounter 1
\repeat
\edef\somestring{\somestring]\gMPa\scratchcounter\space d}%
\PDFcode{\somestring}%
@@ -924,7 +970,7 @@
\PDFcode{\gMPa2 w}%
\def\next##1 ##2 ##3 ##4 {\handleMPsequence}%
\fi
- \let\handleMPsequence=\dohandleMPsequence
+ \let\handleMPsequence\dohandleMPsequence
\resetMPstack
\next}
@@ -957,62 +1003,70 @@
%D macro \type{\handleMPsequence}.
\def\handleMPpath%
- {\chardef\finiMPpath=0
- \let\closeMPpath=\relax
- \let\flushMPpath=\flushnormalMPpath
+ {\chardef\finiMPpath0
+ \let\closeMPpath\relax
+ \let\flushMPpath\flushnormalMPpath
\resetMPstack
- \nofMPsegments=1
- \let\handleMPsequence=\dohandleMPpath
+ \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
+ {\expandafter\ifcase\getMPkeyword{\the\nofMPsegments}\relax
+ \PDFcode{\!MPgMPs1 \!MPgMPs2 l}%
+ \or
+ \PDFcode{\!MPgMPs1 \!MPgMPs2 \!MPgMPs3 \!MPgMPs4 \!MPgMPs5 \!MPgMPs6 c}%
+ \or
+ \PDFcode{\!MP\lastMPmoveX\space\!MP\lastMPmoveY\space l S}%
+ \or
+ \edef\lastMPmoveX{\gMPs1}% evt \!MP here
+ \edef\lastMPmoveY{\gMPs2}%
+ \PDFcode{\!MP\lastMPmoveX\space \!MP\lastMPmoveY\space m}%
+ \fi}
+
\def\flushnormalMPpath%
- {\scratchcounter=\nofMPsegments
- \nofMPsegments=1
+ {\scratchcounter\nofMPsegments
+ \nofMPsegments1
\loop
- \expandafter\ifcase\getMPkeyword{\the\nofMPsegments}\relax
- \PDFcode{\!MP{\gMPs1} \!MP{\gMPs2} l}%
- \or
- \PDFcode{\!MP{\gMPs1} \!MP{\gMPs2} \!MP{\gMPs3} \!MP{\gMPs4} \!MP{\gMPs5} \!MP{\gMPs6} c}%
- \or
- \PDFcode{\!MP{\lastMPmoveX} \!MP{\lastMPmoveY} l S}%
- \or
- \edef\lastMPmoveX{\gMPs1}%
- \edef\lastMPmoveY{\gMPs2}%
- \PDFcode{\!MP{\lastMPmoveX} \!MP{\lastMPmoveY} m}%
- \fi
- \advance\nofMPsegments by 1\relax
- \ifnum\nofMPsegments<\scratchcounter
+ \flushnormalMPsegment
+ \advance\nofMPsegments 1
+ \ifnum\nofMPsegments<\scratchcounter
\repeat}
+\def\flushconcatMPsegment
+ {\expandafter\ifcase\getMPkeyword{\the\nofMPsegments}\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\flushconcatMPpath%
{\scratchcounter=\nofMPsegments
\nofMPsegments=1
\loop
- \expandafter\ifcase\getMPkeyword{\the\nofMPsegments}\relax
- \doMPconcat{\gMPs1}\a{\gMPs2}\b%
- \PDFcode{\!MP{\a} \!MP{\b} l}%
- \or
- \doMPconcat{\gMPs1}\a{\gMPs2}\b%
- \doMPconcat{\gMPs3}\c{\gMPs4}\d%
- \doMPconcat{\gMPs5}\e{\gMPs6}\f%
- \PDFcode{\!MP{\a} \!MP{\b} \!MP{\c} \!MP{\d} \!MP{\e} \!MP{\f} c}%
- \or
- \bgroup
- \noMPtranslate
- \doMPconcat\lastMPmoveX\a\lastMPmoveY\b%
- \PDFcode{\!MP{\a} \!MP{\b} l S}%
- \egroup
- \or
- \edef\lastMPmoveX{\gMPs1}%
- \edef\lastMPmoveY{\gMPs2}%
- \doMPconcat\lastMPmoveX\a\lastMPmoveY\b%
- \PDFcode{\!MP{\a} \!MP{\b} m}%
- \fi
- \advance\nofMPsegments by 1\relax
- \ifnum\nofMPsegments<\scratchcounter
+ \flushconcatMPsegment
+ \advance\nofMPsegments 1
+ \ifnum\nofMPsegments<\scratchcounter
\repeat}
%D The transformation of the coordinates is handled by one of
@@ -1038,15 +1092,17 @@
\def\MPconcatfactor{256}
-% \def\doMPreducedimen#1
-% {\count0=\MPconcatfactor
-% \advance\dimen#1 \ifdim\dimen#1>\!!zeropoint .5\else -.5\fi\count0
-% \divide\dimen#1 \count0\relax}
-
\def\doMPreducedimen#1
{\count0=\MPconcatfactor
+ \advance\dimen#1 \ifdim\dimen#1>\!!zeropoint .5\else -.5\fi\count0
\divide\dimen#1 \count0\relax}
+% too inaccurate (see old pragma logo)
+%
+% \def\doMPreducedimen#1
+% {\count0=\MPconcatfactor
+% \divide\dimen#1 \count0\relax}
+
\def\doMPexpanddimen#1
{\multiply\dimen#1 \MPconcatfactor\relax}
@@ -1113,10 +1169,70 @@
%D The following optimization resulted from some tests by
%D and email exchanges with Sanjoy Mahajan.
+%D
+%D \starttypen
+%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 \stoptypen
+%D
+%D But, this one is still too inaccurate, so we now have:
\def\doMPconcat#1#2#3#4%
- {\dimen12=#1 pt \doMPreducedimen12 % p_x
- \dimen14=#3 pt \doMPreducedimen14 % p_y
+ {\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
@@ -1146,9 +1262,8 @@
\multiply \dimen20 \dimen10
\advance \dimen12 -\dimen20
%
-% \ifdim\dimen16>1pt % oeps, can be < 1pt too
\ifdim\dimen16=1pt \else
- \ifdim\dimen16>256pt
+ \ifdim\dimen16>\MPconcatfactor pt
\doMPreducedimen16
\divide \dimen18 \dimen16 \doMPexpanddimen18
\divide \dimen12 \dimen16 \doMPexpanddimen12
@@ -1158,9 +1273,12 @@
\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 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
@@ -1404,7 +1522,7 @@
\closeMPpath
\finishMPpath
\fi
- \let\handleMPsequence=\dohandleMPsequence
+ \let\handleMPsequence\dohandleMPsequence
\resetMPstack
\nofMPsegments=0
\handleMPsequence}
@@ -1446,45 +1564,54 @@
%D This macro interprets the path and saves it as compact as
%D possible.
-\def\dohandleMPpath#1#2 %
- {\ifnum\lccode`#1=0
- \setMPargument{#1#2}%
+\def\dohandleMPpath#1%
+ {\ifcase\lccode`#1\relax
+ \@EA\dohandleMPpathA
\else
- \def\somestring{#1#2}%
- \ifx\somestring\PSlineto
- \setMPkeyword0
- \else\ifx\somestring\PScurveto
- \setMPkeyword1
- \else\ifx\somestring\PSrlineto
- \setMPkeyword2
- \else\ifx\somestring\PSmoveto
- \setMPkeyword3
- \else\ifx\somestring\PSclip
- % \chardef\finiMPpath=0 % already
- \let\handleMPsequence=\processMPpath
- \else\ifx\somestring\PSgsave
- \chardef\finiMPpath=3
- \else\ifx\somestring\PSgrestore
- \else\ifx\somestring\PSfill
- \ifnum\finiMPpath=0
- \chardef\finiMPpath=2
- \let\handleMPsequence=\processMPpath
- \fi
- \else\ifx\somestring\PSstroke
- \ifnum\finiMPpath=0
- \chardef\finiMPpath=1
- \fi
- \let\handleMPsequence=\processMPpath
- \else\ifx\somestring\PSclosepath
- \def\closeMPpath{\PDFcode{h}}%
- \else\ifx\somestring\PSconcat
- \let\flushMPpath=\flushconcatMPpath
- \handleMPpathconcat
- \else\ifx\somestring\PSscale
- \let\flushMPpath=\flushconcatMPpath
- \handleMPpathscale
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
- \fi
+ \@EA\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
+ \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}
%D The main conversion command is:
@@ -1541,7 +1668,7 @@
\def\processMPtoPDFfile% file xscale yscale
{\bgroup
- \let\finishMPgraphic=\egroup
+ \let\finishMPgraphic\egroup
\doprocessMPtoPDFfile}
\def\doprocessMPtoPDFfile#1#2#3% file xscale yscale
@@ -1549,14 +1676,13 @@
\the\everyMPtoPDFconversion
\catcode`\^^M=\@@endofline
\startMPscanning
- \let\do=\empty
+ \let\do\empty
\xdef\MPxscale{#2}%
\xdef\MPyscale{#3}%
\donefalse
- \let\handleMPsequence=\dohandleMPsequence
- \message{[MP to PDF #1]}%
- \input#1\relax
- \deleteMPgraphic{#1}}
+ \let\handleMPsequence\dohandleMPsequence
+ \message{[MP to PDF]}% was: [MP to PDF #1] but there is a (#1) anyway
+ \input#1\relax}
% strange rounding/clip in pdftex/viewer
%
@@ -1687,9 +1813,13 @@
%D This option only works in \CONTEXT\ combined with \ETEX.
\def\twodigitMPoutput%
- {\let\!MP\twodigitrounding}
+ {\let\!MP \twodigitrounding
+ \def\!MPgMPs##1{\twodigitrounding{\gMPs##1}}%
+ \def\!MPgMPa##1{\twodigitrounding{\gMPa##1}}}
-\def\!MP#1{#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\
diff --git a/tex/context/base/supp-ran.tex b/tex/context/base/supp-ran.tex
index 20892c056..094d0f36b 100644
--- a/tex/context/base/supp-ran.tex
+++ b/tex/context/base/supp-ran.tex
@@ -61,18 +61,23 @@
\else
- \let\normalnextrandom = \nextrandom
+ \let\verynormalnextrandom = \nextrandom
- \global\chardef\randomseedfrozen=0
+ \def\normalnextrandom
+ {\bgroup
+ \let\time \normaltime
+ \let\day \normalday
+ \let\month\normalmonth
+ \let\year \normalyear
+ \verynormalnextrandom
+ \egroup}
+
+ \chardef\randomseedfrozen=0
- \def\nextrandom%
+ \def\nextrandom
{\bgroup
- \let\time =\normaltime
- \let\day =\normalday
- \let\month=\normalmonth
- \let\year =\normalyear
\normalnextrandom
- \gdef\nextrandom%
+ \gdef\nextrandom
{\ifcase\randomseedfrozen\normalnextrandom\fi}%
\egroup}
diff --git a/tex/context/base/supp-vis.tex b/tex/context/base/supp-vis.tex
index ffa518a5a..9979e5179 100644
--- a/tex/context/base/supp-vis.tex
+++ b/tex/context/base/supp-vis.tex
@@ -118,10 +118,8 @@
%D messages we introduce \type{\dontcomplain}.
\def\dontcomplain%
- {\hbadness = \!!tenthousand
- \hfuzz = \maxdimen
- \vbadness = \!!tenthousand
- \vfuzz = \maxdimen}
+ {\hbadness=\!!tenthousand \vbadness=\hbadness
+ \hfuzz =\maxdimen \vfuzz =\hfuzz}
%D \macros
%D {normaloffinterlineskip}
@@ -143,10 +141,10 @@
%D baseline behavior. Especially \type{\vtop}'s need our
%D special attention.
-\let\normalhbox = \hbox
-\let\normalvbox = \vbox
-\let\normalvtop = \vtop
-\let\normalvcenter = \vcenter
+\ifx \normalhbox \undefined \let \normalhbox = \hbox \fi
+\ifx \normalvbox \undefined \let \normalvbox = \vbox \fi
+\ifx \normalvtop \undefined \let \normalvtop = \vtop \fi
+\ifx \normalvcenter \undefined \let \normalvcenter = \vcenter \fi
%D \macros
%D {normalhskip,
@@ -335,6 +333,8 @@
%D primitive too. By storing and restoring the height and depth
%D of box \type{#1}, we preserve the mode.
+\let\dowithruledbox\relax
+
\def\makeruledbox#1%
{\edef\ruledheight{\the\ht#1}%
\edef\ruleddepth {\the\dp#1}%
@@ -379,7 +379,9 @@
\ifbottomrule\else\!!width\!!zeropoint\fi}%
\wd#1=\!!zeropoint
\setbox#1=\ifhbox#1\normalhbox\else\normalvbox\fi
- {\normalhbox{\box#1\lower\ruleddepth\box\scratchbox}}%
+ {\normalhbox
+ {\box#1%
+ \lower\ruleddepth\normalhbox{\dowithruledbox{\box\scratchbox}}}}%
\ht#1=\ruledheight
\wd#1=\ruledwidth
\dp#1=\ruleddepth}
@@ -1707,66 +1709,66 @@
%D For those who want to manipulate the visual cues in detail,
%D we have grouped them.
-\def\showfils%
- {\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%
+\def\showfils
+ {\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
{\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%
- {\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%
- {\let\penalty = \ruledpenalty}
-
-\def\dontshowpenalties%
- {\let\penalty = \normalpenalty}
+ \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
+ {\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
+ {\let\penalty \ruledpenalty}
+
+\def\dontshowpenalties
+ {\let\penalty \normalpenalty}
%D \macros
%D {showcomposition,dontshowcomposition,
diff --git a/tex/context/base/symb-ini.tex b/tex/context/base/symb-ini.tex
index d2a0842d6..3cbfe09cc 100644
--- a/tex/context/base/symb-ini.tex
+++ b/tex/context/base/symb-ini.tex
@@ -1,8 +1,8 @@
%D \module
-%D [ file=symb-nav,
+%D [ file=symb-ini,
%D version=1998.07.20,
%D title=\CONTEXT\ Symbol Libraries,
-%D subtitle=Navigational Symbols,
+%D subtitle=Basic Symbols Commands,
%D author=Hans Hagen,
%D date=\currentdate,
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
@@ -82,41 +82,93 @@
% ss:set:tag -> symbol out of set
% sstag -> list of symbols in set
+% \def\dodefinesymbol[#1][#2]%
+% {\ifx\currentsymboldef\empty
+% \setvalue{\??ss:#1}{#2}%
+% \else
+% \doifundefinedelse{\??ss\currentsymboldef}
+% {\let\currentsymbollist\empty}
+% {\edef\currentsymbollist{\csname\??ss\currentsymboldef\endcsname}}%
+% \addtocommalist{#1}\currentsymbollist
+% \setvalue{\??ss:\currentsymboldef:#1}{#2}%
+% \letvalue{\??ss\currentsymboldef}\currentsymbollist
+% \fi}
+
\def\dodefinesymbol[#1][#2]%
- {\ifx\currentsymbolset\empty
+ {\ifx\currentsymboldef\empty
\setvalue{\??ss:#1}{#2}%
\else
- \doifundefinedelse{\??ss\currentsymbolset}
- {\let\currentsymbollist\empty}
- {\edef\currentsymbollist{\csname\??ss\currentsymbolset\endcsname}}%
- \addtocommalist{#1}\currentsymbollist
- \setvalue{\??ss:\currentsymbolset:#1}{#2}%
- \letvalue{\??ss\currentsymbolset}\currentsymbollist
+ \setvalue{\??ss:\currentsymboldef:#1}{#2}%
+ \addvalue{\??ss\currentsymboldef}{#1}%
\fi}
-\def\definesymbol%
+\def\definesymbol
{\dodoubleargument\dodefinesymbol}
\unexpanded\def\symbol% % This one always gobbles spaces,
{\dodoubleempty\dosymbol} % so never change it again!
-\def\dosymbol[#1][#2]%
- {\ifsecondargument
- \doifdefinedelse{\??ss:#1:#2}
- {\dodosymbol{#1:#2}}
- {\doifdefinedelse{\??ss:#2}{\dodosymbol{#2}}{#2}}%
- \else\ifx\currentsymbolset\empty
- \doifdefinedelse{\??ss:#1}{\dodosymbol{#1}}{#1}%
- \else
- \doifdefinedelse{\??ss:\currentsymbolset:#1}
- {\dodosymbol{\currentsymbolset:#1}}
- {\doifdefinedelse{\??ss:#1}{\dodosymbol{#1}}{#1}}%
- \fi\fi}
+%D Since symbols are used frequently in interactive
+%D documents, we speed up this one.
+
+\newif\ifnosymbol \newtoks\everysymbol
\def\dodosymbol#1% \relax's prevent lookahead problems
- {{\the\everysymbol\getvalue{\??ss:#1}\relax}\relax}
+ {\nosymbolfalse{\the\everysymbol\csname\??ss:#1\endcsname\relax}\relax}
+
+\beginTEX
+
+\def\dosymbol[#1][#2]%
+ {\nosymboltrue
+ \ifsecondargument \@EA\ifx\csname\??ss:#1:#2\endcsname\relax\else
+ \dodosymbol{#1:#2}%
+ \fi \fi
+ \ifnosymbol
+ \edef\currentsymbol{#1}%
+ \the\symbolsetups
+ \ifnosymbol
+ \redosymbol\currentsymbol
+ \fi
+ \fi}
+
+\def\fetchsymbol#1%
+ {\ifnosymbol % will be a \cs anyway, so no test needed
+ %\@EA\ifx\csname\??ss:#1:\currentsymbol\endcsname\relax\else
+ \dodosymbol{#1:\currentsymbol}%
+ %\fi
+ \fi}
+
+\def\redosymbol#1%
+ {\@EA\ifx\csname\??ss:#1\endcsname\relax\else\@EA\dodosymbol\fi{#1}}
+
+\endTEX
+
+\beginETEX \ifcsname
+
+\def\dosymbol[#1][#2]%
+ {\nosymboltrue
+ \ifsecondargument \ifcsname\??ss:#1:#2\endcsname
+ \dodosymbol{#1:#2}%
+ \fi \fi
+ \ifnosymbol
+ \edef\currentsymbol{#1}%
+ \the\symbolsetups
+ \ifnosymbol
+ \redosymbol\currentsymbol
+ \fi
+ \fi}
+
+\def\fetchsymbol#1%
+ {\ifnosymbol
+ \ifcsname\??ss:#1:\currentsymbol\endcsname
+ \dodosymbol{#1:\currentsymbol}%
+ \fi
+ \fi}
+
+\def\redosymbol#1%
+ {\ifcsname\??ss:#1\endcsname\@EA\dodosymbol\else\fi{#1}}
-\newtoks\everysymbol
+\endETEX
% % % % %
% this should go in symb-fig, to be loaded after core-fig
@@ -129,12 +181,19 @@
%D \showsetup{\y!definefiguresymbol}
%D
%D By default, such symbols scale along the current bodyfont
-%D size.
+%D size or running font size (which is better).
\def\defaultsymbolfactor{10}
+\def\defaultsymbolheight{1.25ex}
\def\dohandlefiguresymbol#1#2%
- {\externalfigure[#1][\c!reset=\v!ja,\c!symbool=\v!ja,\c!hfactor=\defaultsymbolfactor,#2]}
+ {\externalfigure
+ [#1]
+ [\c!reset=\v!ja,
+ \c!symbool=\v!ja,
+ \c!hoogte=\defaultsymbolheight,
+ %\c!hfactor=\defaultsymbolfactor,
+ #2]}
\appendtoks \resetexternalfigures \to \everysymbol
@@ -157,12 +216,49 @@
%D
%D A handy private one:
-\def\doifsymboldefinedelse#1#2#3%
- {\ifx\currentsymbolset\empty
- \doifdefinedelse{\??ss:#1}{#2}{#3}%
+\beginTEX
+
+\def\xfetchsymbol#1%
+ {\ifnosymbol % will be a \cs anyway, so no test needed
+ %\@EA\ifx\csname\??ss:#1:\currentsymbol\endcsname\relax\else
+ \nosymbolfalse
+ %\fi
+ \fi}
+
+\def\xredosymbol#1%
+ {\@EA\ifx\csname\??ss:#1\endcsname\relax\else\nosymbolfalse\fi}
+
+\endTEX
+
+\beginETEX
+
+\def\xfetchsymbol#1%
+ {\ifnosymbol
+ \ifcsname\??ss:#1:\currentsymbol\endcsname\nosymbolfalse\fi
+ \fi}
+
+\def\xredosymbol#1%
+ {\ifcsname\??ss:#1\endcsname\nosymbolfalse\fi}
+
+\endETEX
+
+\def\doifsymboldefinedelse#1%
+ {\bgroup
+ \edef\currentsymbol{#1}%
+ \let\fetchsymbol\xfetchsymbol
+ %\let\redosymbol \xredosymbol
+ \nosymboltrue
+ \the\symbolsetups
+ \ifnosymbol
+ %\redosymbol\currentsymbol
+ \xredosymbol\currentsymbol
+ \ifnosymbol
+ \egroup\@EAEAEA\secondoftwoarguments
+ \else
+ \egroup\@EAEAEA\firstoftwoarguments
+ \fi
\else
- \doifdefinedelse{\??ss:\currentsymbolset:#1}
- {#2}{\doifdefinedelse{\??ss:#1}{#2}{#3}}%
+ \egroup\@EA\firstoftwoarguments
\fi}
%D \macros
@@ -195,59 +291,31 @@
%D \showsetup{\y!setupsymbolset}
%D \showsetup{\y!startsymbolset}
-\let\currentsymbolset\empty
+\let\currentsymboldef\empty
-\def\startsymbolset%
- {\localpushmacro\currentsymbolset
- \setupsymbolset}
+\def\startsymbolset[#1]
+ {\def\currentsymboldef{#1}}
-\def\stopsymbolset%
- {\localpopmacro\currentsymbolset}
+\def\stopsymbolset
+ {\let\currentsymboldef\empty}
+
+\newtoks\symbolsetups
\def\setupsymbolset[#1]%
- {\def\currentsymbolset{#1}}
+ {\prependtoksonce\fetchsymbol{#1}\to\symbolsetups}
+
+\def\resetsymbolset
+ {\symbolsetups\emptytoks}
+
+\def\forcesymbolset[#1]%
+ {\symbolsetups{\fetchsymbol{#1}}}
%D \macros
%D {showsymbolset}
%D
%D \showsetup{\y!showsymbolset}
-\def\doshowsymbolset[#1][#2]% looks like \showexternalfigureb
- {\vbox\bgroup
- \blanko
- \getparameters[\??ss][\c!n=5,#2]%
- \setupsymbolset[#1]%
- \doifdefined{\??ss\currentsymbolset}
- {\global\let\allfigures=\empty
- \doglobal\newcounter\figurecounter
- \setupcolors[\c!status=\v!start]% to prevent mps color conversion
- \mindermeldingen
- \def\doshowsymbols% global needed due to grouping in alignment
- {\expanded{\globalprocesscommalist[\getvalue{\??ss\currentsymbolset}]\noexpand\docommando}}%
- \def\docommando##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}}%
- \blanko
- \egroup}
-
-\def\showsymbolset%
- {\dodoubleempty\doshowsymbolset}
+\fetchruntimecommand \showsymbolset {\f!symbolprefix\s!run}
%D \macros
%D {usesymbols}
@@ -280,7 +348,7 @@
\definesymbol [circle] [\mathematics{\circ}]
\definesymbol [medcircle] [\hbox{\setsmallbodyfont\raise\!!onepoint\hbox{$\bigcirc$}}]
\definesymbol [bigcircle] [\mathematics{\bigcirc}]
-\definesymbol [square] [\hbox{\hsmash{$\sqcup$}$\sqcap$}]
+\definesymbol [square] [\mathematics{\square}]
\definesymbol [diamond] [\mathematics{\diamond}]
\definesymbol [1] [{\symbol[bullet]}]
diff --git a/tex/context/base/symb-mvs.tex b/tex/context/base/symb-mvs.tex
new file mode 100644
index 000000000..f8d996642
--- /dev/null
+++ b/tex/context/base/symb-mvs.tex
@@ -0,0 +1,215 @@
+% Insert this in font-fil.tex ( I would think):
+
+% tobias: what is the original and what the berry name?
+
+%D \module
+%D [ file=symb-nav,
+%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 \LaTeXe\ 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.
+
+\definefontsynonym [MartinVogel] [fmvr8x]
+
+\loadmapfile[original-vogel-symbol]
+
+\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
+
+\unexpanded\def\euro{\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 {0}] % ?
+ \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
index 2e1bc07e2..60b77ad1d 100644
--- a/tex/context/base/symb-nav.tex
+++ b/tex/context/base/symb-nav.tex
@@ -17,7 +17,9 @@
\loadmapfile [original-context-symbol.map]
-\def\ContextNavigationGlyph#1{\getglyph{ContextNavigation}{\char#1}}
+% \def\ContextNavigationGlyph#1{\getglyph{ContextNavigation}{\char#1}}
+
+\def\ContextNavigationGlyph#1{\getrawglyph{contnav}{\char#1}}
\startsymbolset [navigation 1]
diff --git a/tex/context/base/symb-run.tex b/tex/context/base/symb-run.tex
new file mode 100644
index 000000000..6668f40cd
--- /dev/null
+++ b/tex/context/base/symb-run.tex
@@ -0,0 +1,53 @@
+%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]% looks like \showexternalfigureb
+ {\vbox\bgroup
+ \blanko
+ \getparameters[\??ss][\c!n=5,#2]%
+ \forcesymbolset[#1]%
+ \doifdefined{\??ss#1}
+ {\global\let\allfigures\empty
+ \doglobal\newcounter\figurecounter
+ \setupcolors[\c!status=\v!start]% to prevent mps color conversion
+ \mindermeldingen
+ \def\doshowsymbols% global needed due to grouping in alignment
+ {\expanded{\globalprocesscommalist[\getvalue{\??ss#1}]\noexpand\docommando}}%
+ \def\docommando##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}}%
+ \blanko
+ \egroup}
+
+\gdef\showsymbolset%
+ {\dodoubleempty\doshowsymbolset}
+
+\protect \endinput
diff --git a/tex/context/base/syst-eet.tex b/tex/context/base/syst-eet.tex
deleted file mode 100644
index 8d606366f..000000000
--- a/tex/context/base/syst-eet.tex
+++ /dev/null
@@ -1,270 +0,0 @@
-% TACO: wordt ook de eerste spatie weggefilterd? Het komt
-% voor dat (om estetische redenen we hebben:
-%
-% \definieerkorps[12pt][rm]
-% [ tf=...,
-% tfa=...]
-%
-% Is evt wel in macro weg te werken, maar ik denk dat het
-% erin moet.
-%
-% vreemd, als 1 item en dan \delitem, number reports niets
-% ipv 0
-%
-% (dat gedoe met die expansie in commalists is niet nodig,
-% ik maak een specials processaction, nu nog incompatible
-% trouwens, komt wel goed.)
-
-\ifx\eeTeXversion\undefined \endinput \fi
-
-\writestatus{loading}{Context System Macros / eeTeX replacements}
-
-\unprotect
-
-%D Test loop
-%D
-%D \starttypen
-%D \dorecurse{20}{{\switchnaarkorps[lbr,10pt]}}
-%D \stoptypen
-%D
-%D \starttabulate[|c|c|c|]
-%D \NC pdftex \NC pdfetex \NC eetex \NC \NR
-%D \HL
-%D \NC 64 sec \NC 54 sec \NC 56/54 sec \NC \NR
-%D \stoptabulate
-%D
-%D Keep in mind that the font mechanism is optimized for
-%D \ETEX\ anyway.
-
-%D \macros
-%D {listsep}
-%D
-%D The list separator is a comma, optionally followed by a
-%D space or something similar.
-
-\listsep{, }
-
-%D \macros
-%D {appendtoks, prependtoks}
-%D
-%D Must deal with:
-%D
-%D \startypen
-%D \appendtoks \bgroup \to \sometoks -> \sometoks={\bgroup}
-%D \appendtoks {oeps}\to \sometoks -> \sometoks={{oeps}}
-%D \appendtoks oeps\to \sometoks -> \sometoks={oeps}
-%D \stoptypen
-
-\def\appendtoks%
- {\bgroup
- \let\bgroup\relax
- \futurelet\scratchtoken\doappendtoks}
-
-\def\doappendtoks%
- {\ifx\scratchtoken\normalbgroup
- \egroup\expandafter\dodoappendtoks
- \else
- \egroup\expandafter\donoappendtoks
- \fi}
-
-\def\dodoappendtoks#1\to#2{\dodoglobal\apptoks#2{{#1}}}
-\def\donoappendtoks#1\to#2{\dodoglobal\apptoks#2{#1}}
-
-\def\prependtoks%
- {\bgroup
- \let\bgroup\relax
- \futurelet\scratchtoken\doprependtoks}%
-
-\def\doprependtoks%
- {\ifx\scratchtoken\bgroup
- \egroup\expandafter\dodoprependtoks
- \else
- \egroup\expandafter\donoprependtoks
- \fi}
-
-\def\dodoprependtoks#1\to#2{\dodoglobal\pretoks#2{{#1}}}
-\def\donoprependtoks#1\to#2{\dodoglobal\pretoks#2{#1}}
-
-%D \macros
-%D {addtocommalist,removefromcommalist}
-%D
-%D The first one is rather straightforward, but the second
-%D one, well maybe another primitive makes sense.
-
-\def\addtocommalist#1#2%
- {\redoglobal\einsdef#2{#1}%
- \dodoglobal\edef#2{#2}}
-
-\def\removefromcommalist#1#2%
- {\scratchcounter\@EA\itemnumber\@EA#2\@EA{#1}%
- \redoglobal\delitem#2\scratchcounter to\garbage
- \dodoglobal\edef#2{#2}}
-
-%D \macros
-%D {getcommalistsize,getfromcommalist}
-%D
-%D Pretty short, these ones. We don't optimize for case 1
-%D and 2.
-
-\def\getcommalistsize[#1]%
- {\listdef\commalisttokens{#1}%
- \edef\commalistsize{\number\commalisttokens}}
-
-\def\getfromcommalist[#1]#2[#3]%
- {\listdef\commalisttokens{#1}%
- \getitem\commalisttokens#3to\commalistelement}
-
-%D \macros
-%D {dogetparameters}
-%D
-%D We skip the parameter passing.
-
-\def\dogetparameters#1[#2]#3[#4]%
- {\listdef\commalisttokens{#4}%
- \ifcase\commalisttokens\else
- \def\p!dogetparameter##1%
- {\p!doassign#1[#2][##1==\relax]}%
- \scanlist\commalisttokens\p!dogetparameter
- \fi}
-
-% tijdelijk:
-
-\def\dogetparameters#1[#2]#3[#4]%
- {\listdef\commalisttokens{,#4}% de comma is een hack
- \writestatus{assign}{\number\commalisttokens::\detokenize{#4}}%
- \delitem\commalisttokens1to\garbage
- \writestatus{assign}{\number\commalisttokens}% leeg als 0
- \ifcase\commalisttokens\else % vreemd
- \def\p!dogetparameter##1%
- {\writestatus{assign}{\detokenize{##1}}%
- \p!doassign#1[#2][##1==\relax]}%
- \scanlist\commalisttokens\p!dogetparameter
- \fi}
-
-%D \macros
-%D {doifinsetelse, doifinset, doifnotinset}
-%D
-%D We limit the number of parameter passes and don't share
-%D the common component.
-
-\long\def\doifinsetelse#1#2#3#4%
- {\elistdef\commalisttokens{#2}%
- \ifhasitem\commalisttokens{#1}#3\else#4\fi}
-
-\long\def\doifinset#1#2#3%
- {\elistdef\commalisttokens{#2}%
- \ifhasitem\commalisttokens{#1}#3\fi}
-
-\long\def\doifnotinset#1#2#3%
- {\elistdef\commalisttokens{#2}%
- \ifhasitem\commalisttokens{#1}\else#3\fi}
-
-%D \macros
-%D {doifcommonelse, doifcommon, doifnotcommon}
-%D
-%D Again, we don't share the common component.
-
-\long\def\doifcommonelse#1#2#3#4%
- {\listdef\commalisttokensa{#1}%
- \ifcase\commalisttokensa
- #4%
- \else
- \listdef\commalisttokensb{#2}%
- \ifcase\commalisttokensb
- #4%
- \else
- \ifnum\commalisttokensb>\commalisttokensa
- \ifsubset\commalisttokensb{#1}#3\else#4\fi
- \else
- \ifsubset\commalisttokensa{#2}#3\else#4\fi
- \fi
- \fi
- \fi}
-
-\long\def\doifcommon#1#2#3%
- {\listdef\commalisttokensa{#1}%
- \ifcase\commalisttokensa\else
- \listdef\commalisttokensb{#2}%
- \ifcase\commalisttokensb\else
- \ifnum\commalisttokensb>\commalisttokensa
- \ifsubset\commalisttokensb{#1}#3\fi
- \else
- \ifsubset\commalisttokensa{#2}#3\fi
- \fi
- \fi
- \fi}
-
-\long\def\doifnotcommon#1#2#3%
- {\listdef\commalisttokensa{#1}%
- \ifcase\commalisttokensa
- #3%
- \else
- \listdef\commalisttokensb{#2}%
- \ifcase\commalisttokensb
- #3%
- \else
- \ifnum\commalisttokensb>\commalisttokensa
- \ifsubset\commalisttokensb{#1}\else#3\fi
- \else
- \ifsubset\commalisttokensa{#2}\else#3\fi
- \fi
- \fi
- \fi}
-
-%D \macros
-%D {quitcommalist,quitprevcommalist}
-%D
-%D Watch the extra level, needed to quit the macro itself.
-
-%\def\quitcommalist {\quitlist 1 }
-%\def\quitprevcommalist{\quitlist 2 }
-
-%D \macros
-%D {processcommalist, processcommacommand}
-%D
-%D The \type {\ifcase} is needed!
-
-%%%\def\listexpandafter{\@EA\appdef\@EA\commalisttokens\@EA}
-%%%
-%%%\long\def\processcommalist[#1]#2%
-%%% {\listdef\templist{#1}%
-%%% \listdef\commalisttokens{}%
-%%% \scanlist\templist\listexpandafter
-%%% \scanlist\commalisttokens#2}
-%%%
-%%%\def\processcommacommand[#1]#2%
-%%% {\elistdef\templist{#1}%
-%%% \listdef\commalisttokens{}%
-%%% \scanlist\templist\listexpandafter
-%%% \scanlist\commalisttokens#2}
-
-%\long\def\processcommalist[#1]% #2%
-% {\listdef\commalisttokens{#1}%
-% \scanlist\commalisttokens}% #2}
-%
-%\long\def\processcommalist[#1]}% #2%
-% {\elistdef\commalisttokens{#1}%
-% \scanlist\commalisttokens}% #2}
-
-% \def\expandaction#1=>{}
-%
-% \def\processaction[#1]#2[#3]%
-% {\listdef\actionstoprocess{#3}%
-% \edef\!!stringa{#1}%
-% \ifx\!!stringa\empty
-% \scratchcounter=\subitemnumber\actionstoprocess{\s!default=>}%
-% \else
-% \scratchcounter=\subitemnumber\actionstoprocess{\!!stringa=>}%
-% \ifcase\scratchcounter
-% \scratchcounter=\subitemnumber\actionstoprocess{\s!unknown=>}%
-% \fi
-% \fi
-% \ifcase\scratchcounter\else
-% \getitem\actionstoprocess\scratchcounter to\actiontoprocess
-% % wordt \lastsubitem / geen \subitem: name clash
-% \@EA\@EA\@EA\expandaction\@EA\actiontoprocess
-% \fi}
-
-\protect
-
-\endinput
diff --git a/tex/context/base/syst-etx.tex b/tex/context/base/syst-etx.tex
index db56ae6bb..865432b95 100644
--- a/tex/context/base/syst-etx.tex
+++ b/tex/context/base/syst-etx.tex
@@ -1,4 +1,21 @@
-\ifx\undefined\unprotect \catcode`\@=11 \fi
+%D \module
+%D [ file=syst-etx,
+%D version=1999.03.17, % some time ...
+%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 module prepares \CONTEXT\ for \ETEX. We don't use
+%D the definition files that come with this useful \TEX\
+%D extension, but implement our own alternatives.
+
+\unprotect
%D Constants to be used with \type {\grouptype}.
@@ -89,22 +106,22 @@
\beginETEX \tracing...
\def\tracingall%
- {\tracingonline =\@ne
- \tracingcommands =\thr@@
- \tracingstats =\tw@
- \tracingpages =\@ne
- \tracingoutput =\@ne
- \tracinglostchars =\tw@
- \tracingmacros =\tw@
- \tracingparagraphs=\@ne
- \tracingrestores =\@ne
- \showboxbreadth =\maxdimen
- \showboxdepth =\maxdimen
- \tracinggroups =\@ne
- \tracingifs =\@ne
- \tracingscantokens=\@ne
- \tracingnesting =\@ne
- \tracingassigns =\tw@
+ {\tracingonline \@ne
+ \tracingcommands \thr@@
+ \tracingstats \tw@
+ \tracingpages \@ne
+ \tracingoutput \@ne
+ \tracinglostchars \tw@
+ \tracingmacros \tw@
+ \tracingparagraphs\@ne
+ \tracingrestores \@ne
+ \showboxbreadth \maxdimen
+ \showboxdepth \maxdimen
+ \tracinggroups \@ne
+ \tracingifs \@ne
+ \tracingscantokens\@ne
+ \tracingnesting \@ne
+ \tracingassigns \tw@
\errorstopmode}
\def\loggingall%
@@ -112,22 +129,22 @@
\tracingonline=\z@}
\def\tracingnone%
- {\tracingassigns =\z@
- \tracingnesting =\z@
- \tracingscantokens=\z@
- \tracingifs =\z@
- \tracinggroups =\z@
- \showboxdepth =\thr@@
- \showboxbreadth =5
- \tracingrestores =\z@
- \tracingparagraphs=\z@
- \tracingmacros =\z@
- \tracinglostchars =\@ne
- \tracingoutput =\z@
- \tracingpages =\z@
- \tracingstats =\z@
- \tracingcommands =\z@
- \tracingonline =\z@ }
+ {\tracingassigns \z@
+ \tracingnesting \z@
+ \tracingscantokens\z@
+ \tracingifs \z@
+ \tracinggroups \z@
+ \showboxdepth \thr@@
+ \showboxbreadth 5
+ \tracingrestores \z@
+ \tracingparagraphs\z@
+ \tracingmacros \z@
+ \tracinglostchars \@ne
+ \tracingoutput \z@
+ \tracingpages \z@
+ \tracingstats \z@
+ \tracingcommands \z@
+ \tracingonline \z@ }
\endETEX
@@ -171,9 +188,9 @@
%D We use some constants in the tests.
-\mathchardef\@@minallocation= 16
-\mathchardef\@@medallocation= 256
-\mathchardef\@@maxallocation=32767
+\mathchardef\@@minallocation = 16
+\mathchardef\@@medallocation = 256
+\mathchardef\@@maxallocation = 32767
%D I cannot imagine that more than~8 extra insert classes
%D are needed, so we say:
@@ -212,4 +229,4 @@
\let\normalprotected = \protected
\let\normalunexpanded = \unexpanded
-\ifx\undefined\unprotect \catcode`\@=12 \fi \endinput
+\protect \endinput
diff --git a/tex/context/base/syst-ext.tex b/tex/context/base/syst-ext.tex
index afda909c2..ed2240c83 100644
--- a/tex/context/base/syst-ext.tex
+++ b/tex/context/base/syst-ext.tex
@@ -32,7 +32,7 @@
{\if]#1\else
\expandafter\def\csname\rawparameterprefix#1\endcsname{#2}%
\expandafter\rawsetparameter
- \fi}%
+ \fi}
%D \macros
%D {doglobal,
@@ -48,8 +48,7 @@
\def\doglobal%
{\let\redoglobal\global
- \def\dodoglobal%
- {\resetglobal\global}}
+ \def\dodoglobal{\resetglobal\global}}
\def\resetglobal%
{\let\redoglobal\relax
@@ -62,11 +61,14 @@
\def\doglobal%
{\ifx\redoglobal\relax
\let\redoglobal\global
- \def\dodoglobal{\resetglobal\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}
@@ -187,30 +189,108 @@
\def\newcounter#1%
{\dodoglobal\let#1\zerocountervalue}
-\def\dodododoincrement(#1,#2)%
+% 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:
+
+\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
- \redoglobal\let#1\zerocountervalue
+ \dodoglobal\edef#1{1}%
\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{1}%
+ \else
+ \fastincrement#1%
+ \fi\fi}
+
+\def\dodecrement#1% 10% faster alternative
+ {\ifx#1\undefined
+ \dodoglobal\edef#1{\minusone}%
+ \else\ifx#1\relax % \csname...\endcsname
+ \dodoglobal\edef#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}}
-\def\dododoincrement#1%
- {\dodododoincrement(#1,1)}
+\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-}
+
+\def\dodoindecrement#1#2,#3)%
+ {\dodoglobal\edef#2%
+ {\the\numexpr(\ifx#2\undefined\else\ifx#2\relax\else#2\fi\fi#1#3)}}
\def\dodoincrement(#1%
- {\doifnextcharelse,%
- {\dodododoincrement(#1}{\dodododoincrement(#1,1}}
+ {\doifnextcharelse,{\dodoindecrement+#1}{\dodoindecrement+#1,1}}
-\def\doincrement#1%
- {\def\incrementsign{#1}%
- \doifnextcharelse(\dodoincrement\dododoincrement}
+\def\dododecrement(#1%
+ {\doifnextcharelse,{\dodoindecrement-#1}{\dodoindecrement-#1,1}}
+
+\def\fastincrement#1{\dodoglobal\edef#1{\the\numexpr(#1+1)}}
+\def\fastdecrement#1{\dodoglobal\edef#1{\the\numexpr(#1-1)}}
+
+\endETEX
-\def\increment{\doincrement+}
-\def\decrement{\doincrement-}
+\def\increment{\doifnextcharelse(\dodoincrement\doincrement}
+\def\decrement{\doifnextcharelse(\dododecrement\dodecrement}
%D \macros
%D {newsignal}
@@ -291,6 +371,16 @@
{\expandafter\gobbleoneargument\string}
%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}
@@ -329,11 +419,8 @@
%D conditionals. The next implementation is abaou as fast
%D and just as straightforward:
-\def\settrue#1%
- {\chardef#1=0 }
-
-\def\setfalse#1%
- {\chardef#1=1 }
+\def\settrue #1{\chardef#1\zerocount}
+\def\setfalse#1{\chardef#1\plusone}
\let\newconditional = \setfalse
\let\ifconditional = \ifcase
@@ -394,57 +481,15 @@
%D macros. The real \COUNTERS\ are hidden from the user because
%D we don't want any interference.
-\def\@@irecurse{@@irecurse} % stepper
-\def\@@nrecurse{@@nrecurse} % number of steps
-\def\@@srecurse{@@srecurse} % step
-\def\@@drecurse{@@drecurse} % direction, < or >
-\def\@@arecurse{@@arecurse} % action
-
\newcount\outerrecurse
\newcount\innerrecurse
-\def\recursedepth%
- {\the\outerrecurse}
+\def\recursedepth{\the\outerrecurse}
+\def\recurselevel{0}
\let\nextrecurse\relax
-% not entirely correct
-%
-% \long\def\dostepwiserecurse#1#2#3#4%
-% {%\let\nextrecurse\relax
-% \ifcase#2\relax
-% \let\recurselevel\zerocountervalue
-% \let\nextrecurse\relax
-% \else
-% \global\advance\outerrecurse by 1
-% \setevalue{\@@irecurse\recursedepth}{\number#1}%
-% \setevalue{\@@nrecurse\recursedepth}{\number#2}%
-% \setevalue{\@@srecurse\recursedepth}{\number#3}%
-% \ifnum#3>0\relax\ifnum#2<#1\relax
-% \else
-% \setevalue{\@@drecurse\recursedepth}{>}%
-% \long\setvalue{\@@arecurse\recursedepth}{#4}%
-% \let\nextrecurse\dodorecurse
-% \fi\fi
-% \ifnum#3<0\relax\ifnum#1<#2\relax
-% \else
-% \setevalue{\@@drecurse\recursedepth}{<}%
-% \long\setvalue{\@@arecurse\recursedepth}{#4}%
-% \let\nextrecurse\dodorecurse
-% \fi\fi
-% \fi
-% \nextrecurse}
-
-\long\def\dosetstepwiserecurse#1#2#3#4#5%
- {\global\advance\outerrecurse by 1
- \setevalue{\@@drecurse\recursedepth}{#1}%
- \setevalue{\@@irecurse\recursedepth}{\number#2}%
- \setevalue{\@@nrecurse\recursedepth}{\number#3}%
- \setevalue{\@@srecurse\recursedepth}{\number#4}%
- \long\setvalue{\@@arecurse\recursedepth}{#5}%
- \dodorecurse}
-
-%D Acceptable.
+%D Acceptable:
%D
%D \starttypen
%D \long\def\dostepwiserecurse#1#2#3%
@@ -458,49 +503,158 @@
%D \nextrecurse{#1}{#2}{#3}}
%D \stoptypen
%D
-%D Better.
+%D Better:
+%D
+%D \starttypen
+%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 \stoptypen
+%D
+%D Cleaner and much faster:
+
+\def\@@irecurse{@@ir@@} % ecurse} % stepper
+\def\@@arecurse{@@ar@@} % ecurse} % action
-\long\def\dostepwiserecurse#1#2#3%
- {\let\nextrecurse\gobblefourarguments
+% \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
- \def\nextrecurse{\dosetstepwiserecurse>}%
+ \let\nextrecurse\dodostepwiserecurse
\fi
\else
\ifnum#3<0\relax
\ifnum#1<#2\relax
+ \let\nextrecurse\exitstepwiserecurse
\else
- \def\nextrecurse{\dosetstepwiserecurse<}%
+ \let\nextrecurse\dodostepwisereverse
\fi
+ \else
+ \let\nextrecurse\exitstepwiserecurse
\fi
- \fi
- \nextrecurse{#1}{#2}{#3}}
+ \fi\expanded{\nextrecurse{\number#1}{\number#2}{\number#3}}}
-\def\donorecurse%
- {}
+\beginETEX \numexpr
-\def\dododorecurse%
- {\edef\recurselevel{\getvalue{\@@irecurse\recursedepth}}%
- \getvalue{\@@arecurse\recursedepth}%
- \edef\recurselevel{\getvalue{\@@irecurse\recursedepth}}%
- \innerrecurse=\recurselevel
- \advance\innerrecurse by \getvalue{\@@srecurse\recursedepth}\relax
- \setevalue{\@@irecurse\recursedepth}{\the\innerrecurse}%
- \dodorecurse}
-
-\def\dodorecurse%
- {\ifnum\getvalue{\@@irecurse\recursedepth}
- \getvalue{\@@drecurse\recursedepth}
- \getvalue{\@@nrecurse\recursedepth}\relax
- \global\advance\outerrecurse by -1
- \edef\recurselevel{\getvalue{\@@irecurse\recursedepth}}%
+\long\def\dodostepwiserecurse#1#2#3% from to step
+ {\ifnum#1>#2\relax
+ \@EA\nodostepwiserecurse
\else
- \expandafter\dododorecurse
- \fi}
+ \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\redostepwiserecurse
+ {\csname\@@arecurse\recursedepth\endcsname\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
+ {\csname\@@arecurse\recursedepth\endcsname\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%
- {\dostepwiserecurse{1}{#1}{1}}
+ {\dostepwiserecurse1{#1}1}
%D As we can see here, the simple command \type{\dorecurse} is
%D a special case of the more general:
@@ -518,6 +672,64 @@
%D \dostepwiserecurse {10} {1} {-2} {...}
%D \stoptypen
%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{\number#1}}
+
+\long\def\ydorecurse#1#2%
+ {\global\advance\outerrecurse \plusone
+ \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel
+ \def\recurselevel{1}%
+ #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+1\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
+ {\csname\@@arecurse\recursedepth\endcsname\dodorecurse}
+
+\def\nodorecurse#1#2#3%
+ {\@EA\let\@EA\recurselevel\csname\@@irecurse\recursedepth\endcsname
+ \global\advance\outerrecurse \minusone }
+
%D The third 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.
@@ -536,11 +748,11 @@
%D The use of \type{\od} as a dilimiter would have made nested
%D use more problematic.
+% maybe this one will becoem obsolete
+
\def\for#1=#2\to#3\step#4\do#5%
{\dostepwiserecurse{#2}{#3}{#4}
- {\edef#1{\recurselevel}%
- #5%
- \edef#1{\recurselevel}}}
+ {\let#1\recurselevel#5\let#1\recurselevel}}
%D \macros
%D {doloop,exitloop}
@@ -611,20 +823,64 @@
%D \def\looplevel{\recurselevel}
%D \def\loopdepth{\recursedepth}
%D \stoptypen
+%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 \starttypen
+%D \def\doloop%
+%D {\dostepwiserecurse1\maxdimen1}
+%D
+%D \def\exitloop%
+%D {\letvalue{\@@irecurse\recursedepth}\maxdimen}
+%D \stoptypen
+%D
+%D Although, the next version is faster because it used the
+%D simple loop.
-\def\doloop%
- {\dostepwiserecurse{1}{\maxdimen}{1}}
+\let\endofloop\donothing
-\def\exitloop%
- {\setvalue{\@@irecurse\recursedepth}{\maxdimen}}
+\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}
+
+\beginETEX \numexpr
+
+\long\def\dodoloop#1%
+ {\def\recurselevel{#1}%
+ \@EA\redoloop\@EA{\the\numexpr\recurselevel+1\relax}}
+
+\endETEX
+
+\beginTEX
+
+\long\def\dodoloop#1%
+ {\def\recurselevel{#1}%
+ \innerrecurse#1\advance\innerrecurse\plusone
+ \@EA\redoloop\@EA{\the\innerrecurse}}
+
+\endTEX
+
+\def\redoloop
+ {\csname\@@arecurse\recursedepth\endcsname\endofloop}
+
+\def\nodoloop#1%
+ {\@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 We don't declare new counters for \type{\looplevel} and
-%D \type{\loopdepth} because one can use \type{\recurselevel}
-%D and \type{\recursedepth}.
-%D
%D The loop is executed at least once, so beware of situations
%D like:
%D
@@ -638,6 +894,10 @@
%D \starttypen
%D \doloop {\ifwhatever \exitloop \else some commands\fi}
%D \stoptypen
+%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 \macros
%D {newevery,everyline,EveryLine,EveryPar}
@@ -707,16 +967,31 @@
%
% 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\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}
+ {\def\next{\dodowithevery#1}%
+ \afterassignment\next\scratchtoks}
\bgroup \let\newtoks\relax % plain safe (\outer)
@@ -724,7 +999,7 @@
{\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=0
+ \expandafter\chardef\csname c\strippedcsname#1\endcsname\zerocount
\def#2{\dowithevery#1}%
\fi\fi}
@@ -961,34 +1236,27 @@
%D care of (first) arguments that are delimited by \type{[ ]},
%D but the faster \type{\ExpandAfter} does not.
-%D RECONSIDER
-
\def\simpleExpandFirstAfter#1%
- {\edef\!!stringa{#1}%
- \@EA\ExpandCommand\@EA{\!!stringa}}
+ {\edef\@@expanded{\noexpand\ExpandCommand{#1}}\@@expanded}
\def\complexExpandFirstAfter[#1]%
- {\edef\!!stringa{#1}%
- \@EA\ExpandCommand\@EA[\!!stringa]}
+ {\edef\@@expanded{\noexpand\ExpandCommand[#1]}\@@expanded}
\def\ExpandFirstAfter#1%
- {\let\ExpandCommand#1\complexorsimple\ExpandFirstAfter}
+ {\let\ExpandCommand#1%
+ \doifnextcharelse[\complexExpandFirstAfter\simpleExpandFirstAfter}
\def\ExpandSecondAfter#1#2#3%
- {\edef\!!stringa{#2}% was \def
- \edef\!!stringb{#3}%
- \@EA#1\@EA{\@EA\!!stringa\@EA}\@EA{\!!stringb}}
+ {\scratchtoks{#2}%
+ \edef\@@expanded{\noexpand#1{\the\scratchtoks}{#3}}\@@expanded}
\def\ExpandBothAfter#1#2#3%
- {\edef\!!stringa{#2}%
- \edef\!!stringb{#3}%
- \@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA\!!stringa\@EA}\@EA{\!!stringb}}
+ {\edef\@@expanded{\noexpand#1{#2}{#3}}\@@expanded}
\def\ExpandAfter#1#2%
- {\edef\!!stringa{#2}%
- \@EA#1\@EA{\!!stringa}}
+ {\edef\@@expanded{\noexpand#1{#2}}\@@expanded}
-%D Now we can for instance redefine \type{\ifinstringelse} as:
+%D Now we can for instance define \type{\ifinstringelse} as:
\def\ifinstringelse%
{\ExpandBothAfter\p!doifinstringelse}
@@ -1057,9 +1325,9 @@
%D constructions like:
%D
%D \starttypen
-%D \setupfoottexts[...][...]
-%D \setupfoottexts[margin][...][...]
-%D \setupfoottexts[\v!margin][...][...]
+%D \setupfootertexts[...][...]
+%D \setupfootertexts[margin][...][...]
+%D \setupfootertexts[\v!margin][...][...]
%D \stoptypen
%D
%D where \type{...} can be anything legally \TEX.
@@ -1071,17 +1339,10 @@
{\expandafter\convertargument#1\to#2}
{}}
-\def\simpleConvertConstantAfter#1#2%
- {\CheckConstantAfter{#1}\asciiA
- \CheckConstantAfter{#2}\asciiB
- \ConvertCommand{\asciiA}{\asciiB}}
-
-\def\complexConvertConstantAfter[#1]%
- {\doConvertConstantAfter{#1}%
- \@EA\ConvertCommand\@EA[\!!stringa]}
-
-\def\ConvertConstantAfter#1%
- {\let\ConvertCommand#1\complexorsimple\ConvertConstantAfter}
+\def\ConvertConstantAfter#1#2#3%
+ {\CheckConstantAfter{#2}\asciiA
+ \CheckConstantAfter{#3}\asciiB
+ #1{\asciiA}{\asciiB}}
%D \macros
%D {assignifempty}
@@ -1094,12 +1355,12 @@
%D
%D We don't explicitly test if the macro is defined.
-\def\assignifempty#1#2%
- {\doifnot{#1}{}
- {\def#1{#2}}}
+\def\assignifempty#1#2% can be sped up
+ {\doifnot{#1}{}{\def#1{#2}}}
%D \macros
-%D {gobbleuntil,grabuntil,processbetween}
+%D {gobbleuntil,grabuntil,gobbleuntilrelax,
+%D processbetween,processuntil}
%D
%D In \TEX\ gobbling usually stand for skipping arguments, so
%D here are our gobbling macros.
@@ -1160,7 +1421,7 @@
%D leads to: \type{\message{Hello again!}}. The command
%D
%D \starttypen
-%D \gobbleuntil\command
+%D \gobbleuntil{sequence}
%D \stoptypen
%D
%D is related to these commands. This one simply throws away
@@ -1173,6 +1434,18 @@
\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 \starttypen
+%D \processuntil{sequence}
+%D \stoptypen
+
+\def\processuntil#1%
+ {\long\def\next##1#1{##1}\next}
+
%D \macros
%D {groupedcommand}
%D
@@ -1311,18 +1584,24 @@
%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%
- {\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}
+ {\doifnextcharelse\bgroup
+ {\HandleGroup{#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
@@ -1417,18 +1696,32 @@
\let\endoflinetoken=^^M
+%\def\doGotoPar%
+% {\ifx\nextchar\blankspace
+% \let\donext\GotoPar
+% \else\ifx\nextchar\endoflinetoken
+% \let\donext\GotoPar
+% \else
+% \def\donext%
+% {\the\BeforePar
+% \BeforePar\emptytoks
+% \nextchar}%
+% \fi\fi
+% \donext}
+
\def\doGotoPar%
{\ifx\nextchar\blankspace
- \let\donext\GotoPar
+ \@EA\GotoPar
\else\ifx\nextchar\endoflinetoken
- \let\donext\GotoPar
+ \@EAEAEA\GotoPar
\else
- \def\donext%
- {\the\BeforePar
- \BeforePar{}%
- \nextchar}%
- \fi\fi
- \donext}
+ \@EAEAEA\dodoGotoPar
+ \fi\fi}
+
+\def\dodoGotoPar
+ {\the\BeforePar
+ \BeforePar\emptytoks
+ \nextchar}
\def\GotoPar%
{\afterassignment\doGotoPar\let\nextchar=}
@@ -1437,19 +1730,33 @@
%D primitive, which can lead to unexpected results, depending
%D in the context.
+% \def\GetPar%
+% {\edef\next%
+% {\BeforePar
+% {\the\BeforePar
+% \BeforePar\emptytoks
+% \bgroup
+% \def\par%
+% {\egroup
+% \par
+% \the\AfterPar
+% \BeforePar\emptytoks
+% \AfterPar\emptytoks}}}%
+% \next
+% \GotoPar}
+
\def\GetPar%
- {\edef\next%
+ {\expanded
{\BeforePar
{\the\BeforePar
- \BeforePar{}%
+ \BeforePar\emptytoks
\bgroup
- \def\par%
+ \def\par
{\egroup
\par
\the\AfterPar
- \BeforePar{}%
- \AfterPar{}}}}%
- \next
+ \BeforePar\emptytoks
+ \AfterPar\emptytoks}}}%
\GotoPar}
%D \macros
@@ -1515,14 +1822,19 @@
%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}}%
- \doifnextcharelse{\bgroup}
- {\nextarg}
- {\doifnextcharelse{\par}
- {#1{}}
- {\nextpar}}}
+ \doifnextcharelse\bgroup\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}
@@ -1562,12 +1874,17 @@
%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}}%
- \doifnextcharelse{\bgroup}
- {\nextarg}
- {\nextwar}}
+ \doifnextcharelse\bgroup\nextarg\nextwar}
%D \macros
%D {dorepeat,dorepeatwithcommand}
@@ -1599,25 +1916,28 @@
%D a row. In both commands, the \type{n*} is optional. When this
%D specification is missing, the command executes once.
-\long\def\dodorepeat[#1*#2*#3*]%
- {\doifelse{#3}{}
- {#1}
- {\dorecurse{#1}{#2}}}
+\def\dorepeat[#1]%
+ {\dodorepeat#1*\empty*\relax}
-\long\def\dorepeat[#1]%
- {\dodorepeat[#1***]}
+\long\def\dodorepeat#1*#2#3*#4\relax
+ {\ifx#2\empty
+ #1%
+ \else
+ \dorecurse{#1}{#2#3}%
+ \fi}
-\def\repeater%
+\def\repeater
{\recurselevel}
-\def\dorepeatwithcommand[#1]#2%
- {\def\p!dorepeatnot%
- {#2{#1}}%
- \def\p!dorepeatyes[##1*##2]%
- {\dorecurse{##1}{#2{##2}}}%
- \doifinstringelse{*}{#1}
- {\doifnumberelse{#1}{\p!dorepeatyes[#1]}{\p!dorepeatnot}}%
- {\p!dorepeatnot}}
+\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}
%D \macros
%D {normalbgroup,normalgroup}
@@ -1627,6 +1947,35 @@
\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 \starttypen
+%D \long\def\doifstringinstringelse#1#2%
+%D {\p!doifinstringelse#1#2%
+%D \@EA\firstoftwoarguments
+%D \else
+%D \@EA\secondoftwoarguments
+%D \fi}
+%D \stoptypen
+%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}
@@ -1661,55 +2010,105 @@
%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}}}
+% {\@@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}}}
+% {\@@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\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:
+
+\def\dodoappendtoks
+ {\dodoglobal\@@toks\@EAEAEA{\@EA\the\@EA\@@toks\the\@@scratchtoks}}
-\def\dodoprependtoks#1%
- {\expanded{\dodoglobal\noexpand#1{\the\scratchtoks\the#1}}}
+\def\dodoprependtoks
+ {\dodoglobal\@@toks\@EAEAEA{\@EA\the\@EA\@@scratchtoks\the\@@toks}}
-\long\def\doappendtoks#1\to%
- {\scratchtoks\@EA{\gobbleoneargument#1}\dodoappendtoks}
+\long\def\doappendtoks#1\to#2%
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}\dodoappendtoks}
-\long\def\doprependtoks#1\to%
- {\scratchtoks\@EA{\gobbleoneargument#1}\dodoprependtoks}
+\long\def\doprependtoks#1\to#2%
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}\dodoprependtoks}
\long\def\doappendtoksonce#1\to#2%
- {\scratchtoks\@EA{\gobbleoneargument#1}%
- \doifintokselse\scratchtoks{#2}{}{\dodoappendtoks{#2}}}
+ {\def\@@toks{#2}%
+ \@@scratchtoks\@EA{\gobbleoneargument#1}%
+ \doifintokselse\@@scratchtoks\@@toks\donothing\dodoappendtoks}
\long\def\doprependtoksonce#1\to#2%
- {\scratchtoks\@EA{\gobbleoneargument#1}%
- \doifintokselse\scratchtoks{#2}{}{\dodoprependtoks{#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\!!stringa{\the#1}\convertcommand\!!stringa\to\asciiA
\edef\!!stringb{\the#2}\convertcommand\!!stringb\to\asciiB
\doifinstringelse\asciiA\asciiB}
+%D Better:
+
+\def\doifintokselse#1#2% #1 en #2 zijn toks
+ {\edef\!!stringa{\the#1}\convertcommand\!!stringa\to\asciiA
+ \edef\!!stringb{\the#2}\convertcommand\!!stringb\to\asciiB
+ \doifstringinstringelse\asciiA\asciiB}
+
+%D Even better:
+
+\def\doifintokselse#1#2% #1 en #2 zijn toks
+ {\@EA\convertargument\the#1\to\asciiA
+ \@EA\convertargument\the#2\to\asciiB
+ \doifstringinstringelse\asciiA\asciiB}
+
+%D Also:
+
+\def\appendetoks #1\to{\expanded{\appendtoks #1}\to}
+\def\prependetoks#1\to{\expanded{\prependtoks#1}\to}
+
%D Hm.
\def\flushtoks#1%
- {\scratchtoks=#1\relax
- \dodoglobal#1=\emptytoks
- \the\scratchtoks\relax}
+ {\@@scratchtoks#1\relax
+ \dodoglobal#1\emptytoks
+ \the\@@scratchtoks\relax}
\let\dotoks=\the
@@ -1750,10 +2149,10 @@
%D {\expandafter\newcount\csname#1\endcsname}
%D
%D \def\pluscounter#1%
-%D {\expandafter\global\expandafter\advance\csname#1\endcsname by 1 }
+%D {\global\advance\csname#1\endcsname by 1 }
%D
%D \def\minuscounter#1%
-%D {\expandafter\global\expandafter\advance\csname#1\endcsname by -1 }
+%D {\global\advance\csname#1\endcsname by -1 }
%D
%D \def\resetcounter#1%
%D {\expandafter\global\csname#1\endcsname=0 }
@@ -1774,12 +2173,12 @@
\def\pluscounter#1%
{\scratchcounter=\getvalue{#1}\relax
- \advance\scratchcounter 1
+ \advance\scratchcounter \plusone
\setxvalue{#1}{\the\scratchcounter}}
\def\minuscounter#1%
{\scratchcounter=\getvalue{#1}\relax
- \advance\scratchcounter -1
+ \advance\scratchcounter \minusone
\setxvalue{#1}{\the\scratchcounter}}
\def\resetcounter#1%
@@ -1799,10 +2198,44 @@
%D values. Only one level is saved.
\def\savecounter#1%
- {{\scratchcounter=\getvalue {#1}\setxvalue{!#1}{\the\scratchcounter}}}
+ {{\scratchcounter\getvalue {#1}\setxvalue{!#1}{\the\scratchcounter}}}
\def\restorecounter#1%
- {{\scratchcounter=\getvalue{!#1}\setxvalue {#1}{\the\scratchcounter}}}
+ {{\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\pluscounter#1%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr(\csname#1\endcsname+1)}}
+
+\def\minuscounter#1%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr(\csname#1\endcsname-1)}}
+
+\def\resetcounter#1%
+ {\global\@EA\let\csname#1\endcsname\zerocountervalue}
+
+\def\setcounter#1#2%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr(#2)}}
+
+\def\countervalue#1%
+ {\csname#1\endcsname}
+
+\def\savecounter#1%
+ {\@EA\xdef\csname !#1\endcsname{\the\numexpr(\csname#1\endcsname)}}
+
+\def\restorecounter#1%
+ {\@EA\xdef\csname#1\endcsname{\the\numexpr(\csname !#1\endcsname)}}
+
+\endETEX
%D \macros
%D {beforesplitstring,aftersplitstring}
@@ -1836,10 +2269,15 @@
%D
%D A bonus macro.
+%\def\splitstring#1\at#2\to#3\and#4%
+% {\def\dosplitstring##1#2##2@@@##3\\%
+% {\def#3{##1}\def#4{##2}}%
+% \@EA\dosplitstring#1@@@#2@@@\\}
+
\def\splitstring#1\at#2\to#3\and#4%
- {\def\dosplitstring##1#2##2@@@##3\\%
+ {\def\dosplitstring##1#2##2#2##3\\%
{\def#3{##1}\def#4{##2}}%
- \@EA\dosplitstring#1@@@#2@@@\\}
+ \@EA\dosplitstring#1#2#2\\}
%D \macros
%D {removesubstring}
@@ -1852,14 +2290,17 @@
%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%
- {\doifinstringelse{#1}{#2}
- {\beforesplitstring#2\at#1\to\!!stringa
- \aftersplitstring #2\at#1\to\!!stringb
- \edef#3{\!!stringa\!!stringb}%
- \def\next{\removesubstring#1\from#3\to#3}}
- {\let\next=\relax}%
- \next}
+ {\splitstring#2\to\!!stringa\and\!!stringb
+ \dodoglobal#3{\!!stringa\!!stringb}}
%D \macros
%D {appendtocommalist,prependtocommalist,
@@ -1898,68 +2339,117 @@
%D \appendtocommalist {something} \name
%D \prependtocommalist {something} \name
%D \stoptypen
+%D
+%D This can be implemented as follows:
+%D
+%D \starttypen
+%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 \stoptypen
+%D
+%D The faster alternatives are:
\def\appendtocommalist#1#2%
- {\ifx#2\empty
- \dodoglobal\edef#2{#1}%
- \else % no test on empty
- \dodoglobal\edef#2{#2,#1}%
- \fi}
+ {\dodoglobal\edef#2{\ifx#2\empty\else#2,\fi#1}}
\def\prependtocommalist#1#2%
- {\ifx#2\empty
- \dodoglobal\edef#2{#1}%
- \else % no test on empty
- \dodoglobal\edef#2{#1,#2}%
- \fi}
+ {\dodoglobal\edef#2{#1\ifx#2\empty\else,#2\fi}}
-\def\addtocommalist#1#2%
- {\ifx#2\empty
- \dodoglobal\edef#2{#1}%
- \else
- \edef\!!stringa{#2,,}%
- \beforesplitstring#2\at,,\to#2\relax
- \ExpandBothAfter\doifinsetelse{#1}{#2}
- {\resetglobal}
- {\dodoglobal\edef#2{#2,#1}}%
- \fi}
+%D The old ones are:
+%D
+%D \starttypen
+%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 \stoptypen
+%D
+%D Significantly faster (especially for longer lists):
-\def\pretocommalist#1#2%
- {\ifx#2\empty
- \dodoglobal\edef#2{#1}%
- \else
- \edef\!!stringa{#2,,}%
- \beforesplitstring#2\at,,\to#2\relax
- \ExpandBothAfter\doifinsetelse{#1}{#2}
- {\resetglobal}
- {\dodoglobal\edef#2{#1,#2}}%
- \fi}
+\def\cleanedupcommalist#1,,#2\relax{#1}
+
+\def\xsplitstring#1#2% \cs {item}
+ {\def\dosplitstring##1#2,##2#2,##3\\%
+ {\edef\!!stringa{\cleanedupcommalist##1,,\relax}%
+ \edef\!!stringb{\cleanedupcommalist##2,,\relax}}%
+ \@EA\dosplitstring#1,#2,#2,\\}
-\def\doremovefromcommalist#1#2#3% nog \doglobal
- {\edef\!!stringa{,,#3,,}%
- \beforesplitstring\!!stringa\at,#1#2,\to\!!stringb
- \aftersplitstring\!!stringa\at,#1#2,\to\!!stringc
- \edef#3{\!!stringb,\!!stringc}%
- \aftersplitstring#3\at,,\to#3\relax
- \beforesplitstring#3\at,,\to#3}
+\def\addtocommalist#1#2% {item} \cs
+ {\expanded{\xsplitstring\noexpand#2{#1}}%
+ \dodoglobal\edef#2%
+ {\ifx\!!stringa\empty\else\!!stringa,\fi
+ \ifx\!!stringb\empty\else\!!stringb,\fi#1}}
+
+\def\pretocommalist#1#2%
+ {\expanded{\xsplitstring\noexpand#2{#1}}%
+ \dodoglobal\edef#2%
+ {#1%
+ \ifx\!!stringa\empty\else,\!!stringa\fi
+ \ifx\!!stringb\empty\else,\!!stringb\fi}}
\def\removefromcommalist#1#2%
- {\doremovefromcommalist{ }{#1}{#2}%
- \doremovefromcommalist{}{#1}{#2}%
- \dofrontstrip#2%
- \dodoglobal\edef#2{#2}}
+ {\expanded{\xsplitstring\noexpand#2{#1}}%
+ \dodoglobal\edef#2%
+ {\ifx\!!stringa\empty
+ \!!stringb
+ \else
+ \!!stringa\ifx\!!stringb\empty\else,\!!stringb\fi
+ \fi}}
+
+%D A not so useful macro:
\def\dodofrontstrip[#1#2]#3%
{\ifx#1\space
\def#3{#2}%
\else
\def#3{#1#2}%
- \fi}%
+ \fi}
\def\dofrontstrip#1%
{\edef\!!stringa{#1}%
- \ifx\!!stringa\empty
- \else
+ \ifx\!!stringa\empty \else
\@EA\dodofrontstrip\@EA[#1]#1%
\fi}
@@ -2014,7 +2504,7 @@
\fi
\fi
\fi
- \advance\commalistcounter by 1 }%
+ \advance\commalistcounter\plusone}%
\let\commalistelement\empty
\let\newcommalist\empty
\commalistcounter=1
@@ -2058,7 +2548,8 @@
\dimen0=#1\relax
\@EA\convertargument\the\dimen0\to\asciiA
\@EA\convertargument#2\to\asciiB
- \@EA\@EA\@EA\beforesplitstring\@EA\asciiA\@EA\at\asciiB\to\!!stringa%
+ %\@EA\@EA\@EA\beforesplitstring\@EA\asciiA\@EA\at\asciiB\to\!!stringa
+ \@EA\beforesplitstring\@EA\asciiA\@EA\at\asciiB\to\!!stringa
\!!stringa
\endgroup}
@@ -2105,14 +2596,14 @@
\def\numberofpoints#1%
{\scratchdimen=#1\relax
- \advance\scratchdimen by .5pt
+ \advance\scratchdimen .5pt
\withoutpt{\the\scratchdimen}}
\def\dimensiontocount#1#2%
{\scratchdimen=#1\relax
- \advance\scratchdimen by .5pt
+ \advance\scratchdimen .5pt
#2=\scratchdimen
- \divide#2 by \!!maxcard\relax}
+ \divide#2 by \maxcard}
%D \macros
%D {swapdimens,swapmacros}
@@ -2123,14 +2614,10 @@
%D argument.
\def\swapdimens#1#2%
- {\scratchdimen=#1\relax
- \redoglobal#1=#2\relax
- \dodoglobal#2=\scratchdimen}
+ {\scratchdimen #1\redoglobal #1#2\dodoglobal #2\scratchdimen}
\def\swapmacros#1#2%
- {\let\!!stringa=#1\relax
- \let#1=#2\relax
- \let#2=\!!stringa\relax}
+ {\let\!!stringa#1\redoglobal\let#1#2\dodoglobal\let#2\!!stringa}
%D \macros
%D {pushmacro,popmacro}
@@ -2146,7 +2633,9 @@
\def\@s@{@s@}
-\def\globalpushmacro#1%
+\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}
@@ -2164,6 +2653,42 @@
{\@EA\let\@EA#1\csname\csname\@s@::\string#1\endcsname::\string#1\endcsname
\global\@EA\decrement\csname\@s@::\string#1\endcsname}
+\endTEX
+
+% * niet nodig, in @s@ stoppen
+
+\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
+ {%\ifcsname\@s@*\string#1\endcsname
+ \global\@EA\let\@EA#1\csname\the\csname\@s@*\string#1\endcsname*\string#1\endcsname
+ \global\advance\csname\@s@*\string#1\endcsname \minusone
+ %\else
+ % \message{error in \string#1}\wait
+ }%\fi}
+
+% this one can be used to push a value over an \egroup
+
+\def\localpushmacro#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\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
+
\let\pushmacro\globalpushmacro
\let\popmacro \globalpopmacro
@@ -2188,13 +2713,13 @@
\def\complexsetlocalhsize[#1]% don't change !
{\localhsize=\hsize
- % \advance\localhsize by -\parindent % changed anyway
- \advance\localhsize by -\leftskip
- \advance\localhsize by -\rightskip
- \advance\localhsize by #1\relax}
+ % \advance\localhsize -\parindent % changed anyway
+ \advance\localhsize -\leftskip
+ \advance\localhsize -\rightskip
+ \advance\localhsize #1\relax}
\def\simplesetlocalhsize%
- {\complexsetlocalhsize[\!!zeropoint]}
+ {\complexsetlocalhsize[\zeropoint]}
\definecomplexorsimple\setlocalhsize
@@ -2340,9 +2865,83 @@
%D
%D Slightly more efficient:
- \def\doifnothing{\doif {}}
- \def\doifsomething{\doifnot {}}
-\def\doifelsenothing{\doifelse{}}
+ \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\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}
@@ -2365,13 +2964,30 @@
%D \type {\doifallcommonelse}, where the first two
%D arguments are sets.
-\def\doifallcommonelse#1#2#3#4%
+%\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}{#2}{\donefalse}%
+ {\doifnotinset{##1}{#4}\donefalse
\ifdone\else\quitcommalist\fi}%
\donetrue
- \processcommalist[#1]\p!docommoncheck
- \ifdone#3\else#4\fi}
+ \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}
@@ -2477,30 +3093,45 @@
%D \executeifdefined{name}\gobbleoneargument
%D \stoptypen
%D
-%D We can of course globble more arguments using the
-%D appropriate globbling command.
+%D We can of course gobble more arguments using the
+%D appropriate gobbling command.
-\newif\ifexecuted
+\newif\ifexecuted % general purpose
\def\executeifdefined#1#2%
{\ifundefined{#1}%
- \executedfalse
\def\next{#2}%
\else
- \executedtrue
\def\next{\getvalue{#1}}%
\fi
\next}
-% cleaner but less clear
-%
-% \def\executeifdefined#1%
-% {\ifundefined{#1}%
-% \executedfalse \let\next\gobbleoneargument
-% \else
-% \executedtrue \def\next##1{\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)!
+
+\def\executeifdefined#1% #2 / never change this one again
+ {\ifundefined{#1}%
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi
+ {\csname#1\endcsname}}
+
+\beginETEX
+
+\def\executeifdefined#1% #2 / never change this one again
+ {\ifcsname#1\endcsname
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi
+ {\csname#1\endcsname}}
+
+\endETEX
+
+
+%D This one also has the advantage that it is fully
+%D expandable and that it can be used after an assignment.
%D We considered an alternative imlementation accepting
%D commands directly, like:
@@ -2510,20 +3141,7 @@
%D \stoptypen
%D
%D For the moment we don't need this one, so we stick to the
-%D faster one. The more versatile alternative is:
-%D
-%D \starttypen
-%D \def\executeifdefined#1#2%
-%D {\setnameofcommand{#1}%
-%D \@EA\ifundefined\@EA{\nameofcommand}%
-%D \def\next{#2}%
-%D \else
-%D \def\next{\getvalue{\nameofcommand}}%
-%D \fi
-%D \next}
-%D \stoptypen
-
-% ISN'T THE NEXT ONE OBSOLETE?
+%D faster one.
%D \macros
%D {doifsomespaceelse}
@@ -2539,6 +3157,8 @@
%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}%
@@ -2546,8 +3166,12 @@
\def\p!doifsomespaceelse#1 #2#3\war{\if\noexpand#2@}
-\long\def\doifsomespaceelse#1#2#3%
- {\p!doifsomespaceelse#1 @ @\war#3\else#2\fi}
+\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}
@@ -2773,7 +3397,7 @@
{\begingroup
\catcode`\{=\@@ignore
\catcode`\}=\@@ignore
- \escapechar=-1
+ \escapechar=\minusone
\dountexsomething}
\long\def\dountexsomething#1#2\to#3%
@@ -2802,17 +3426,20 @@
%D The magic factor $72/72.27$ can be found in most \TEX\
%D related books.
-\def\ScaledPointsToBigPoints#1#2%
- {\scratchdimen=#1sp
- \scratchdimen=.996264\scratchdimen
+\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\ScaledPointsToWholeBigPoints#1#2%
- {\scratchdimen=#1sp
- \scratchdimen=.996264\scratchdimen
- \scratchcounter=\scratchdimen
- \advance\scratchcounter by \!!medcard
- \divide\scratchcounter by \!!maxcard
+\def\PointsToWholeBigPoints#1#2%
+ {\scratchdimen#1%
+ \scratchdimen.996264\scratchdimen
+ \scratchcounter\scratchdimen
+ \advance\scratchcounter \medcard
+ \divide\scratchcounter \maxcard
\edef#2{\the\scratchcounter}}
%D \macros
@@ -2922,6 +3549,16 @@
%D \dohandletokens#1\end}
%D \stoptypen
+%D A bonus example:
+%D
+%D \starttypen
+%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 \stoptypen
+
%D \macros
%D {counttoken}
%D
@@ -2937,14 +3574,14 @@
%D {\doglobal}.
\def\counttoken#1\in#2\to#3%
- {\redoglobal#3=0
+ {\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 by 1
+ \dodoglobal\advance#3 \plusone
\fi
\expandafter\docounttoken
\fi}%
@@ -2963,7 +3600,7 @@
\scratchcounter=#1\relax
\def\dosplitofftokens##1%
{\ifnum\scratchcounter>0
- \advance\scratchcounter by -1
+ \advance\scratchcounter \minusone
\edef#3{#3##1}%
\fi}%
% \let#3=\empty % #3 can be #2, so:
@@ -3107,13 +3744,13 @@
\ifnum\globaldefs#10
\globaldefs=-\globaldefs
\fi
- \advance\globaldefs by #21
+ \advance\globaldefs #21
\setevalue{@gd@\the\globaldefs}{\!!stringa}}
\def\dostopglobaldefs%
{\doifdefinedelse{@gd@\the\globaldefs}
- {\globaldefs=\getvalue{@gd@\the\globaldefs}\relax}
- {\globaldefs=0\relax}}
+ {\globaldefs\getvalue{@gd@\the\globaldefs}\relax}
+ {\globaldefs\zerocount}}
\def\startlocal {\dostartglobaldefs>-}
\def\stoplocal {\dostopglobaldefs}
@@ -3171,7 +3808,8 @@
%\endTEX
-% Hm. Side effect, spaces after \type{\test} in verbatim.
+% Hm. Side effect, spaces after \type{\test} in verbatim.
+% must set eof token
%\beginETEX \scantokens
%
@@ -3274,7 +3912,7 @@
\replaceincommalist\sortedcommalist\scratchcounter
\quitcommalist
\fi}%
- \advance\scratchcounter 1 }
+ \advance\scratchcounter \minusone}
%D The macro \type{\donumericcompare} considers everything
%D that is not a number to be larger than any number.
@@ -3292,22 +3930,6 @@
{\comparedresult=2 }}
{\comparedresult=1 }}
-%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\firstofthreearguments #1#2#3{#1}
-\long\def\secondoftwoarguments #1#2{#2}
-\long\def\secondofthreearguments#1#2#3{#2}
-\long\def\thirdofthreearguments #1#2#3{#3}
-
%D \macros
%D {@saveprimitive}
%D
@@ -3386,9 +4008,13 @@
%D Not that fast I guess, but here's a way to test for token
%D registers being empty.
-\def\doifsometokselse#1#2#3%
+\def\doifsometokselse#1% % #2#3%
{\edef\!!stringa{\the#1}%
- \ifx\!!stringa\empty#3\else#2\fi}
+ \ifx\!!stringa\empty % #3\else#2\fi}
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
%D \macros
%D {startstrictinspectnextcharacter}
diff --git a/tex/context/base/syst-gen.tex b/tex/context/base/syst-gen.tex
index 5ee3299f5..19381d91b 100644
--- a/tex/context/base/syst-gen.tex
+++ b/tex/context/base/syst-gen.tex
@@ -1,4 +1,4 @@
-%D \module
+%D \module
%D [ file=syst-gen,
%D version=1996.3.20,
%D title=\CONTEXT\ System Macros,
@@ -8,8 +8,8 @@
%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
-%C details.
+%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
+%C details.
% nagaan : \ifinstringelse in syst-ext.tex
% do => p! dodo pp! dododo ppp!
@@ -17,12 +17,12 @@
%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 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}
@@ -37,7 +37,7 @@
%D
%D where \type{\command} is a command defined in the module
%D to be loaded only once.
-%D
+%D
%D \starttypen
%D \def\abortinputifdefined#1%
%D {\ifx#1\undefined
@@ -48,13 +48,13 @@
%D \next}
%D \stoptypen
%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 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 \starttypen
+%D If we perform such actions directly, we can say:
+%D
+%D \starttypen
%D \ifx\somecommand\undefined
%D \let\next=\relax
%D \else
@@ -62,38 +62,38 @@
%D \fi
%D \next
%D \stoptypen
-%D
-%D We need the \type{\next} because we need to end the
-%D \type{\fi}. The efficient one is:
-%D
-%D \starttypen
+%D
+%D We need the \type{\next} because we need to end the
+%D \type{\fi}. The efficient one is:
+%D
+%D \starttypen
%D \ifx\somecommand\undefined
%D \else
-%D \expandafter\endinput
+%D \expandafter\endinput
%D \fi
%D \stoptypen
%D
-%D Because \type{\endinput} comes into action after the current
+%D Because \type{\endinput} comes into action after the current
%D line, we can also say:
-%D
-%D \starttypen
+%D
+%D \starttypen
%D \ifx\somecommand\undefined \else \endinput \fi
%D \stoptypen
%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 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:
+%D we can use a formatted definition:
\def\abortinputifdefined#1%
- {\ifx#1\undefined \else
- \endinput
+ {\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 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 deep in code.
%D And because this module implements \type{\writestatus}, we
%D just say:
@@ -108,11 +108,11 @@
%D \writestatus{laden}{Context Systeem Macro's (a)}
%D \stoptypen
-%D The next few macros are needed in case this module is
-%D used outside \CONTEXT.
+%D The next few macros are needed in case this module is
+%D used outside \CONTEXT.
\ifx\beginTEX\undefined
- \long\def\beginETEX#1\endETEX{}
+ \long\def\beginETEX#1\endETEX{}
\let\beginTEX\relax \let\endTEX\relax
\fi
@@ -150,19 +150,23 @@
\ifx\protect\undefined
\def\protect{\message{<too much protection>}}
+\else
+ % a simple version is already defined
\fi
-\let\normalprotect=\protect
+\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.
+%D don't take arguments, unless lines are obeyed, I decided
+%D to put it there as a reminder. I only mention this once.
+
+\chardef\protectionthreshold=2
-\def\unprotect%
+\def\unprotect
{\ifcase\protectionlevel
\edef\doprotectcharacters%
- {\catcode`\noexpand @=\the\catcode`@
- \catcode`\noexpand !=\the\catcode`!
+ {\catcode`\noexpand @=\the\catcode`@
+ \catcode`\noexpand !=\the\catcode`!
\catcode`\noexpand ?=\the\catcode`? }%
\let\protect\doprotect
\fi
@@ -170,7 +174,7 @@
\catcode`!=11
\catcode`?=11
\advance\protectionlevel 1
- \ifnum\protectionlevel>1
+ \ifnum\protectionlevel>\protectionthreshold
\message{<unprotect \the\protectionlevel>}%
\fi}
@@ -180,10 +184,21 @@
\let\doprotectcharacters\relax
\let\protect\normalprotect
\fi
- \ifnum\protectionlevel>1
+ \ifnum\protectionlevel>\protectionthreshold
\message{<protect \the\protectionlevel>}%
\fi
\advance\protectionlevel -1 }
+
+\ifx\everyeof\undefined
+
+ \let\checkprotection\relax
+
+\else
+
+ \def\checkprotection%
+ {\everyeof{\writestatus{protection}{level: \the\protectionlevel}}}
+
+\fi
%D Now it is defined, we can make use of this very useful
%D macro.
@@ -218,8 +233,8 @@
%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:
+%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{ }
@@ -239,25 +254,25 @@
\newdimen \scratchdimen
\newskip \scratchskip
\newmuskip \scratchmuskip
-\newbox \scratchbox
+\newbox \scratchbox
\newtoks \scratchtoks
-\newif \ifdone
+\newif \ifdone
%D \macros
%D {ifCONTEXT}
-%D
+%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.
+%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 {!!count, !!toks, !!dimen, !!box,
+%D !!width, !!height, !!depth, !!string, !!done}
%D
-%D We define some more \COUNTERS\ and \DIMENSIONS. We also
+%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.
@@ -271,12 +286,22 @@
\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\!!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
+\ifx \z@\undefined \else \let\zeropoint\z@ \fi
+\ifx \@ne\undefined \else \let\plusone \@ne \fi
+\ifx\m@ne\undefined \else \let\minusone \m@ne \fi
+
+\ifx\zeropoint\undefined \newdimen\zeropoint \fi
+\ifx\plusone \undefined \chardef\plusone=1 \fi
+\ifx\minusone \undefined \count\minusone \minusone=-1 \fi
+
+\newcount\zerocount
+
%D \macros
%D {s!,c!,e!,p!,v!,@@,??}
%D
@@ -285,7 +310,7 @@
%D results.
\def\v!prefix! {v!} \def\c!prefix! {c!}
-\def\s!prefix! {s!} \def\p!prefix! {p!}
+\def\s!prefix! {s!} \def\p!prefix! {p!}
\def\s!next {next} \def\s!default {default}
\def\s!dummy {dummy} \def\s!unknown {unknown}
@@ -296,37 +321,41 @@
\def\s!simple {simple} \def\s!stop {stop}
%D \macros
-%D {@EA,expanded}
+%D {@EA,@EAEA,@EAEAEA,@EAEAEAEAEAEA,expanded}
%D
-%D When in unprotected mode, to be entered with
-%D \type{\unprotect}, one can use \type{\@EA} as equivalent
+%D When in unprotected mode, to be entered with
+%D \type{\unprotect}, one can use \type{\@EA} as equivalent
%D of \type{\expandafter}.
-\let\@EA=\expandafter
+\let\@EA =\expandafter
+\def\@EAEA {\expandafter\expandafter}
+\def\@EAEAEA{\expandafter\expandafter\expandafter}
-%D Sometimes we pass macros as arguments to commands that
+\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 be enclosed with \type{\expanded}, like:
%D
%D \starttypen
-%D \expanded{\setupsomething[\alfa]}
+%D \expanded{\setupsomething[\alfa]}
%D \stoptypen
-%D
-%D Such situations occur for instance when \type{\alfa} is a
+%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.
+%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.
\let\@@expanded\empty
\long\def\expanded#1%
{\long\edef\@@expanded{\noexpand#1}\@@expanded}
-%D \macros
+%D \macros
%D {expandoneargafter,expandtwoargsafter}
%D
-%D These two commands make macros more readable by hiding a
+%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
@@ -335,13 +364,21 @@
%D \expandtwoargsafter\command{\abc}{\def}
%D \stoptypen
%D
-%D These commands expect the arguments to be macros.
+%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\expandoneargafter#1#2%
- {\@EA#1\@EA{#2}}
+\def\fullexpandoneargafter#1#2%
+ {\edef\@@expanded{\noexpand#1{#2}}\@@expanded}
-\def\expandtwoargsafter#1#2#3%
- {\@EA\@EA\@EA#1\@EA\@EA\@EA{\@EA#2\@EA}\@EA{#3}}
+\def\fullexpandtwoargsafter#1#2#3%
+ {\edef\@@expanded{\noexpand#1{#2}{#3}}\@@expanded}
%D \macros
%D {gobbleoneargument,gobble...arguments}
@@ -358,6 +395,7 @@
\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}
@@ -384,24 +422,35 @@
%D {\localnext} because we don't want clashes with \type
%D {\next}.
-\long\def\doifnextcharelse#1#2#3%
- {\let\charactertoken=#1%
- \def\!!stringa{#2}%
- \def\!!stringb{#3}%
- \futurelet\nexttoken\inspectnextcharacter}
+\long\def\doifnextcharelse#1#2#3% #1 should not be {} !
+ {\let\charactertoken=#1%
+ \def\!!stringa{#2}%
+ \def\!!stringb{#3}%
+ \futurelet\nexttoken\inspectnextcharacter}
+
+% \def\inspectnextcharacter%
+% {\ifx\nexttoken\blankspace
+% \let\localnext\reinspectnextcharacter
+% %\else\ifx\nexttoken\endoflinetoken
+% % \let\localnext\reinspectaftercharacter
+% \else\ifx\nexttoken\charactertoken
+% \let\localnext\!!stringa
+% \else
+% \let\localnext\!!stringb
+% \fi\fi%\fi
+% \localnext}
+%
+% faster ?
-\def\inspectnextcharacter%
+\def\inspectnextcharacter%
{\ifx\nexttoken\blankspace
- \let\localnext\reinspectnextcharacter
- %\else\ifx\nexttoken\endoflinetoken
- % \let\localnext\reinspectaftercharacter
+ \@EA\reinspectnextcharacter
\else\ifx\nexttoken\charactertoken
- \let\localnext\!!stringa
+ \@EAEAEA\!!stringa
\else
- \let\localnext\!!stringb
- \fi\fi%\fi
- \localnext}
-
+ \@EAEAEA\!!stringb
+ \fi\fi}
+
%\let\endoflinetoken=^^M
%
%\long\def\reinspectaftercharacter#1%
@@ -429,10 +478,10 @@
%D \stoptypen
%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.
+%D into this construction. Saving and restoring \type {\:} is
+%D needed when we use \PPCHTEX\ in \LATEX.
-\let\next\:
+\let\next\:
\def\:{\let\blankspace= } \:
@@ -467,37 +516,22 @@
%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\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\resetvalue #1{\expandafter\let\csname#1\endcsname\empty}
+\def\ignorevalue#1#2{\expandafter\let\csname#1\endcsname\empty}
-\def\letvalue#1%
- {\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 \macros
%D {globallet}
%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:
+%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}
@@ -517,22 +551,19 @@
%D \def\somecommand {\donottest\dosomecommand}
%D \stoptypen
%D
-%D This double definition can be made transparant by using
+%D This double definition can be made transparant by using
%D \type{\unexpanded}, as in:
-%D
+%D
%D \starttypen
%D \unexpanded\def\somecommand{... ... ...}
%D \stoptypen
-%D
+%D
%D The protection mechanism uses:
\beginTEX
-\def\dontprocesstest#1%
- {==}
-
-\def\doprocesstest#1%
- {#1}
+\def\dontprocesstest#1{==}
+\def\doprocesstest #1{#1}
\let\donottest=\doprocesstest
@@ -544,12 +575,12 @@
\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 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}
@@ -557,16 +588,16 @@
%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
%D \starttypen
%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 \stoptypen
-%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
+%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
@@ -589,7 +620,7 @@
\fi#1}%
\futurelet\next\dounexpanded}
-\def\honorunexpanded% for writing to a file or message
+\def\honorunexpanded% for writing to a file or message
{\def\donottest##1{\expandafter\gobblethreearguments\string##1}}
\def\forceunexpanded% for preventing expansion in \xdef
@@ -610,8 +641,8 @@
\endETEX
-%D This one accepts the more direct \type{\def} and cousins
-%D as well as the \CONTEXT\ specific \type{\setvalue} ones.
+%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
@@ -620,13 +651,13 @@
%D \def\somecommand{\donottest\csname do\somecommand\endcsname}
%D \stoptypen
%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 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 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,
@@ -653,24 +684,24 @@
%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 \type{\endcsname} and testing the \type{\name} directly.
+%D
%D \starttypen
%D \expandafter\ifx\csname NameA\endcsname\relax ... \else ... \fi
-%D
+%D
%D \ifx\NameB\undefined ... \else ... \fi
%D \stoptypen
-%D
+%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 the meaning of the names:
+%D
%D \starttypen
%D \expandafter\show\csname NameA\endcsname
-%D
+%D
%D \show\NameB
%D \stoptypen
%D
@@ -679,7 +710,7 @@
%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 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
@@ -736,7 +767,7 @@
{\let\donottest\dontprocesstest
\expandafter\ifx\csname#1\endcsname\relax}
-\def\doifundefinedelse#1#2#3%
+\def\doifundefinedelse#1#2#3%
{\p!doifundefined{#1}%
\let\donottest\doprocesstest#2%
\else
@@ -768,40 +799,56 @@
\beginETEX \ifcsname
-\def\ifundefined#1% ongelukkige naam
+\def\ifundefined#1% ongelukkige naam
{\unless\ifcsname#1\endcsname}
\def\p!doifundefined#1%
- {\edef\p!defined{#1}%
- \@EA\unless\@EA\ifcsname\@EA\detokenize\@EA{\p!defined}\endcsname}
+ {\edef\p!defined{#1}%
+ \unless\ifcsname\detokenize\@EA{\p!defined}\endcsname}
-\def\doifundefinedelse#1#2#3%
+\def\doifundefinedelse#1% % #2#3%
{\edef\p!defined{#1}%
- \@EA\ifcsname\@EA\detokenize\@EA{\p!defined}\endcsname#3\else#2\fi}
+ \ifcsname\detokenize\@EA{\p!defined}\endcsname % #3\else#2\fi}
+ \expandafter\secondoftwoarguments
+ \else
+ \expandafter\firstoftwoarguments
+ \fi}
-\def\doifdefinedelse#1#2#3%
+\def\doifdefinedelse#1% % #2#3%
{\edef\p!defined{#1}%
- \@EA\ifcsname\@EA\detokenize\@EA{\p!defined}\endcsname#2\else#3\fi}
+ \ifcsname\detokenize\@EA{\p!defined}\endcsname % #2\else#3\fi}
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
-\def\doifundefined#1#2%
+\def\doifundefined#1% % #2%
{\edef\p!defined{#1}%
- \@EA\ifcsname\@EA\detokenize\@EA{\p!defined}\endcsname\else#2\fi}
+ \ifcsname\detokenize\@EA{\p!defined}\endcsname % \else#2\fi}
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
-\def\doifdefined#1#2%
+\def\doifdefined#1% % #2%
{\edef\p!defined{#1}%
- \@EA\ifcsname\@EA\detokenize\@EA{\p!defined}\endcsname#2\fi}
+ \ifcsname\detokenize\@EA{\p!defined}\endcsname % #2\fi}
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
\endETEX
-%D \macros
+%D \macros
%D {letbeundefined}
-%D
+%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:
+%D is not the same as the one described here. Therefore we
+%D introduce:
\beginTEX
@@ -812,23 +859,23 @@
\beginETEX \undefined
-\def\letbeundefined#1%
+\def\letbeundefined#1% potential stack buildup when used \global
{\expandafter\let\csname#1\endcsname\undefined}
\endETEX
-%D Beware, being \type {\undefined} in \ETEX\ means that the macro
-%D {\em is} defined!
+%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 Before we start using this variant, we used another one,
+%D which is even a bit faster. This one looked like:
+%D
%D \starttypen
%D \def\p!doifundefined%
%D {\begingroup
%D \let\donottest=\dontprocesstest
%D \ifundefined}
-%D
+%D
%D \def\doifundefinedelse#1#2#3%
%D {\p!doifundefined{#1}%
%D \endgroup#2%
@@ -836,31 +883,31 @@
%D \endgroup#3%
%D \fi}
%D \stoptypen
-%D
-%D A even more previous version used \type{\bgroup} and
+%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 \starttypen
+%D from \type{$1x2$}. This can been seen when one compares the
+%D output of:
+%D
+%D \starttypen
%D $\kern10pt\showthe\lastkern$
%D $\kern10pt{\showthe\lastkern}$
%D $\kern10pt\begingroup\showthe\lastkern\endgroup$
%D \stoptypen
-%D
-%D Also in math mode, one can better use \type {\begingroup}
+%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
+%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
@@ -870,15 +917,17 @@
\donefalse
\fi}
-\def\doifalldefinedelse#1#2#3%
+\def\doifalldefinedelse#1% % #2#3%
{\begingroup
\let\donottest\dontprocesstest
\donetrue
\processcommalist[#1]\docheckonedefined
\ifdone
- \endgroup\let\donottest\doprocesstest#2%
+ \endgroup\let\donottest\doprocesstest
+ \expandafter\firstoftwoarguments % #2%
\else
- \endgroup\let\donottest\doprocesstest#3%
+ \endgroup\let\donottest\doprocesstest
+ \expandafter\secondoftwoarguments % #3%
\fi}
\endTEX
@@ -890,14 +939,13 @@
\donefalse
\fi}
-\def\doifalldefinedelse#1#2#3%
+\def\doifalldefinedelse#1% % #2#3%
{\begingroup
- \donetrue
- \processcommalist[#1]\docheckonedefined
+ \donetrue \processcommalist[#1]\docheckonedefined
\ifdone
- \endgroup#2%
+ \endgroup\expandafter\firstoftwoarguments % #2%
\else
- \endgroup#3%
+ \endgroup\expandafter\secondoftwoarguments % #3%
\fi}
\endETEX
@@ -990,11 +1038,37 @@
{\edef\!!stringa{#1}\edef\!!stringb{#2}%
\ifx\!!stringa\!!stringb#3\else#4\fi}
+% slightly faster on big arguments
+
+\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 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
@@ -1031,31 +1105,34 @@
%D
%D \starttypen
%D \doifempty {string} {...}
-%D \doifnot {string} {...}
+%D \doifnotempty {string} {...}
%D \doifemptyelse {string} {then ...} {else ...}
%D \stoptypen
%D
%D This time, the string is not expanded.
-\long\def\doifemptyelse#1#2#3%
+\long\def\doifemptyelse#1% % #2#3%
{\def\!!stringa{#1}%
- \ifx\!!stringa\empty
- #2%
+ \ifx\!!stringa\empty % #2\else#3\fi}
+ \expandafter\firstoftwoarguments
\else
- #3%
+ \expandafter\secondoftwoarguments
\fi}
-\long\def\doifempty#1#2%
+\long\def\doifempty#1% % #2%
{\def\!!stringa{#1}%
- \ifx\!!stringa\empty
- #2%
+ \ifx\!!stringa\empty % #2\fi}
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
\fi}
-\long\def\doifnotempty#1#2%
+\long\def\doifnotempty#1% % #2%
{\def\!!stringa{#1}%
- \ifx\!!stringa\empty
+ \ifx\!!stringa\empty % \else#2\fi}
+ \expandafter\gobbleoneargument
\else
- #2%
+ \expandafter\firstofoneargument
\fi}
%D \macros
@@ -1108,9 +1185,9 @@
% \donetrue
% \let\p!docheckiteminset\gobbleoneargument
% \fi}
-%
+%
% \beginTEX
-%
+%
% \def\p!doifinsetelse#1#2%
% {\let\donottest\dontprocesstest
% \donefalse
@@ -1122,11 +1199,11 @@
% \fi
% \let\donottest\doprocesstest
% \ifdone}
-%
+%
% \endTEX
-%
+%
% \beginETEX \protected
-%
+%
% \def\p!doifinsetelse#1#2%
% {\donefalse
% \edef\!!stringa{#1}%
@@ -1136,7 +1213,7 @@
% \processcommalist[#2]\p!docheckiteminset
% \fi
% \ifdone}
-%
+%
% \endETEX
\def\p!docheckiteminset#1%
@@ -1161,6 +1238,8 @@
\endTEX
+% can be sped up with processnext...
+
\beginETEX \protected
\def\p!doifinsetelse#1#2%
@@ -1174,14 +1253,26 @@
\endETEX
-\long\def\doifinsetelse#1#2#3#4%
- {\p!doifinsetelse{#1}{#2}#3\else#4\fi}
+\long\def\doifinsetelse#1#2% % #3#4%
+ {\p!doifinsetelse{#1}{#2}% % #3\else#4\fi}
+ \expandafter\firstoftwoarguments
+ \else
+ \expandafter\secondoftwoarguments
+ \fi}
-\long\def\doifinset#1#2#3%
- {\p!doifinsetelse{#1}{#2}#3\fi}
+\long\def\doifinset#1#2% % #3%
+ {\p!doifinsetelse{#1}{#2}% % #3\fi}
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
-\long\def\doifnotinset#1#2#3%
- {\p!doifinsetelse{#1}{#2}\else#3\fi}
+\long\def\doifnotinset#1#2% % #3%
+ {\p!doifinsetelse{#1}{#2}% % \else#3\fi}
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
%D \macros
%D {doifcommon,doifnotcommon,doifcommonelse}
@@ -1239,9 +1330,9 @@
% \let\p!docommoncheck\gobbleoneargument
% \let\p!dodocommoncheck\gobbleoneargument
% \fi}
-%
+%
% \beginTEX
-%
+%
% \def\p!doifcommonelse#1#2%
% {\donefalse
% \let\donottest\dontprocesstest
@@ -1253,11 +1344,11 @@
% \processcommalist[#1]\p!docommoncheck
% \let\donottest\doprocesstest
% \ifdone}
-%
+%
% \endTEX
-%
+%
% \beginETEX \protected
-%
+%
% \def\p!doifcommonelse#1#2%
% {\donefalse
% \let\p!dodocommoncheck\p!dododocommoncheck
@@ -1267,7 +1358,7 @@
% \processcommalist[#2]\p!dodocommoncheck}%
% \processcommalist[#1]\p!docommoncheck
% \ifdone}
-%
+%
% \endETEX
\def\p!dodocommoncheck#1%
@@ -1284,7 +1375,7 @@
\let\donottest\dontprocesstest
\def\p!docommoncheck##1%
{\edef\!!stringa{##1}%
- \def\commalistelement{##1}%
+ \def\commalistelement{##1}% no let to stringa
\processcommalist[#2]\p!dodocommoncheck}%
\processcommalist[#1]\p!docommoncheck
\let\donottest\doprocesstest
@@ -1305,14 +1396,26 @@
\endETEX
-\long\def\doifcommonelse#1#2#3#4%
- {\p!doifcommonelse{#1}{#2}#3\else#4\fi}
+\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#3%
- {\p!doifcommonelse{#1}{#2}#3\fi}
+\long\def\doifcommon#1#2% % #3%
+ {\p!doifcommonelse{#1}{#2}% % #3\fi}
+ \expandafter\firstofoneargument
+ \else
+ \expandafter\gobbleoneargument
+ \fi}
-\long\def\doifnotcommon#1#2#3%
- {\p!doifcommonelse{#1}{#2}\else#3\fi}
+\long\def\doifnotcommon#1#2% % #3%
+ {\p!doifcommonelse{#1}{#2}% % \else#3\fi}
+ \expandafter\gobbleoneargument
+ \else
+ \expandafter\firstofoneargument
+ \fi}
%D \macros
%D {processcommalist,processcommacommand,quitcommalist,
@@ -1326,9 +1429,9 @@
%D \stoptypen
%D
%D The user supplied command \type{\commando} receives one
-%D argument: the string. This command permits nesting and
+%D argument: the string. This command permits nesting and
%D spaces after commas are skipped. Empty sets are no problem.
-%D
+%D
%D \startbuffer
%D \def\dosomething#1{(#1)}
%D
@@ -1341,25 +1444,36 @@
%D 7: \processcommalist [] \dosomething \par
%D 8: \processcommalist [{[}] \dosomething \par
%D \stopbuffer
-%D
+%D
%D \typebuffer
%D
-%D Before we show the result, we present the macro's:
+%D Before we show the result, we present the macro's:
\newcount\commalevel
\def\dododoprocesscommaitem%
{\csname\s!next\the\commalevel\endcsname}
-\def\dodoprocesscommaitem%
+%\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
- \let\nextcommaitem\redoprocesscommaitem
+ \@EA\redoprocesscommaitem
\else\ifx\nexttoken]%
- \let\nextcommaitem\gobbleoneargument
+ \@EAEAEA\gobbleoneargument
\else
- \let\nextcommaitem\dododoprocesscommaitem
- \fi\fi
- \nextcommaitem}
+ \@EAEAEA\dododoprocesscommaitem
+ \fi\fi}
\def\doprocesscommaitem%
{\futurelet\nexttoken\dodoprocesscommaitem}
@@ -1367,8 +1481,8 @@
%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 \starttypen
+%D
+%D \starttypen
%D \def\processcommalist[%
%D {\futurelet\nexttoken\docheckcommaitem}
%D
@@ -1388,20 +1502,20 @@
%D {#3{##1}\doprocesscommaitem}%
%D \doprocesscommaitem{#1}#2,]\relax
%D \global\advance\commalevel -1 }
-%D
+%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 \stoptypen
-%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.
+%D \stoptypen
+%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}
@@ -1412,14 +1526,14 @@
\else
\expandafter\doprocesscommalist
\fi
- \relax} % this one preserved the next {}
+ \relax} % this one preserved the next {}
\def\doprocesscommalist#1]#2%
- {\global\advance\commalevel 1
+ {\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 -1 }
+ \global\advance\commalevel \minusone }
%D One way of quitting a commalist halfway is:
@@ -1436,7 +1550,7 @@
{\let\doprocesscommaitem\doquitcommalist}
%D The hack we used for checking the next character
-%D \type {\doifnextcharelse} is also used here.
+%D \type {\doifnextcharelse} is also used here.
\def\:{\redoprocesscommaitem}
@@ -1474,13 +1588,6 @@
%D Commands that are part of the list are expanded, so the
%D use of this macro has its limits.
-% why the \toks0? still needed?
-%
-% \def\processcommacommand[#1]%
-% {\edef\commacommand{#1}%
-% \toks0=\expandafter{\expandafter[\commacommand]}%
-% \expandafter\processcommalist\the\toks0 }
-
\def\processcommacommand[#1]%
{\expanded{\processcommalist[#1]}}
@@ -1529,7 +1636,7 @@
%D default=>\default,
%D unknown=>\unknown{... \commalistelement ...}]
%D \stoptypen
-%D
+%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,
@@ -1539,8 +1646,8 @@
%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 \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,
@@ -1621,7 +1728,7 @@
%D \advance\processlevel by -1 }}
%D \stoptypen
%D
-%D The gain of speed in the (again) next implementation is
+%D The gain of speed in the (again) next implementation is
%D around 20\%, depending on the application.
\newcount\processlevel
@@ -1642,12 +1749,12 @@
% \else
% \edef\!!stringb{#1}%
% \ifx\!!stringb\s!unknown
-% \def\commalistelement{#3}% beware of loops
+% \def\commalistelement{#3}% beware of loops
% #2%
% \fi
% \fi}
-% met \quitcommalist tot meer dan 25\% sneller
+% met \quitcommalist tot meer dan 25\% sneller
\def\p!compareprocessactionB[#1=>#2][#3]%
{\expandedaction\!!stringb{#1}%
@@ -1658,7 +1765,7 @@
\else
\edef\!!stringb{#1}%
\ifx\!!stringb\s!unknown
- \def\commalistelement{#3}% beware of loops
+ \def\commalistelement{#3}% beware of loops
#2%
\fi
\fi}
@@ -1683,7 +1790,7 @@
\beginETEX \protected
-\def\processaction[#1]#2[#3]%
+\def\processaction[#1]#2[#3]% faster version follows
{\expandedaction\!!stringa{#1}%
\ifx\!!stringa\empty
\let\p!compareprocessaction\p!compareprocessactionA
@@ -1728,7 +1835,7 @@
\fi
\fi}
-\def\processfirstactioninset[#1]#2[#3]%
+\def\processfirstactioninset[#1]#2[#3]% faster version follows
{\expandedaction\!!stringa{#1}%
\ifx\!!stringa\empty
\processaction[][#3]%
@@ -1774,44 +1881,132 @@
\def\doprocessallactionsinset%
{\csname\s!do\the\processlevel\endcsname}
-\def\processallactionsinset[#1]#2[#3]%
+\def\processallactionsinset[#1]#2[#3]% faster version follows
{\expandedaction\!!stringa{#1}%
\ifx\!!stringa\empty
\processaction[][#3]%
\else
- \advance\processlevel 1
+ \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 -1
- \fi
+ \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 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:
+%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:
+%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.
+%D But when needed we convert the strings to meaningful
+%D sequences of characters.
\def\unexpandedaction#1>{}
@@ -1887,62 +2082,143 @@
%D #3%
%D \fi}
%D \stoptypen
-%D
+%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:
+%D \TEX\ runs. So finally the definition became:
-\long\def\doifinstringelse#1#2#3#4%
- {\edef\@@@instring{#1}% expand #1 here
- \@EA\p!doifinstringelse\@EA{\@@@instring}{#2}%
- #3%
+\long\def\doifinstringelse#1%
+ {\edef\@@@instring{#1}% expand #1 here
+ \ifx\@@@instring\empty
+ \@EA\thirdofthreearguments
\else
- #4%
+ \@EA\dodoifinstringelse
\fi}
-\beginTEX
+\long\def\dodoifinstringelse#1%
+ {\p!doifinstringelse\@@@instring{#1}%
+ \@EA\firstoftwoarguments
+ \else
+ \@EA\secondoftwoarguments
+ \fi}
-\long\def\p!doifinstringelse#1#2%
- {\long\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}} % expand #2 here
+\long\def\doifinstring#1%%
+ {\edef\@@@instring{#1}% expand #1 here
+ \ifx\@@@instring\empty
+ \@EA\gobbletwoarguments
+ \else
+ \@EA\dodoifinstring
+ \fi}
-\endTEX
+\long\def\dodoifinstring#1%
+ {\p!doifinstringelse\@@@instring{#1}%
+ \@EA\firstofoneargument
+ \else
+ \@EA\gobbleoneargument
+ \fi}
-\beginETEX \unless
+%D \starttypen
+%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 \stoptypen
+%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
-\long\def\p!doifinstringelse#1#2%
- {\long\def\pp!doifinstringelse##1#1##2##3\war%
+\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@@\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 (expanded) strings is much slower that passing a macro.
%D
%D \starttypen
%D \doifincsnameelse {substring} {\string} {then ...} {else ...}
%D \stoptypen
-%D
-%D Where \type{\doifinstringelse} does as much expansion as
-%D possible, the latter alternative does minimal (one level)
-%D expansion.
+%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%
- {\csname\if##2@iffalse\else iftrue\fi\endcsname}%
+ {\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%
+\endETEX
+
+\long\def\doifincsnameelse#1#2% % #3#4%
{\edef\@@@instring{#1}%
- \@EA\p!doifincsnameelse\@EA{\@@@instring}{#2}%
- #3%
+ \@EA\p!doifincsnameelse\@EA{\@@@instring}{#2}% % #3\else#4\fi}
+ \expandafter\firstoftwoarguments
\else
- #4%
+ \expandafter\secondoftwoarguments
\fi}
%D \macros
@@ -1951,24 +2227,39 @@
%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 \type{\if}||ladder or some tricky \type{\lcode} checking.
%D
%D \starttypen
%D \doifnumberelse {string} {then ...} {else ...}
%D \stoptypen
%D
%D The macro accepts \type{123}, \type{abc}, \type{{}},
-%D \type{\getal} and \type{\the\count...}. This macro is a
+%D \type{\getal} and \type{\the\count...}. This macro is a
%D rather dirty one.
-
-\long\def\doifnumberelse#1#2#3%
- {\begingroup\donefalse
- \ifcase1#1\or\or\or\or\or\or\or\or\or\else\donetrue\fi
- \ifdone\endgroup#2\else\endgroup#3\fi}
-
-%D The previous implementation was:
+%D
+%D \starttypen
+%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 \stoptypen
+%D
+%D Or better:
%D
%D \starttypen
+%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 \stoptypen
+%D
+%D A previous implementation was:
+%D
+%D \starttypen
%D \long\def\doifnumberelse#1#2#3%
%D {\getfirstcharacter{#1}%
%D \@EA\p!doifinstringelse\@EA{\firstcharacter}{1234567890}%
@@ -1977,8 +2268,9 @@
%D #3%
%D \fi}
%D \starttypen
-%D
-%D Before we had \type{\p!doifinstringelse} available, we used:
+%D
+%D And before we had \type{\p!doifinstringelse} available, we
+%D used:
%D
%D \starttypen
%D \def\doifnumberelse#1%
@@ -1986,19 +2278,32 @@
%D \rawdoifinsetelse{\firstcharacter}{1,2,3,4,5,6,7,8,9,0}}
%D \stoptypen
%D
-%D The current implementation is much faster, but the next
-%D one is not, not even when testing milion calls.
-%D
-%D \starttypen
+%D The implementation using \type {\ifcase} is much faster, but
+%D the next one is not, not even when testing milion calls.
+%D
+%D \starttypen
%D \newif\ifitsanumber
-%D
+%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
%D \long\def\doifnumberelse#1#2#3%
%D {\isitanumber{#1}\ifitsanumber#2\else#3\fi}
-%D \stoptypen
+%D \stoptypen
+%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%
+ {\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,
@@ -2012,7 +2317,7 @@
%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 \type{\rawprocesscommalist}, because this macro does not
%D compare anything. Expandable macros are permitted as search
%D string.
%D
@@ -2024,9 +2329,9 @@
%D \stoptypen
%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 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
@@ -2042,11 +2347,17 @@
%D
%D But we prefer:
-\def\makerawcommalist[#1]#2%
- {\def\appendtocommalist##1%
- {\edef#2{##1}\def\appendtocommalist####1{\edef#2{#2,####1}}}%
+% \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]\appendtocommalist}
+ \processcommalist[#1]\domakerawcommalist}
\def\rawprocesscommaitem#1,%
{\if]#1\else
@@ -2054,14 +2365,51 @@
\expandafter\rawprocesscommaitem
\fi}
-\def\rawprocesscommalist[#1]#2%
- {\global\advance\commalevel 1
+\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 -1 }
+ \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}
-\def\rawdoifinsetelse#1#2%
- {\doifinstringelse{,#1,}{,#2,}}
+%D Some more raw material:
\def\p!rawprocessaction[#1][#2]%
{\def\pp!rawprocessaction##1,#1=>##2,##3\war%
@@ -2072,7 +2420,7 @@
\def\rawprocessaction[#1]#2[#3]%
{\edef\!!stringa{#1}%
- \edef\!!stringb{undefined}% better \!!undefined
+ \edef\!!stringb{undefined}% better \!!undefined
\let\!!processaction\!!stringb
\ifx\!!stringa\empty
\@EA\p!rawprocessaction\@EA[\s!default][#3]%
@@ -2094,19 +2442,19 @@
% {\rawprocessaction[##1][#3]}%
% \processcommalist[#1]\docommando}
-%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 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 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 \starttypen
% %D \processunexpandedcommalist
@@ -2114,8 +2462,8 @@
% %D \handleitem
% %D \stoptypen
% %D
-% %D This time nesting is not supported.
-%
+% %D This time nesting is not supported.
+%
% %\def\processunexpandedcommaitem#1,%
% % {\if]\noexpand#1%
% % \let\nextcommaitem\relax
@@ -2126,19 +2474,19 @@
% \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:
-%
+%
+% %D Or faster:
+%
% \def\processunexpandedcommaitem#1,%
% {\if]\noexpand#1\else
% \handleunexpandedcommaitem{#1}%
@@ -2191,7 +2539,7 @@
%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 how are these assignments done.
%D
%D Assignments can be realized with:
%D
@@ -2214,7 +2562,7 @@
%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.
+%D on, when a more advanced message mechanism is implemented.
\def\showassignerror#1#2%
{\writestatus{setup}{missing '=' after '#1' in line #2}}
@@ -2329,21 +2677,14 @@
{\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}
+\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:
+%D This one is slightly faster:
\def\dogetparameters#1[#2]#3[#4%
{\if\noexpand#4]%
@@ -2356,6 +2697,44 @@
\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}
+
+%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\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@}
+
%D \macros
%D {getemptyparameters}
%D
@@ -2377,8 +2756,8 @@
%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 standard command for ruled boxes. Is situations like this
+%D we can use:
%D
%D \starttypen
%D \copyparameters [to-label] [from-label] [name1,name2,...]
@@ -2428,7 +2807,7 @@
%D \doifassignmentelse {...} {then ...} {else ...}
%D \stoptypen
-% not robust
+% not robust
%
% \def\doifassignmentelse%
% {\doifinstringelse{=}}
@@ -2492,32 +2871,32 @@
\def\commalistsize{0}
\def\p!dogetcommalistsize#1%
- {\advance\commalistcounter 1 }
+ {\advance\commalistcounter\plusone}
\def\getcommalistsize[#1]%
- {\commalistcounter=0
+ {\commalistcounter\zerocount
\processcommalist[#1]\p!dogetcommalistsize % was [{#1}]
\edef\commalistsize{\the\commalistcounter}}
\def\getcommacommandsize[#1]%
{\edef\commacommand{#1}%
- \toks0=\expandafter{\expandafter[\commacommand]}%
- \expandafter\getcommalistsize\the\toks0 }
+ \scratchtoks\expandafter{\expandafter[\commacommand]}%
+ \expandafter\getcommalistsize\the\scratchtoks }
-% to be tested first
+% to be tested first
%
% \def\getcommacommandsize[#1]%
% {\expanded{\getcommalistsize[#1]}}
% \def\p!dogetfromcommalist#1%
-% {\advance\commalistcounter -1
+% {\advance\commalistcounter \minusone
% \ifcase\commalistcounter
% \def\commalistelement{#1}%
% \begingroup\def\doprocesscommaitem##1]{\endgroup}%
% \fi}
\def\p!dogetfromcommalist#1%
- {\advance\commalistcounter -1
+ {\advance\commalistcounter \minusone
\ifcase\commalistcounter
\def\commalistelement{#1}%
\expandafter\quitcommalist
@@ -2533,41 +2912,41 @@
% \toks0=\expandafter{\expandafter[\commacommand]}%
% \expandafter\getfromcommalist\the\toks0 }
-\def\getfromcommacommand[#1]%
+\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 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 \starttypen
%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
+%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 \p!dogetfirstfromcommalist[#1,]%
%D \or
-%D \p!dogetsecondfromcommalist[#1,,]%
+%D \p!dogetsecondfromcommalist[#1,,]%
%D \else
%D \p!dogetotherfromcommalist[#1][#3]%
%D \fi}
%D \stoptypen
%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 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 to the handling of braces during parameters passing and
+%D scanning. Nevertheless:
+%D
%D \startbuffer
%D \def\dosomething#1{(#1=\commalistsize) }
-%D
+%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
@@ -2578,18 +2957,18 @@
%D \getcommalistsize [{[}] \dosomething 1
%D \stopbuffer
%D
-%D \typebuffer
+%D \typebuffer
+%D
+%D reports:
%D
-%D reports:
-%D
%D \haalbuffer
%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
+%D For low level (fast) purposes, we can also use the next
+%D alternative, which can handle 8~elements at most.
+%D
%D \starttypen
%D \dogetcommalistelement1\from a,b,c\to\commalistelement
%D \stoptypen
@@ -2617,7 +2996,7 @@
%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 arguments. Forgive me the funny names.
%D
%D \starttypen
%D \dosingleargument\commando = \commando[#1]
@@ -2660,7 +3039,7 @@
%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 us to do some checking, we reimplemented the non||empty
%D ones.
\def\dosingleargument {\chardef\expectedarguments 1 \dosingleempty }
@@ -2751,7 +3130,7 @@
% {\noshowargumenterror#3\dodogetargument}
% {\doshowargumenterror#4\dodogetargument#1#2}}
%
-% faster ?
+% faster ?
\long\def\dogetargument#1#2#3#4%
{\let\charactertoken=#1%
@@ -2955,6 +3334,56 @@
\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
+ \doifnextcharelse[%
+ {\firstargumenttrue#1}
+ {\dosinglefakeempty#1}}
+
+\def\dodoubleempty#1%
+ {\noshowargumenterror % \relax % prevents lookahead, brr
+ \doifnextcharelse[%
+ {\dodoubletestempty#1}
+ {\dodoublefakeempty#1}}
+
+\def\dotripleempty#1%
+ {\noshowargumenterror % \relax % prevents lookahead, brr
+ \doifnextcharelse[%
+ {\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
+ \doifnextcharelse[%
+ {\secondargumenttrue #1[{#2}]}
+ {\secondargumentfalse#1[{#2}][]}}
+
+\long\def\dotripletestempty#1[#2]%
+ {\firstargumenttrue
+ \doifnextcharelse[%
+ {\dotripletestemptyx #1[{#2}]}
+ {\secondargumentfalse
+ \thirdargumentfalse #1[{#2}][][]}}
+
+\long\def\dotripletestemptyx#1[#2][#3]%
+ {\secondargumenttrue
+ \doifnextcharelse[%
+ {\thirdargumenttrue #1[{#2}][{#3}]}
+ {\thirdargumentfalse#1[{#2}][{#3}][]}}
+
%D \macros
%D {dosingleargumentwithset,
%D dodoubleargumentwithset,dodoubleemptywithset,
@@ -3029,6 +3458,21 @@
{\dotriplewithset\dotripleargument}
%D \macros
+%D {strippedcsname}
+%D
+%D The next macro can be very useful when using \type{\csname}
+%D like in:
+%D
+%D \starttypen
+%D \csname if\strippedcsname\something\endcsname
+%D \stoptypen
+%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
@@ -3045,7 +3489,7 @@
%D \complexcommand [setup]
%D \stoptypen
%D
-%D executes, else we get
+%D executes, else we get
%D
%D \starttypen
%D \simplecommand
@@ -3057,67 +3501,118 @@
%D \complexorsimpleempty {command}
%D \stoptypen
%D
-%D Depending on the presence of \type{[setup]}, this one
-%D leads to one of:
+%D Depending on the presence of \type{[setup]}, this one
+%D leads to one of:
%D
%D \starttypen
%D \complexcommando [setup]
%D \complexcommando []
%D \stoptypen
%D
-%D Many \CONTEXT\ commands started as complex or simple ones,
+%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.
+%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%
- {\setnameofcommand{#1}%
- \doifnextcharelse{[}
- {\firstargumenttrue \getvalue{\s!complex\nameofcommand}}
- {\firstargumentfalse\getvalue{\s!simple \nameofcommand}}}
+ {% \relax % prevents lookahead, brrr
+ \doifnextcharelse[%
+ {\firstargumenttrue \csname\s!complex\strippedcsname#1\endcsname}
+ {\firstargumentfalse\csname\s!simple \strippedcsname#1\endcsname}}
\def\complexorsimpleempty#1%
- {\setnameofcommand{#1}%
- \doifnextcharelse{[}
- {\firstargumenttrue \getvalue{\s!complex\nameofcommand}}
- {\firstargumentfalse\getvalue{\s!complex\nameofcommand}[]}}
-
-\def\setnameofcommand#1%
- {\begingroup
- \escapechar=-1
- \globaldefs=0 % pretty important!
- \xdef\nameofcommand{\string#1}%
- \endgroup}
+ {% \relax % prevents lookahead, brrr
+ \doifnextcharelse[%
+ {\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.
+%D in protection.
-\beginTEX
+% 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..}.
-\def\definewithnameofcommand#1#2%
- {\setnameofcommand{#2}%
- \@EA\def\@EA#2\@EA{\@EA\donottest\@EA#1\@EA{\nameofcommand}}}
+% \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
-\def\definecomplexorsimple%
- {\definewithnameofcommand\complexorsimple}
+% However, since this one uses an idirect method, things go
+% okay (at the cost of extra macros).
-\def\definecomplexorsimpleempty%
- {\definewithnameofcommand\complexorsimpleempty}
+% \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
-\endTEX
+\def\docomplexorsimple#1#2%
+ {\doifnextcharelse[{\firstargumenttrue#1}{\firstargumentfalse#2}}
-\beginETEX \protected
+\def\docomplexorsimpleempty#1%
+ {\doifnextcharelse[{\firstargumenttrue#1}{\firstargumentfalse#1[]}}
\def\definecomplexorsimple#1%
- {\normalprotected\def#1{\complexorsimple#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%
- {\normalprotected\def#1{\complexorsimpleempty#1}}
-
-\endETEX
+ {\unexpanded\edef#1%
+ {\noexpand\docomplexorsimpleempty
+ \@EA\noexpand\csname\s!complex\strippedcsname#1\endcsname}}
%D These commands are called as:
%D
@@ -3137,45 +3632,45 @@
%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 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 We won't go into details here, but the general form of
+%D this using this command is:
%D
%D \starttypen
%D \definestartstopcommand\somecommand\e!specifier{arg}{arg}%
-%D {do something with arg}
+%D {do something with arg}
%D \stoptypen
%D
%D This expands to something like:
%D
%D \starttypen
%D \def\somecommand arg \startspecifier arg \stopspecifier%
-%D {do something with arg}
+%D {do something with arg}
%D \stoptypen
%D
-%D The arguments can be anything reasonable, but double
+%D The arguments can be anything reasonable, but double
%D \type{#}'s are needed in the specification part, like:
%D
%D \starttypen
%D \definestartstopcommand\somecommand\e!specifier{[##1][##2]}{##3}%
-%D {do #1 something #2 with #3 arg}
+%D {do #1 something #2 with #3 arg}
%D \stoptypen
%D
-%D which becomes:
+%D which becomes:
%D
%D \starttypen
%D \def\somecommand[#1][#2]\startspecifier#3\stopspecifier%
-%D {do #1 something #2 with #3 arg}
+%D {do #1 something #2 with #3 arg}
%D \stoptypen
%D
-%D We will see some real applications of this command in the
-%D core modules.
+%D We will see some real applications of this command in the
+%D core modules.
-\def\definestartstopcommand#1#2#3#4%
+\def\definestartstopcommand#1#2#3#4% can be done with \expanded
{\def\!stringa{#3}%
\def\!stringb{\e!start#2}%
\def\!stringc{#4}%
@@ -3191,11 +3686,11 @@
%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
+%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 \starttypen
%D \dosinglegroupempty \ineedONEargument
%D \dodoublegroupempty \ineedTWOarguments
@@ -3203,15 +3698,15 @@
%D \doquadruplegroupempty \ineedFOURarguments
%D \doquintuplegroupempty \ineedFIVEarguments
%D \stoptypen
-%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
+%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 \starttypen
%D \def\dogetgroupargument#1#2% redefined in mult-ini
%D {\def\nextnextargument%
-%D {\ifx\nextargument\bgroup
+%D {\ifx\nextargument\bgroup
%D \let\expectedarguments\noexpectedarguments
%D \def\nextargument{#1\dodogetargument}%
%D %\else\ifx\nextargument\lineending % this can be an option
@@ -3230,11 +3725,11 @@
%D \fi%\fi\fi % so let's get rid of it
%D \nextargument}%
%D \futurelet\nextargument\nextnextargument}
-%D \stoptypen
+%D \stoptypen
%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.
+%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.
\let\normalif \if
\let\normalifx \ifx
@@ -3243,6 +3738,8 @@
\let\normalifcat \ifcat
\let\normalifcase \ifcase
\let\normalifcsname \ifcsname
+\let\normalifhmode \ifhmode
+\let\normalifvmode \ifvmode
\let\normalor \or
\let\normalelse \else
\let\normalfi \fi
@@ -3263,8 +3760,8 @@
\let\endrobusttest\endgroup
% \def\dogetgroupargument#1#2%
-% {\def\nextnextargument%
-% {\normalifx\nextargument\bgroup
+% {\def\nextnextargument%
+% {\normalifx\nextargument\bgroup
% \endrobusttest
% \let\expectedarguments\noexpectedarguments
% \def\nextargument{#1\dodogetargument}%
@@ -3285,8 +3782,8 @@
% \futurelet\nextargument\nextnextargument}
% \def\dogetgroupargument#1#2%
-% {\def\nextnextargument%
-% {\normalifx\nextargument\bgroup
+% {\def\nextnextargument%
+% {\normalifx\nextargument\bgroup
% \endrobusttest
% \noshowargumenterror
% \def\nextargument{#1\dodogetargument}%
@@ -3325,7 +3822,7 @@
\endrobusttest
\def\nextargument{\begingroup\def\\ {\endgroup\dogetgroupargument#1#2}\\}%
\normalelse
- \endrobusttest
+ \endrobusttest
\doshowargumenterror
\def\nextargument{#2\dodogetargument{}}%
\normalfi\normalfi
@@ -3370,7 +3867,7 @@
{\def\dodogetargument%
{\dontpermitspacesbetweengroups
#1{##1}{####1}{########1}}%
- \dogetgroupargument\fourthargumenttrue\fourthargumentfalse}%
+ \dogetgroupargument\fourthargumenttrue\fourthargumentfalse}%
\dogetgroupargument\thirdargumenttrue\thirdargumentfalse}%
\dogetgroupargument\secondargumenttrue\secondargumentfalse}%
\dogetgroupargument\firstargumenttrue\firstargumentfalse}
@@ -3383,31 +3880,51 @@
{\def\dodogetargument%
{\dontpermitspacesbetweengroups
#1{##1}{####1}{########1}{################1}}%
- \dogetgroupargument\fifthargumenttrue\fifthargumentfalse}%
- \dogetgroupargument\fourthargumenttrue\fourthargumentfalse}%
+ \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 These macros can explictly take care of spaces, which means
%D that the next definition and calls are valid:
-%D
+%D
%D \starttypen
%D \def\test#1#2#3{[#1#2#3]}
-%D
+%D
%D \dotriplegroupempty\test {a}{b}{c}
-%D \dotriplegroupempty\test {a}{b}
+%D \dotriplegroupempty\test {a}{b}
%D \dotriplegroupempty\test {a}
-%D \dotriplegroupempty\test
+%D \dotriplegroupempty\test
%D \dotriplegroupempty\test {a} {b} {c}
-%D \dotriplegroupempty\test {a} {b}
-%D \dotriplegroupempty\test
-%D {a}
-%D {b}
+%D \dotriplegroupempty\test {a} {b}
+%D \dotriplegroupempty\test
+%D {a}
+%D {b}
%D \stoptypen
%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\firstofthreearguments #1#2#3{#1}
+\long\def\firstoffourarguments #1#2#3#4{#1}
+\long\def\secondoftwoarguments #1#2{#2}
+\long\def\secondofthreearguments #1#2#3{#2}
+\long\def\secondoffourarguments #1#2#3#4{#2}
+\long\def\thirdofthreearguments #1#2#3{#3}
+\long\def\thirdoffourarguments #1#2#3#4{#3}
+\long\def\fourthoffourarguments #1#2#3#4{#4}
+
%D \macros
%D {wait}
%D
@@ -3440,13 +3957,13 @@
%D \type{\statuswidth}.
% \chardef\statuswidth=15
-%
+%
% \def\writestring%
% {\immediate\write16}
-%
+%
% \def\writeline%
% {\writestring{}}
-%
+%
% \def\dosplitstatus#1#2\end%
% {\ifx#1?%
% \loop
@@ -3461,7 +3978,7 @@
% \fi
% \dosplitstatus#2\end
% \fi}
-%
+%
% \def\writestatus#1#2%
% {\begingroup
% \let\messagecontentA=\empty
@@ -3483,11 +4000,11 @@
\newcount\statuscounter
\def\dosplitstatus#1%
- {\advance\statuscounter -1
+ {\advance\statuscounter \minusone
\ifcase\statuscounter
\expandafter\nosplitstatus
\else
- \@EA\scratchtoks\@EA{\the\scratchtoks#1}%
+ \scratchtoks\@EA{\the\scratchtoks#1}%
\expandafter\dosplitstatus
\fi}
@@ -3502,19 +4019,20 @@
\space\space\space\space\space\space\space
\space\space\space\space\space\space\space
\space\space\space\space\space\space\end
- \expanded{\writestring{\the\scratchtoks\space:\space#2}}%
+ %\expanded{\writestring{\the\scratchtoks\space:\space#2}}%
+ \@EA\writestring\@EA{\the\scratchtoks\space:\space#2}%
\endgroup}
-%D The next implementation saves only some 10 words of format
+%D The next implementation saves only some 10 words of format
%D memory, but we hardly gain any speed.
%D
-%D \starttypen
+%D \starttypen
%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
%D \def\writestatus#1#2%
%D {\writestring
%D {\expandafter\dosplitstatus#1%
@@ -3527,7 +4045,7 @@
%D \macros
%D {emptytoks}
%D
-%D For this we need an empty token register, analogous
+%D For this we need an empty token register, analogous
%D to \type {\empty}.
\newtoks\emptytoks
@@ -3552,7 +4070,7 @@
\writestatus{loading}{Context System Macros / General}
-%D Well, the real final command is the one that resets the
+%D Well, the real final command is the one that resets the
%D unprotected characters \type{@}, \type{?} and \type{!}.
\protect
diff --git a/tex/context/base/syst-new.tex b/tex/context/base/syst-new.tex
index 3d3bee72f..eec5d6f6c 100644
--- a/tex/context/base/syst-new.tex
+++ b/tex/context/base/syst-new.tex
@@ -11,18 +11,109 @@
%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
+
+% For myself
+
+\newcount\nofprofiled
+
+\def\profilemacro#1%
+ {\nofprofiled=0
+ \letvalue{\string#1\string#1}#1%
+ \appendtoks
+ \writestatus{\m!systems}{profile \string#1: \number\nofprofiled}%
+ \to \everystoptext
+ \unexpanded\def#1%
+ {\global\advance\nofprofiled\plusone
+ \csname\string#1\string#1\endcsname}}
+
+% 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
+
+\dostepwiserecurse{0}{255}{1}
+ {\@EA\chardef\csname-\recurselevel\endcsname\recurselevel}
+
+\newtoks\withminorcharacters
+\newtoks\withlowercharacters
+\newtoks\withuppercharacters
+
+% \thewithcharacter#1 % self
+
+\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}}
+
+\def\doassigncatcodes#1%
+ {\def\withcharacter##1{\catcode##1#1}%
+ \the\withminorcharacters
+ \the\withlowercharacters
+ \ifeightbitcharacters\the\withuppercharacters\fi}
+
+\def\makeallother%
+ {\doassigncatcodes\@@other}
+
+\chardef\obeyedlccode=`. % so <32 and >127 chars become .
+
+%\def\obeylccodes%
+% {\def\withcharacter##1{\lccode##1##1}%
+% \the\withlowercharacters
+% \def\withcharacter##1{\lccode##1\obeyedlccode}%
+% \the\withminorcharacters
+% \ifeightbitcharacters\the\withuppercharacters\fi}
+
+\def\setownlccode #1{\lccode#1#1}
+\def\setobeyedlccode#1{\lccode#1\obeyedlccode}
+
+\def\obeylccodes%
+ {\let\withcharacter\setownlccode
+ \the\withlowercharacters
+ \let\withcharacter\setobeyedlccode
+ \the\withminorcharacters
+ \ifeightbitcharacters\the\withuppercharacters\fi}
\def\unspaced#1%
{\dounspaced#1\end}
\def\dounspaced#1%
{\ifx#1\end
- \else\ifx#1\blankspace
- \@EA\@EA\@EA\dounspaced
+ \@EA\gobbleoneargument
\else
- #1\@EA\@EA\@EA\dounspaced
- \fi\fi}
+ \ifx#1\blankspace\else#1\fi
+ \fi
+ \dounspaced}
\def\unspaceargument#1\to#2%
{\convertargument#1\to#2%
@@ -30,10 +121,53 @@
\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}}
+
+% this will replace loadfile once and alike !!! todo
+
+\def\@flg@{@flg@}
+
+\def\setflag#1%
+ {\@EA\dodoglobal\@EA\chardef\csname\@flg@#1\endcsname=0 }
+
+\def\resetflag#1%
+ {\@EA\dodoglobal\@EA\chardef\csname\@flg@#1\endcsname=1 }
+
+\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\@EA\@EA\def\@EA\csname\@EA#1\@EA#3\@EA
- \endcsname\@EA{\csname#1#5\endcsname}}
+ {\@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}
@@ -89,14 +223,14 @@
% here ?
\def\dosetrawvalue#1#2#3%
- {\setvalue{#1#2}{#3}}
+ {\@EA\def\csname#1#2\endcsname{#3}}
\def\getrawparameters%
{\dogetparameters\dosetrawvalue}
\def\splitskip#1%
- {\scratchskip=0pt plus 1pt minus 1pt
- \advance\scratchskip by #1
+ {\scratchskip\zeropoint \!!plus 1pt \!!minus 1pt
+ \advance\scratchskip#1\relax % \relax is realy needed here
\expandafter\SPLITSKIP\the\scratchskip}
{\catcode`\.=\@@other
@@ -113,8 +247,8 @@
\def\DOSPLITSKIP#1 #2 #3
{\dimen0=#1pt\dimen2=#2pt\dimen4=#3pt
- \advance\dimen2 by -1pt%
- \advance\dimen4 by -1pt}
+ \advance\dimen2 -1pt%
+ \advance\dimen4 -1pt}
% \def\minimaxskip#1#2%
% {\splitskip#2\relax
@@ -140,15 +274,11 @@
\newcount\modcounter
\def\DoMod #1by#2to#3%
- {\modcounter=#1\relax
- \divide\modcounter by #2\relax
- \multiply\modcounter by #2\relax
- #3=#1\relax
- \advance#3 by -\modcounter}
+ {\modcounter#1\divide\modcounter#2\multiply\modcounter#2%
+ #3#1\advance#3 -\modcounter}
\def\DoDiv #1by#2to#3%
- {#3=#1\relax
- \divide#3 by #2\relax}
+ {#3#1\divide#3 #2\relax}
\def\dounprotected#1\par%
{#1\protect}
@@ -209,18 +339,21 @@
\newcount\featuretest
\def\testfeature#1#2%
- {\def\dotestfeature%
+ {\def\dotestfeature
{\advance\featuretest 1
\ifnum\featuretest<#1\relax#2\expandafter\dotestfeature\fi}%
\retestfeature}
-\def\retestfeature%
+\def\retestfeature
{\bgroup
\ifcase\interactionmode\let\wait\relax\fi
\message{starting feature test}\wait
\featuretest=-1 \dotestfeature
\message{feature test done}\wait
\egroup}
+
+\def\testfeatureonce#1#2%
+ {\let\wait\relax\testfeature{#1}{#2}\end}
%D \macros
%D {adddimenregister,adddimenmacro}
@@ -267,6 +400,12 @@
\def\freezedimenmacro#1%
{\scratchdimen#1\edef#1{\the\scratchdimen}}
+%D The next one is slower:
+%D
+%D \starttypen
+%D \def\freezedimenmacro#1{\edef#1{\the\dimexpr(#1)}}
+%D \stoptypen
+
% \newcount\rawrecursecounter
%
% \def\rawrecurselevel{\the\rawrecursecounter}%
@@ -346,6 +485,23 @@
\let\donothing\empty
-\protect
+% The following macros are used in XML handling.
+
+\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\unstringnothing}
-\endinput
+\def\unstringdouble"#1"{#1}
+\def\unstringsingle'#1'{#1}
+\def\unstringspaced #1 {#1}
+
+\def\grabstring%
+ {\dowithstringed\grabstringdouble\grabstringsingle\grabstringspaced}
+
+\def\grabstringdouble"#1"{\scratchtoks{#1}}
+\def\grabstringsingle'#1'{\scratchtoks{#1}}
+\def\grabstringspaced #1 {\scratchtoks{#1}}
+
+\protect \endinput
diff --git a/tex/context/base/syst-pln.tex b/tex/context/base/syst-pln.tex
new file mode 100644
index 000000000..dd777854d
--- /dev/null
+++ b/tex/context/base/syst-pln.tex
@@ -0,0 +1,636 @@
+%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.
+
+%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}.
+
+%D This is a stripped down version of plain \TEX. We need this
+%D module to get started. Whole sections are missing here,
+%D like font loading and math. Thise are taken care of in
+%D dedicated modules. A few definitions are added (and
+%D marked as such).
+
+%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 First we define a simplified version of the \CONTEXT\
+%D protection mechanism.
+
+\def\unprotect{\catcode`@=11}
+\def\protect {\catcode`@=12}
+
+\unprotect
+
+%D We do not set up mathcodes here, but postpone that to the
+%D math modules.
+
+\mathcode`\ = "8000 % \space
+\mathcode`\' = "8000 % ^\prime
+\mathcode`\_ = "8000 % \_
+\mathcode`\^^? = "1273 % \smallint
+
+\sfcode`\)=0
+\sfcode`\'=0
+\sfcode`\]=0
+
+\chardef\@ne = 1
+\chardef\tw@ = 2
+\chardef\thr@@ = 3
+\chardef\sixt@@n = 16
+\chardef\@cclv = 255
+
+\mathchardef\@cclvi = 256
+\mathchardef\@m = 1000
+\mathchardef\@M = 10000
+\mathchardef\@MM = 20000
+
+%D Pretty important definitions:
+
+\let\bgroup={
+\let\egroup=}
+
+%D In plain \TEX\ the following explanation about the register
+%D allocation mechanism is given:
+%D
+%D \startsmaller
+%D The following counters are reserved:
+%D
+%D \starttabulatie
+%D \NC 0--9 \NC page numbering \NC \NR
+%D \NC 10 \NC count allocation \NC \NR
+%D \NC 11 \NC dimen allocation \NC \NR
+%D \NC 12 \NC skip allocation \NC \NR
+%D \NC 13 \NC muskip allocation \NC \NR
+%D \NC 14 \NC box allocation \NC \NR
+%D \NC 15 \NC toks allocation \NC \NR
+%D \NC 16 \NC read file allocation \NC \NR
+%D \NC 17 \NC write file allocation \NC \NR
+%D \NC 18 \NC math family allocation \NC \NR
+%D \NC 19 \NC language allocation \NC \NR
+%D \NC 20 \NC insert allocation \NC \NR
+%D \NC 21 \NC the most recently allocated number \NC \NR
+%D \NC 22 \NC constant $-1$ \NC \NR
+%D \stoptabulatie
+%D
+%D New counters are allocated starting with 23, 24, etc. Other
+%D registers are allocated starting with 10. This leaves 0
+%D through 9 for the user to play with safely, except that
+%D counts 0 to 9 are considered to be the page and subpage
+%D numbers (since they are displayed during output). In this
+%D scheme, \type {\count10} always contains the number of the
+%D highest||numbered counter that has been allocated, \type
+%D {\count14} the highest||numbered box, etc. Inserts are given
+%D numbers 254, 253, etc., since they require a \type
+%D {\count}, \type {\dimen}, \type {\skip}, and \type {\box}
+%D all with the same number; \type {\count20} contains the
+%D lowest-numbered insert that has been allocated. Of course,
+%D \type {\box255} is reserved for \type {\output}; \type
+%D {\count255}, \type {\dimen255}, and \type {\skip255} can be
+%D used freely.
+%D
+%D It is recommended that macro designers always use \type
+%D {\globa}l assignments with respect to registers numbered 1,
+%D 3, 5, 7, 9, and always non||\type {\global} assignments
+%D with respect to registers 0, 2, 4, 6, 8, 255. This will
+%D prevent \quote {save stack buildup} that might otherwise
+%D occur.
+%D \stopsmaller
+%D
+%D We well overload some macros in \ETEX\ mode.
+
+\count10 = 22 % allocates \count registers 23, 24, ...
+\count11 = 9 % allocates \dimen registers 10, 11, ...
+\count12 = 9 % allocates \skip registers 10, 11, ...
+\count13 = 9 % allocates \muskip registers 10, 11, ...
+\count14 = 9 % allocates \box registers 10, 11, ...
+\count15 = 9 % allocates \toks registers 10, 11, ...
+\count16 = -1 % allocates input streams 0, 1, ...
+\count17 = -1 % allocates output streams 0, 1, ...
+\count18 = 3 % allocates math families 4, 5, ...
+\count19 = 0 % allocates \language codes 1, 2, ...
+\count20 =255 % allocates insertion classes 254, 253, ...
+
+\countdef\insc@unt = 20 % the insertion counter
+\countdef\allocationnumber= 21 % the most recent allocation
+\countdef\m@ne = 22 % a handy constant
+ \m@ne = -1
+
+\def\wlog{\immediate\write\m@ne} % write on log file (only)
+
+%D \startsmaller
+%D Here are abbreviations for the names of scratch registers
+%D that don't need to be allocated.
+%D \stopsmaller
+
+\countdef \count@ = 255
+\dimendef \dimen@ = 0
+\dimendef \dimen@i = 1 % global only
+\dimendef \dimen@ii = 2
+\skipdef \skip@ = 0
+\toksdef \toks@ = 0
+
+%D \startsmaller
+%D Now, we define \type {\newcount}, \type {\newbox}, etc. so
+%D that you can say \newcount\foo and \type {\foo} will be
+%D defined (with \type {\countdef}) to be the next counter. To
+%D find out which counter \type {\foo} is, you can look at
+%D \type {\allocationnumber}. Since there's no \type {\boxdef}
+%D command, \type {\chardef} is used to define a \type
+%D {\newbox}, \type {\newinsert}, \type {\newfam}, and so on.
+%D \stopsmaller
+
+\def\newcount {\alloc@0\count \countdef \insc@unt}
+\def\newdimen {\alloc@1\dimen \dimendef \insc@unt}
+\def\newskip {\alloc@2\skip \skipdef \insc@unt}
+\def\newmuskip {\alloc@3\muskip \muskipdef\@cclvi }
+\def\newbox {\alloc@4\box \chardef \insc@unt}
+\def\newtoks {\alloc@5\toks \toksdef \@cclvi }
+\def\newread {\alloc@6\read \chardef \sixt@@n }
+\def\newwrite {\alloc@7\write \chardef \sixt@@n }
+\def\newfam {\alloc@8\fam \chardef \sixt@@n }
+\def\newlanguage{\alloc@9\language\chardef \@cclvi }
+
+\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+
+\def\alloc@#1#2#3#4#5%
+ {\global\advance\count1#1by\@ne
+ \ch@ck#1#4#2% make sure there's still room
+ \allocationnumber=\count1#1%
+ \global#3#5=\allocationnumber
+ \wlog{\string#5=\string#2\the\allocationnumber}}
+
+\def\newinsert#1%
+ {\global\advance\insc@unt by\m@ne
+ \ch@ck0\insc@unt\count
+ \ch@ck1\insc@unt\dimen
+ \ch@ck2\insc@unt\skip
+ \ch@ck4\insc@unt\box
+ \allocationnumber=\insc@unt
+ \global\chardef#1=\allocationnumber
+ \wlog{\string#1=\string\insert\the\allocationnumber}}
+
+\def\ch@ck#1#2#3%
+ {\ifnum\count1#1<#2\else
+ \errmessage{No room for a new #3}
+ \fi}
+
+\newdimen\maxdimen \maxdimen = 16383.99999pt
+\newskip \hideskip \hideskip = -1000pt plus 1fill
+\newskip \centering \centering = 0pt plus 1000pt minus 1000pt
+\newdimen\p@ \p@ = 1pt
+\newdimen\z@ \z@ = 0pt
+\newskip \z@skip \z@skip = 0pt plus 0pt minus 0pt
+\newbox \voidb@x % permanently void box register
+
+%D We define \type {\newif} a la plain \TEX, but will
+%D redefine it later. As Knuth says:
+%D
+%D \startsmaller
+%D And here's a different sort of allocation: for example,
+%D
+%D \starttypen
+%D \newif\iffoo
+%D \stoptypen
+%D
+%D creates \type {\footrue}, \type {\foofalse} to go
+%D with \type {\iffoo}.
+%D \stopsmaller
+
+\def\newif#1%
+ {\count@\escapechar
+ \escapechar\m@ne
+ \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 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
+%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 Extra numeric variables.
+
+\newcount \interdisplaylinepenalty
+\newcount \interfootnotelinepenalty
+
+\interdisplaylinepenalty = 100
+\interfootnotelinepenalty = 100
+
+%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
+
+%D Extra dimension parameters.
+
+\newskip \bigskipamount
+\newdimen \jot
+\newskip \medskipamount
+\newskip \normalbaselineskip
+\newskip \normallineskip
+\newdimen \normallineskiplimit
+\newskip \smallskipamount
+
+\bigskipamount = 12pt plus 4pt minus 4pt
+\jot = 3pt
+\medskipamount = 6pt plus 2pt minus 2pt
+\normalbaselineskip = 12pt
+\normallineskip = 1pt
+\normallineskiplimit = 0pt
+\smallskipamount = 3pt plus 1pt minus 1pt
+
+%D The following shortcuts are rather standard:
+
+\def\lq{`}
+\def\rq{'}
+
+\def\lbrack{[}
+\def\rbrack{]}
+
+\let\endgraf=\par
+\let\endline=\cr
+
+\def\space{ }
+\def\empty{}
+\def\null {\hbox{}}
+
+%D The next loop construct is about the fastest you can get.
+%D Beware: this macro does not support nested loops.
+
+\long\def\loop#1\repeat{\long\def\body{#1}\iterate}
+
+%D The following makes \type {\loop} \unknown\ \type {\if}
+%D \unknown\ \type {\repeat} skippable:
+
+\let\repeat=\fi
+
+%D The original:
+
+\def\iterate{\body\let\next\iterate\else\let\next\relax\fi\next}
+
+%D A more efficient alternative:
+
+\def\iterate{\body\expandafter\iterate\else\expandafter\relax\fi}
+
+%D An even more efficient one:
+
+\def\iterate{\body\expandafter\iterate\else\fi}
+
+%D Counter 0 is normally used as page counter:
+
+\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}
+
+%D Indeed, we don't define a real output routine yet:
+
+\output{\box255}
+
+%D We don't support \type {\magnification} and just consume
+%D the value.
+
+\let\magnification\count@
+
+%D The following macro will be overloaded in \ETEX.
+
+\def\tracingall
+ {\tracingonline \@ne
+ \tracingcommands \tw@
+ \tracingstats \tw@
+ \tracingpages \@ne
+ \tracingoutput \@ne
+ \tracinglostchars \@ne
+ \tracingmacros \tw@
+ \tracingparagraphs\@ne
+ \tracingrestores \@ne
+ \showboxbreadth \maxdimen
+ \showboxdepth \maxdimen
+ \errorstopmode}
+
+%D Some users expect this macro to be present. This one
+%D sends the hyphenated word to the terminal.
+
+\def\showhyphens#1%
+ {\setbox0\vbox
+ {\parfillskip\z@skip
+ \hsize\maxdimen\tenrm
+ \pretolerance\m@ne
+ \tolerance\m@ne
+ \hbadness0
+ \showboxdepth0
+ \ #1}}
+
+%D The following bunch of macros deals with basic alignment.
+%D We just include them here so that they can be used if
+%D needed. Normally, \CONTEXT\ users will fall back on one of
+%D the three table environments.
+
+\newcount \mscount
+\newif \ifus@
+\newif \if@cr
+\newbox \tabs
+\newbox \tabsyet
+\newbox \tabsdone
+
+\def\hidewidth % for alignment entries that can stick out
+ {\hskip\hideskip}
+
+\def\ialign % initialized \halign
+ {\everycr{}
+ \tabskip\z@skip
+ \halign}
+
+\def\multispan#1%
+ {\omit
+ \mscount#1\relax
+ \loop
+ \ifnum\mscount>\@ne \sp@n
+ \repeat}
+
+\def\sp@n
+ {\span
+ \omit
+ \advance\mscount\m@ne}
+
+\def\cleartabs
+ {\global\setbox\tabsyet\null
+ \setbox\tabs\null}
+
+\def\settabs
+ {\setbox\tabs\null
+ \futurelet\next\sett@b}
+
+\def\sett@b
+ {\ifx\next\+%
+ \def\nxt{\afterassignment\s@tt@b\let\nxt}%
+ \else
+ \let\nxt\s@tcols
+ \fi
+ \let\next\relax
+ \nxt}
+
+\def\s@tt@b%
+ {\let\nxt\relax
+ \us@false\m@ketabbox}
+
+\def\tabalign%
+ {\us@true\m@ketabbox}
+
+\let\+\tabalign % no outer here
+
+\def\s@tcols#1\columns%
+ {\count@#1%
+ \dimen@\hsize
+ \loop
+ \ifnum\count@>\z@ \@nother
+ \repeat}
+
+\def\@nother%
+ {\dimen@ii\dimen@
+ \divide\dimen@ii\count@
+ \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}%
+ \advance\dimen@-\dimen@ii
+ \advance\count@\m@ne}
+
+\def\m@ketabbox%
+ {\begingroup
+ \global\setbox\tabsyet\copy\tabs
+ \global\setbox\tabsdone\null
+ \def\cr
+ {\@crtrue\crcr\egroup\egroup
+ \ifus@\unvbox\z@\lastbox\fi\endgroup
+ \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}%
+ \setbox\z@\vbox\bgroup\@crfalse
+ \ialign\bgroup&\t@bbox##\t@bb@x\crcr}
+
+\def\t@bbox
+ {\setbox\z@\hbox\bgroup}
+
+\def\t@bb@x
+ {\if@cr
+ \egroup % now \box\z@ holds the column
+ \else
+ \hss\egroup
+ \global\setbox\tabsyet\hbox
+ {\unhbox\tabsyet\global\setbox\@ne\lastbox}% now \box\@ne holds its size
+ \ifvoid\@ne
+ \global\setbox\@ne\hbox to\wd\z@{}%
+ \else
+ \setbox\z@\hbox to\wd\@ne{\unhbox\z@}%
+ \fi
+ \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}%
+ \fi
+ \box\z@}
+
+%D Users are advised not to use the following macros:
+
+\def\hang
+ {\hangindent\parindent}
+
+\def\textindent#1%
+ {\indent
+ \llap{#1\enspace}%
+ \ignorespaces}
+
+\def\narrower%
+ {\advance\leftskip \parindent
+ \advance\rightskip\parindent}
+
+%D Useful, used too, but sometimes dangerous:
+
+\def\leavevmode{\unhbox\voidb@x}
+
+%D We will overload these, but may need them beforehand:
+
+\bgroup
+ \catcode`\^^M=\active%
+ \gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
+ \global\let^^M\par%
+\egroup
+
+\def\obeyspaces{\catcode`\ \active}
+
+{\obeyspaces\global\let =\space}
+
+%D Useful and expected:
+
+\def~{\penalty\@M \ } % tie
+
+\chardef\%=`\%
+\chardef\&=`\&
+\chardef\#=`\#
+\chardef\$=`\$
+
+\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
+
+%D Used at all?
+
+\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-'
+
+%D Replaced later on:
+
+\def\line {\hbox to\hsize}
+\def\leftline #1{\line{#1\hss}}
+\def\rightline #1{\line{\hss#1}}
+\def\centerline#1{\line{\hss#1\hss}}
+
+%D Let's end in the plain way:
+
+\def\fmtname {ConTeXt Minimized Plain TeX}
+\def\fmtversion{3.1415926}
+
+\protect \endinput
diff --git a/tex/context/base/syst-prm.tex b/tex/context/base/syst-prm.tex
new file mode 100644
index 000000000..a53c1cdef
--- /dev/null
+++ b/tex/context/base/syst-prm.tex
@@ -0,0 +1,85 @@
+%D \module
+%D [ file=syst-prm,
+%D version=1999.03.17,
+%D title=\CONTEXT\ System Macros,
+%D subtitle=Primitive Behavior,
+%D author=Hans Hagen,
+%D date=\currentdate,
+%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
+%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 Saved primitives are preceded by \type {\normal}, as in:
+
+\let\normalfmtversion\fmtversion
+
+%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}}}
+
+ \global\let\endETEX\relax
+
+\fi
+
+\egroup
+
+%D Let's get rid of this one:
+
+\def\wlog#1{}
+
+%D Just for tracing purposes we set:
+
+\tracingstats=1
+
+%D We don't like outer commands, and we always want access
+%D to the original \type {\input} primitive.
+
+\let\normalouter = \outer \let\outer\relax
+\let\normalinput = \input
+
+%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 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}
+
+\protect \endinput
diff --git a/tex/context/base/syst-tex.tex b/tex/context/base/syst-tex.tex
index b231c7051..2ad5b77a0 100644
--- a/tex/context/base/syst-tex.tex
+++ b/tex/context/base/syst-tex.tex
@@ -1,5 +1,5 @@
%D \module
-%D [ file=syst-tex,
+%D [ file=syst-pln,
%D version=1999.03.17, % an oldie: 1995.10.10
%D title=\CONTEXT\ System Macros,
%D subtitle=Efficient \PLAIN\ \TEX\ loading,
@@ -74,13 +74,24 @@
\long\def\font#1=#2 #3%
{\ifx#3s%
\skipmessage{scaled \string\font}%
- \let\next=\skipscaled
+ \let\next\skipscaled
\else
\skipmessage{\string\font}%
- \let\next=\relax
+ \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.
@@ -124,7 +135,7 @@
%D initializations. We just want to default to \DVI\ output.
\ifx\pdftexversion\undefined
- \newcount\pdfoutput
+ \chardef\pdfoutput=0
\else
\pdfoutput=0
\fi
@@ -193,6 +204,12 @@
% \let\normalprotected = \protected
% \let\normalunexpanded = \unexpanded
+\beginETEX \savinghyphcodes
+
+ \savinghyphcodes=1
+
+\endETEX
+
%D We restore some redefined primitives to their old meaning.
\let\font = \normalfont
@@ -214,8 +231,9 @@
\let\normaltextfont = \undefined
\let\normalscriptfont = \undefined
\let\normalscriptscriptfont = \undefined
-\let\normalinput = \undefined
-\let\normalouter = \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.
diff --git a/tex/context/base/type-buy.tex b/tex/context/base/type-buy.tex
index a986aef92..ba16cee15 100644
--- a/tex/context/base/type-buy.tex
+++ b/tex/context/base/type-buy.tex
@@ -94,13 +94,13 @@
\starttypescript [sans] [meta] [name]
- \definefontsynonym [Sans] [MetaBook-Roman]
- \definefontsynonym [SansItalic] [MetaBook-Italic]
- \definefontsynonym [SansSlanted] [MetaBook-Slanted]
+ \definefontsynonym [Sans] [MetaNormal-Roman]
+ \definefontsynonym [SansItalic] [MetaNormal-Italic]
+ \definefontsynonym [SansSlanted] [MetaNormal-Slanted]
\definefontsynonym [SansBold] [MetaBold-Roman]
\definefontsynonym [SansBoldItalic] [MetaBold-Italic]
\definefontsynonym [SansBoldSlanted][MetaBold-Slanted]
- \definefontsynonym [SansCaps] [MetaBook-Caps]
+ \definefontsynonym [SansCaps] [MetaNormal-Caps]
\stoptypescript
@@ -205,21 +205,4 @@
\stoptypescript
-% Lucas Sun, sans
-
-ontsynonym[TheAntiqua-B3Light][texnansi-tantb3][encoding=texnansi]
-ontsynonym[TheAntiqua-B3cLightCaps][texnansi-tantb3c][encoding=texnansi]
-ontsynonym[TheAntiqua-B3iLightItalic][texnansi-tantb3i][encoding=texnansi]
-ontsynonym[TheAntiqua-B4SemiLight][texnansi-tantb4][encoding=texnansi]
-ontsynonym[TheAntiqua-B4cSemiLightCaps][texnansi-tantb4c][encoding=texnansi]
-ontsynonym[TheAntiqua-B4iSemiLightItalic][texnansi-tantb4i][encoding=texnansi
-]
-ontsynonym[TheAntiqua-B5][texnansi-tantb5][encoding=texnansi]
-ontsynonym[TheAntiqua-B5cCaps][texnansi-tantb5c][encoding=texnansi]
-ontsynonym[TheAntiqua-B5iItalic][texnansi-tantb5i][encoding=texnansi]
-ontsynonym[TheAntiqua-B6SemiBold][texnansi-tantb6][encoding=texnansi]
-ontsynonym[TheAntiqua-B6cSemiBoldCaps][texnansi-tantb6c][encoding=texnansi]
-ontsynonym[TheAntiqua-B6iSemiBoldItalic][texnansi-tantb6i][encoding=texnansi]
-ontsynonym[TheAntiqua-B7Bold][texnansi-tantb7][encoding=texnansi]
-ontsynonym[TheAntiqua-B7cBoldCaps][texnansi-tantb7c][encoding=texnansi]
-ontsynonym[TheAntiqua-B7iBoldItalic][texnansi-tantb7i][encoding=texnansi]
+\endinput
diff --git a/tex/context/base/type-enc.tex b/tex/context/base/type-enc.tex
index f70ac000c..f4e4a6f42 100644
--- a/tex/context/base/type-enc.tex
+++ b/tex/context/base/type-enc.tex
@@ -273,7 +273,7 @@
\definefontsynonym [ComputerModern-Bold] [cmbx10]
\definefontsynonym [ComputerModern-BoldItalic] [cmbxti10]
\definefontsynonym [ComputerModern-BoldSlanted] [cmbxsl10]
- \definefontsynonym [ComputerModern-Caps] [cmr10]
+ \definefontsynonym [ComputerModern-Caps] [cmcsc10]
\stoptypescript
\starttypescript [sans] [computer-modern] [default]
@@ -294,6 +294,7 @@
\definefontsynonym [ComputerModernMono-BoldItalic] [cmtt10]
\definefontsynonym [ComputerModernMono-BoldSlanted] [cmtt10]
\definefontsynonym [ComputerModernMono-Caps] [cmtt10]
+ \definefontsynonym [ComputerModernMono-Variable] [cmvtt10]
\stoptypescript
\starttypescript [math] [computer-modern] [default]
@@ -368,11 +369,15 @@
% Math Times (tx)
-\starttypescript [math] [times] [ec]
- \definefontsynonym [Times-Roman-Upright] [t1xr] [encoding=ec]
- \definefontsynonym [Times-Roman-Italic] [t1xi] [encoding=ec]
- \definefontsynonym [Times-Roman-Slanted] [t1xsl] [encoding=ec]
- \definefontsynonym [Times-Roman-Caps] [t1xsc] [encoding=ec]
+\starttypescript [math] [times] [all]
+% \definefontsynonym [Times-Roman-Upright] [t1xr] [encoding=ec]
+% \definefontsynonym [Times-Roman-Italic] [t1xi] [encoding=ec]
+% \definefontsynonym [Times-Roman-Slanted] [t1xsl] [encoding=ec]
+% \definefontsynonym [Times-Roman-Caps] [t1xsc] [encoding=ec]
+ \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]
@@ -418,15 +423,19 @@
% Palatino Math (PX)
-\starttypescript [math] [palatino] [ec]
- \definefontsynonym [Palatino-Roman-Upright] [p1xr] [encoding=ec]
- \definefontsynonym [Palatino-Roman-Italic] [p1xi] [encoding=ec]
- \definefontsynonym [Palatino-Roman-Slanted] [p1xsl] [encoding=ec]
- \definefontsynonym [Palatino-Roman-Caps] [p1xsc] [encoding=ec]
- \definefontsynonym [Palatino-Companion-Upright] [pcxr]
- \definefontsynonym [Palatino-Companion-Italic] [pcxi]
- \definefontsynonym [Palatino-Companion-Slanted] [pcxsl]
- \definefontsynonym [Palatino-Math-Italic] [pxmi]
+\starttypescript [math] [palatino] [all]
+% \definefontsynonym [Palatino-Roman-Upright] [p1xr] [encoding=ec]
+% \definefontsynonym [Palatino-Roman-Italic] [p1xi] [encoding=ec]
+% \definefontsynonym [Palatino-Roman-Slanted] [p1xsl] [encoding=ec]
+% \definefontsynonym [Palatino-Roman-Caps] [p1xsc] [encoding=ec]
+ \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]
@@ -511,34 +520,34 @@
% Lucida Bright (BH)
-\starttypescript [serif] [lucida] [texnansi]
- \definefontsynonym [LucidaBright] [lbr] [encoding=texnansi]
- \definefontsynonym [LucidaBright-Demi] [lbd] [encoding=texnansi]
- \definefontsynonym [LucidaBright-DemiItalic] [lbdi] [encoding=texnansi]
- \definefontsynonym [LucidaBright-Italic] [lbi] [encoding=texnansi]
- \definefontsynonym [LucidaBrightSmallcaps] [lbrsc] [encoding=texnansi]
- \definefontsynonym [LucidaBrightSmallcaps-Demi] [lbdsc] [encoding=texnansi]
- \definefontsynonym [LucidaBright-Oblique] [lbsl] [encoding=texnansi]
+\starttypescript [serif] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [LucidaBright] [\typefaceencoding-lbr] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaBright-Demi] [\typefaceencoding-lbd] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaBright-DemiItalic] [\typefaceencoding-lbdi] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaBright-Italic] [\typefaceencoding-lbi] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaBrightSmallcaps] [\typefaceencoding-lbrsc] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaBrightSmallcaps-Demi] [\typefaceencoding-lbdsc] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaBright-Oblique] [\typefaceencoding-lbsl] [encoding=\typefaceencoding]
\stoptypescript
-\starttypescript [sans] [lucida] [texnansi]
- \definefontsynonym [LucidaSans] [lsr] [encoding=texnansi]
- \definefontsynonym [LucidaSans-Demi] [lsd] [encoding=texnansi]
- \definefontsynonym [LucidaSans-DemiItalic] [lsdi] [encoding=texnansi]
- \definefontsynonym [LucidaSans-Italic] [lsi] [encoding=texnansi]
- \definefontsynonym [LucidaSans-Bold] [lsb] [encoding=texnansi]
- \definefontsynonym [LucidaSans-BoldItalic] [lsbi] [encoding=texnansi]
+\starttypescript [sans] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [LucidaSans] [\typefaceencoding-lsr] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaSans-Demi] [\typefaceencoding-lsd] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaSans-DemiItalic] [\typefaceencoding-lsdi] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaSans-Italic] [\typefaceencoding-lsi] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaSans-Bold] [\typefaceencoding-lsb] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaSans-BoldItalic] [\typefaceencoding-lsbi] [encoding=\typefaceencoding]
\stoptypescript
-\starttypescript [mono] [lucida] [texnansi]
- \definefontsynonym [LucidaSans-Typewriter] [lstr] [encoding=texnansi]
- \definefontsynonym [LucidaSans-TypewriterBold] [lstb] [encoding=texnansi]
- \definefontsynonym [LucidaSans-TypewriterBoldOblique] [lstbo] [encoding=texnansi]
- \definefontsynonym [LucidaSans-TypewriterOblique] [lsto] [encoding=texnansi]
+\starttypescript [mono] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [LucidaSans-Typewriter] [\typefaceencoding-lstr] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaSans-TypewriterBold] [\typefaceencoding-lstb] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaSans-TypewriterBoldOblique] [\typefaceencoding-lstbo] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaSans-TypewriterOblique] [\typefaceencoding-lsto] [encoding=\typefaceencoding]
\stoptypescript
-\starttypescript [math] [lucida] [texnansi]
- \definefontsynonym [LucidaBright] [lbr] [encoding=texnansi]
+\starttypescript [math] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [LucidaBright] [\typefaceencoding-lbr] [encoding=\typefaceencoding]
\definefontsynonym [LucidaNewMath-AltItalic] [lbmo]
\definefontsynonym [LucidaNewMath-Arrows] [lbma]
\definefontsynonym [LucidaNewMath-Extension] [lbme]
@@ -548,7 +557,7 @@
\definefontsynonym [LucidaBlackletter] [lbl]
\stoptypescript
-\starttypescript [boldmath] [lucida] [texnansi]
+\starttypescript [boldmath] [lucida] [texnansi,ec,8r]
\definefontsynonym [LucidaNewMath-AltDemiItalic] [lbmdo]
\definefontsynonym [LucidaNewMath-Arrows-Demi] [lbmad]
\definefontsynonym [LucidaNewMath-Extension] [lbme]
@@ -557,85 +566,25 @@
\definefontsynonym [LucidaNewMath-Symbol-Demi] [lbmsd]
\stoptypescript
-\starttypescript [calligraphy] [lucida] [texnansi]
- \definefontsynonym [LucidaCalligraphy-Italic] [lbc] [encoding=texnansi]
-\stoptypescript
-
-\starttypescript [casual] [lucida] [texnansi]
- \definefontsynonym [LucidaCasual] [lbkr] [encoding=texnansi]
- \definefontsynonym [LucidaCasual-Italic] [lbki] [encoding=texnansi]
-\stoptypescript
-
-\starttypescript [handwriting] [lucida] [texnansi]
- \definefontsynonym [LucidaHandwriting-Italic] [lbh] [encoding=texnansi]
-\stoptypescript
-
-\starttypescript [fax] [lucida] [texnansi]
- \definefontsynonym [LucidaFax] [lfr] [encoding=texnansi]
- \definefontsynonym [LucidaFax-Demi] [lfd] [encoding=texnansi]
- \definefontsynonym [LucidaFax-DemiItalic] [lfdi] [encoding=texnansi]
- \definefontsynonym [LucidaFax-Italic] [lfi] [encoding=texnansi]
-\stoptypescript
-
-% \starttypescript [serif] [lucida] [ec]
-% \definefontsynonym [LucidaBright] [hlhr8t] [encoding=ec]
-% \definefontsynonym [LucidaBright-Demi] [hlhb8t] [encoding=ec]
-% \definefontsynonym [LucidaBright-Italic] [hlhri8t] [encoding=ec]
-% \definefontsynonym [LucidaBright-Oblique] [hlhro8t] [encoding=ec]
-% \definefontsynonym [LucidaBright-DemiItalic] [hlhbi8t] [encoding=ec]
-% \definefontsynonym [LucidaBrightSmallcaps] [hlhrc8t] [encoding=ec]
-% \stoptypescript
-%
-% \starttypescript [sans] [lucida] [ec]
-% \definefontsynonym [LucidaSans] [hlsr8t] [encoding=ec]
-% \definefontsynonym [LucidaSans-Demi] [hlsb8t] [encoding=ec]
-% \definefontsynonym [LucidaSans-Italic] [hlsri8t] [encoding=ec]
-% \definefontsynonym [LucidaSans-DemiItalic] [hlsbi8t] [encoding=ec]
-% \stoptypescript
-%
-% \starttypescript [mono] [lucida] [ec]
-% \definefontsynonym [LucidaSans-Typewriter] [hlsrt8t] [encoding=ec]
-% \definefontsynonym [LucidaSans-TypewriterBold] [hlsbt8t] [encoding=ec]
-% \definefontsynonym [LucidaSans-TypewriterOblique] [hlsrot8t] [encoding=ec]
-% \definefontsynonym [LucidaSans-TypewriterBoldOblique] [hlsbot8t] [encoding=ec]
-% \stoptypescript
-%
-% \starttypescript [math] [lucida] [ec]
-% \definefontsynonym [LucidaBright] [hlhr8t] [encoding=ec]
-% \definefontsynonym [LucidaNewMath-AltItalic] [hlcrima]
-% \definefontsynonym [LucidaNewMath-Arrows] [hlcra]
-% \definefontsynonym [LucidaNewMath-Extension] [hlcrv]
-% \definefontsynonym [LucidaNewMath-Roman] [hlcrm]
-% \definefontsynonym [LucidaNewMath-Italic] [hlcrim]
-% \definefontsynonym [LucidaNewMath-Symbol] [hlcry]
-% \stoptypescript
-%
-% \starttypescript [boldmath] [lucida] [ec]
-% \definefontsynonym [LucidaNewMath-AltDemiItalic] [hlcdima]
-% \definefontsynonym [LucidaNewMath-Arrows-Demi] [hlcda]
-% \definefontsynonym [LucidaNewMath-Extension] [hlcrv]
-% \definefontsynonym [LucidaNewMath-Demibold] [hlcdm]
-% \definefontsynonym [LucidaNewMath-DemiItalic] [hlcdim]
-% \definefontsynonym [LucidaNewMath-Symbol-Demi] [hlcdy]
-% \stoptypescript
-%
-% \starttypescript [calligraphy] [lucida] [ec]
-% \definefontsynonym [LucidaCalligraphy-Italic] [hlcrie8t] [encoding=ec]
-% \stoptypescript
-%
-% \starttypescript [handwriting] [lucida] [ec]
-% \definefontsynonym [LucidaHandwriting-Italic] [hlcriw8t] [encoding=ec]
-% \stoptypescript
-
-% \definefontsynonym [Helvetica-MathRoman] [hvrm10t1]
-% \definefontsynonym [Helvetica-MathExtendedSymbols] [hvex10]
-% \definefontsynonym [Helvetica-MathItalics] [hvmi10]
-% \definefontsynonym [Helvetica-MathSymbols] [hvsy10]
-
-% \definefontsynonym [Times-MathRoman] [tir] [encoding=texnansi]
-% \definefontsynonym [Times-MathExtension] [mtex]
-% \definefontsynonym [Times-MathItalic] [mtmi] [skewcharmi='177]
-% \definefontsynonym [Times-MathSymbol] [mtsy] [skewcharmi='60]
+\starttypescript [calligraphy] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [LucidaCalligraphy-Italic] [\typefaceencoding-lbc] [encoding=\typefaceencoding]
+\stoptypescript
+
+\starttypescript [casual] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [LucidaCasual] [\typefaceencoding-lbkr] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaCasual-Italic] [\typefaceencoding-lbki] [encoding=\typefaceencoding]
+\stoptypescript
+
+\starttypescript [handwriting] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [LucidaHandwriting-Italic] [\typefaceencoding-lbh] [encoding=\typefaceencoding]
+\stoptypescript
+
+\starttypescript [fax] [lucida] [texnansi,ec,8r]
+ \definefontsynonym [LucidaFax] [\typefaceencoding-lfr] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaFax-Demi] [\typefaceencoding-lfd] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaFax-DemiItalic] [\typefaceencoding-lfdi] [encoding=\typefaceencoding]
+ \definefontsynonym [LucidaFax-Italic] [\typefaceencoding-lfi] [encoding=\typefaceencoding]
+\stoptypescript
%D For those who want to use the existing tfm and vf files we
%D provide:
diff --git a/tex/context/base/type-exa.tex b/tex/context/base/type-exa.tex
index c88de4481..0f256ee43 100644
--- a/tex/context/base/type-exa.tex
+++ b/tex/context/base/type-exa.tex
@@ -25,12 +25,13 @@
\starttypescript [postscript] [texnansi,ec,8r]
\definetypeface [postscript] [rm] [serif] [times] [default] [encoding=\typescripttwo]
+\definetypeface [postscript] [mm] [math] [times] [default]
\definetypeface [postscript] [ss] [sans] [helvetica] [default] [rscale=.9,encoding=\typescripttwo]
\definetypeface [postscript] [tt] [mono] [courier] [default] [rscale=1.1,encoding=\typescripttwo]
\stoptypescript
-\starttypescript [times] [ec]
+\starttypescript [times] [texnansi,ec,8r]
\definetypeface [times] [rm] [serif] [times] [default] [encoding=\typescripttwo]
\definetypeface [times] [ss] [sans] [helvetica] [default] [rscale=.9,encoding=\typescripttwo]
@@ -39,7 +40,7 @@
\stoptypescript
-\starttypescript [palatino] [ec]
+\starttypescript [palatino] [texnansi,ec,8r]
\definetypeface [palatino] [rm] [serif] [palatino] [default] [encoding=\typescripttwo]
\definetypeface [palatino] [mm] [math] [palatino] [default] [encoding=\typescripttwo]
@@ -51,10 +52,13 @@
\starttypescript [lucida] [texnansi]
-\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] [mm] [math] [lucida] [default] [encoding=\typescripttwo]
+\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] [mm] [math] [lucida] [default] [encoding=\typescripttwo]
+\definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo]
+
+\usemathcollection[lbr]
\stoptypescript
diff --git a/tex/context/base/type-ini.tex b/tex/context/base/type-ini.tex
index 05680dd21..eab99156b 100644
--- a/tex/context/base/type-ini.tex
+++ b/tex/context/base/type-ini.tex
@@ -54,12 +54,14 @@
\pushmacro\typescriptone
\pushmacro\typescripttwo
\pushmacro\typescriptthree
+ \pushmacro\stoptypescript
\typescriptfoundfalse
\writestatus
{typescript}
{[\@@typescriptone] [\@@typescripttwo] [\@@typescriptthree]}%
\processcommacommand[\typescriptfiles]\dododousetypescript
\firsttypescriptpassfalse % testen
+ \popmacro\stoptypescript
\popmacro\typescriptthree
\popmacro\typescripttwo
\popmacro\typescriptone
@@ -71,10 +73,25 @@
{\startreadingfile
\pushmacro\currenttypefile
\def\currenttypefile{#1}%
- \readfile{\currenttypefile}{}{}% \relax\relax
+ \readfile\currenttypefile\donothing\donothing
\popmacro\currenttypefile
\stopreadingfile}
+\def\usetypescriptonce%
+ {\dotripleempty\dousetypescriptonce}
+
+%\def\dousetypescriptonce[#1][#2][#3]%
+% {\doifdefinedelse{@@tso@@#1:#2:#3}
+% {\writestatus{typescript}{(#1) (#2) (#3)}}
+% {\setvalue{@@tso@@#1:#2:#3}{0}%
+% \expanded{\dodousetypescript[#1][#2][#3]}}}
+
+\def\dousetypescriptonce[#1][#2][#3]%
+ {\doifelseflagged{ts:#1:#2:#3}%
+ {\writestatus{typescript}{(#1) (#2) (#3)}}
+ {\setflag{ts:#1:#2:#3}%
+ \expanded{\dodousetypescript[#1][#2][#3]}}}
+
% \definetypescriptsynonym[lbr][cmr]
\def\definetypescriptsynonym%
@@ -111,54 +128,112 @@
% script [serif] [computer-modern] [name]
% script [serif] [computer-modern] [special]
-\def\dochecktypescript#1#2#3% script use value
- {\donefalse
- \doifelsenothing{#1}\donetrue
- {\doifelse{#2}{all}\donetrue
- {\doifelse{#1}{all}\donetrue
- {\expanded{\doifcommonelse{#1}{#2}}\donetrue\donefalse
- \ifdone\let#3\commalistelement\fi}}}}
-
-\def\starttypescript%
- {\dotripleempty\dostarttypescript}
-
\newif\iffirsttypescriptpass \firsttypescriptpasstrue
\prependtoks\firsttypescriptpasstrue\to\everyjob
-\long\def\dostarttypescript[#1][#2][#3]#4\stoptypescript
+% \def\dochecktypescript#1#2#3% script use value
+% {\donefalse
+% \doifelsenothing{#1}\donetrue
+% {\doifelse{#2}{all}\donetrue
+% {\doifelse{#1}{all}\donetrue
+% {\fullexpandtwoargsafter\doifcommonelse{#1}{#2}\donetrue\donefalse
+% \ifdone\let#3\commalistelement\fi}}}}
+%
+% \def\starttypescript%
+% {\dotripleempty\dostarttypescript}
+%
+% \long\def\dostarttypescript[#1][#2][#3]#4\stoptypescript
+% {\iffirstargument
+% \let\typescriptone \@@typescriptone
+% \let\typescripttwo \@@typescripttwo
+% \let\typescriptthree\@@typescriptthree
+% \dochecktypescript{#1}\@@typescriptone \typescriptone \ifdone
+% \dochecktypescript{#2}\@@typescripttwo \typescripttwo \ifdone
+% \dochecktypescript{#3}\@@typescriptthree\typescriptthree \ifdone
+% %\writestatus
+% \debuggerinfo
+% {typescript}
+% {\currenttypefile: use=scr (val)
+% [\@@typescriptone =#1 (\typescriptone)]
+% [\@@typescripttwo =#2 (\typescripttwo)]
+% [\@@typescriptthree=#3 (\typescriptthree)]}%
+% #4\typescriptfoundtrue
+% \fi\fi\fi
+% \else\iffirsttypescriptpass
+% \pushmacro\fontclass
+% #4%
+% \popmacro\fontclass
+% \else
+% % skip this since it may do unwanted resets, like
+% % setting symbolic font names to unknown, especially
+% % in run time user type scripts
+% \fi\fi}
+
+\def\typescript@@all{all}
+
+\def\dochecktypescript#1#2#3% script use value
+ {\donefalse
+ \def\@@typescriptcheck{#1}%
+ \ifx\@@typescriptcheck\empty
+ \donetrue
+ \else\ifx#2\typescript@@all
+ \donetrue
+ \else\ifx\@@typescriptcheck\typescript@@all
+ \donetrue
+ \else\fullexpandtwoargsafter\doifcommonelse{#1}{#2}\donetrue\donefalse\ifdone
+ \let#3\commalistelement
+ \fi\fi\fi\fi}
+
+\def\starttypescript
+ {\dotripleempty\dostarttypescript}
+
+\long\def\dostarttypescript[#1][#2][#3]% #4\stoptypescript
{\iffirstargument
- \let\typescriptone \@@typescriptone
- \let\typescripttwo \@@typescripttwo
- \let\typescriptthree\@@typescriptthree
- \dochecktypescript{#1}\@@typescriptone \typescriptone \ifdone
- \dochecktypescript{#2}\@@typescripttwo \typescripttwo \ifdone
- \dochecktypescript{#3}\@@typescriptthree\typescriptthree \ifdone
- %\writestatus
- \debuggerinfo
- {typescript}
- {\currenttypefile: use=scr (val)
- [\@@typescriptone =#1 (\typescriptone)]
- [\@@typescripttwo =#2 (\typescripttwo)]
- [\@@typescriptthree=#3 (\typescriptthree)]}%
- #4\typescriptfoundtrue
- \fi\fi\fi
+ \let\typescriptone \@@typescriptone
+ \let\typescripttwo \@@typescripttwo
+ \let\typescriptthree\@@typescriptthree
+ \dochecktypescript{#1}\@@typescriptone \typescriptone
+ \ifdone
+ \dochecktypescript{#2}\@@typescripttwo \typescripttwo
+ \ifdone
+ \dochecktypescript{#3}\@@typescriptthree\typescriptthree
+ \ifdone
+ %\debuggerinfo
+ % {typescript}
+ % {\currenttypefile: use=scr (val)
+ % [\@@typescriptone =#1 (\typescriptone)]
+ % [\@@typescripttwo =#2 (\typescripttwo)]
+ % [\@@typescriptthree=#3 (\typescriptthree)]}%
+ \let\next\dostarttypescriptA
+ \else
+ \let\next\dostarttypescriptC
+ \fi
+ \else
+ \let\next\dostarttypescriptC
+ \fi
+ \else
+ \let\next\dostarttypescriptC
+ \fi
\else\iffirsttypescriptpass
- \pushmacro\fontclass
- #4%
- \popmacro\fontclass
+ \let\next\dostarttypescriptB
\else
% skip this since it may do unwanted resets, like
% setting symbolic font names to unknown, especially
% in run time user type scripts
- \fi\fi}
+ \let\next\dostarttypescriptC
+ \fi\fi
+ \next}
-\newif\ifautoloadmapfiles
+\def\dostarttypescriptA
+ %{\def\stoptypescript{\typescriptfoundtrue}}
+ {\let\stoptypescript\typescriptfoundtrue}
-\def\forgetmapfiles
- {\global\let\allfontmapsfiles\empty}
+\def\dostarttypescriptB
+ {\def\stoptypescript{\popmacro\fontclass}\pushmacro\fontclass}
-\forgetmapfiles
+\long\def\dostarttypescriptC#1\stoptypescript
+ {}
% status
%
@@ -166,21 +241,42 @@
% 2 reported
% 3 preloaded
+% flags ipv \c!status, more flag values
+
+% \def\preloadmapfile[#1]%
+% {\def\docommando##1%
+% {\doifinstringelse{.}{##1}
+% {\writestatus{pdftex}{compensate map file: ##1}%
+% \setxvalue{##1 \c!status}{3}%
+% \doglobal\removefromcommalist{##1}\allfontmapsfiles}
+% {\expanded{\docommando{##1.\f!fontmapextension}}}}%
+% \expanded{\processcommalist[#1]}\docommando}
+%
+% \def\loadmapfile[#1]% last add first
+% {\def\docommando##1%
+% {\doifinstringelse{.}{##1}
+% {\doglobal\pretocommalist{##1}\allfontmapsfiles}
+% {\expanded{\docommando{##1.\f!fontmapextension}}}}%
+% \expanded{\processcommalist[#1]}\docommando
+% \ifproductionrun \loadallfontmapfiles \fi}
+
+\def\dopreloadmapfile#1%
+ {\doifinstringelse{.}{#1}
+ {\writestatus{pdftex}{compensate map file: #1}%
+ \setxvalue{#1 \c!status}{3}%
+ \doglobal\removefromcommalist{#1}\allfontmapsfiles}
+ {\expanded{\dopreloadmapfile{#1.\f!fontmapextension}}}}
+
\def\preloadmapfile[#1]%
- {\def\docommando##1%
- {\doifinstringelse{.}{##1}
- {\writestatus{pdftex}{compensate map file: ##1}%
- \setxvalue{##1 \c!status}{3}%
- \doglobal\removefromcommalist{##1}\allfontmapsfiles}
- {\expanded{\docommando{##1.\f!fontmapextension}}}}%
- \expanded{\processcommalist[#1]\noexpand\docommando}}
-
-\def\loadmapfile[#1]% last add first
- {\def\docommando##1%
- {\doifinstringelse{.}{##1}
- {\doglobal\pretocommalist{##1}\allfontmapsfiles}
- {\expanded{\docommando{##1.\f!fontmapextension}}}}%
- \expanded{\processcommalist[#1]\noexpand\docommando}%
+ {\expanded{\processcommalist[#1]}\dopreloadmapfile}
+
+\def\doloadmapfile#1%
+ {\doifinstringelse{.}{#1}
+ {\doglobal\pretocommalist{#1}\allfontmapsfiles}
+ {\expanded{\doloadmapfile{#1.\f!fontmapextension}}}}
+
+\def\loadmapfile[#1]% last added first !
+ {\expanded{\processcommalist[#1]}\doloadmapfile
\ifproductionrun \loadallfontmapfiles \fi}
\def\doloadfontmapfile#1% will be special
@@ -213,7 +309,14 @@
\appendtoks \loadallfontmapfiles \to \everyjob
\appendtoks \loadallfontmapfiles \to \everystarttext
-\appendtoks \loadallfontmapfiles \to \everypagebody
+\appendtoks \loadallfontmapfiles \to \everybeforepagebody
+
+\newif\ifautoloadmapfiles
+
+\def\forgetmapfiles
+ {\global\let\allfontmapsfiles\empty}
+
+\forgetmapfiles
% \definetypeface [#1:joke] [#2:rm]
% \definetypeface [#1:joke] [#2:rm] [#3:...]
diff --git a/tex/context/base/type-map.tex b/tex/context/base/type-map.tex
index 5303385db..18724bd92 100644
--- a/tex/context/base/type-map.tex
+++ b/tex/context/base/type-map.tex
@@ -18,6 +18,7 @@
\starttypescript [map] [all]
\loadmapfile[original-ams-cmr.map]
\loadmapfile[original-ams-euler.map]
+ \loadmapfile[original-ams-logo.map]
\stoptypescript
\starttypescript [map] [il2]
@@ -74,19 +75,27 @@
\loadmapfile[texnansi-urw-zapfchan.map]
\stoptypescript
-\starttypescript [map] [ec]
- \loadmapfile[ec-youngryu-px.map]
- \loadmapfile[ec-youngryu-tx.map]
+\starttypescript [map] [ec,texnansi,8r]
+ \loadmapfile[original-youngryu-px.map]
+ \loadmapfile[original-youngryu-tx.map]
\stoptypescript
+% to do
+
\starttypescript [map] [default]
\loadmapfile[original-micropress-informal.map]
\stoptypescript
-% to do
-
\starttypescript [map] [texnansi]
- \loadmapfile[original-bh-lucida.map]
+ \loadmapfile[texnansi-bh-lucida.map]
+\stoptypescript
+
+\starttypescript [map] [ec]
+ \loadmapfile[ec-bh-lucida.map]
+\stoptypescript
+
+\starttypescript [map] [8r]
+ \loadmapfile[8r-bh-lucida.map]
\stoptypescript
%\starttypescript [math] [helvetica] [all]
diff --git a/tex/context/base/type-pre.tex b/tex/context/base/type-pre.tex
index cb56b77f5..c5aee8b98 100644
--- a/tex/context/base/type-pre.tex
+++ b/tex/context/base/type-pre.tex
@@ -67,7 +67,6 @@
\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.
@@ -112,19 +111,25 @@
\usetypescript [serif,sans,mono,math,handwriting] [lucida] [name,special,\defaultencoding]
\usetypescript [serif,sans,mono,math,handwriting] [default] [size]
-\usemathcollection[lbr]
+\usemathcollection[lbr]
+
+\usetypescript [map] [\defaultencoding]
\stoptypescript
-%D With thanks to Berthold Horn from YandY for providing me
-%D evaluation copies of the MathTimePlus fonts.
+% %D With thanks to Berthold Horn from YandY for providing me
+% %D evaluation copies of the MathTimePlus fonts.
+
+% todo: \starttypescript [mt,tim]
-\starttypescript [mt,tim]
+\starttypescript [tim]
\usetypescript [math] [times] [all]
\usetypescript [math] [default] [size]
-\usemathcollection[tim]
+\usemathcollection[tim]
+
+\usetypescript [map] [\defaultencoding]
\stoptypescript
@@ -137,6 +142,8 @@
\usetypescript [serif] [antykwa-torunska] [name,\defaultencoding]
\usetypescript [serif] [default] [size]
+\usetypescript [map] [\defaultencoding]
+
\stoptypescript
%D This script defines the Standard Adobe Courier fonts.
@@ -146,6 +153,8 @@
\usetypescript [mono] [courier] [name,\defaultencoding]
\usetypescript [mono] [default] [size]
+\usetypescript [map] [\defaultencoding]
+
\stoptypescript
%D This script defines the Standard Adobe Helvetica fonts.
@@ -155,6 +164,8 @@
\usetypescript [sans] [helvetica] [name,\defaultencoding]
\usetypescript [sans] [default] [size]
+\usetypescript [map] [\defaultencoding]
+
\stoptypescript
%D This script defines the Standard Adobe Times fonts.
@@ -164,6 +175,8 @@
\usetypescript [serif] [times] [name,\defaultencoding]
\usetypescript [serif] [default] [size]
+\usetypescript [map] [\defaultencoding]
+
\stoptypescript
%D This script loads the Adobe Times Roman, Helvetica and
@@ -177,6 +190,11 @@
\usetypescript [serif,sans,mono] [default] [size]
+% \usetypescript [math] [times] [all]
+% \usetypescript [math] [default] [size]
+
+\usetypescript [map] [\defaultencoding]
+
\stoptypescript
%D This script defines the Palatino font.
@@ -186,6 +204,8 @@
\usetypescript [serif] [palatino] [name,\defaultencoding]
\usetypescript [serif] [default] [size]
+\usetypescript [map] [\defaultencoding]
+
\stoptypescript
%D The following scripts fake the old \type {font-ber} and
diff --git a/tex/context/base/type-syn.tex b/tex/context/base/type-syn.tex
index 00517d723..3cd761979 100644
--- a/tex/context/base/type-syn.tex
+++ b/tex/context/base/type-syn.tex
@@ -313,7 +313,7 @@
% Courier :
-\starttypescript [sans] [courier] [name]
+\starttypescript [mono] [courier] [name]
\definefontsynonym [Mono] [Courier]
\definefontsynonym [MonoBold] [Courier-Bold]
\definefontsynonym [MonoItalic] [Courier-Oblique]
diff --git a/tex/context/base/verb-ini.tex b/tex/context/base/verb-ini.tex
index 3390af3d4..f1ec48b90 100644
--- a/tex/context/base/verb-ini.tex
+++ b/tex/context/base/verb-ini.tex
@@ -244,18 +244,24 @@
%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 \spaceskip=.5em \xspaceskip=\spaceskip
- \let\obeytabs=\ignoretabs
- \let\obeylines=\ignorelines
- \let\obeypages=\ignorepages
+ {\verbatimfont
+ \setverbatimspaceskip
+ \let\obeytabs\ignoretabs
+ \let\obeylines\ignorelines
+ \let\obeypages\ignorepages
\setupcopyverbatim}
\def\doprocessinlineverbatim%
{\ifx\next\bgroup
\setupinlineverbatim
- \catcode`\{=\@@begingroup
- \catcode`\}=\@@endgroup
+ \catcode`\{\@@begingroup
+ \catcode`\}\@@endgroup
\def\next{\let\next=}%
\else
\setupinlineverbatim
@@ -343,13 +349,19 @@
\let\handleverbatimline=\relax
+% \def\initializeverbatimline%
+% {\global\let\savedverbatimline=\empty
+% \ifskipfirstverbatimline
+% \global\chardef\verbatimstatus=0
+% \else
+% \global\chardef\verbatimstatus=1
+% \fi}
+%
+% more efficient
+
\def\initializeverbatimline%
- {\global\let\savedverbatimline=\empty
- \ifskipfirstverbatimline
- \global\chardef\verbatimstatus=0
- \else
- \global\chardef\verbatimstatus=1
- \fi}
+ {\global\let\savedverbatimline\empty
+ \global\chardef\verbatimstatus\ifskipfirstverbatimline0 \else1 \fi}
\def\presetemptyverbatimline%
{\ifcase\verbatimstatus
@@ -363,7 +375,7 @@
\doemptyverbatimline
\global\chardef\verbatimstatus=2
\else
- \kern\!!zeropoint
+ \kern\zeropoint
\doverbatimnobreak
\doflushverbatimline
\global\let\savedverbatimline=\empty
@@ -382,7 +394,7 @@
\doflushverbatimline
\global\chardef\verbatimstatus=4
\or
- \kern\!!zeropoint
+ \kern\zeropoint
\doverbatimnobreak
\doflushverbatimline
\global\chardef\verbatimstatus=5
@@ -396,7 +408,7 @@
{\ifcase\verbatimstatus \or \or \or
\doflushverbatimline
\else
- \kern\!!zeropoint
+ \kern\zeropoint
\doverbatimnobreak
\doflushverbatimline
\fi}
@@ -449,18 +461,19 @@
\egroup
\def\endofdisplayverbatim{\csname\verbatimname\endcsname}%
\bgroup
- \parindent\!!zeropoint
+ \parindent\zeropoint
\ifdim\lastskip<\parskip
\removelastskip
\vskip\parskip
\fi
- \parskip\!!zeropoint
+ \parskip\zeropoint
\processingverbatimtrue
\global\linepartrue
\expandafter\let\csname\verbatimname\endcsname=\relax
\edef\endofverbatimcommand{\csname\verbatimname\endcsname}%
\edef\endofverbatimcommand{\meaning\endofverbatimcommand}%
- \verbatimfont \spaceskip=.5em \xspaceskip=\spaceskip
+ \verbatimfont
+ \setverbatimspaceskip
\global\linepartrue % needed for paragraph numbering
\setupcopyverbatim
\initializeverbatimline
@@ -527,24 +540,60 @@
\catcode`\^^?=\@@ignore}
\def\setcatcodes#1%
- {\doprocesscatcodes
- {\catcode\scratchcounter=#1}}
+ {\doprocesscatcodes{\catcode\scratchcounter=#1}}
+
+% \def\uncatcodecharacters%
+% {\setcatcodes\@@letter}
\def\uncatcodecharacters%
- {\setcatcodes\@@letter}
-
-\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}
+ {\setnaturalcatcodes}
+
+\newtoks\everycommoncatcodes
+\newtoks\everynaturalcatcodes
+\newtoks\everynormalcatcodes
+
+\def\setcommoncatcodes%
+ {\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
+ \the\everycommoncatcodes}
+
+\def\setnaturalcatcodes% see elsewhere, merge 'm
+ {\setcommoncatcodes
+ \uncatcodespacetokens
+ \catcode`\#\@@other
+ \catcode`\$\@@other
+ \catcode`\%\@@other
+ \catcode`\&\@@other
+ \catcode`\\\@@other
+ \catcode`\^\@@other
+ \catcode`\_\@@other
+ \catcode`\{\@@other
+ \catcode`\|\@@other
+ \catcode`\}\@@other
+ \catcode`\~\@@other
+ \the\everynaturalcatcodes}
+
+\def\setnormalcatcodes
+ {\setcommoncatcodes
+ \uncatcodespacetokens
+ \catcode`\#\@@parameter
+ \catcode`\$\@@mathshift
+ \catcode`\%\@@comment
+ \catcode`\&\@@alignment
+ \catcode`\\\@@escape
+ \catcode`\^\@@superscript
+ \catcode`\_\@@subscript
+ \catcode`\{\@@begingroup
+ \catcode`\|\@@active
+ \catcode`\}\@@endgroup
+ \catcode`\~\@@active
+ \the\everynormalcatcodes}
%D \macros
%D {localcatcodes,
@@ -572,18 +621,18 @@
\def\savecatcode%
{\iflocalcatcodes \else
\saverestoreactivecatcode
- {\@EA\let\csname\@@aa@@\the\scratchcounter\endcsname=~}%
+ {\@EA\let\csname\@@aa@@\the\scratchcounter\endcsname~}%
\@EA\chardef\csname\@@cc@@\the\scratchcounter\endcsname
- =\catcode\scratchcounter
+ \catcode\scratchcounter
\fi}
%D It's counterpart is:
\def\restorecatcode%
- {\@EA\catcode\@EA\scratchcounter\@EA=
+ {\@EA\catcode\@EA\scratchcounter
\csname\@@cc@@\the\scratchcounter\endcsname
\saverestoreactivecatcode
- {\@EA\let\@EA~\@EA=\csname\@@aa@@\the\scratchcounter\endcsname}}
+ {\@EA\let\@EA~\csname\@@aa@@\the\scratchcounter\endcsname}}
%D Especially when we enable pretty printing, we need to
%D restore the meaning of active characters too. Just think of
@@ -613,35 +662,39 @@
\def\beginrestorecatcodes%
{\ifx\restorecatcodes\relax
- \let\endrestorecatcodes=\relax
+ \let\endrestorecatcodes\relax
\else
\bgroup
\restorecatcodes
- \let\beginrestorecatcodes=\bgroup
- \let\endrestorecatcodes =\egroup
+ \let\beginrestorecatcodes\bgroup
+ \let\endrestorecatcodes \egroup
\fi}
%D \macros
-%D {makeallletter}
+%D {makeallother}
%D
-%D With \type {\makeallletter} each character ($>0$) gets the
+%D With \type {\makeallother} each character ($>0$) gets the
%D category code 12.
%D
%D The next alternative was okay when memory was still low.
%D
-%D \startypen
+%D \starttypen
%D \def\makeallother%
%D {\dorecurse{255}{\catcode\recurselevel=\@@other}}
%D \stoptypen
%D
%D Today we prebuild a token list:
-\newtoks\makeallothertoks
+\ifx\makeallother\undefined
+
+ \newtoks\makeallothertoks
+
+ \dorecurse{255}
+ {\@EA\appendtoks\@EA\catcode\recurselevel=\@@other\to\makeallothertoks}
-\dorecurse{255}
- {\@EA\appendtoks\@EA\catcode\recurselevel=\@@other\to\makeallothertoks}
+ \def\makeallother{\the\makeallothertoks}
-\def\makeallother{\the\makeallothertoks}
+\fi
%D The main copying routine of display verbatim does an
%D ordinary string||compare on the saved closing command and
@@ -704,11 +757,11 @@
\iflinepar\else\EveryPar{}\fi
\leavevmode
\xdef\dokeepverbatimlinedata%
- {\parindent =\the\parindent
- \hangindent=\the\hangindent
- \hangafter =\the\hangafter
- \leftskip =\the\leftskip
- \rightskip =\the\rightskip}%
+ {\parindent \the\parindent
+ \hangindent\the\hangindent
+ \hangafter \the\hangafter
+ \leftskip \the\leftskip
+ \rightskip \the\rightskip}%
\egroup
\dokeepverbatimlinedata
\doopenupverbatimline
@@ -850,16 +903,17 @@
\def\processfileverbatim#1%
{\par
\bgroup
- \parindent\!!zeropoint
+ \parindent\zeropoint
\ifdim\lastskip<\parskip
\removelastskip
\vskip\parskip
\fi
- \parskip\!!zeropoint
+ \parskip\zeropoint
\processingverbatimtrue
\global\linepartrue
\uncatcodecharacters
- \verbatimfont \spaceskip=.5em \xspaceskip=\spaceskip
+ \verbatimfont
+ \setverbatimspaceskip
\frenchspacing
\obeyspaces
\obeytabs
@@ -986,7 +1040,7 @@
%D calls for an interpreter macro.
\def\handleprettytoken#1%
- {\getvalue{\!!PRETTY#1}}
+ {\csname\!!PRETTY#1\endcsname} % \getvalue{\!!PRETTY#1}}
%D This interpreter is installed by saying
%D
@@ -1773,17 +1827,18 @@
% \egroup
% \def\endofdisplayverbatim{\csname\verbatimname\endcsname}%
% \bgroup
-% \parindent\!!zeropoint
+% \parindent\zeropoint
% \ifdim\lastskip<\parskip
% \removelastskip
% \vskip\parskip
% \fi
-% \parskip\!!zeropoint
+% \parskip\zeropoint
% \processingverbatimtrue
% \expandafter\let\csname\verbatimname\endcsname=\relax
% \expandafter\convertargument\csname\verbatimname\endcsname
% \to\endofverbatimcommand
-% \verbatimfont \spaceskip=.5em \xspaceskip=\spaceskip
+% \verbatimfont
+% \setverbatimspaceskip
% \global\linepartrue % needed for paragraph numbering
% \setupcopyverbatim
% \initializeverbatimline
@@ -1812,14 +1867,15 @@
% \let\endofdisplayverbatim\relax
% \convertargument#1\to\endofverbatimcommand
% \bgroup
-% \parindent\!!zeropoint
+% \parindent\zeropoint
% \ifdim\lastskip<\parskip
% \removelastskip
% \vskip\parskip
% \fi
-% \parskip\!!zeropoint
+% \parskip\zeropoint
% \processingverbatimtrue
-% \verbatimfont \spaceskip=.5em \xspaceskip=\spaceskip
+% \verbatimfont
+% \setverbatimspaceskip
% \global\linepartrue % needed for paragraph numbering
% \setupcopyverbatim
% \initializeverbatimline
@@ -1837,12 +1893,12 @@
\def\endofdisplayverbatim{\csname\verbatimname\endcsname}%
\fi
\bgroup
- \parindent\!!zeropoint
+ \parindent\zeropoint
\ifdim\lastskip<\parskip
\removelastskip
\vskip\parskip
\fi
- \parskip\!!zeropoint
+ \parskip\zeropoint
\processingverbatimtrue
\ifcase#1%
\convertargument#2\to\endofverbatimcommand
@@ -1851,7 +1907,8 @@
\expandafter\convertargument\csname\verbatimname\endcsname
\to\endofverbatimcommand
\fi
- \verbatimfont \spaceskip=.5em \xspaceskip=\spaceskip
+ \verbatimfont
+ \setverbatimspaceskip
\global\linepartrue % needed for paragraph numbering
\setupcopyverbatim
\initializeverbatimline
diff --git a/tex/context/base/verb-raw.tex b/tex/context/base/verb-raw.tex
new file mode 100644
index 000000000..32903db77
--- /dev/null
+++ b/tex/context/base/verb-raw.tex
@@ -0,0 +1,7 @@
+\ifx\undefined\setupprettyTEXtype \input verb-tex \relax \fi
+
+\gdef\setupprettyRAWtype%
+ {\setupprettyTEXtype
+ \def\prettyidentifier{RAW}}
+
+\endinput
diff --git a/tex/context/base/x-chemml.tex b/tex/context/base/x-chemml.tex
new file mode 100644
index 000000000..8475fe81a
--- /dev/null
+++ b/tex/context/base/x-chemml.tex
@@ -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-contml.tex b/tex/context/base/x-contml.tex
new file mode 100644
index 000000000..0758846cf
--- /dev/null
+++ b/tex/context/base/x-contml.tex
@@ -0,0 +1,451 @@
+% interface=en
+
+%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}}{}{},
+ tex=>{{\disableXML\readfile{\XMLop{name}}{}{}}},
+ 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]
+
+\let\normalcompound=|
+
+% \defineXMLsingular [context:compound] [token=]
+% {\expanded{\normalcompound\XMLop{token}}|}
+
+\defineXMLsingular [context:compound] [token=]
+ {\ifmmode
+ \doifXMLop{token}{\XMLop{token}}{\compoundhyphen}%
+ \else
+ \expanded{\normalcompound\XMLop{token}}|%
+ \fi}
+
+%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=] {\op} {[\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]
+ {\startopelkaar
+ \defineXMLargument[context:line]{\endgraf\type}}
+ {\stopopelkaar}
+
+\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 {fixed}
+%D
+%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="koe" 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
+%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 prvide a caption.
+%D
+%D <float type="figure">
+%D <content>
+%D <externalfigure file="koe" 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 {externalfigure}
+%D
+%D \startbuffer
+%D The previous examples already demonstrated how we can include a graphic:
+%D
+%D <verbatim>
+%D <line><externalfigure file="koe" 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 {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 hav emuch 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
+ \processaction
+ [\XMLop{align}]
+ [ 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
+
+\protect \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..921757f56
--- /dev/null
+++ b/tex/context/base/x-fdf-00.tex
@@ -0,0 +1,40 @@
+% <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}}
+ {\doglobal\saveXMLdata{fdf:\XMLop{name}}{fdf:value}}
+
+\defineXMLsingular [fdf:field] [name=,value=]
+ {\doglobal\saveasXMLdata{fdf:\XMLop{name}}{\XMLop{value}}}
+
+\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-fig-00.tex b/tex/context/base/x-fig-00.tex
index 657cb56fa..e83584392 100644
--- a/tex/context/base/x-fig-00.tex
+++ b/tex/context/base/x-fig-00.tex
@@ -47,7 +47,6 @@
%D <comment>When will we talk about European cows?</comment>
%D </figure>
%D
-%D
%D </figurelibrary>
%D \stoptypen
%D
@@ -87,7 +86,7 @@
\unprotect
-\startXMLnamespace [-] [figbase]
+\startXMLmapping [-] [figbase]
\defineXMLprocess [figurelibrary]
\defineXMLignore [description]
@@ -99,7 +98,7 @@
\defineXMLpush [dummy]
\defineXMLenvironment [figure] \figbase@StartFigure \figbase@StopFigure
-\stopXMLnamespace
+\stopXMLmapping
\newcounter\figurefilepage
@@ -114,7 +113,8 @@
\def\getfigurefilename#1#2%
{\startnointerference
- \startXMLnamespace[-][figbase]
+ \traceXMLelementsfalse
+ \startXMLmapping[-][figbase]
\resetfigurefilebase
\XMLerase{file}
\XMLerase{dummy}
@@ -123,7 +123,7 @@
\doglobal\newcounter\figurefilepage
\def\askedlabel{#2}
\processXMLfilegrouped{#1.xml} % grouped ?
- \stopXMLnamespace
+ \stopXMLmapping
\stopnointerference}
\def\resetfigurefilebase%
@@ -156,7 +156,7 @@
\def\usefigurebase[#1]%
{\doifelse{#1}{\v!reset}
{\let\figurebaselist\empty}
- {\appendtocommalist{#1}\figurebaselist}}
+ {\addtocommalist{#1}\figurebaselist}}
\let\figurebaselist\empty
diff --git a/tex/context/base/x-fig-01.tex b/tex/context/base/x-fig-01.tex
index ece20f7b1..f4900fc4e 100644
--- a/tex/context/base/x-fig-01.tex
+++ b/tex/context/base/x-fig-01.tex
@@ -13,7 +13,7 @@
%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 {\inputfilename} (\TEXEXEC\ will set this
+%D named \type {\jobfilename} (\TEXEXEC\ will set this
%D variable). You can apply this style to a database by
%D saying:
%D
@@ -51,19 +51,20 @@
\usemodule[fig-00]
-\overcomePDFspacefalse
+\setupoutput[pdftex] \overcomePDFspacefalse
-\doifnothing {\inputfilename} {\end}
-\doiffileelse {\inputfilename.xml} {} {\end}
+\doifnothing {\jobfilename} {\end}
+\doiffileelse {\jobfilename.xml} {} {\end}
-\def\StartDescription%
+
+\def\StartDescription
{\bgroup
\defineXMLpush[organization]
\defineXMLpush[project]
\defineXMLpush[product]
\defineXMLpush[comment]}
-\def\StopDescription%
+\def\StopDescription
{\subject [begin] {Figure collection}
\starttabulate[|lBe|p|]
\doifXMLdataelse{organization}
@@ -78,10 +79,10 @@
\blank[2*big]
\egroup}
-\def\StartFigureA%
+\def\StartFigureA
{\bgroup
- \XMLassign{file}{buffer}
\defineXMLpush[file]
+ \XMLassign{file}{buffer}
\defineXMLpush[dummy]
\defineXMLpush[label]
\defineXMLpush[copyright]
@@ -101,7 +102,7 @@
{\bf \XMLpop{dummy}}
\stopbuffer
-\def\StopFigureA%
+\def\StopFigureA
{\doglobal\increment\CurrentPage
\setupbackgrounds[page][background=page]
\doifelsenothing{\XMLpop{label}}
@@ -113,7 +114,7 @@
\setupbackgrounds[page][background=]
\egroup}
-\def\StartFigureB%
+\def\StartFigureB
{\StartFigureA}
\defineregister
@@ -167,7 +168,7 @@
rulethickness=1pt,
framecolor=darkred]
-\def\StopFigureB%
+\def\StopFigureB
{\par
\doglobal\increment\CurrentPage
\doifelsenothing{\XMLpop{label}}
@@ -244,10 +245,10 @@
\vskip10pt
\egroup}
-\def\StartFigureC%
+\def\StartFigureC
{\StartFigureA}
-\def\StopFigureC%
+\def\StopFigureC
{\doglobal\increment\NumberOfFigures
\egroup}
@@ -319,7 +320,7 @@
\doglobal\newcounter\CurrentPage
-\processXMLfilegrouped{\inputfilename.xml}
+\processXMLfilegrouped{\jobfilename.xml}
\increment\NumberOfFigures
@@ -333,7 +334,7 @@
\doglobal\newcounter\CurrentPage
-\processXMLfilegrouped{\inputfilename.xml}
+\processXMLfilegrouped{\jobfilename.xml}
\setuppapersize
[S6][S6]
@@ -350,7 +351,7 @@
\doglobal\newcounter\CurrentPage
-\processXMLfilegrouped{\inputfilename.xml} \page
+\processXMLfilegrouped{\jobfilename.xml} \page
\subject [list] {List of figures}
diff --git a/tex/context/base/x-fig-02.tex b/tex/context/base/x-fig-02.tex
index 13e601819..1bdfc2f11 100644
--- a/tex/context/base/x-fig-02.tex
+++ b/tex/context/base/x-fig-02.tex
@@ -34,15 +34,15 @@
\usemodule[fig-00]
-\doifnothing {\inputfilename} {\end}
-\doiffileelse {\inputfilename.xml} {} {\end}
+\doifnothing {\jobfilename} {\end}
+\doiffileelse {\jobfilename.xml} {} {\end}
\defineXMLenvironment [figurelibrary] \StartLibrary \StopLibrary
\defineXMLignore [description]
\defineXMLenvironment [figure] \StartFigure \StopFigure
\def\StartLibrary
- {\immediate\openout \scratchwrite=\inputfilename.fig
+ {\immediate\openout \scratchwrite=\jobfilename.fig
\immediate\write\scratchwrite{\string\input\space x-fig-03.tex \string\relax}
\immediate\write\scratchwrite{}}
@@ -64,13 +64,13 @@
\immediate\write\scratchwrite
{\string\setfiguredata\space
{\XMLpop{label}}
- {\inputfilename}
+ {\jobfilename}
{\CurrentPage}}}
\doglobal\newcounter\CurrentPage
\starttext
-\processXMLfilegrouped{\inputfilename.xml}
+\processXMLfilegrouped{\jobfilename.xml}
\stoptext
diff --git a/tex/context/base/m-mathml.tex b/tex/context/base/x-mathml.tex
index f9caf56d3..5c36c35fb 100644
--- a/tex/context/base/m-mathml.tex
+++ b/tex/context/base/x-mathml.tex
@@ -27,16 +27,18 @@
%D For simple inline math, we first provide:
-% todo : nesting ! ! ! !
+\newcount\xmlmathlevel % todo : nesting ! ! ! !
-\newcount\xmlmathlevel
+\defineXMLenvironment [m] \startXMLinlinemath \stopXMLinlinemath
-\defineXMLenvironment [m]
+\def\startXMLinlinemath
{\ifmmode
\advance\xmlmathlevel1\relax
\else
\xmlmathlevel1$%
\fi}
+
+\def\stopXMLinlinemath
{\ifcase\xmlmathlevel\or
$\xmlmathlevel0\relax
\else
diff --git a/tex/context/base/x-physml.tex b/tex/context/base/x-physml.tex
new file mode 100644
index 000000000..0b9799a34
--- /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.
+
+\usemodule[units] \useXMLfilter[pml,pmu]
+
+\endinput
diff --git a/tex/context/base/x-sch-00.tex b/tex/context/base/x-sch-00.tex
new file mode 100644
index 000000000..97b266d5e
--- /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\docommando##1{\doXSDkeyval{#1}{##1}{#2}{##1}}%
+ \processcommalist[#3]\docommando}
+
+\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..f704f8e73
--- /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 \starttypen
+%D texexec --use=sch-01 x-fig-00.xsd --pdf
+%D \stoptypen
+
+\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]
+ [texnansi]
+
+\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-xml-01.tex b/tex/context/base/x-xml-01.tex
new file mode 100644
index 000000000..6a1601f27
--- /dev/null
+++ b/tex/context/base/x-xml-01.tex
@@ -0,0 +1,80 @@
+% output=pdftex modes=packed
+
+%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}
+
+% makes pdftotext to 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
+
+% too many messages
+%
+% \setupbodyfont
+% [1pt,tt]
+%
+% so:
+
+\definedfont [Mono at 1pt]
+
+\setuplayout
+ [backspace=0cm,
+ topspace=0cm,
+ width=40em,
+ height=middle,
+ header=0cm,
+ footer=0cm]
+
+\setupXMLfile
+ [level=2]
+
+\startmode[wide]
+
+ \setuplayout[width=250cm]
+
+\stopmode
+
+\startmode[packed]
+
+ \setupXMLfile[inbetween=]
+
+\stopmode
+
+\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..df56baa36
--- /dev/null
+++ b/tex/context/base/x-xml-02.tex
@@ -0,0 +1,67 @@
+% output=pdftex modes=letter
+
+%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]
+
+\setuptolerance
+ [verytolerant]
+
+\setupalign
+ [right]
+
+\lowercasestring \inputfilename \to \lcinputfilename
+
+\setupheadertexts
+ [\lcinputfilename]
+
+\setupfootertexts
+ [\currentdate\space\string| \currenttime\space \string| \pagenumber]
+
+\setupXMLfile
+ [level=2]
+
+\starttext
+
+\showXMLfile{\inputfilename}
+
+\stoptext
diff --git a/tex/context/base/xtag-cml.tex b/tex/context/base/xtag-cml.tex
new file mode 100644
index 000000000..01e137f8a
--- /dev/null
+++ b/tex/context/base/xtag-cml.tex
@@ -0,0 +1,222 @@
+% see mathml, == \defineXMLdirective [mathml] \setupMMLappearance
+
+\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!variant=\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{\@@CMLionvariant}{\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
+ %\processXMLRchild{caption}{#2}% not here
+ \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-exp.tex b/tex/context/base/xtag-exp.tex
new file mode 100644
index 000000000..fc51675cb
--- /dev/null
+++ b/tex/context/base/xtag-exp.tex
@@ -0,0 +1,81 @@
+%D \module
+%D [ file=xtag-exp,
+%D version=2001.08.20,
+%D title=\CONTEXT\ XML Support,
+%D subtitle=Expansion Related 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.
+
+\beginTEX
+ \writestatus{XML}{sorry, XML is only supported in (pdf)etex}
+ \def\startXMLdefinitions{\gobbleuntil\stopXMLdefinitions}
+ \endinput
+\endTEX
+
+\writestatus{loading}{Context XML Macros (expansion)}
+
+\unprotect
+
+%D Files
+
+\newcounter\XMLfilenesting \let\restoreXMLelements\relax
+
+\def\startXMLreading
+ {\increment \XMLfilenesting \relax
+ \ifnum\XMLfilenesting=1
+ \ifprocessingXML
+ \let\restoreXMLelements\relax
+ \else
+ \let\restoreXMLelements\disableXMLelements
+ \enableXMLelements
+ \fi
+ \fi}
+
+\def\stopXMLreading
+ {\ifnum\XMLfilenesting=1
+ \restoreXMLelements
+ \let\restoreXMLelements\relax
+ \fi
+ \decrement \XMLfilenesting \relax}
+
+\def\enableXMLfiledata
+ {\prependtoks \enableXMLelements \to \mainoutput % brrr, will change
+ \appendtoks \startXMLreading \to \everybeforeutilityread
+ \appendtoks \stopXMLreading \to \everyafterutilityread
+ \appendtoks \forcefileexpansiontrue \to \everyenableXML
+ \let\enableXMLfiledata\relax}
+
+\setupXMLprocessing[\c!status=\v!start]
+
+\appendtoks \enableXMLfiledata \to \aftersetupXMLprocessing
+
+%D Here we overload the mark handler.
+
+\def\XMLexpanded#1%
+ {\bgroup
+ \honorunexpanded
+ \dontexpandencoding
+ \xdef\@@globalexpanded{\noexpand#1}%
+ \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}}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-ext.tex b/tex/context/base/xtag-ext.tex
index 9bf9f89a9..0645cea38 100644
--- a/tex/context/base/xtag-ext.tex
+++ b/tex/context/base/xtag-ext.tex
@@ -21,54 +21,61 @@
\unprotect
%D \macros
-%D {startXMLnamespace}
+%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 namespaces.)
%D
%D \starttypen
-%D \startXMLnamespace [tag] | [-] [tag] | [+] [tag]
+%D \startXMLmapping [tag] | [-] [tag] | [+] [tag]
%D definitions
-%D \stopXMLnamespace
+%D \stopXMLmapping
%D \stoptypen
%D
-%D When a \type {[+]} is specified, the namespaces will
+%D When a \type {[+]} is specified, the mappings will
%D nest.
\let\normal@@XMLelement\@@XMLelement
-\let\XMLnamespace\empty
-\def\startXMLnamespace%
- {\dodoubleempty\dostartXMLnamespace}
+\def\resetXMLmapping
+ {\let\@@XMLelement\normal@@XMLelement
+ \let\@@XMLmapping\empty}
-\def\dostartXMLnamespace[#1][#2]%
+\resetXMLmapping
+
+\def\startXMLmapping
+ {\dodoubleempty\dostartXMLmapping}
+
+\def\dostartXMLmapping[#1][#2]% sneller maken
{\pushmacro\@@XMLelement
- \pushmacro\@@XMLnamespace
+ \pushmacro\@@XMLmapping
\ifsecondargument
\doifelse{#1}{-}
- {\donostartXMLnamespace{#1}}
+ {\donostartXMLmapping{#2}}
{\doifelse{#1}{+}
- {\dodostartXMLnamespace{#1}{#2}}
- {\donostartXMLnamespace{#1}}}%
+ {\dodostartXMLmapping{#2}}
+ {\donostartXMLmapping{#2}}}%
\else
- \donostartXMLnamespace{#1}%
+ \donostartXMLmapping{#1}%
\fi
\unprotect}
-\def\donostartXMLnamespace#1%
- {\edef\XMLnamespace{#1}%
- \let\@@XMLelement\normal@@XMLelement}
+\def\donostartXMLmapping#1%
+ {\let\@@XMLprevelement\@@XMLelement
+ \edef\@@XMLmapping{#1}%
+ \edef\@@XMLelement{\normal@@XMLelement+#1}}
-\def\dodostartXMLnamespace#1#2%
- {\edef\XMLnamespace{\XMLnamespace:#2}%
- \edef\@@XMLelement{\@@XMLelement:#2}}
+\def\dodostartXMLmapping#1%
+ {\let\@@XMLprevelement\@@XMLelement
+ \edef\@@XMLmapping{\@@XMLmapping+#1}%
+ \edef\@@XMLelement{\@@XMLelement+#1}}
-\def\stopXMLnamespace%
+\def\stopXMLmapping%
{\protect
- \popmacro\@@XMLnamespace
+ \popmacro\@@XMLmapping
\popmacro\@@XMLelement}
-
+
%D Context Directives:
\def\@@CTXML{@@CTXML}
@@ -76,20 +83,22 @@
\def\defineXMLdirective%
{\dodoubleempty\dodefineXMLdirective}
-\def\dodefineXMLdirective[#1][#2]#3%
+\long\def\dodefineXMLdirective[#1][#2]#3%
{\defineXMLprocessor[context-#1-directive]{\dohandleXMLdirective{#1}{#3}}%
\ifsecondargument
- \setvalue{\@@CTXML-#1-#2}{#3}%
+ \long\setvalue{\@@CTXML-#1-#2}{#3}%
\fi}
\def\dohandleXMLdirective#1#2#3%
-% {\dodohandleXMLdirective#3 dummy dummy dummy\end{#1}{#2}}
{\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%
- {\doifdefinedelse{\@@CTXML-#5-#1}
- {\getvalue{\@@CTXML-#5-#1}[#2=#3]}
- {#6[#2=#3]}}
+ {\executeifdefined{\@@CTXML-#5-#1}{#6[#1]}[#2=#3]}
% \defineXMLdirective [mathml] \setupMMLappearance % [#1][#2=#3]
% \defineXMLdirective [flowchart] [shapes] \setupFLOWshapes % [#2=#3]
@@ -97,5 +106,53 @@
\defineXMLprocessor [context-begin-group] {\begingroup\gobbleoneargument}
\defineXMLprocessor [context-end-group] {\endgroup \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\saveasXMLdata#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>}}
+
+\gdef\doifelseXMLelement#1%
+ {\doifdefinedelse{\@@XMLsave#1}}
+
+\gdef\flushXMLelement#1%
+ {\csname\@@XMLsave#1\endcsname}
+
+\gdef\showXMLelement#1%
+ {\showvalue{\@@XMLsave#1}}
+
+\gdef\processXMLelement#1%
+ {\bgroup
+ \enableXMLelements
+ \getvalue{\@@XMLsave#1}%
+ \egroup}
+
+\gdef\texXMLelement#1%
+ {\begingroup
+ \setnormalcatcodes
+ \scantokens\@EA\@EA\@EA{\csname\@@XMLsave#1\endcsname}%
+ \endgroup}
+
+
+\egroup
+\def\potentialXMLentity#1%
+ {\doifXMLentityelse{#1}{\getXMLentity{#1}}{#1}}
+
\protect \endinput
diff --git a/tex/context/base/xtag-ini.tex b/tex/context/base/xtag-ini.tex
index 970f065df..97853ed45 100644
--- a/tex/context/base/xtag-ini.tex
+++ b/tex/context/base/xtag-ini.tex
@@ -11,20 +11,32 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\beginTEX
+% csnames
+
+\beginTEX
\writestatus{XML}{sorry, XML is only supported in (pdf)etex}
\def\startXMLdefinitions{\gobbleuntil\stopXMLdefinitions}
- \endinput
-\endTEX
+ \endinput
+\endTEX
+
+\writestatus{loading}{Context XML Macros (initialization)}
+
+% XMLelse -> elseXML
+
+%D This module is highly optimized for speed, which sometimes
+%D reads to rather unreadable code. Sorry for this.
+
+\def\gobblespacetokens % will go to syst-ext.tex + speed up
+ {\doifnextcharelse\empty\donothing\donothing} % no {}\do\do !
\beginETEX XML
\bgroup \obeylines
- \gdef\startXMLdefinitions%
- {\bgroup\obeylines\dostartXMLdefinitions}
+ \gdef\startXMLdefinitions%
+ {\bgroup\obeylines\dostartXMLdefinitions}
- \gdef\dostartXMLdefinitions #1
+ \gdef\dostartXMLdefinitions #1
{\egroup\doifsomething{#1}{\writestatus{XML}{loading #1 support}}}
\global\let\stopXMLdefinitions\relax
@@ -42,16 +54,17 @@
%D Like it or not, this module deals with angle bracketed
%D input. Processing \XML\ alike input in \CONTEXT\ has been
-%D possible since 1994, but several methods ran in parallel
-%D and were implemented in modules like \type {m-sgml}.
+%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 no one optimal solution for processing \XML\ data.
+%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 \PERL: \type {<command>} was converted into
-%D \type {\begSGML[command]} and optional parameters were
-%D passed.
+%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 is to use a \PERL\ or \XSL\ transformation
+%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
@@ -60,34 +73,60 @@
%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 forhand, processing in
+%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 it's advantage, but especially the third
+%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 on
+%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
+%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.
+%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}
+
+\protect
%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 due time
-%D this module will deal with all these animals in a
-%D convenient way. In some cases the upper and lowercase
-%D alternatives need to be dealt with, although this is not
-%D realy needed since XML is case sensitive.
+%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
@@ -100,47 +139,47 @@
%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:}
-\def\@@XMLentity {\@@XML ent}
-\def\@@XMLelement {\@@XML ele}
-\def\@@XMLvariable {\@@XML var}
-\def\@@XMLvalue {\@@XML val}
-\def\@@XMLpars {\@@XML par}
-\def\@@XMLdata {\@@XML dat}
-\def\@@XMLcode {\@@XML cod}
-\def\@@XMLinstruction {\@@XML ins}
-\def\@@XMLmap {\@@XML map}
-\def\@@XMLlist {\@@XML lst}
+\def\@@XMLentity {\@@XML ent} % &crap;
+\def\@@XMLelement {\@@XML ele} % <this> </this> <that/>
+\def\@@XMLvariable {\@@XML var} % key="val"
+\def\@@XMLvalue {\@@XML val} % key="val"
+\def\@@XMLpars {\@@XML par} %
+\def\@@XMLdata {\@@XML dat} % mem buffer
+\def\@@XMLcode {\@@XML cod} % named mem buffers
+\def\@@XMLinstruction {\@@XML ins} % <?
+\def\@@XMLmap {\@@XML map} % mapping on context attr
+\def\@@XMLlist {\@@XML lst} %
+\def\@@XMLnamespace {\@@XML nam} % namespace:element
+\def\@@XMLurlspace {\@@XML url} %
+\def\@@XMLescape {\@@XML esc} % <!
+\def\@@XMLdepth {\@@XML dep} % used to track nesting
+\def\@@XMLdopth {\@@XML dop} % used to track nesting
+\def\@@XMLsave {\@@XML sav} % namespace for saved elements
\newtoks\XMLtoks
\newtoks\XMLresetlist
-\chardef\XMLargumentmode=0
-
-\newif\ifignoreXMLcase
\newif\ifignoreXMLspaces
\newif\iffixedXMLfont
+\newif\iftraceXMLelements
+\newif\ifprocessingXML
-%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 \starttypen
-%D so test\compound{}test can be used instead of test||test
-%D \stoptypen
+\newcount\XMLlevel % scratchcounter
+\newcount\XMLdepth % used here
-\let\docompound=| \def\compound#1{\docompound#1|}
+\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. The core handlers are \type
-%D {\doXMLentity} and \type {\doXMLelement}.
+%D original meaning.
%D \macros
%D {enableXML}
@@ -156,34 +195,46 @@
\catcode`\.=\@@escape
.catcode`.B=.@@begingroup
.catcode`.E=.@@endgroup
-
-.catcode`.&=.@@active .gdef.letterampersand B.string&E
-.catcode`.<=.@@active .gdef.letterless B.string<E
-
-.catcode`.#=.@@active .gdef.letterhash B.string#E
-.catcode`.$=.@@active .gdef.letterdollar B.string$E
-.catcode`.%=.@@active
-.catcode`.\=.@@active .gdef.letterbackslash B.string\E
-.catcode`.^=.@@active .gdef.letterhat B.string^E
-.catcode`._=.@@active .gdef.letterunderscore B.string_E
-.catcode`.{=.@@active .gdef.letterbgroup B.string{E
-.catcode`.}=.@@active .gdef.letteregroup B.string}E
-.catcode`.|=.@@active .gdef.letterbar B.string|E
-.catcode`.~=.@@active .gdef.lettertilde B.string~E
-
-.gdef.enableXMLexpansion
+.catcode`.P=.@@parameter
+
+.catcode`.&=.@@active * .gdef.letterampersand B.string&E
+.catcode`.<=.@@active * .gdef.letterless B.string<E
+ * .gdef.lettermore B.string>E
+.catcode`.#=.@@active * .gdef.letterhash B.string#E
+.catcode`.$=.@@active * .gdef.letterdollar B.string$E
+.catcode`.%=.@@active * .gdef.letterpercent B.string%E
+.catcode`.\=.@@active * .gdef.letterbackslash B.string\E
+.catcode`.^=.@@active * .gdef.letterhat B.string^E
+.catcode`._=.@@active * .gdef.letterunderscore B.string_E
+.catcode`.{=.@@active * .gdef.letterbgroup B.string{E
+.catcode`.}=.@@active * .gdef.letteregroup B.string}E
+.catcode`.|=.@@active * .gdef.letterbar B.string|E
+.catcode`.~=.@@active * .gdef.lettertilde B.string~E
+
+.gdef.enableXMLexpansion
B.def<B.doXMLelementE.let&=.doXMLentityE
-.gdef.disableXMLexpansion
+.gdef.disableXMLexpansion
B.unexpanded.def<B.doXMLelementE.let&=.doXMLentityE
-.gdef.enableXML*
+* 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*
.catcode`.&=.@@active .let&=.doXMLentity*
.catcode`.<=.@@active .unexpanded.def<B.doXMLelementE*
- .catcode`.>=.@@other*
- .catcode`.#=.@@active .def#B&tex-hash;E*
+ .catcode`.>=.@@other .catcode`."=.@@other*
+ .catcode`./=.@@other .catcode`.'=.@@other*
+ *catcode`.#=.@@active .def#PP1B&tex-hash;E* gobbles its own dup
+ .catcode`.#=.@@active .def#B&tex-hash;E*
.catcode`.$=.@@active .def$B&tex-dollar;E*
.catcode`.%=.@@active .def%B&tex-percent;E*
.catcode`.\=.@@active .def\B&tex-backslash;E*
@@ -192,18 +243,35 @@
.catcode`.{=.@@active .def{B&tex-leftbrace;E*
.catcode`.}=.@@active .def}B&tex-rightbrace;E*
.catcode`.|=.@@active .def|B&tex-bar;E*
- .catcode`.~=.@@other* active .def~B&tex-tilde;E*
- .relax* needed for successive .if's
+ .catcode`.~=.@@other *def~B&tex-tilde;E*
+ .processingXMLtrue
+ .the.everyenableXML
E
-.gdef.enableXMLelements*
- B.catcode`.<=.@@active .unexpanded.def<B.doXMLelementE*
- .catcode`.>=.@@other*
- .relax* needed for successive .if's
+* 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}
+
%D An element can be singular or paired. A singular element is
%D called an empty element. The following definitions are
%D equivalent:
@@ -265,45 +333,83 @@
%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 more catcode and first character cases. We need to use
+%D \type {\begingroup} here, otherwise we get funny spaces in
+%D math.
-\protect
+%D Maybe I will remove grouping here and introduce \type
+%D {\obeyXMLlines}.
-\long\def\doXMLelement#1%
- {\begingroup % maybe tab and space needs some treatment too: \catcode`\ =10 % \@@space
- \catcode`\^^M=10
- \if#1!\let\next \xdoXMLelement \else
- \if#1?\let\next \ydoXMLelement \else
- \let\next \zdoXMLelement \fi\fi
- \next#1}
-
-%D By using a few {\expandafter}'s we can us a \type {\next}
+%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).
+%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%
- {\begingroup % maybe tab and space needs some treatment too: \catcode`\ =10 % \@@space
- \catcode`\^^M=10\relax
- \if#1!\expandafter \xdoXMLelement \else
- \if#1?\expandafter\expandafter\expandafter \ydoXMLelement \else
- \expandafter\expandafter\expandafter \zdoXMLelement \fi\fi
+ {\if#1!\expandafter \xparseXMLescape \else
+ \if#1?\expandthree \xparseXMLprocess \else
+ \expandthree \xparseXMLelement \fi\fi
#1}
-%D The (yet experimental) \type {CDATA} parser is implemented
-%D on top of the verbatim environment.
+% 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 >}
+
+% this kind of optimizations are only faster in a more
+% extensive if tree combined with equally spread occurance of
+% #1 (also tested for arguments)
+%
+% \long\def\doXMLelement#1%
+% {\csname<\if#1!!\else\if#1??\else.\fi\fi>\endcsname#1}
+%
+% \long\setvalue{<!>}!#1 {\parseXMLescape{#1}}
+% \long\setvalue{<?>}?#1 {\parseXMLprocess{#1}}
+% \long\setvalue{<.>}#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
+ \expandafter\xyparseXMLescape
+ \fi#1#2}
+
+\long\def\xxparseXMLescape --#1{\parseXMLescape{--}#1}
+\long\def\xyparseXMLescape #1 {\parseXMLescape{#1}}
+
+%D Now the real work can begin.
+
+\unprotect
-\long\def\xdoXMLelement !#1 % !-- --> or !xyz >
- {\endgroup
- \doifelse{#1}{--}
- {\long\def\nextelement{\gobbleuntil{-->}}}
- {\doifelse{#1}{[CDATA[}
- {\long\def\nextelement{\skipfirstverbatimlinefalse
- \processtaggeddisplayverbatim{]]>}}}
- {\long\def\nextelement{\gobbleuntil{>}}}}%
- \nextelement}
+\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}}
+
+\let\normalparseXMLescape \parseXMLescape
+\let\normalparseXMLelement\parseXMLelement
+\let\normalparseXMLprocess\parseXMLprocess
%D In our case, processing instructions are only needed if
%D we want specific \CONTEXT\ support. This may be useful in
@@ -311,183 +417,620 @@
%D application. We will implement a \CONTEXT\ code handler
%D later.
-\long\def\ydoXMLelement#1 #2?>% ?target ?>
- {\endgroup\dodoXMLprocessor{#1}{#2}}
+%D The processing instructions handler is implemented as
+%D follows.
-%D The normal elements are handled by \type {\dodoXMLelement}.
+\long\def\defineXMLprocessor[#1]#2%
+ {\long\setvalue{\@@XMLinstruction:#1}{#2}}
-\long\def\zdoXMLelement#1>%
- {\endgroup\dodoXMLelement#1 >}
+% \def\parseXMLprocess#1#2%
+% {\executeifdefined{\@@XMLinstruction:#1}\gobbleoneargument{#2}}
-%D Now we switch to unprotected mode again.
+%D Because we support \type {.. ?>} as well as \type {.. >}
+%D end||of||pi situations, we need to clean up the ending
+%D \type {?}.
-\unprotect
+\protect
-%D The processing instructions handler is implemented as
-%D follows.
+\long\def\cleanupXMLprocess#1%
+ {\docleanupXMLprocess#1 ? \relax}
+
+\long\def\docleanupXMLprocess#1? #2\relax
+ {\def\currentXMLprocess{#1}}
+
+\unprotect
+
+\def\parseXMLprocess#1#2%
+ {\cleanupXMLprocess{#2}%
+ %\convertcommand\currentXMLprocess\to\ascii
+ %\writestatus{xml-process}{\ascii}
+ \expanded
+ {\executeifdefined
+ {\@@XMLinstruction:#1}
+ \noexpand\gobbleoneargument
+ {\expandafter\noexpand\currentXMLprocess}}}
+
+%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
-\long\def\dodoXMLprocessor#1%
- {\ifundefined{\@@XMLinstruction:#1}%
- \let\next\gobbleoneargument
+\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
- \def\next{\getvalue{\@@XMLinstruction:#1}}%
+ \docleanupXMLelement#1#2/\empty\relax
+ \fi
+ \ifx\currentXMLarguments\openXMLargument
+ \chardef\kindofXMLelement\emptyXMLtag
\fi
- \next}
+ \@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{\someXMLelement\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}
-\long\def\defineXMLprocessor[#1]#2% watch the ?
- {\long\setvalue{\@@XMLinstruction:?#1}{#2}}
+%D Although not really needed, we clean up the arguments.
-%D As an example, we implement a \CONTEXT\ code handler:
+% \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
-\defineXMLprocessor[context] {\contextXMLcommand}
-\defineXMLprocessor[context-command]{\contextXMLcommand}
+\long\def\cleanupXMLarguments
+ {\ifnum\kindofXMLelement=\emptyXMLtag
+ \ifx\currentXMLarguments\empty \else
+ \@EA\docleanupXMLarguments\currentXMLarguments/ \relax
+ \fi
+ \fi}
-\def\contextXMLcommand#1%
- {\pushmacro\disableXML
- \def\disableXML{\global\let\afterXMLprocessor\empty}%
- \global\let\afterXMLprocessor\enableXML
- \setnormalcatcodes\scantokens{#1}\afterXMLprocessor
- \popmacro\disableXML}
+\long\def\docleanupXMLarguments#1/ #2\relax % space added earlier
+ {\edef\currentXMLarguments{#1}}
-\defineXMLprocessor[context-directive]{\contextXMLdirective}
+\def\executeXMLelementA% no fallback
+ {\ifcsname\@@XMLelement:\currentXMLfullidentifier\endcsname
+ \csname\@@XMLelement:\currentXMLfullidentifier\endcsname
+ \fi}
-\def\contextXMLdirective#1%
- {\docontextXMLdirective#1 dummy dummy dummy\end}
+\def\executeXMLelementB% default fallback
+ {\csname \@@XMLelement:%
+ \ifcsname\@@XMLelement:\currentXMLfullidentifier\endcsname
+ \currentXMLfullidentifier
+ \else
+ \defaultXMLelement
+ \fi
+ \endcsname}
+
+\def\executeXMLelementC% no namespace of default fallback
+ {\csname \@@XMLelement:%
+ \ifcsname\@@XMLelement:\currentXMLfullidentifier\endcsname
+ \currentXMLfullidentifier
+ \else\ifcsname\@@XMLelement:\currentXMLidentifier\endcsname
+ \currentXMLidentifier
+ \else
+ \defaultXMLelement
+ \fi\fi
+ \endcsname}
+
+\def\setXMLfallbackmode#1%
+ {\ifcase#1\relax
+ \let\executeXMLelement\executeXMLelementA
+ \or
+ \let\executeXMLelement\executeXMLelementB
+ \or
+ \let\executeXMLelement\executeXMLelementC
+ \fi}
+
+\setXMLfallbackmode2
+
+%D An example of fall back modes is given below.
-\def\docontextXMLdirective#1 #2 #3 #4\end% class var value
- {\setvalue{\@@XMLvariable:#1:#2}{#3}}
+%D Later we will implement the error handler, here we handle
+%D the default case.
-\defineXMLprocessor[context-message]{\contextXMLmessage}
+\def\someXMLelement#1%
+ {\ifnum\kindofXMLelement=\endXMLtag /\fi
+ #1%
+ \ifnum\kindofXMLelement=\emptyXMLtag/\fi}
+
+\def\defaultXMLelement%
+ {\someXMLelement\s!default}
-\def\contextXMLmessage#1%
- {\writestatus{xml}{#1}}
+%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\setnormalcatcodes%
- {\catcode`\!=\@@other \catcode`\?=\@@other
- \catcode`\&=\@@alignment \catcode`\<=\@@other
- \catcode`\#=\@@parameter \catcode`\$=\@@mathshift
- \catcode`\%=\@@comment \catcode`\\=\@@escape
- \catcode`\^=\@@superscript \catcode`\_=\@@subscript
- %\catcode`\|=\@@active \catcode`\~=\@@active
- \catcode`\{=\@@begingroup \catcode`\}=\@@endgroup}
+\def\beginXMLelement
+ {\global\advance\XMLdepth \plusone % 1
+ \global\@EA\let\csname\@@XMLdepth:\the\XMLdepth\endcsname\currentXMLelement}
-\let\disableXML\setnormalcatcodes
+\def\endXMLelement
+ {\global\advance\XMLdepth \minusone } % -1 }
-%D Given the previous definition, and given that \ETEX\ is
-%D used, we can now say:
+\def\XMLancestor#1%
+ {\ifnum\numexpr(\XMLdepth-#1)>0
+ \csname\@@XMLdepth:\the\numexpr(\XMLdepth-#1)\endcsname
+ \else
+ \currentXMLelement
+ \fi}
+
+\def\XMLparent%
+ {\XMLancestor1}
+
+% 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 \XMLparent{1} \NC \NR
+%D \NC parent 2 \NC \XMLparent{2} \NC \NR
+%D \NC parent 3 \NC \XMLparent{3} \NC \NR
+%D \NC parent 4 \NC \XMLparent{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: \setXMLfallbacklevel0 \processXMLbuffer
+%D fallback B: \setXMLfallbacklevel1 \processXMLbuffer
+%D fallback C: \setXMLfallbacklevel2 \processXMLbuffer
+
+%D Here we do the namespace (re)mapping. More examples are
+%D provided in the manual.
%D
%D \starttypen
-%D <?context {\bf Start Of Some \TeX\ Text} ?>
+%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 \stoptypen
-%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 will implement the normal element handler.
+\newtoks\autoXMLnamespaces
-\let\currentXMLarguments\empty
-\let\currentXMLelement \empty
+%D The automatically mapped namespaces (the fallbacks so to
+%D day) are collected in a token list.
-\newtoks\everyXMLelement
+\let\checkedXMLnamespace\empty
-\long\def\dodoXMLelement#1 #2>%
- {\def\!!stringa{#2}%
- \def\!!stringb{/ }%
- \ifx\!!stringa\empty
- \let\currentXMLarguments\empty
- \def\currentXMLelement{#1}%
- \the\everyXMLelement
- \else\ifx\!!stringa\!!stringb
- \let\currentXMLarguments\empty
- \def\currentXMLelement{#1/}%
- \the\everyXMLelement
+\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
- \def\currentXMLelement{#1}%
- \def\currentXMLarguments{#2}%
- \the\everyXMLelement
- %\getXMLarguments\currentXMLelement{#2}%
- \dogetXMLarguments\currentXMLelement#2>%
- \fi \fi
- \executeXMLelement\currentXMLelement}
-
-\def\executeXMLelement#1%
- {\getvalue{\@@XMLelement:#1}}
-
-\newif\ifXMLrawentities
+ % locate fallback
+ \donefalse\the\autoXMLnamespaces
+ \fi\fi\fi}
-% \bgroup
-%
-% \catcode`<=\@@active
-%
-% \gdef\defineXMLentity[#1]#2%
-% {\unspaceargument#1\to\ascii
-% \long\setvalue{\@@XMLelement:ent:\@EA\firstofoneargument\ascii/}{#2}}
-%
-% \gdef\doXMLentity#1;%
-% {\ifXMLrawentities#1\else\executeXMLentity{#1}\fi}
-%
-% \gdef\executeXMLentity#1%
-% {<ent:#1/>}
-%
-% \gdef\getXMLentity#1%
-% {\getvalue{\@@XMLelement:ent:#1/}}
-%
-% \gdef\doifXMLentityelse#1#2#3%
-% {\ifundefined{\@@XMLelement:ent:#1/}#3\else#2\fi}
-%
-% \egroup
+\def\skipXMLnamespace[#1]%
+ {\letvalue{\@@XMLnamespace:#1}\doXMLskipnamespace}
-\gdef\defineXMLentity[#1]#2%
- {\unspaceargument#1\to\ascii
- \long\setvalue{\@@XMLentity:\@EA\firstofoneargument\ascii}{#2}}
+\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}
-% we need to be able to do:
+\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 of:
+% so we need an ifless implementation
-\gdef\doXMLentity#1;%
- {\ifXMLrawentities
- \expandafter\firstofoneargument
+% \eacute -> simplified -> e (via raw encoding)
+% -> raw -> eacute (via handler)
+%
+% naming sucks
+
+\newif\ifXMLrawentities % proper fallback
+\newif\ifXMLsimpleentities % last resort
+
+\def\simpleXMLencoding{raw}
+
+\def\simplifyXMLentities%
+ {\fastenableencoding\simpleXMLencoding
+ \XMLsimpleentitiestrue}
+
+\gdef\defineXMLentity%
+ {\dodoubleempty\dodefineXMLentity}
+
+\gdef\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}}
+
+\gdef\dododefineXMLentity#1#2%
+ {\unspaceargument#1\to\ascii % #1 can be {[} or so
+ \long\setvalue{\@@XMLentity:\@EA\firstofoneargument\ascii}{#2}}
+
+%D May this wile become dodo (more in tune with rest);
+%D beware: also remapped in xtag-map.
+
+\gdef\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\executeXMLhexcharacter
+ \else
+ \@EA\executeXMLdeccharacter
+ \fi#1#2\relax}
+
+% \def\executeXMLhexcharacter x#1\relax % can be overloaded
+% {\ifnum"#1<256
+% \@EA\getXMLcharacter
+% \else\ifXMLrawentities
+% \@EAEAEA\firstofoneargument
+% \else
+% \@EAEAEA\unknownXMLcharacter
+% \fi\fi{\number"#1}}
+
+\def\executeXMLhexcharacter x#1\relax % can be overloaded
+ {\uppercase{\doexecuteXMLhexcharacter#1\relax}}
+
+\def\doexecuteXMLhexcharacter#1\relax
+ {\ifnum"#1<256
+ \@EA\getXMLcharacter
+ \else\ifXMLrawentities
+ \@EAEAEA\firstofoneargument
+ \else
+ \@EAEAEA\unknownXMLcharacter
+ \fi\fi{\number"#1}}
+
+% ==
+%
+% \def\executeXMLhexcharacter x#1\relax
+% {\uppercase{\ifnum"#1}<256
+% \@EA\getXMLcharacter
+% \else\ifXMLrawentities
+% \@EAEAEA\firstofoneargument
+% \else
+% \@EAEAEA\unknownXMLcharacter
+% \fi\fi{\uppercase{\number"#1}}}
+
+\def\executeXMLdeccharacter#1\relax % can be overloaded
+ {\ifnum#1<256
+ \@EA\getXMLcharacter
+ \else\ifXMLrawentities
+ \@EAEAEA\firstofoneargument
+ \else
+ \@EAEAEA\unknownXMLcharacter
+ \fi\fi{\number#1}}
+
+\unexpanded\def\getXMLcharacter#1%
+ {\ifcsname\@@XMLentity:#1\endcsname
+ \@EA\getXMLentity
\else
- \expandafter\executeXMLentity
+ \@EA\rawcharacter
\fi{#1}}
-\def\executeXMLentity#1% internal ! ! !
+\def\unknownXMLcharacter#1{[#1]}
+
+% \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%
- {\getvalue{\@@XMLentity:#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}
+
+\newif\ifautoXMLentities % 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#1%
- {\getvalue{\@@XMLentity:#1}}
+\unexpanded\def\getXMLentity{\expandedXMLentity}
\gdef\doifXMLentityelse#1#2#3%
- {\ifundefined{\@@XMLentity:#1}#3\else#2\fi}
+ {\ifcsname\@@XMLentity:#1\endcsname#2\else#3\fi}
-% \long\def\getXMLarguments#1#2%
-% {\dogetXMLarguments{#1}#2>}
-%
-% \long\def\dogetXMLarguments#1%
-% {\XMLtoks\emptytoks
-% \def\@@XMLclass{#1}%
-% \let\dodoparseXMLarguments\doparseXMLarguments
-% \doparseXMLarguments}
-%
-% \def\dosetXMLargument#1%
-% {\setvalue{\@@XMLvariable:\@@XMLclass:\@@XMLname}{#1}%
-% %\message{[\@@XMLname=#1]}%
-% \let\dodoparseXMLarguments\doparseXMLarguments
-% \dodoparseXMLarguments}
-
-% see \defineXML... commands:
+% see \defineXML... commands:
%
% [key=val] => \presetXMLarguments{element} => default key/vals
% [blabla] => \theXMLarguments{blabla} => user key/vals
@@ -496,78 +1039,217 @@
%
% <element key="val"> stored in case of [blabla] else set as \XMLpar
%
-% see m-steps for an example of usage
+% see m-steps for an example of usage
+
+\let\@@XMLmapmap\empty
+\newif\ifXMLnamespace
\long\def\getXMLarguments#1#2%
- {\dogetXMLarguments{#1}#2>}
+ {\XMLnamespacefalse
+ \dogetXMLarguments{#1}#2>}
+
+\let\dosetXMLattributeA\gobbleoneargument
+
+\def\dosetXMLattributeB#1%
+ {\ifx\@@XMLspac\originalXMLnamespace
+ \@EA\def\csname\@@XMLvariable:\@@XMLclass:\@@XMLname\endcsname{#1}%
+ \fi}
+
+% \def\dosetXMLattributeC#1%
+% {\ifx\@@XMLspac\originalXMLnamespace
+% \@EA\def\csname\@@XMLvariable:\@@XMLclass:\@@XMLname\endcsname{#1}%
+% \else
+% \@EA\def\csname\@@XMLvariable:\@@XMLclass:\@@XMLspac:\@@XMLname\endcsname{#1}%
+% \fi}
+
+\def\dosetXMLattributeC%
+ {\@EA\def\csname\@@XMLvariable:\@@XMLclass\ifx\@@XMLspac
+ \originalXMLnamespace\else:\@@XMLspac\fi:\@@XMLname\endcsname}
+
+% \def\dosetXMLattributeD#1%
+% {\ifx\@@XMLspac\originalXMLnamespace
+% \@EA\def\csname\@@XMLvariable:\@@XMLclass:\currentXMLnamespace:\@@XMLname\endcsname{#1}%
+% \else
+% \@EA\def\csname\@@XMLvariable:\@@XMLclass:\@@XMLspac:\@@XMLname\endcsname{#1}%
+% \fi}
+
+\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\dosetXMLargument\dosetXMLargumentB
+ \let\dodosetXMLargument\dodosetXMLargumentB
\else
\def\@@XMLclass{#1}%
- \let\dosetXMLargument\dosetXMLargumentA
+ \let\dodosetXMLargument\dodosetXMLargumentA
\fi
\let\dodoparseXMLarguments\doparseXMLarguments
\doparseXMLarguments}
-\def\dosetXMLargumentA#1%
- {\setvalue{\@@XMLvariable:\@@XMLclass:\@@XMLname}{#1}%
+\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}
+
+\def\dodoparseXMLargumentsD#1"{\dosetXMLargument{#1}}
+\def\dodoparseXMLargumentsS#1'{\dosetXMLargument{#1}}
+
+\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
- %\message{[\@@XMLclass][\@@XMLname=#1]}\wait
\dodoparseXMLarguments}
-\def\dosetXMLargumentB#1%
- {\setevalue{\@@XMLmap:\@@XMLmapmap}%
- {\@EA\ifx\csname\@@XMLmap:\@@XMLmapmap\endcsname\empty\else
- \csname\@@XMLmap:\@@XMLmapmap\endcsname,%
- \fi
- \@@XMLname=#1}%
+\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
- %\message{[\@@XMLprefix][\@@XMLname=#1]}\wait
\dodoparseXMLarguments}
+\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}}
+
\appendtoks
- \resetXMLarguments\currentXMLelement
+ \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}
+ \@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}
-\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/%
- \edef\currentXMLelement{\currentXMLelement/}%
- \else
- \@EA\XMLtoks\@EA{\the\XMLtoks#1}%
- \fi\fi\fi\fi\fi
- \dodoparseXMLarguments}
+\newtoks\globalscratchtoks
+
+\def\expandXMLvalue#1%
+ {\ifcsname#1\endcsname
+ \bgroup
+\enableXMLexpansion
+ \let\getXMLentity\expandedXMLentity
+ \expanded{\global\globalscratchtoks{\csname#1\endcsname}}%
+ \egroup
+ \@EA\edef\csname#1\endcsname{\the\globalscratchtoks}%
+ \fi}
+
+\def\expandTEXpar #1#2{\expandXMLvalue{#1\interfaced{#2}}}
+\def\expandXMLpar #1#2{\expandXMLvalue{\@@XMLvariable:#1:#2}}
+\def\expandXMLarguments#1{\expandXMLvalue{\@@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]
-\def\dodoparseXMLargumentsD#1"{\dosetXMLargument{#1}}
-\def\dodoparseXMLargumentsS#1'{\dosetXMLargument{#1}}
-
%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.
+%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
+\bgroup \catcode`<=\@@active
\long\gdef\dododefineXMLsingular#1#2%
{\long\setvalue{\@@XMLelement:#1/}{#2}}
@@ -580,30 +1262,76 @@
{\long\setvalue{\@@XMLelement:#1}{\groupedcommand{#2}{}\bgroup}%
\long\setvalue{\@@XMLelement:/#1}{\egroup}}
+%\long\gdef\dododefineXMLargument#1#2% watch the {} around ##1
+% {\long\setvalue{\@@XMLelement:#1/}{#2{}}%
+% \long\setvalue{\@@XMLelement:#1}##1</#1>{#2{##1}}}
+
\long\gdef\dododefineXMLargument#1#2% watch the {} around ##1
{\long\setvalue{\@@XMLelement:#1/}{#2{}}%
- \long\setvalue{\@@XMLelement:#1}##1</#1>{#2{##1}}}
+ \long\setvalue{\@@XMLelement:#1}{\redoXMLargument{#1}{#2}}}
+
+\long\gdef\redoXMLargument#1#2%
+ {\long\@EA\def\@EA\next\@EA##\@EA1\@EA<\@EA/\currentXMLelement>{#2{##1}}%
+ \next}
+
+%\long\gdef\dododefineXMLignore#1%
+% {\long\setvalue{\@@XMLelement:#1/}{}%
+% \long\setvalue{\@@XMLelement:#1}##1</#1>{}}
\long\gdef\dododefineXMLignore#1%
{\long\setvalue{\@@XMLelement:#1/}{}%
- \long\setvalue{\@@XMLelement:#1}##1</#1>{}}
+ \long\setvalue{\@@XMLelement:#1}{\redoXMLignore{#1}}}
+
+\long\gdef\redoXMLignore#1%
+ {\long\@EA\def\@EA\next\@EA##\@EA1\@EA<\@EA/\currentXMLelement>{}%
+ \next}
+
+%\long\gdef\dododefineXMLpickup#1#2#3%
+% {\long\setvalue{\@@XMLelement:#1/}{#2#3}%
+% \long\setvalue{\@@XMLelement:#1}##1</#1>{#2##1#3}}
\long\gdef\dododefineXMLpickup#1#2#3%
{\long\setvalue{\@@XMLelement:#1/}{#2#3}%
- \long\setvalue{\@@XMLelement:#1}##1</#1>{#2##1#3}}
+ \long\setvalue{\@@XMLelement:#1}{\redoXMLpickup{#1}{#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\setvalue{\@@XMLelement:#1/}{#2#3}% % genereert evt relax
+ {\long\setvalue{\@@XMLelement:#1/}{#2#3}%
\long\setvalue{\@@XMLelement:#1}{#2}%
\long\setvalue{\@@XMLelement:/#1}{#3}}
-\long\gdef\dododefineXMLpush#1%
- {\long\setvalue{\@@XMLelement:#1/}{\long\setvalue{\@@XMLdata:#1}{}}%
- \long\setvalue{\@@XMLelement:#1}##1</#1>{\long\setvalue{\@@XMLdata:#1}{##1}}}
+%\long\gdef\dododefineXMLsave#1%
+% {\letvalue{\@@XMLdata:#1}\longempty
+% \long\setvalue{\@@XMLelement:#1/}{\long\setvalue{\@@XMLdata:#1}{}}%
+% \long\setvalue{\@@XMLelement:#1}##1</#1>{\long\setvalue{\@@XMLdata:#1}{##1}}}
-\long\gdef\dododefineXMLenvironmentpush#1#2#3%
- {\long\setvalue{\@@XMLelement:#1/}{#2\long\setvalue{\@@XMLdata:#1}{}#3}%
- \long\setvalue{\@@XMLelement:#1}##1</#1>{#2\long\setvalue{\@@XMLdata:#1}{##1}#3}}
+\long\gdef\dododefineXMLsave#1%
+ {\letvalue{\@@XMLdata:#1}\longempty
+ \long\setvalue{\@@XMLelement:#1/}{\long\setvalue{\@@XMLdata:#1}{}}%
+ \long\setvalue{\@@XMLelement:#1}{\redoXMLsave{#1}}}
+
+\gdef\redoXMLsave#1%
+ {\long\@EA\def\@EA\next\@EA##\@EA1\@EA<\@EA/\currentXMLelement>%
+ {\long\@EA\def\csname\@@XMLdata:#1\endcsname{##1}}%
+ \next}
+
+%\long\gdef\dododefineXMLenvironmentsave#1#2#3%
+% {\letvalue{\@@XMLdata:#1}\longempty
+% \long\setvalue{\@@XMLelement:#1/}{#2\long\setvalue{\@@XMLdata:#1}{}#3}%
+% \long\setvalue{\@@XMLelement:#1}##1</#1>{#2\long\setvalue{\@@XMLdata:#1}{##1}#3}}
+
+\long\gdef\dododefineXMLenvironmentsave#1#2#3%
+ {\letvalue{\@@XMLdata:#1}\longempty
+ \long\setvalue{\@@XMLelement:#1/}{#2\long\setvalue{\@@XMLdata:#1}{}#3}%
+ \long\setvalue{\@@XMLelement:#1}{\redoXMLenvironmentsave{#1}{#2}{#3}}}
+
+\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\dododefineXMLprocess#1%
{\long\setvalue{\@@XMLelement:#1/}{}%
@@ -627,11 +1355,16 @@
\def\defineXMLignore {\dotripleempty\dodefineXMLignore}
\def\defineXMLpickup {\dotripleempty\dodefineXMLpickup}
\def\defineXMLenvironment {\dotripleempty\dodefineXMLenvironment}
-\def\defineXMLpush {\dotripleempty\dodefineXMLpush}
-\def\defineXMLenvironmentpush{\dotripleempty\dodefineXMLenvironmentpush}
+\def\defineXMLsave {\dotripleempty\dodefineXMLsave}
+\def\defineXMLenvironmentsave{\dotripleempty\dodefineXMLenvironmentsave}
\def\defineXMLprocess {\dotripleempty\dodefineXMLprocess}
-% goes for all types
+% push is (not yet) a real push, so:
+
+\def\defineXMLpush {\dotripleempty\dodefineXMLsave}
+\def\defineXMLenvironmentpush{\dotripleempty\dodefineXMLenvironmentsave}
+
+% goes for all types
\def\defineXMLnested {\dotripleempty\dodefineXMLnestedenvironment}
\def\defineXMLnestedenvironment{\dotripleempty\dodefineXMLnestedenvironment}
@@ -658,11 +1391,11 @@
\long\def\dodefineXMLenvironment[#1][#2][#3]#4#5%
{\defineXMLmethod\dododefineXMLenvironment{#1}{#2}{#3}{#4}{#5}}
-\long\def\dodefineXMLpush[#1][#2][#3]%
- {\defineXMLmethod\dododefineXMLpush{#1}{#2}{#3}{}{}}
+\long\def\dodefineXMLsave[#1][#2][#3]%
+ {\defineXMLmethod\dododefineXMLsave{#1}{#2}{#3}{}{}}
-\long\def\dodefineXMLenvironmentpush[#1][#2][#3]#4#5%
- {\defineXMLmethod\dododefineXMLenvironmentpush{#1}{#2}{#3}{#4}{#5}}
+\long\def\dodefineXMLenvironmentsave[#1][#2][#3]#4#5%
+ {\defineXMLmethod\dododefineXMLenvironmentsave{#1}{#2}{#3}{#4}{#5}}
\long\def\dodefineXMLprocess[#1][#2][#3]%
{\defineXMLmethod\dododefineXMLprocess{#1}{#2}{#3}{}{}}
@@ -678,105 +1411,151 @@
% [blabla] [key=val] => \presetXMLarguments{element} => default key/vals
% \theXMLarguments{blabla} => user key/vals
-\long\def\defineXMLmethod#1#2#3#4#5#6% command element [map] [parlst] begin end
+% command element [map] [parlst] begin end
+
+\long\def\defineXMLmethod#1#2#3#4#5#6%
{\ifsecondargument
- \setXMLarguments{#2}{#3}{#4}%
- \fi
- \ifignoreXMLcase
- \lowercasestring#2\to\ascii \@EA#1\@EA{\ascii}{#5}{#6}%
- \uppercasestring#2\to\ascii \@EA#1\@EA{\ascii}{#5}{#6}%
+ \setXMLarguments{#2}{#3}{#4}%
\else
- #1{#2}{#5}{#6}%
- \fi}
+ \resetXMLarguments{#2}% new
+ \fi
+ #1{#2}{#5}{#6}}
+
+%D Arguments (attributes) \unknown
-\def\setXMLarguments#1#2#3% element [tag] settings
+\long\def\setXMLarguments#1#2#3% element [tag] settings
{\doifassignmentelse{#2}
- {\setvalue{\@@XMLpars:#1}{\getrawparameters[\@@XMLvariable:#1:][#2]}}
- {\setvalue{\@@XMLmap :#1}{#2}% later we can init vars by this name
- \doifsomething{#3}{\setvalue{\@@XMLpars:#1}{\getrawparameters[#2][#3]}}}}
+ {\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%
- {\getvalue{\@@XMLpars:#1}}
+ {\csname\@@XMLpars:\rawXMLnamespace#1\endcsname} % == \getvalue{}
\prependtoks
- \presetXMLarguments\currentXMLelement
+ \presetXMLarguments\rawXMLidentifier
\to \everyXMLelement
-\def\doifXMLdataelse#1#2#3% % \relax too, so no etex
-% wrong
-% {\expandafter\ifx\csname\@@XMLdata:#1\endcsname\relax
-% slow
-% {\ifundefined{\@@XMLdata:#1}%
-% etex
- {\unless\ifcsname\@@XMLdata:#1\endcsname
- #3%
- \else\expandafter\ifx\csname\@@XMLdata:#1\endcsname\empty
- #3%
- \else\expandafter\ifx\csname\@@XMLdata:#1\endcsname\relax
- #3%
+\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
- #2%
- \fi\fi\fi}
+ \expandafter\firstoftwoarguments
+ \fi}
-\def\XMLpop#1% one level
-% wrong
-% {\expandafter\ifx\csname\@@XMLdata:#1\endcsname\relax\else
-% \csname\@@XMLdata:#1\endcsname
-% \fi}
-% slow, hm was not commented
-% {\ifundefined{\@@XMLdata:#1}\else\getvalue{\@@XMLdata:#1}\fi}
-% etex
- {\ifcsname\@@XMLdata:#1\endcsname\csname\@@XMLdata:#1\endcsname\fi}
-
-\def\XMLpopdata#1% see m-steps for usage
- {\unless\ifcsname\@@XMLdata:#1\endcsname
- \else\expandafter\ifx\csname\@@XMLdata:#1\endcsname\empty
- \else\expandafter\ifx\csname\@@XMLdata:#1\endcsname\relax
+\def\doifXMLdata#1% always empty at start [gets a long assignment]
+ {\@EA\ifx\csname\@@XMLdata:#1\endcsname\longempty
+ \expandafter\gobbleoneargument
\else
- \@EA\@EA\@EA\XMLdata\@EA\@EA\@EA{\csname\@@XMLdata:#1\endcsname}%
- \fi\fi\fi}
+ \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}
-\def\XMLappend#1#2%
- {\edef\!!stringa{\@@XMLdata:#1}%
- \doifXMLdataelse{#1}%
- {\@EA\@EA\@EA\setvalue\@EA\@EA\@EA\!!stringa\@EA\@EA\@EA
- {\csname\!!stringa\endcsname#2}}
- {\setvalue\!!stringa{#2}}}
+% 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}
+
+\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}%
+ \fi}
-\def\XMLprepend#1#2%
- {\edef\!!stringa{\@@XMLdata:#1}%
- \doifXMLdataelse{#1}%
- {\@EA\@EA\@EA\setvalue\@EA\@EA\@EA\!!stringa\@EA\@EA\@EA
- {#2\csname\!!stringa\endcsname}}
- {\setvalue\!!stringa{#2}}}
+\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%
- {\letvalue{\@@XMLdata:#1}\empty}
+ {\@EA\let\csname\@@XMLdata:#1\endcsname\longempty}
\def\XMLassign#1%
- {\setvalue{\@@XMLdata:#1}}
+ {\long\@EA\def\csname\@@XMLdata:#1\endcsname}
+
+\def\dontparseXMLelement#1>{}
+
+\def\simplifyXMLelements{\let\parseXMLelement\dontparseXMLelement}
\def\defXMLstring#1#2%
-% {\@EA\convertcommand\csname\@@XMLdata:#2\endcsname\to#1}
{\bgroup
+ \enableXMLexpansion
+ \simplifyXMLelements
\let\getXMLentity\firstofoneargument
+ \XMLrawentitiestrue
\xdef\@@XML@@string{\csname\@@XMLdata:#2\endcsname}%
- \egroup
- \@EA\convertcommand\@@XML@@string\to#1}
-
+ \egroup
+ \convertcommand\@@XML@@string\to#1}
+
+\def\defXMLclean#1#2%
+ {\bgroup
+ \enableXMLexpansion
+ \simplifyXMLelements
+ \simplifyXMLentities
+ \let\getXMLentity\expandedXMLentity % should this go in \simplify ?
+ \xdef\@@XML@@string{\csname\@@XMLdata:#2\endcsname}%
+ \egroup
+ \convertcommand\@@XML@@string\to#1}
+
\def\XMLshow#1%
- {\showvalue{\@@XMLdata:#1\endcsname}}
+ {\showvalue{\@@XMLdata:#1}}
-\def\XMLunspace#1%
- {\ifcsname\@@XMLdata:#1\endcsname
- \setevalue{\@@XMLdata:#1}%
- {\@EA\@EA\@EA\dounspaced\csname\@@XMLdata:#1\endcsname\end}%
+\def\XMLunspace#1% kan sneller
+ {\@EA\ifx\csname\@@XMLdata:#1\endcsname\longempty\else
+ \long\@EA\edef\csname\@@XMLdata:#1\csname
+ {\@EAEAEA\dounspaced\csname\@@XMLdata:#1\endcsname\end}%
\fi}
+\chardef\asciispacecode=32
+
\def\defXMLlowerclean#1% lowercase ! evt tzt upper too
{\bgroup
- \lccode`\#=32\lccode`\$=32\lccode`\%=32\lccode`\\=32\lccode`\^=32
- \lccode`\_=32\lccode`\{=32\lccode`\}=32\lccode`\|=32\lccode`\~=32
+ \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}
@@ -791,36 +1570,17 @@
\def\mapXMLvalue#1#2#3% td align center -> middle
{\setvalue{\@@XMLvalue:#1:#2:#3}}
-% \def\XMLvar#1#2#3% td align center
-% {\ifundefined{\@@XMLvariable:#1:#2}%
-% \XMLval{#1}{#2}{#3}%
-% \else
-% \XMLval{#1}{#2}{\getvalue{\@@XMLvariable:#1:#2}}%
-% \fi}
-%
-% \def\XMLval#1#2#3%
-% {\ifundefined{\@@XMLvalue:#1:#2}%
-% #3%
-% \else
-% \getvalue{\@@XMLvalue:#1:#2}%
-% \fi}
-%
-% \def\XMLpar#1#2#3%
-% {\ifundefined{\@@XMLvariable:#1:#2}%
-% #3%
-% \else
-% \getvalue{\@@XMLvariable:#1:#2}%
-% \fi}
-%
-% speedup
-
\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
+ \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%
{\ifcsname\@@XMLvalue:#1:#2\endcsname
\csname\@@XMLvalue:#1:#2\endcsname
@@ -835,76 +1595,166 @@
#3%
\fi}
-% so far for speedup
+\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\TEXpar#1#2%
+ {\csname#1\interfaced{#2}\endcsname}
-\defineXMLsingular [begingroup] {\begingroup}
-\defineXMLsingular [endgroup] {\endgroup}
+\let\texXMLpar\TEXpar % soon obsolete
+
+\let\XMLtex\TEXpar
+
+% handy one
+
+\def\XMLtyp#1#2#3%
+ {\ifcsname\@@XMLvariable:#1:#2\endcsname
+ \@EA\convertcommand\csname\@@XMLvariable:#1:#2\endcsname\to\ascii
+ \else
+ \convertargument#3\to\ascii
+ \fi
+ \ascii}
+
+\defineXMLsingular [begingroup] {\begingroup}
+\defineXMLsingular [endgroup] {\endgroup}
+\defineXMLsingular [gobblespacetokens] {\gobblespacetokens}
+\defineXMLsingular [disableXML] {\disableXML}
\def\XMLstr#1%
{{\enableXML\scantokens{#1}\unskip}}
-\def\XMLstr#1% test
- {\scantokens{\begingroup\enableXML#1<endgroup/>}}
-
-%\def\XMLstrpar#1#2#3%
-% {{\enableXML
-% \ifundefined{\@@XMLvariable:#1:#2}%
-% \scantokens{#3}%
-% \else
-% \scantokens\@EA\@EA\@EA
-% {\csname\@@XMLvariable:#1:#2\endcsname}\unskip
-% \fi}}
+\def\XMLstr#1% test
+ {\scantokens{\begingroup\enableXML#1<endgroup/>\gobblespacetokens}}
-\def\XMLstrpar#1#2#3% test
- {\ifundefined{\@@XMLvariable:#1:#2}%
+\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\relax
+% \message{#1 #2 -> relax}\wait
+%\fi
+ \expandafter\ifx\csname\@@XMLvariable:#1:#2\endcsname\empty
+ \@EAEAEA\secondoftwoarguments
+ \else
+ \@EAEAEA\firstoftwoarguments
+ \fi
\else
- \scantokens\@EA\@EA\@EA{\@EA\begingroup\@EA\enableXML
- \csname\@@XMLvariable:#1:#2\endcsname<endgroup/>}%
+ \@EA\secondoftwoarguments
\fi}
-\def\doifXMLvarelse#1#2#3#4% geen etex, \relax too
- {\expandafter\ifx\csname\@@XMLvariable:#1:#2\endcsname\relax#4\else
- \expandafter\ifx\csname\@@XMLvariable:#1:#2\endcsname\empty#4\else#3\fi\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#3#4% geen etex, \relax too
- {\expandafter\ifx\csname\@@XMLvalue:#1:#2\endcsname\relax#4\else
- \expandafter\ifx\csname\@@XMLvalue:#1:#2\endcsname\empty#4\else#3\fi\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
+
+\bgroup \catcode`<=\@@active
-\def\dogotoXML%
- {\ifx\nexttoken<%
- \expandafter\nexttoken
- \else
- \expandafter\gotoXML
- \fi}
+\long\gdef\ignoreuntilXMLelement#1<{<}
+\long\gdef\grabuntilXMLelement #1<\to#2{\def#2{#1}<}
-\def\gotoXML%
- {\afterassignment\dogotoXML\let\nexttoken=}
+\egroup
-%D Saves tokens and typing.
+%D Saves tokens and typing.
-\def\XMLownvar {\XMLvar \currentXMLelement}
-\def\XMLownval {\XMLval \currentXMLelement}
-\def\XMLownpar {\XMLpar \currentXMLelement}
-\def\XMLownstrpar {\XMLstrpar \currentXMLelement}
-\def\doifXMLownvarelse{\doifXMLvarelse\currentXMLelement}
-\def\doifXMLownvalelse{\doifXMLvalelse\currentXMLelement}
-\def\doifXMLownparelse{\doifXMLparelse\currentXMLelement}
+\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\ownXMLelement{\rawXMLnamespace\rawXMLidentifier}
-%D
+\def\XMLop#1% ownpar
+ {\csname\@@XMLvariable:\ownXMLelement:#1\endcsname}
+
+\def\XMLtp#1% texpar
+ {\csname\@@XMLmapmap\interfaced{#1}\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}}}
-\long\def\startXMLcode[#1] #2 \stopXMLcode
- {\setgvalue{\@@XMLcode:#1}{\startXMLdata#2\stopXMLdata}}
+\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\XMLta {\theXMLarguments\@@XMLmapmap}
+\def\getXMLta {\expanded{\getparameters[\@@XMLmapmap][\XMLta]}}
+\def\expandXMLta{\expandXMLarguments\@@XMLmapmap}
+\def\expandXMLtp{\expandTEXpar\@@XMLmapmap} % #1
+
+\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
- {\getvalue{\@@XMLcode:#1}}
+ {\csname\@@XMLcode:#1\endcsname}
% \long\def\startXMLdata#1\stopXMLdata%
% {\begingroup\enableXML\scantokens{#1}\endgroup}
%
-% \defineXMLentity[tex-backslash] {\catchXMLpar}
+% \defineXMLentity[tex-backslash] {\catchXMLpar}
%
% \def\catchXMLpar#1#2#3
% {\if#1p\if#2a\if#3r\ifmmode\else\endgraf\fi
@@ -912,25 +1762,38 @@
\long\def\startXMLdata
{\begingroup
- \catcode`\^^I=\@@space
- \catcode`\^^M=\@@space
- \catcode`\^^L=\@@space
+ \protectXMLdata
\dostartXMLdata}
-
-% \long\def\dostartXMLdata#1\stopXMLdata
-% {\enableXML\scantokens{#1}\endgroup}
\long\def\dostartXMLdata#1\stopXMLdata
- {\enableXML\scantokens{#1}\ifhmode\unskip\unskip\fi\endgroup}
+ {\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#1% % \unexpanded added 22/5/2001
+\unexpanded\def\XMLdata % # safe
{\begingroup
- \enableXML\scantokens{#1}\ifhmode\unskip\unskip\fi
- \endgroup}
+ \protectXMLdata
+ \doXMLdata}
+
+\def\doXMLdata#1%
+ {\enableXML
+ \scantokens{#1<gobblespacetokens/>}%
+ \endgroup}
-\unexpanded\def\XMLdata#1% % grouping changed 20/5/2001
- {\scantokens{\begingroup\enableXML#1<endgroup/>}}
-
%D
\def\bXMLs{\ifignoreXMLspaces\ignorespaces\fi}
@@ -969,17 +1832,6 @@
\def\processXMLfile #1{\enableXML\processfile{#1}}
\def\processXMLfilegrouped#1{{\enableXML\processfile{#1}\relax\ifmmode\else\par\fi}}
-% partially defined here
-
-\fetchruntimecommand\showXMLfile {\f!xtagprefix\s!run}
-\fetchruntimecommand\showXMLbuffer{\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}
-
%D \type
%D {processXMLbuffer}
%D
@@ -1003,6 +1855,8 @@
%D Loading specific modules takes place with \type
%D {\useXMLfilters}.
+% todo: flag
+
\def\useXMLfilter[#1]%
{\processcommalist[#1]\douseXMLfilter}
@@ -1018,141 +1872,112 @@
%D Temporarily here.
\newtoks\groupedtoks
+\newif\ifcollectXMLgrouped
-\bgroup
-
-\catcode`\<=\@@active
-
-\long\unexpanded\gdef\getXMLgrouped#1#2#3%
- {\groupedtoks\emptytoks
- \convertargument<#1>\to\xxascii
- \convertargument<#1 \to\yyascii
- \newcounter\groupedlevel
- \long\def\dogetgrouped##1</#1>%
- {\appendtoks##1\to\groupedtoks
- \convertargument##1\to\ascii
- \doloop
- {\@EA\@EA\@EA\aftersplitstring\@EA\ascii\@EA\at\xxascii\to\ascii
- \ifx\ascii\empty
- \exitloop
- \else
- \increment\groupedlevel
- \fi}%
- \convertargument##1\to\ascii
- \doloop
- {\@EA\@EA\@EA\aftersplitstring\@EA\ascii\@EA\at\yyascii\to\ascii
- \ifx\ascii\empty
- \exitloop
- \else
- \increment\groupedlevel
- \fi}%
- \ifnum\groupedlevel>0
- \decrement\groupedlevel
- \appendtoks</#1>\to\groupedtoks
- \else
- \edef\dogetgrouped{\noexpand#2\the\groupedtoks\noexpand#3}%
- \fi
- \dogetgrouped}%
- \dogetgrouped}
-
-%D Cleaner but hardly faster unless big strings are passed.
-
-\long\gdef\docountXMLgrouped#1\end#2\end
- {\long\def\dosplitstring##1#2##2@@##3\end%
- {\def\ascii{##2}%
- \ifx\ascii\empty \else
- \advance\scratchcounter 1
- \dosplitstring##2@@#2@@\end
- \fi}%
- \dosplitstring#1@@#2@@\end}
-
-\long\unexpanded\gdef\getXMLgrouped#1#2#3%
- {\groupedtoks\emptytoks
- \scratchcounter=0
- \long\def\dogetgrouped##1</#1>%
- {\appendtoks##1\to\groupedtoks
- \docountXMLgrouped##1\end<#1>\end
- \docountXMLgrouped##1\end<#1 \end
- \ifcase\scratchcounter
- \def\dogetgrouped{\@EA#2\the\groupedtoks#3}%
- \else
- \advance\scratchcounter -1
- \appendtoks</#1>\to\groupedtoks
- \fi
- \dogetgrouped}%
- \dogetgrouped}
+\bgroup \catcode`\<=\@@active
-%D More versatile.
+\newtoks\XMLgtoks
\long\unexpanded\gdef\getXMLgroupedenvironment#1#2#3%
- {\def\dodogetgrouped{\@EA#2\the\groupedtoks#3}%
+ {\collectXMLgroupedtrue
+ \XMLgtoks{#2}%
+ \long\def\dodogetgrouped{\@EA\the\@EA\XMLgtoks\the\groupedtoks#3}%
\getXMLgrouped{#1}}
\long\unexpanded\gdef\getXMLgroupedargument#1#2%
- {\def\dodogetgrouped{\@EA#2\@EA{\the\groupedtoks}}%
+ {\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\unexpanded\gdef\getXMLgrouped#1%
+%\long\gdef\docountXMLgrouped#1\end#2\end % @@ => \relax\relax
+% {\long\def\dosplitstring##1#1##2@@##3\end%
+% {\def\ascii{##2}%
+% \ifx\ascii\empty \else
+% \advance\scratchcounter 1
+% \dosplitstring##2@@#1@@\end
+% \fi}%
+% \dosplitstring#2@@#1@@\end}
+
+\long\gdef\docountXMLgrouped#1\end#2\end % 1 relax is enough since it's
+ {\long\def\dosplitstring##1#1##2\relax\relax##3\end % another regime
+ {\def\ascii{##2}%
+ \ifx\ascii\empty \else
+ \advance\scratchcounter \plusone
+ \dosplitstring##2\relax\relax#1\relax\relax\end
+ \fi}%
+ \dosplitstring#2\relax\relax#1\relax\relax\end}
+
+\long\unexpanded\gdef\getXMLgrouped#1% #1 kan weg % klopt dit nu?
{\groupedtoks\emptytoks
\scratchcounter=0
- \long\def\dogetgrouped##1</#1>%
- {\appendtoks##1\to\groupedtoks
- \docountXMLgrouped##1\end<#1>\end
- \docountXMLgrouped##1\end<#1 \end
+ \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 -1
- \appendtoks</#1>\to\groupedtoks
+ \advance\scratchcounter \minusone
+ \ifcollectXMLgrouped\@EA\appendtoks\@EA<\@EA/\currentXMLelement>\to\groupedtoks\fi
\fi
\dogetgrouped}%
\dogetgrouped}
\egroup
-% {pre}{pos}{before}{after}
-%
-%\unexpanded\def\getgrouped#1#2#3#4%
-% {\groupedtoks\emptytoks
-% \convertargument#1\to\xxascii
-% \newcounter\groupedlevel
-% \def\dogetgrouped##1#2%
-% {\appendtoks##1\to\groupedtoks
-% \convertargument##1\to\ascii
-% \doloop
-% {\@EA\@EA\@EA\aftersplitstring\@EA\ascii\@EA\at\xxascii\to\ascii
-% \ifx\ascii\empty
-% \exitloop
-% \else
-% \increment\groupedlevel
-% \fi}%
-% \ifnum\groupedlevel>0
-% \decrement\groupedlevel
-% \appendtoks#2\to\groupedtoks
-% \else
-% \edef\dogetgrouped{\noexpand#3\the\groupedtoks\noexpand#4}%
-% \fi
-% \dogetgrouped}%
-% \dogetgrouped}
-
% interesting and fully expandable
-\def\XMLifequalelse#1#2#3#4#5%
- {\ifundefined{\@@XMLvariable:#1:#2}%
- #5%
+\def\XMLifequalelse#1#2#3%
+ {\ifcsname\@@XMLvariable:#1:#2\endcsname
+ \@EAEAEA\@@ifequal\csname\@@XMLvariable:#1:#2\endcsname\relax\@@and#3\relax\@@then
\else
- \@EA\@EA\@EA\@@ifequal\csname\@@XMLvariable:#1:#2\endcsname
- \relax\@@and#3\relax\@@then#4\@@else#5\@@fi
+ \@EA\secondoftwoarguments
\fi}
-\def\expifequalelse#1#2#3#4%
- {\@@ifequal#1\relax\relax\@@and#2\relax\relax\@@then#3\@@else#4\@@fi}
+\def\XMLownifequalelse#1#2%
+ {\@EAEAEA\@@ifequal\csname\@@XMLvariable:\ownXMLelement:#1\endcsname\relax\@@and#2\relax\@@then}
+
+\def\XMLyes#1{\XMLownifequalelse{#1}{yes}{#1}{}}
-\def\@@ifequal#1#2\@@and#3#4\@@then#5\@@else#6\@@fi%
+\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#5\else#6\fi
+ \ifx#3\relax
+ \@EAEAEA\@@if@@equal@@true
+ \else
+ \@EAEAEA\@@if@@equal@@false
+ \fi
\else
- \ifx#3\relax#6\else\@@ifequal#2\@@and#4\@@then#5\@@else#6\@@fi\fi
- \fi}
+ \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
+ \edef\@@expanded{\noexpand#1}%
+ \let\notexpanded\empty
+ \@@expanded}
+
\protect \endinput
diff --git a/tex/context/base/xtag-map.tex b/tex/context/base/xtag-map.tex
index 32648acd7..8eda9b74b 100644
--- a/tex/context/base/xtag-map.tex
+++ b/tex/context/base/xtag-map.tex
@@ -11,107 +11,167 @@
%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 There is a more versatile mapper available in \type {xtag-rem.tex}!
-\beginTEX
- \endinput
-\endTEX
+%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 (remap)}
+\beginTEX
+ \endinput
+\endTEX
+
+\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 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 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.
+%D grown up \TEX\ distribution.
-\unprotect
+\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 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.
+%D advanced in the sense that it permits all kind of parsers.
-\def\findendofXMLelement#1% better use a few expandafters
- {\if#1>0 \else % space prevents auto \relax
+\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
- \if#1/1 \endofXMLelement \else
\endofXMLelementN \fi\fi\fi\fi}
-\def\endofXMLelementD#1\fi\fi\fi\fi#2"{\fi\fi \findendofXMLelement}
-\def\endofXMLelementS#1\fi\fi\fi\fi#2'{\fi\fi\fi \findendofXMLelement}
-\def\endofXMLelementN#1\fi\fi\fi\fi {\fi\fi\fi\fi\findendofXMLelement}
-\def\endofXMLelement #1\fi\fi\fi\fi#2>{\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
+\newif\ifremapXMLunknown
-\def\doremapXMLelement#1#2#3#4%
- {\expandafter\ifx\csname\@@XML#1:#2\endcsname\relax#4\else
- \csname\@@XML#1:#2\endcsname#3%
- \fi}
+%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\remapXMLelement#1#2 #3>% todo: we need to get rid of the end /
- {\if#1!%
- % ignore all comment
- \else\if#1?%
- % ignore all instructions
- \remapXMLpi#2 #3>%
- \else\ifcase\findendofXMLelement#2#3>%
+\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#2:M\endcsname\relax
- \ifremapXMLunknown\remapXMLone{\s!unknown}{#2}\fi
+ \expandafter\ifx\csname\@@XML\@@XMLmapping:#2:M\endcsname\relax
+ \remapXMLunknownONE{#2}{}%
\else
\remapXMLone{#2}{}%
\fi
\else
- \expandafter\ifx\csname\@@XML#1#2:M\endcsname\relax
- \ifremapXMLunknown\remapXMLtwo{\s!unknown}{#1#2}\fi
+ \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#1#2:M\endcsname\relax
- \expandafter\ifx\csname\@@XML#1#2/:M\endcsname\relax
- \ifremapXMLunknown\remapXMLthree{\s!unknown/}{#1#2}\fi
+ \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\fi\fi}
+ \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}
-\unexpanded\def\xmlr#1#2{\csname\@@XML#1:#2\endcsname}
+\def\expandXMLremapping{\let\xmlr\expandedxmlr}
\def\@@XMLremap{XMLremap}
\def\remapXMLone#1#2%
- {\ifcase\csname\@@XMLremap\csname\@@XML#1:M\endcsname\endcsname
+ {\ifcase\csname\@@XMLremap\csname\@@XML\@@XMLmapping:#1:M\endcsname\endcsname
\or % GCPA
\XMLeg\XMLeg
\or % GCP-
- \XMLeg
+ \XMLeg
\or % GC-A
\XMLeg\XMLeg
\or % GC--
@@ -119,11 +179,11 @@
\or % -CPA
\XMLeg
\or % -CP-
- %
+ %
\or % -C-A
\XMLeg
\or % -C--
- %
+ %
\or % G---
\XMLeg
\or % GLR-
@@ -133,11 +193,11 @@
\fi}
\def\remapXMLtwo#1#2%
- {\ifcase\csname\@@XMLremap\csname\@@XML#1:M\endcsname\endcsname
+ {\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}%
+ \XMLbg\xmlr{#1}{X}{#2}%
\or % GC-A
\XMLbg\xmlr{#1}{X}\XMLbg
\or % GC--
@@ -145,21 +205,21 @@
\or % -CPA
\xmlr{#1}{X}{#2}\XMLbg
\or % -CP-
- \xmlr{#1}{X}{#2}%
+ \xmlr{#1}{X}{#2}%
\or % -C-A
\xmlr{#1}{X}\XMLbg
\or % -C--
- \xmlr{#1}{X}%
+ \xmlr{#1}{X}%
\or % G---
\XMLbg
\or % GLR-
\XMLbg\xmlr{#1}{L}%
\or % -LR-
- \xmlr{#1}{L}%
+ \xmlr{#1}{L}%
\fi}
\def\remapXMLthree#1#2%
- {\ifcase\csname\@@XMLremap\csname\@@XML#1:M\endcsname\endcsname
+ {\ifcase\csname\@@XMLremap\csname\@@XML\@@XMLmapping:#1:M\endcsname\endcsname
\or % GCPA
\XMLbg\xmlr{#1}{X}{#2}\XMLbg\XMLeg\XMLeg
\or % GCP-
@@ -169,9 +229,9 @@
\or % GC--
\XMLbg\xmlr{#1}{X}\XMLeg
\or % -CPA
- \xmlr{#1}{X}{#2}\XMLbg\XMLeg
+ \xmlr{#1}{X}{#2}\XMLbg\XMLeg
\or % -CP-
- \xmlr{#1}{X}{#2}%
+ \xmlr{#1}{X}{#2}%
\or % -C-A
\xmlr{#1}{X}\XMLbg\XMLeg
\or % -C--
@@ -180,112 +240,116 @@
\XMLbg\XMLeg
\fi}
-\@EA\scratchtoks\@EA{\string{} \edef\XMLbg{\the\scratchtoks}
-\@EA\scratchtoks\@EA{\string}} \edef\XMLeg{\the\scratchtoks}
+\scratchtoks\@EA{\string{} \edef\XMLbg{\the\scratchtoks}
+\scratchtoks\@EA{\string}} \edef\XMLeg{\the\scratchtoks}
-\chardef\XMLremapGCPA = 1 % {\command {arg} { } }
+\chardef\XMLremapGCPA = 1 % {\command {arg} { } }
\chardef\XMLremapGCP = 2 % {\command {arg} } %
-\chardef\XMLremapGCA = 3 % {\command { } }
+\chardef\XMLremapGCA = 3 % {\command { } }
\chardef\XMLremapGC = 4 % {\command } %
-\chardef\XMLremapCPA = 5 % \command {arg} { }
+\chardef\XMLremapCPA = 5 % \command {arg} { }
\chardef\XMLremapCP = 6 % \command {arg} %
-\chardef\XMLremapCA = 7 % \command { }
+\chardef\XMLremapCA = 7 % \command { }
\chardef\XMLremapC = 8 % \command %
\chardef\XMLremapG = 9 % { }
\chardef\XMLremapGLR = 10 % { \bcom \ecom }
\chardef\XMLremapLR = 11 % \bcom \ecom
-\protect
-
-\def\remapXMLpi#1 #2?#3>%
- {\xmlr{procins/}{X}{#1}{#2}}
-
-\unprotect
-
-%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 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 \starttypen
%D \remapXMLsequence [name] [result map] \unexpandablecommand
%D \remapXMLsequence [name] [result map] \unexpandablecommand
%D \stoptypen
-%D
-%D The \MATHML\ module demonstrates how these can be used.
+%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 of the following components.
%D
%D \starttypen
-%D { \command {parameters} {argument} }
+%D { \command {parameters} {argument} }
%D \stoptypen
%D
-%D The following combinations are supported.
-%D
+%D The following combinations are supported.
+%D
%D \starttabulatie[|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 \stoptabulatie
+%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 \stoptabulatie
%D
-%D Empty elements (singular ones) never get an argument,
-%D which makes sense, since they have at most parameters.
+%D Empty elements (singular ones) never get an argument,
+%D which makes sense, since they have at most parameters.
-\def\remapXMLsequence{\dotripleargument\doremapXML []}
-\def\remapXMLsingular{\dotripleargument\doremapXML[/]}
+\def\remapXMLsequence{\doquadrupleargument\doremapXML []}
+\def\remapXMLsingular{\doquadrupleargument\doremapXML[/]}
-\def\doremapXML[#1][#2][#3]%
- {\doifinstringelse{LR}{#3}
- {\let\next\doremapXMLtwo}
- {\let\next\doremapXMLone}%
- \next[#1][#2][#3]}
+\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\doremapXMLone[#1][#2][#3]#4%
- {\setvalue{\@@XML#2#1:M}{#3}%
- \setvalue{\@@XML#2#1:X}{#4}}
+%\def\dodoremapXML[#1][#2][#3][#4]% class / name pattern
+% {\doifinstringelse{LR}{#4}
+% {\let\next\doremapXMLtwo}
+% {\let\next\doremapXMLone}%
+% \next[#1][#2][#3][#4]}%
-\def\doremapXMLtwo[#1][#2][#3]#4#5%
- {\setvalue{\@@XML#2:M}{#3}%
- \setvalue{\@@XML#2:L}{#4}%
- \setvalue{\@@XML#2:R}{#5}}
+\def\dodoremapXML[#1][#2][#3][#4]% class / name pattern
+ {\doifinstringelse{LR}{#4}\doremapXMLtwo\doremapXMLone[#1][#2][#3][#4]}
-\let\dowithentity\empty
+\def\doremapXMLone[#1][#2][#3][#4]#5%
+ {\setvalue{\@@XML#1:#3#2:M}{#4}%
+ \setvalue{\@@XML#1:#3#2:X}{#5}}
-%D We handle unknown elements with:
+\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}}
-\remapXMLsingular[procins] [CPA] \doXMLprocins
+\let\dowithentity\empty
-\def\doXMLprocins#1#2{\dodoXMLprocessor{?#1}{#2}}
+%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{\hbox{\tttf[#1]}}
-\def\doXMLunknownSE#1#2{\hbox{\tttf[#1:\enspace\ignorespaces#2\unskip]}}
+\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%
+\def\remapXMLentity#1;#2%
+ {\doremapXMLentity{#1}#2}%
+
+\def\doremapXMLentity%
{\xmlrent}
\unexpanded\def\xmlrent#1%
{\getXMLentity{#1}}
-%D The remapping is taken care of by the following macro,
-%D which takes three arguments.
+%D The remapping is taken care of by the following macro,
+%D which takes three arguments.
%D
-%D \starttypen
+%D \starttypen
%D \XMLremapdata{before}{after}{content}
-%D \stoptypen
+%D \stoptypen
%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.
+%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
@@ -296,10 +360,10 @@
\defineXMLentity[tex-bar]{\myspecialvert}%
\to \everyXMLremapping
-\def\setnormalXMLentities%
+\def\setnormalXMLentities% will change ! ! ! ! !
{\defineXMLentity[tex-hash]\letterhash
- \defineXMLentity[tex-dollar]\letterdollar
- \defineXMLentity[tex-percent]\letterpercent
+ \defineXMLentity[tex-dollar]\letterdollar
+ \defineXMLentity[tex-percent]\letterpercent
\defineXMLentity[tex-backslash]\letterbackslash
\defineXMLentity[tex-hat]\letterhat
\defineXMLentity[tex-underscore]\letterunderscore
@@ -309,12 +373,36 @@
\let\XMLremappedpar\empty
-\long\def\XMLremapdata#1#2#3%
+%D Here we implement the second step in the element grabber.
+
+\long\def\XMLremapdata%
+ {\dosingleempty\doXMLremapdata}
+
+\long\def\doXMLremapdata[#1]#2#3#4%
{\bgroup
- \pushmacro\doXMLelement
- \pushmacro\doXMLentity % ##2 removes leading spaces
- \long\def\doXMLelement##1>##2{\remapXMLelement##1 >##2}%
- \def\doXMLentity ##1;##2{\remapXMLentity{##1}##2}%
+ \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 leaqding / 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
@@ -324,10 +412,9 @@
\catcode`\^^M=\@@space
\catcode`\^^L=\@@space
\catcode`\^^Z=\@@space
- \xdef\remappedXMLdata{#3\empty}%
+ \xdef\remappedXMLdata{#4\empty}%
\let\par\endgraf
- \popmacro\doXMLentity
- \popmacro\doXMLelement
+ \popmacro\doXMLentity % needed ?
\disableXMLexpansion
\catcode`\{=\@@begingroup
\catcode`\}=\@@endgroup
@@ -336,18 +423,19 @@
\bgroup
\convertcommand\remappedXMLdata\to\ascii
\tttf\veryraggedright\ascii\par
- \writestatus{XML}{\ascii}%
+ \writestatus{xml-remap}{\ascii}%
\egroup
\fi
- #1\scantokens\@EA{\remappedXMLdata\empty\empty}#2%
+ #2\scantokens\@EA{\remappedXMLdata\empty\empty}#3%
+ \stopXMLmapping
\egroup}
-% rename to better names
+% rename to better names
\newtoks \XMLRtoks
\newcount \nofXMLRchildren
-\def\naturalxmlr#1#2{\getvalue{\@@XML#1:#2}}
+\def\naturalxmlr#1#2{\getvalue{\@@XML\@@XMLmapping:#1:#2}}
\def\ignoreXMLRelement#1#2{}
\def\normalXMLRelement#1#2{#2}
@@ -363,8 +451,8 @@
% \def\nextXMLRelement{##1{##2}{##3}{##4}{##5}}%
% #1}%
% \doifnextcharelse\empty\empty\dowithnextXMLRelement}
-%
-% better and faster:
+%
+% better and faster:
\def\dowithnextXMLRelement#1#2#3#4#5#6%
{\def\nextXMLRelement{#2{#3}{#4}{#5}{#6}}#1}%
@@ -383,7 +471,7 @@
\popmacro\secondXMLRelement
\popmacro\firstXMLRelement}}}
-\def\withnextthreeXMLRelements#1% korter, met two
+\def\withnextthreeXMLRelements#1% korter, met two
{\pushmacro\firstXMLRelement
\pushmacro\secondXMLRelement
\pushmacro\thirdXMLRelement
@@ -467,7 +555,7 @@
{\let\nextXMLRelement\empty#2}%
\doifnextcharelse\xmlr\xdowithnextXMLRelement\xnowithnextXMLRelement}
-\def\encapsulatenextXMLRelements#1#2#3#4% oude bewaren
+\def\encapsulatenextXMLRelements#1#2#3#4% oude bewaren
{\pushmacro\betweenXMLRchild
\pushmacro\afterXMLRchild
\def\betweenXMLRchild{#1\def\betweenXMLRchild{#2}}%
@@ -482,7 +570,7 @@
\popmacro\betweenXMLRchild}%
#4}
-\def\collectXMLRchild#1#2%
+\def\collectXMLRchild#1#2%
{\XMLRtoks\emptytoks
\pushmacro\xmlr
\def\xmlr##1##2##3##4%
@@ -490,7 +578,7 @@
#2\empty
\popmacro\xmlr}
-\def\collectbetweenXMLRchild#1#2#3%
+\def\collectbetweenXMLRchild#1#2#3%
{\XMLRtoks\emptytoks
\pushmacro\xmlr
\pushmacro\betweenXMLRchild
@@ -502,7 +590,7 @@
\popmacro\betweenXMLRchild
\popmacro\xmlr}
-\def\dorawcollectbetweenXMLR#1#2%
+\def\dorawcollectbetweenXMLR#1#2%
{\pushmacro\xmlr
\pushmacro\betweenXMLRchild
\def\betweenXMLRchild{\def\betweenXMLRchild{#1}}%
@@ -512,16 +600,16 @@
\popmacro\betweenXMLRchild
\popmacro\xmlr}
-\def\rawcollectbetweenXMLR%
+\def\rawcollectbetweenXMLR%
{\XMLRtoks\emptytoks\dorawcollectbetweenXMLR}
-\def\docollectbetweenXMLR#1%
- {\dorawcollectbetweenXMLR{\appendtoks#1\to\XMLRtoks}}
+\def\docollectbetweenXMLR#1%
+ {\dorawcollectbetweenXMLR{\appendtoks#1\to\XMLRtoks}}
\def\collectbetweenXMLR%
{\XMLRtoks\emptytoks\docollectbetweenXMLR}
-\def\processXMLRchildren#1%
+\def\processXMLRchildren#1%
{\pushmacro\xmlr
\let\xmlr\naturalxmlr
#1\empty
@@ -544,7 +632,7 @@
#1\empty
\popmacro\xmlr}
-\def\countXMLRchild#1#2%
+\def\countXMLRchild#1#2%
{\pushmacro\xmlr
\nofXMLRchildren=0
\def\xmlr##1##2##3##4%
@@ -552,4 +640,27 @@
#2\empty
\popmacro\xmlr}
-\protect \endinput
+\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-meh.tex b/tex/context/base/xtag-meh.tex
index 95e244d35..1636f2a2b 100644
--- a/tex/context/base/xtag-meh.tex
+++ b/tex/context/base/xtag-meh.tex
@@ -14,7 +14,7 @@
\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 {\AA} Angstrom capital A, ring
+\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
diff --git a/tex/context/base/xtag-mmc.tex b/tex/context/base/xtag-mmc.tex
index 195ea4a72..f3c46a0c8 100644
--- a/tex/context/base/xtag-mmc.tex
+++ b/tex/context/base/xtag-mmc.tex
@@ -20,8 +20,12 @@
% 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}}%
@@ -47,7 +51,7 @@
{#1}}
\def\MMLcdopolara#1%
- {\def\MMLcsep{,}\getXMLentity{polar}\left(#1\right)}
+ {\def\MMLcsep{\MMLccomma}\getXMLentity{polar}\left(#1\right)}
\def\MMLcdopolarb#1%
{\def\MMLcsep##1\empty%
@@ -130,7 +134,7 @@ complex-cartesian=>\let\next\MMLccartesian,
\def\MMLcCIdefault#1#2% #1=dummy
{#2\!% \getXMLentity{NegThinSpace}%
\doifnextcharelse\xmlr
- {\encapsulatenextXMLRelements{\left(}{,}{\right)}}
+ {\encapsulatenextXMLRelements{\left(}{\MMLccomma}{\right)}}
{}}
\def\MMLcCN#1% #2% can be sped up with \doifundefined ...
@@ -207,8 +211,9 @@ complex-cartesian=>\let\next\MMLccartesian,
in/,inverse/,%
fn,%
floor/,ceiling/,%
- mean/,
- abs/,int/,limit/,sum/,product/%
+ mean/,%
+ selector/,%
+ abs/,int/,limit/,sum/,product/,%
outerproduct/,innerproduct/,scalarproduct/}
\def\MMLcfunctionlist
@@ -219,17 +224,18 @@ complex-cartesian=>\let\next\MMLccartesian,
csc/,arccsc/,csch/,arccsch/,%
sec/,arcsec/,sech/,arcsech/,%
ln/,exp/,log/,%
- abs/,int/,limit/,sum/,product/%
+ abs/,int/,limit/,sum/,product/,%
fn} % ?
\def\MMLcconstructlist
- {diff/,partialdiff/,apply}
+ {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%
- {\pushmacro\xmlr
+ {\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
@@ -246,7 +252,8 @@ complex-cartesian=>\let\next\MMLccartesian,
\endgroup % ook level push
\advance\@MMLlevel-1
\doifXMLparelse{apply}{close}{\right\XMLpar{apply}{close}{}}{}%
- \popmacro\xmlr}
+ \popmacro\xmlr
+ \endgroup}}
\remapXMLsequence [reln] [CPA] \MMLcRELN
@@ -266,20 +273,32 @@ complex-cartesian=>\let\next\MMLccartesian,
\def\MMLcFNdefault#1#2% neg space needed because of \left
{#2\!% \getXMLentity{NegThinSpace}%
- \MMLcreset\encapsulatenextXMLRelements{\left(}{,}{\right)}}
+ \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
- #2#3%
- \else
- \encapsulateXMLR{\left(}{#2}{\right)}{\MMLcreset#3}%
- \fi}
+ \def\next{#2#3}%
+ \else
+ \def\next
+ {\doifnextcharelse\xmlr
+ {\encapsulateXMLR{\left(}{#2}{\right)}{\MMLcreset#3}}%
+ {\encapsulateXMLR{}{#2}{}{\MMLcreset#3}}}%
+ \fi
+ \next}
\let\doMMLcFNminusplus\doMMLcFNplusminus
@@ -347,11 +366,11 @@ complex-cartesian=>\let\next\MMLccartesian,
\def\MMLcLAMBDA#1#2%
{\doifelse{\@@MMLlambdavariant}{a}
- {\encapsulateXMLR{\getXMLentity{lambda}(}{,}{)}{#2}}
+ {\encapsulateXMLR{\getXMLentity{lambda}(}{\MMLccomma}{)}{#2}}
{\countXMLRchild{bvar}{#2}%
\ifnum\nofXMLRchildren>1
\collectXMLRchild{bvar}{#2}%
- \encapsulateXMLR{\left(}{,}{\right)}{\the\XMLRtoks}%
+ \encapsulateXMLR{\left(}{\MMLccomma}{\right)}{\the\XMLRtoks}%
\else
\processXMLRchild{bvar}{#2}%
\fi
@@ -422,13 +441,13 @@ complex-cartesian=>\let\next\MMLccartesian,
\def\MMLcDIVIDE#1#2%
{\withnexttwoXMLRelements
- {\increment\MMLcDIVIDElevel
- \ifnum\MMLcDIVIDElevel>\@@MMLdivideniveau\space
- \firstXMLRelement/\secondXMLRelement
- \else
- \frac{\MMLcreset\firstXMLRelement}{\MMLcreset\secondXMLRelement}%
- \fi
- \decrement\MMLcDIVIDElevel}}
+ {\increment\MMLcDIVIDElevel
+ \ifnum\MMLcDIVIDElevel>\@@MMLdivideniveau\space
+ \firstXMLRelement/\secondXMLRelement
+ \else
+ \frac{\MMLcreset\firstXMLRelement}{\MMLcreset\secondXMLRelement}%
+ \fi
+ \decrement\MMLcDIVIDElevel}}
\remapXMLsingular [min] [CPA] \MMLcMIN
\remapXMLsingular [max] [CPA] \MMLcMAX
@@ -436,12 +455,12 @@ complex-cartesian=>\let\next\MMLccartesian,
\def\MMLcMIN#1#2#3\empty
{\encapsulateXMLR
{\min\doifXMLRchild{bvar}{#3}{_{\processXMLRchild{bvar}{#3}}}\left\{}
- {,}{\right\}}{#3}}
+ {\MMLccomma}{\right\}}{#3}}
\def\MMLcMAX#1#2#3\empty
{\encapsulateXMLR
{\max\doifXMLRchild{bvar}{#3}{_{\processXMLRchild{bvar}{#3}}}\left\{}
- {,}{\right\}}{#3}}
+ {\MMLccomma}{\right\}}{#3}}
\remapXMLsingular [minus] [CPA] \MMLcMINUS
\remapXMLsingular [plus] [CPA] \MMLcPLUS
@@ -529,7 +548,7 @@ complex-cartesian=>\let\next\MMLccartesian,
\remapXMLsingular [gcd] [CPA] \MMLcGCD
-\def\MMLcGCD#1#2#3\empty{\encapsulateXMLR{\gcd(}{,}{)}{#3}}
+\def\MMLcGCD#1#2#3\empty{\encapsulateXMLR{\gcd(}{\MMLccomma}{)}{#3}}
\remapXMLsingular [and] [CPA] \MMLcAND
\remapXMLsingular [or] [CPA] \MMLcOR
@@ -559,7 +578,7 @@ complex-cartesian=>\let\next\MMLccartesian,
\def\MMLcFORALLandEXISTS#1#2#3\empty
{\MMLcreset
- _{\encapsulateXMLRchildren{bvar}{}{,}{}{#3}}%
+ _{\encapsulateXMLRchildren{bvar}{}{\MMLccomma}{}{#3}}%
\doifXMLRchildelse{condition}{#3}
{\;% \getXMLentity{ThickSpace}%
\processXMLRchild{condition}{#3}
@@ -608,7 +627,7 @@ complex-cartesian=>\let\next\MMLccartesian,
\remapXMLsingular [lcm] [CPA] \MMLcLCM
\def\MMLcLCM#1#2#3\empty
- {\encapsulateXMLR{\getXMLentity{lcm}(}{,}{)}{#3}}
+ {\encapsulateXMLR{\getXMLentity{lcm}(}{\MMLccomma}{)}{#3}}
\remapXMLsingular [floor] [CPA] \MMLcFLOOR
\remapXMLsingular [ceiling] [CPA] \MMLcCEILING
@@ -762,7 +781,7 @@ complex-cartesian=>\let\next\MMLccartesian,
\def\MMLcPARTIALDIFF#1#2#3\empty
{\pushmacro\xmlr
\doifXMLRchildelse{list}{#3}
- {\getXMLentity{capitaldifferentiald}_{\encapsulateXMLRchild{list}{}{,}{}{#3}}%
+ {\getXMLentity{capitaldifferentiald}_{\encapsulateXMLRchild{list}{}{\MMLccomma}{}{#3}}%
\processXMLRchild{apply,reln,ci,cn}{#3}}
{\countXMLRchild{bvar}{#3}%
\ifnum\nofXMLRchildren>0
@@ -829,11 +848,11 @@ complex-cartesian=>\let\next\MMLccartesian,
\def\MMLcSET#1#2%
{\doifXMLRchildelse{condition}{#2}
{\{\processXMLRchild{bvar}{#2}\,\vert\,\processXMLRchild{condition}{#2}\}}
- {\encapsulateXMLR{\{}{,}{\}}{#2}}}
+ {\encapsulateXMLR{\{}{\MMLccomma}{\}}{#2}}}
\remapXMLsequence [list] [CPA] \MMLcLIST
-\def\MMLcLIST#1#2{\encapsulateXMLR{[} {,}{]} {#2}}
+\def\MMLcLIST#1#2{\encapsulateXMLR{[}{\MMLccomma}{]}{#2}}
\remapXMLsingular [union] [CPA] \MMLcUNION
\remapXMLsingular [intersect] [CPA] \MMLcINTERSECT
@@ -1072,7 +1091,7 @@ complex-cartesian=>\let\next\MMLccartesian,
{\countXMLRchildren{#2}%
\ifnum\nofXMLRchildren>1
\doifelse{\@@MMLvectorrichting}{\v!horizontaal}
- {\encapsulateXMLR{\left(}{,}{\right)}{#2}}
+ {\encapsulateXMLR{\left(}{\MMLccomma}{\right)}{#2}}
{\collectbetweenXMLR{\crcr}{#2}%
\MMLcreset\left(\matrix{\the\XMLRtoks}\right)}%
\else
@@ -1128,7 +1147,7 @@ complex-cartesian=>\let\next\MMLccartesian,
\popmacro\xmlr}
\def\doMMLcSELECTOR#1\empty
- {_{\encapsulateXMLR{}{,}{}{#1\empty}}}
+ {_{\MMLcreset\encapsulateXMLR{}{\MMLccomma}{}{#1\empty}}}
\remapXMLsingular [vectorproduct] [CPA] \MMLcVECTORPRODUCT
\remapXMLsingular [scalarproduct] [CPA] \MMLcSCALARPRODUCT
@@ -1152,11 +1171,11 @@ complex-cartesian=>\let\next\MMLccartesian,
\remapXMLsequence [annotation] [CPA] \MMLcANNOTATION
-\def\MMLcANNOTATION#1#2%
+\def\MMLcANNOTATION#1#2% we need a better unmapper
{\getXMLarguments{annotation}{encoding="" #1}%
\doif{\XMLpar{annotation}{encoding}{}}{TeX}%
{\begingroup
- \setnormalXMLentities
+ \setnormalXMLentities % better: \simplifyXMLentities ; test first
\let\xmlrent\expandedXMLentity
\edef\mmlascii{#2}%
\setnormalcatcodes
@@ -1220,4 +1239,6 @@ complex-cartesian=>\let\next\MMLccartesian,
\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
index 27d4d10d0..e7d8e2eda 100644
--- a/tex/context/base/xtag-mml.tex
+++ b/tex/context/base/xtag-mml.tex
@@ -11,10 +11,28 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\ifx\remapXMLsequence\undefined \input xtag-map.tex \relax \fi % temp hack
-
\writestatus{loading}{Context XML Macros (math ml)}
+%\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
@@ -35,43 +53,17 @@
\unprotect
-\def\setupMMLappearance[#1]%
- {\dodoubleargument\getparameters[@@MML#1]}
-
-\defineXMLprocessor[context-mathml-directive]{\contextXMLmathml}
-
-\def\contextXMLmathml#1%
- {\docontextXMLmathml#1 dummy dummy dummy\end}
+\def\setupMMLappearance[#1]{\dodoubleargument\getparameters[@@MML#1]}
-\def\docontextXMLmathml#1 #2 #3 #4\end
- {\setupMMLappearance[#1][#2=#3]}
-
-% == \defineXMLdirective [mathml] \setupMMLappearance
+\defineXMLdirective [mathml] \setupMMLappearance
\defineXMLargument [math] \doXMLmath
\defineXMLargument [imath] \doXMLimath
\defineXMLargument [dmath] \doXMLdmath
\unexpanded\def\doXMLmath {\ifhmode\@EA\doXMLimath\else\@EA\doXMLdmath\fi}
-\unexpanded\def\doXMLimath{\XMLremapdata{$}{$}}
-\unexpanded\def\doXMLdmath{\XMLremapdata{\dostartformula{}}{\dostopformula}}
-
-\defineXMLenvironment [formula]
- {\dostartXMLformula{formula}\placeformula}
- {\dostopXMLformula}
-
-\defineXMLenvironment [subformula]
- {\dostartXMLformula{subformula}\placesubformula}
- {\dostopXMLformula}
-
-\def\dostartXMLformula#1#2%
- {\doifXMLparelse{#1}{label}
- {\expanded{#2[\XMLpar{#1}{label}{}]{\XMLpar{#1}{sublabel}{}}}%
- \startformula}
- {\startformula}}
-
-\def\dostopXMLformula%
- {\stopformula}
+\unexpanded\def\doXMLimath{\XMLremapdata[mml]{$}{$}}
+\unexpanded\def\doXMLdmath{\XMLremapdata[mml]{\dostartformula{}}{\dostopformula}}
\ifx\XMLRtoks\undefined \newtoks\XMLRtoks \fi
@@ -112,12 +104,16 @@
\gdef\xdefineMMLentity #1 #2 #3 #4
{\egroup\dodefineMMLentity{#1}{#2}{#3}{#4}}
+\global\let\dodefineMMLsynonym\gobblefourarguments
+
\gdef\defineMMLsynonym%
{\bgroup\obeylines\xdefineMMLsynonym}
\gdef\xdefineMMLsynonym #1 #2
{\egroup\dodefineMMLsynonym{#1}{#2}}
+\global\let\dodefineMMLsynonym\gobbletwoarguments
+
\egroup
% some more
@@ -387,6 +383,9 @@
\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}
@@ -464,6 +463,8 @@
\def\myspecialvert{\mathematics{\vert}} % temp hack, should stretch
+\defineXMLentity [,] {{,}}
+\defineXMLentity [.] {{.}}
\defineXMLentity [+] {+}
\defineXMLentity [-] {-}
\defineXMLentity [(] {(}
diff --git a/tex/context/base/xtag-mmp.tex b/tex/context/base/xtag-mmp.tex
index 1748e83e6..20cc1e677 100644
--- a/tex/context/base/xtag-mmp.tex
+++ b/tex/context/base/xtag-mmp.tex
@@ -15,6 +15,8 @@
\unprotect
+\startXMLmapping [mml]
+
\def\convertasciiafter#1#2%
{\convertargument#2\to\asciiafter
\@EA#1\@EA{\asciiafter}}
@@ -70,7 +72,7 @@
{}%
{\pushmacro\myspecialvert % hack
\def\myspecialvert{\;\vrule\;}%
- \grabMMLseparator{\XMLpar{mfenced}{separators}}%
+ \grabMMLseparator{\XMLpar{mfenced}{separators}{}}%
\popmacro\myspecialvert}
{}%
{#2\empty}}
@@ -102,9 +104,11 @@
\fi
\dograbMMLseparator}
-\def\grabMMLseparatorb#1%
+\def\grabMMLseparatorb#1% better use \checkMMLoperator
{\ifnum\MMLxxcounter=\MMLyycounter\space
- \def\lastMMLseparator{#1}%
+\doifXMLentityelse{#1}
+ {\def\lastMMLseparator{\xmlrent{#1}}}
+ {\def\lastMMLseparator{#1}}%
\fi
\dograbMMLseparator}
@@ -468,5 +472,7 @@
\fi
\doif{mprescripts/}{#1}{\donefalse}% weak, the / here
\ifdone \advance\scratchcounter 1 \fi}
-
+
+\stopXMLmapping
+
\protect \endinput
diff --git a/tex/context/base/xtag-pml.tex b/tex/context/base/xtag-pml.tex
new file mode 100644
index 000000000..7371ec165
--- /dev/null
+++ b/tex/context/base/xtag-pml.tex
@@ -0,0 +1,83 @@
+%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 (phys ml)}
+
+%D This filter runs on top of the mathml and units modules.
+
+\useXMLfilter[mml,mmp,mmc,unt]
+
+\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..425257b49
--- /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 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)}
+
+%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..6ce33ab84
--- /dev/null
+++ b/tex/context/base/xtag-pre.tex
@@ -0,0 +1,325 @@
+%D \module
+%D [ file=xtag-pre,
+%D version=2000.12.20,
+%D title=\CONTEXT\ XML Support,
+%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.
+
+\beginTEX
+ \endinput
+\endTEX
+
+\writestatus{loading}{Context XML Macros (predefined)}
+
+%D Here we predefine some escapes, processing instructions,
+%D entities and other handy things.
+
+\unprotect
+
+%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[\currentXMLelement]\fi}
+
+%D The following entities need to be defined anyway. They
+%D may be overloaded later.
+
+\defineXMLentities [amp] {\string&} {\&}
+\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] {\letterhar} {\^{}}
+\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!tussen=\blanko,
+ \c!niveau=1]
+
+\fetchruntimecommand\showXMLfile {\f!xtagprefix\s!run}
+\fetchruntimecommand\showXMLbuffer{\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}
+
+%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 \starttypen
+%D <!-- a couple of remarks -->
+%D \stoptypen
+
+\defineXMLescape [--] {\gobbleuntil{-->}}
+
+%D The \type {CDATA} escape is kind of unique in its
+%D strange syntax.
+%D
+%D \starttypen
+%D <!CDATA[
+%D whatever you like to be shown verbatim
+%D ]]>
+%D \stoptypen
+%D
+%D Watch this rather obscure definition (we need to pass an
+%D \type {[} to the macro.
+
+\defineXMLescape [{CDATA[}]
+ {\skipfirstverbatimlinefalse
+ \processtaggeddisplayverbatim{]]>}}
+
+%D \starttypen
+%D <!ENTITY crap "very new [&#x7B;] crap">
+%D <!ENTITY crap SYSTEM "crapfile.xml">
+%D <!ENTITY crap SYSTEM "crapfile.pdf" NDATA ignoredanyway>
+%D \stoptypen
+
+\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\docommando##1>{\expanded{\defineXMLentity[#1]{\the\scratchtoks}}}%
+ \afterassignment\docommando\grabstring}
+
+%D Such entities can be encapsulated in a \type {DOCTYPE}
+%D element. Therefore we remove the outer level of document
+%D type definitions.
+
+\defineXMLescape [DOCTYPE] \handleXMLdoctype
+
+\def\handleXMLdoctype#1 #2%
+ {\doifelse{#2}{[}
+ {%\writestatus{xml-doctype}{expanding #1}%
+ \def\next{\processuntil{]>}}}
+ {%\writestatus{xml-doctype}{skipping #1}%
+ \def\next{\gobbleuntil {>}}}%
+ \next}
+
+%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!commando=\v!ja]
+
+%\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{\@@xpcommando}{\v!ja}
+ {\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 \starttypen
+%D <?context-command {\bf Start Of Some \TeX\ Text} ?>
+%D \stoptypen
+%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
+ {\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 \starttypen
+%D <?context-block begin whatevername ?>
+%D
+%D <to/> <be> <or/> maybe <not/> so much <to/> </be>
+%D
+%D <?context-block end whatevername ?>
+%D \stoptypen
+%D
+%D The following commands will show only this block:
+%D
+%D \starttypen
+%D \videXMLcontextblock[whatevername] \showXMLfile{yourfile}
+%D \stoptypen
+%D
+%D You can also mark blocks in the following way, thereby
+%D saving yourself some work:
+%D
+%D \starttypen
+%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 \stoptypen
+
+% yet undocumented and experimental
+
+% \defineXMLprocessor [context-eof] {\endinput}
+
+% already defined in xtag-ini
+
+% \defineXMLsingular [begingroup] {\begingroup}
+% \defineXMLsingular [endgroup] {\endgroup}
+%
+% \defineXMLsingular [gobblespacetokens] {\gobblespacetokens}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-run.tex b/tex/context/base/xtag-run.tex
index 8da6ab9e3..7a919d31f 100644
--- a/tex/context/base/xtag-run.tex
+++ b/tex/context/base/xtag-run.tex
@@ -13,7 +13,7 @@
\writestatus{loading}{Context XML Macros (visualization)}
-\unprotect
+\unprotect
\bgroup
@@ -46,77 +46,192 @@
.egroup
-\definepalet
- [xtag]
- [0=darkgreen,
- 1=darkred,
- 2=darkblue,
- 3=darkgray]
+\gdef\@@XMLshow {\@@XML shw}
-\newcount\XMLlevel
+\gdef\@XMLindent#1%
+ {\ifnum\XMLlevel>1\advance\leftskip#11em\relax\fi}
-\def\@XMLindent#1%
-% {\ifnum\XMLlevel>0\advance\leftskip#11em\relax\fi}
- {\advance\leftskip#11em\relax}
-
-\def\@XMLlevel#1%
+\gdef\@XMLlevel#1%
{\advance\XMLlevel#11\relax}
-\def\@XMLentity#1%
- {\noindent
- \hbox
- {\localcolortrue
- \startcolormode{xtag:3}\string&#1;\stopcolormode}}
-
-\def\@XMLelement#1%
- {\ifhmode\unskip\fi
- \noindent
- \hbox
- {\localcolortrue
- \DoMod\XMLlevel by3to\scratchcounter
- \startcolormode{xtag:\number\scratchcounter}\string<\currentXMLelement\stopcolormode
+\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\showXMLarguments%
+ {\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"{\string"\color[xtag:8]{##1}\string"}%
+ \def`##1`{\string`\color[xtag:8]{##1}\string`}%
+ \def&##1;{\string&\color[xtag:7]{##1}\string;}%
+ \scantokens\@EA{\currentXMLarguments}%
+ \egroup
+ \else
+ \currentXMLarguments
+ \fi}
+
+\egroup
+
+\ifx\XMLprettycycle\undefined \gdef\XMLprettycycle{3} \fi
+
+\doglobal\newcounter\@XMLnofelements
+
+\gdef\@XMLelement#1%
+ {\ifnum\XMLlevel<\@@xfniveau\relax
+ \ifnum\kindofXMLelement=2\else
+ \doglobal\increment\@XMLnofelements\relax
+ \ifcase\@XMLnofelements\else\@@xftussen\fi
+ \fi
+ \fi
+\hangindent2em
+\indent
+ \bgroup
+ \localcolortrue
+ \advance\XMLlevel -1
+ \DoMod\XMLlevel by\XMLprettycycle to\scratchcounter
+ \advance\scratchcounter 1
+ \startcolor[xtag:\number\scratchcounter]%
+ \string<%
+ \ifnum\kindofXMLelement=2\string/\fi
+ \currentXMLelement
+ \stopcolor
\ifcase#1\or\ifx\currentXMLarguments\empty\else
- \startcolormode{xtag:3}\hskip.5em\currentXMLarguments\unskip\stopcolormode
+ \cleanupXMLarguments
+ \startcolor[xtag:0]\hbox{\space}\showXMLarguments\unskip\stopcolor
\fi\fi
- \startcolormode{xtag:\number\scratchcounter}\string>\stopcolormode}%
+ \startcolor[xtag:\number\scratchcounter]%
+ \ifnum\kindofXMLelement=3\string/\fi
+ \string>%
+ \stopcolor
+ \egroup
+ \ifnum\XMLlevel<\@@xfniveau\relax
+ \ifnum\kindofXMLelement=1\else
+ \doglobal\increment\@XMLnofelements\relax
+ \ifcase\@XMLnofelements\else\@@xftussen\fi
+ \fi
+ \fi
\ignorespaces}
-\def\nextXMLtext{\blank\@XMLlevel+\@XMLelement1\par}
-\def\prevXMLtext{\par\@XMLelement0\par\@XMLlevel-\blank}
-\def\nextXMLpara{\nextXMLline\par}
-\def\prevXMLpara{\par\prevXMLline}
-\def\nextXMLline{\par\@XMLlevel+\@XMLindent+\@XMLelement1}
-\def\prevXMLline{\@XMLelement0\par\@XMLlevel-\@XMLindent-}
-\def\nextXMLword{\@XMLlevel+\@XMLelement1}
-\def\prevXMLword{\@XMLelement0\@XMLlevel-}
-
-\def\someXMLword{\@XMLlevel+\@XMLelement1\@XMLlevel-}
-
-\def\setXMLshow#1#2#3[#4]%
- {\def\docommando##1{#1[##1]#2#3}\processcommalist[#4]\docommando}
-
-\def\showXMLtxt{\setXMLshow\defineXMLenvironment\nextXMLtext\prevXMLtext}
-\def\showXMLpar{\setXMLshow\defineXMLenvironment\nextXMLpara\prevXMLpara}
-\def\showXMLlin{\setXMLshow\defineXMLenvironment\nextXMLline\prevXMLline}
-\def\showXMLwrd{\setXMLshow\defineXMLenvironment\nextXMLword\prevXMLword}
-\def\showXMLemp{\setXMLshow\defineXMLsingular\someXMLword\relax}
-
-\def\showXMLfile#1%
- {{\tttf\dontcomplain
- \let\executeXMLentity\@XMLentity
- \enableXML\verbatimXML
- \processfile{#1}}}
-
-\def\showXMLbuffer%
+\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>0\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\docommando##1{#1[##1]#2#3\letvalue{\@@XMLshow:##1}\empty}%
+ \processcommalist[#4]\docommando}
+
+\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\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
+ \nohyphens
+ \dontcomplain
+ \XMLlevel=0
+ \increment\@@xfniveau % hack
+ \tttf
+ \startopelkaar[\v!blanko]
+ \ifautoXMLshow \let\executeXMLelement\autoshowXMLelement \fi
+ \let\executeXMLentity\@XMLentity
+ \enableXML\verbatimXML
+ \readfile{\truefilename{#1}}{}{}\endgraf
+ \stopopelkaar
+ \egroup}
+
+\gdef\showXMLbuffer%
{\dosingleempty\doshowXMLbuffer}
-\def\doshowXMLbuffer[#1]%
+\gdef\doshowXMLbuffer[#1]%
{\doifelsenothing{#1}
{\doshowXMLbuffer[\jobname]}
{\bgroup
- \def\dodoprocessXMLbuffer##1%
- {\showXMLfile{\TEXbufferfile{##1}}}%
+ \def\dodoprocessXMLbuffer##1{\showXMLfile{\TEXbufferfile{##1}}}%
\processcommalist[#1]\dodoprocessXMLbuffer
\egroup}}
-\protect \endinput
+%D
+
+\gdef\showXSDcomponent%
+ {\dodoubleargument\doshowXSDcomponent}
+
+\gdef\doshowXSDcomponent[#1][#2]%
+ {\bgroup
+ \showXMLnop[xsd:schema]
+ \showXMLign[xsd:appInfo]
+ \showXMLign[xsd:annotation]
+ \videXMLcontextblock[#2]
+ \showXMLfile{#1}
+ \egroup}
+
+\protect \endinput
diff --git a/tex/context/base/xtag-xsd.tex b/tex/context/base/xtag-xsd.tex
new file mode 100644
index 000000000..e354202d5
--- /dev/null
+++ b/tex/context/base/xtag-xsd.tex
@@ -0,0 +1,28 @@
+%D \module
+%D [ file=xtag-pre,
+%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 \starttypen
+%D \showXSDcomponent [x-exa-tx.xsd] [sequence]
+%D \stoptypen
+%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/config/cont-usr.tex b/tex/context/config/cont-usr.tex
index e11370510..38dbab706 100644
--- a/tex/context/config/cont-usr.tex
+++ b/tex/context/config/cont-usr.tex
@@ -30,10 +30,11 @@
\definefilesynonym [lang-da.pat] [dkhyph.tex]
\definefilesynonym [lang-de.pat] [dehyphn.tex]
\definefilesynonym [lang-en.pat] [ushyph1.tex]
+\definefilesynonym [lang-es.pat] [eshyph.tex]
\definefilesynonym [lang-fi.pat] [fihyph.tex]
\definefilesynonym [lang-fr.pat] [frhyph.tex]
-\definefilesynonym [lang-hu.pat] [huhyph.tex]
\definefilesynonym [lang-hr.pat] [hrhyph.tex]
+\definefilesynonym [lang-hu.pat] [huhyph.tex]
\definefilesynonym [lang-it.pat] [ithyph.tex]
\definefilesynonym [lang-la.pat] [lahyph7.tex]
\definefilesynonym [lang-nl.pat] [nehyph.tex]
@@ -41,10 +42,11 @@
\definefilesynonym [lang-pl.pat] [plhyph.tex]
\definefilesynonym [lang-pt.pat] [pthyph.tex]
\definefilesynonym [lang-ro.pat] [rohyph.tex]
+\definefilesynonym [lang-ru.pat] [ruenhyph.tex]
\definefilesynonym [lang-sk.pat] [skhyph.tex]
-\definefilesynonym [lang-es.pat] [eshyph.tex]
\definefilesynonym [lang-sv.pat] [sehyph.tex]
\definefilesynonym [lang-tr.pat] [trhyph.tex]
+\definefilesynonym [lang-ua.pat] [ukrenhyp.tex]
\definefilesynonym [lang-uk.pat] [ukhyphen.tex]
\definefilesynonym [lang-us.pat] [ushyph1.tex]
@@ -86,9 +88,11 @@
% \installlanguage [\s!da] [\c!status=\v!start] % danish
% \installlanguage [\s!de] [\c!status=\v!start] % german
% \installlanguage [\s!en] [\c!status=\v!start] % english us
+% \installlanguage [\s!es] [\c!status=\v!start] % spanish
% \installlanguage [\s!fi] [\c!status=\v!start] % finnish
% \installlanguage [\s!fr] [\c!status=\v!start] % french
% \installlanguage [\s!hr] [\c!status=\v!start] % croatian
+% \installlanguage [\s!hu] [\c!status=\v!start] % hungarian
% \installlanguage [\s!it] [\c!status=\v!start] % italian
% \installlanguage [\s!la] [\c!status=\v!start] % latin
% \installlanguage [\s!nl] [\c!status=\v!start] % dutch
@@ -96,11 +100,11 @@
% \installlanguage [\s!pl] [\c!status=\v!start] % polish
% \installlanguage [\s!pt] [\c!status=\v!start] % portuguese
% \installlanguage [\s!ro] [\c!status=\v!start] % romanian
-% \installlanguage [\s!hu] [\c!status=\v!start] % hungarian
+% \installlanguage [\s!ru] [\c!status=\v!start] % russian
% \installlanguage [\s!sk] [\c!status=\v!start] % slovak
-% \installlanguage [\s!es] [\c!status=\v!start] % spanish
% \installlanguage [\s!sv] [\c!status=\v!start] % swedish
% \installlanguage [\s!tr] [\c!status=\v!start] % turkish
+% \installlanguage [\s!ua] [\c!status=\v!start] % ukrainian
% \installlanguage [\s!uk] [\c!status=\v!start] % english uk
% \installlanguage [deo] [\c!status=\v!start] % old german
@@ -114,9 +118,11 @@
% \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]
@@ -124,11 +130,11 @@
% \setupcurrentlanguage[\s!pl]
% \setupcurrentlanguage[\s!pt]
% \setupcurrentlanguage[\s!ro]
-% \setupcurrentlanguage[\s!hu]
+% \setupcurrentlanguage[\s!ru]
% \setupcurrentlanguage[\s!sk]
-% \setupcurrentlanguage[\s!es]
% \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
diff --git a/tex/context/extra/setup-qr.tex b/tex/context/extra/setup-qr.tex
index 31f40f6ca..d78943cce 100644
--- a/tex/context/extra/setup-qr.tex
+++ b/tex/context/extra/setup-qr.tex
@@ -1,89 +1,40 @@
-% output=pdftex tex=pdfetex modes=cmr,nocover
-
-% This file is not part of the regular ConTeXt distribution.
-% Because this file generates the official ConTeXt command
-% references, you may not alter it.
-%
-% copyright: 19..-2001, Hans Hagen, PRAGMA-ADE, Hasselt NL
-
-% modes: cmr use cmr fonts
-% nocover don't produce a cover page
-%
-% other modes are supported by the cod driver
-
-\unprotect
-
-\startinterface dutch \def\LocalColor{green} \stopinterface
-\startinterface english \def\LocalColor{red} \stopinterface
-\startinterface german \def\LocalColor{blue} \stopinterface
-\startinterface czech \def\LocalColor{magenta} \stopinterface
-\startinterface italian \def\LocalColor{cyan} \stopinterface
-\startinterface romanian \def\LocalColor{yellow} \stopinterface
-
-\startuseMPgraphic{cover}
- def something =
- path p, q;
- color localgray, drawcolor, fillcolor, localcolor;
- localgray := (.9,.9,.9);
- localcolor := \LocalColor ;
- p := (0,0)--(200,0)--(200,50)--(0,50)--cycle;
- q := (25,25)--(175,25);
- dx := uniformdeviate 600;
- dy := uniformdeviate 900;
- sx := .3+(uniformdeviate .5);
- sy := .3+(uniformdeviate .5);
- drawcolor := (uniformdeviate 1)[.75localcolor,localcolor];
- fillcolor := (uniformdeviate 1)[.75localgray,localgray];
- rr := uniformdeviate 360;
- p := p xscaled sx yscaled sy rotated rr shifted (dx,dy);
- q := q xscaled sx yscaled sy rotated rr shifted (dx,dy);
- fill p withcolor fillcolor;
- ahlength := (.2+sy)*15;
- ahangle := (.2+sx)*45;
- draw p withpen pencircle scaled 7.5 withcolor drawcolor;
- drawarrow q withpen pencircle scaled 7.5 withcolor drawcolor;
- enddef;
- for i := 1 upto 1000:
- something;
- endfor;
- setbounds currentpicture to unitsquare
- xscaled \overlaywidth yscaled \overlayheight;
-\stopuseMPgraphic
-
-\startnotmode[cmr]
-
-\setupbodyfont[lbr]
-
-\stopnotmode
+% output=pdftex tex=pdfetex
+
+%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]
-\setupcolors
- [\c!status=\v!start]
-
-\startnotmode[nocover]
-
-\defineoverlay
- [cover]
- [\useMPgraphic{cover}]
-
-\stopnotmode
-
\stellayoutin
- [\c!rugwit=2cm,
- \c!kopwit=2cm,
+ [\c!rugwit=1cm,
+ \c!kopwit=1cm,
\c!hoofd=0cm,
\c!voet=0cm,
- \c!marge=0cm,
- \c!breedte=\v!passend,
- \c!hoogte=\v!passend]
+ \c!breedte=\v!midden,
+ \c!hoogte=\v!midden]
-\stelnummeringin
- [\c!status=\v!stop,
- \c!variant=\v!dubbelzijdig]
-
-\input setupa.tex
+\readfile{setupa} {} {}
\stelsetupin
[\c!criterium=\v!alles,
@@ -93,47 +44,16 @@
[setuptext]
[\c!kader=\v!aan]
-\usemodule[cod-01]
-
-\input setupb.tex
+\readfile{setupb} {} {}
\starttekst
-\setupbackgrounds
- [\v!rechterpagina]
- [\c!achtergrond=cover]
-
-\startmakeup[\v!standaard]
- \definefont[test][RegularBold at 100pt]\test\setstrut
- \steluitlijnenin[\v!midden]
- \strut Con\TeX t \par
- \definefont[test][RegularBold at 75pt]\test\setstrut
- \startinterface dutch \strut commando's \par \stopinterface
- \startinterface english \strut commands \par \stopinterface
- \startinterface german \strut befehle \par \stopinterface
- \startinterface czech \strut prikazy \par \stopinterface
- \startinterface italian \strut comandi \par \stopinterface
- \startinterface romanian \strut comenzile \par \stopinterface
- \vfill
- \definefont[test][RegularBold at 150pt]\test\setstrut
- \startinterface dutch \strut NL \stopinterface
- \startinterface english \strut EN \stopinterface
- \startinterface german \strut DE \stopinterface
- \startinterface czech \strut CZ \stopinterface
- \startinterface italian \strut IT \stopinterface
- \startinterface romanian \strut RO \stopinterface
-\stopmakeup
-
-\setupbackgrounds
- [\v!rechterpagina]
- [\c!achtergrond=]
-
\startmakeup[\v!standaard]
- \definefont[test][RegularBold at 60pt]\test\setstrut
\steluitlijnenin[\v!midden]
+ \definedfont[RegularBold at 60pt]\setstrut
\strut Con\TeX t \par
\vskip24pt
- \definefont[test][RegularBold at 45pt]\test\setstrut
+ \definedfont[RegularBold at 45pt]\setstrut
\startinterface dutch \strut commando's \par \stopinterface
\startinterface english \strut commands \par \stopinterface
\startinterface german \strut befehle \par \stopinterface
@@ -148,31 +68,10 @@
\startinterface czech \strut \^cesk\'y \par \stopinterface
\startinterface italian \strut italiano \par \stopinterface
\startinterface romanian \strut rom\^{a}n\u{a} \par \stopinterface
-
-\stopmakeup
-
-\stellayoutin
- [\c!kopwit=1.5cm]
-
-\protect \placesetup \unprotect
-
-\pagina[\v!ja,\v!blanko,\v!rechts,\v!links]
-
-\setupbackgrounds
- [\v!linkerpagina]
- [\c!achtergrond=cover]
-
-\stellayoutin
- [\c!kopwit=2cm]
-
-\startmakeup[\v!standaard][\c!pagina=]
- \definefont[test][RegularBold at 24pt]\test\stelinterliniein
- \steluitlijnenin[\v!midden]
- \vfill
- PRAGMA ADE \par
- Ridderstraat 27, 8061GH Hasselt NL
\stopmakeup
\protect
+\placesetup
+
\stoptekst
diff --git a/tex/context/user/cont-sys.rme b/tex/context/user/cont-sys.rme
index 4da61099c..a571c8c60 100644
--- a/tex/context/user/cont-sys.rme
+++ b/tex/context/user/cont-sys.rme
@@ -71,9 +71,9 @@
%
% Enabling \CONTEXT\ navigation symbols as well as \euro's.
-\usesymbols [nav,eur]
+\usesymbols [nav,mvs]
-\setupsymbolset [navigation 1]
+\setupsymbolset [navigation 1] % not that clever
\setupinteraction [\c!symboolset=navigation 1]
diff --git a/tex/generic/context/mptopdf.tex b/tex/generic/context/mptopdf.tex
index 665971088..9cd130fd5 100644
--- a/tex/generic/context/mptopdf.tex
+++ b/tex/generic/context/mptopdf.tex
@@ -84,7 +84,7 @@
%D are collected in the file:
\input supp-pdf
-\input supp-mpe
+\input supp-mpe \MPcmyktrue
%D We use no output routine.
diff --git a/tex/generic/context/ppchtex.noc b/tex/generic/context/ppchtex.noc
index 81ec994e9..12cc676af 100644
--- a/tex/generic/context/ppchtex.noc
+++ b/tex/generic/context/ppchtex.noc
@@ -126,8 +126,12 @@
\defineconstant number getal nummer
\defineconstant height hoogte hoehe
\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
@@ -138,6 +142,7 @@
\defineconstant scale schaal format
\defineconstant status status status
\defineconstant text tekst text
+\defineconstant textcolor tekstkleur tekstfarbe
\defineconstant textsize tekstformaat textgroesse
\defineconstant alternative variant alternative
\defineconstant x x x
@@ -201,6 +206,6 @@
\setupchemical[\c!resolutie=\outputresolution]
\fi
-\protect
+\protect
\endinput