diff options
author | Context Git Mirror Bot <phg42.2a@gmail.com> | 2016-08-01 13:39:31 +0200 |
---|---|---|
committer | Context Git Mirror Bot <phg42.2a@gmail.com> | 2016-08-01 13:39:31 +0200 |
commit | c44a9d2f89620e439f335029689e7f0dff9516b7 (patch) | |
tree | 1062a464cb13362d82598c41c437ab1c7eb4f236 /doc/context/sources/general/manuals | |
parent | 665f9095475ffcd1c8750546727c75e5486a266f (diff) | |
download | context-c44a9d2f89620e439f335029689e7f0dff9516b7.tar.gz |
2016-08-01 13:07:00
Diffstat (limited to 'doc/context/sources/general/manuals')
202 files changed, 41705 insertions, 0 deletions
diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-000.tex b/doc/context/sources/general/manuals/columnsets/columnsets-000.tex new file mode 100644 index 000000000..429a067de --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-000.tex @@ -0,0 +1,63 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\usemodule[visual] +\usemodule[simulate] + +\dontcomplain + +\startenvironment columnsets-000 + +\useMPlibrary[dum] + +\setupbodyfont + [palatino] + +\setuplayout + [grid=yes] + +\setuplayout + [backspace=20mm, + cutspace=15mm, + width=middle, + height=middle] + +\setupsystem + [random=1234] + +\setuppagenumbering + [alternative=doublesided, + location=] + +\setupheadertexts + [pagenumber][right] + [left][pagenumber] + +\setupfootertexts + [\inputfilename] + +\setupfooter + [style=\tttf] + +\setuptolerance + [verytolerant,stretch] + +\definecolor[color-1][.5(red,green)] +\definecolor[color-2][.5(green,blue)] +\definecolor[color-3][.5(blue,red)] +\definecolor[color-4][.5(white,black)] +\definecolor[color-5][.5(white,color-4)] + +\startuniqueMPgraphic{frame} + fill OverlayBox withcolor \MPcolor{color-1} ; +\stopuniqueMPgraphic + +\startuniqueMPgraphic{contrast} + fill OverlayBox withcolor \MPcolor{color-3} ; +\stopuniqueMPgraphic + +\defineoverlay[frame] [\uniqueMPgraphic{frame}] +\defineoverlay[contrast][\uniqueMPgraphic{contrast}] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-001.tex b/doc/context/sources/general/manuals/columnsets/columnsets-001.tex new file mode 100644 index 000000000..689f4e044 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-001.tex @@ -0,0 +1,17 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=2] + +\starttext + +\startcolumnset[example] + + \dorecurse{20}{\fakewords{100}{200}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-002.tex b/doc/context/sources/general/manuals/columnsets/columnsets-002.tex new file mode 100644 index 000000000..a67dd3161 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-002.tex @@ -0,0 +1,17 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][nleft=3,nright=2,width=5cm] + +\starttext + +\startcolumnset[example] + + \dorecurse{15}{\fakewords{100}{200}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-003.tex b/doc/context/sources/general/manuals/columnsets/columnsets-003.tex new file mode 100644 index 000000000..eed0286f8 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-003.tex @@ -0,0 +1,35 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=2,page=left] + +\setupbackgrounds[text][background=color,backgroundcolor=color-1] + +\setupcolumnsetstart[example][1][1][2] +\setupcolumnsetstart[example][1][2][4] +\setupcolumnsetstart[example][2][1][6] +\setupcolumnsetstart[example][2][2][6] +\setupcolumnsetstart[example][3][1][4] +\setupcolumnsetstart[example][3][2][2] + +\setupcolumnsetlines[example][1][1][-2] +\setupcolumnsetlines[example][1][2][-4] +\setupcolumnsetlines[example][2][1][-6] +\setupcolumnsetlines[example][2][2][-6] +\setupcolumnsetlines[example][3][1][-4] +\setupcolumnsetlines[example][3][2][-2] +\setupcolumnsetlines[example][4][1][4] +\setupcolumnsetlines[example][4][2][10] + +\starttext + +\startcolumnset[example] + + \dorecurse{20}{\fakewords{100}{200}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-004.tex b/doc/context/sources/general/manuals/columnsets/columnsets-004.tex new file mode 100644 index 000000000..a58ddf621 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-004.tex @@ -0,0 +1,32 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=3,page=left] + +\definecolor[fakerulecolor] + +\definecolumnsetspan[wide] [n=2,background=contrast,color=white] +\definecolumnsetspan[wider][n=4,background=contrast,color=white] + +\starttext + +\startcolumnset[example] + + \startcolumnsetspan[wider] + wider: \dorecurse{2}{#1: \fakewords{25}{50}\par} + \stopcolumnsetspan + + inbetween: \fakewords{25}{50}\par + + \startcolumnsetspan[wide] + wide : \dorecurse{2}{#1: \fakewords{25}{50}\par} + \stopcolumnsetspan + + after: \dorecurse{15}{#1: \fakewords{100}{200}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-005.tex b/doc/context/sources/general/manuals/columnsets/columnsets-005.tex new file mode 100644 index 000000000..f1d970d9e --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-005.tex @@ -0,0 +1,29 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=3,page=left] + +\definecolumnsetspan[wide][n=2,background=contrast,color=white] + +\definecolor[fakerulecolor] + +\starttext + +\startcolumnset[example] + + \startcolumnsetspan[wide][default=btlr] + + \startsimplecolumns + \dorecurse{2}{\fakewords{25}{40}\par} + \stopsimplecolumns + + \stopcolumnsetspan + + \dorecurse{15}{\fakewords{100}{200}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-006.tex b/doc/context/sources/general/manuals/columnsets/columnsets-006.tex new file mode 100644 index 000000000..033619970 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-006.tex @@ -0,0 +1,35 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=3,page=left] + +\definecolor[fakerulecolor] + +\definecolumnsetspan[wide][n=2,background=contrast,color=white] + +\starttext + +\startcolumnset[example] + + \startcolumnsetspan[wide] + \fakewords{25}{50} + \stopcolumnsetspan + + \fakewords{25}{50} + + \startcolumnsetspan[wide] + \fakewords{25}{50} + \stopcolumnsetspan + + \startcolumnsetspan[wide][default=btrl] + \fakewords{25}{50} + \stopcolumnsetspan + + \dorecurse{15}{\fakewords{100}{200}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-007.tex b/doc/context/sources/general/manuals/columnsets/columnsets-007.tex new file mode 100644 index 000000000..137a414d9 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-007.tex @@ -0,0 +1,43 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=3,page=left] + +\definecolor[fakerulecolor] + +\definecolumnsetspan[wide][n=2,background=contrast,color=white] + +\starttext + +\startbuffer + + \startcolumnsetspan[wide] + \fakewords{25}{50} + \stopcolumnsetspan + + \fakewords{25}{50} + + \startcolumnsetspan[wide] + \fakewords{25}{50} + \stopcolumnsetspan + + \startcolumnsetspan[wide][default=btrl] + \fakewords{25}{50} + \stopcolumnsetspan + + \dorecurse{3}{\fakewords{100}{200}\par} + +\stopbuffer + +\startcolumnset[example] + + \dorecurse{4}{\getbuffer} + + \dorecurse{5}{\fakewords{100}{200}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-101.tex b/doc/context/sources/general/manuals/columnsets/columnsets-101.tex new file mode 100644 index 000000000..f9c7b59cb --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-101.tex @@ -0,0 +1,30 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\starttext + +\startbuffer +\fakewords{100}{200} +\placefigure + {} + {\externalfigure[placeholder][width=\columnsetspanwidth{1}]} +\fakewords{100}{200} +\placefigure + {} + {\externalfigure[placeholder][width=\columnsetspanwidth{2}]} +\fakewords{100}{200} +\stopbuffer + +\startcolumnset[example] + + \dorecurse {5}{\getbuffer} + \dorecurse{10}{\fakewords{100}{200}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-102.tex b/doc/context/sources/general/manuals/columnsets/columnsets-102.tex new file mode 100644 index 000000000..3cf4dcd0e --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-102.tex @@ -0,0 +1,36 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\starttext + +\startbuffer +\placefigure [tbrl] + {tblr} + {\externalfigure[fake][width=\columnsetspanwidth{1},lines=5]} +\placefigure [fxtb:6*4] + {fxtb} + {\externalfigure[fake][width=\columnsetspanwidth{2},lines=5]} +\placefigure [btlr] + {btlr} + {\externalfigure[fake][width=\columnsetspanwidth{2},lines=5]} +\placefigure [btlr] + {btlr} + {\externalfigure[fake][width=\columnsetspanwidth{3},lines=5]} + +\dorecurse {5} { + \fakewords{100}{200}\par +} +\stopbuffer + +\startcolumnset[example] + + \dorecurse{6}{\getbuffer} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-103.tex b/doc/context/sources/general/manuals/columnsets/columnsets-103.tex new file mode 100644 index 000000000..f1d4dbedc --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-103.tex @@ -0,0 +1,37 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\starttext + +\startcolumnset[example] + +\useexternalfigure[fake][fake][width=\textwidth,lines=3] + +\placefigure[btlr]{brlr}{\externalfigure[fake]} +\placefigure[btlr]{brlr}{\externalfigure[fake]} +\placefigure[btrl]{btrl}{\externalfigure[fake]} +\placefigure[btrl]{btrl}{\externalfigure[fake]} +\placefigure[tblr]{tblr}{\externalfigure[fake]} +\placefigure[tblr]{tblr}{\externalfigure[fake]} +\placefigure[tbrl]{tbrl}{\externalfigure[fake]} +\placefigure[tbrl]{tbrl}{\externalfigure[fake]} + +\placefigure[lrbt]{lrbt}{\externalfigure[fake]} +\placefigure[lrbt]{lrbt}{\externalfigure[fake]} +\placefigure[lrtb]{lrtb}{\externalfigure[fake]} +\placefigure[lrtb]{lrtb}{\externalfigure[fake]} +\placefigure[rlbt]{rlbt}{\externalfigure[fake]} +\placefigure[rlbt]{rlbt}{\externalfigure[fake]} +\placefigure[rltb]{rltb}{\externalfigure[fake]} +\placefigure[rltb]{rltb}{\externalfigure[fake]} + +\dorecurse{10}{\fakewords{50}{100}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-201.tex b/doc/context/sources/general/manuals/columnsets/columnsets-201.tex new file mode 100644 index 000000000..37b26c391 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-201.tex @@ -0,0 +1,31 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\definecolumnsetarea + [one] + [type=both, + x=1,y=1,nx=2,ny=6, + background=contrast, + state=repeat] + +\definecolumnsetarea + [two] + [type=both, + x=4,y=10,nx=1,ny=6, + background=contrast, + state=repeat] + +\starttext + +\startcolumnset[example] + + \dorecurse{40}{\fakewords{50}{100}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-202.tex b/doc/context/sources/general/manuals/columnsets/columnsets-202.tex new file mode 100644 index 000000000..1721d9cbc --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-202.tex @@ -0,0 +1,32 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\definecolumnsetarea + [one][left] + [x=1,y=1,nx=2,ny=6, + background=contrast,state=repeat] + +\definecolumnsetarea + [two][right] + [x=3,y=1,nx=2,ny=6, + background=contrast,state=repeat] + +\definecolumnsetarea + [three][both] + [x=2,y=10,nx=2,ny=6, + background=contrast,state=repeat] + +\starttext + +\startcolumnset[example] + + \dorecurse{30}{\fakewords{50}{100}} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-203.tex b/doc/context/sources/general/manuals/columnsets/columnsets-203.tex new file mode 100644 index 000000000..6c15578bc --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-203.tex @@ -0,0 +1,29 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\definecolumnsetarea + [one]% [left] + [x=1,y=1,nx=6,ny=6, + background=contrast,state=start] + +\definecolumnsetarea + [two]%[left] + [x=3,y=10,nx=4,ny=6, + background=contrast,state=start] + +\stopsetups + +\starttext + +\startcolumnset[example] + + \dorecurse{25}{\fakewords{50}{100}} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-204.tex b/doc/context/sources/general/manuals/columnsets/columnsets-204.tex new file mode 100644 index 000000000..d390f468e --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-204.tex @@ -0,0 +1,41 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\usemodule[oldfun] + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\definecolumnsetarea + [title] + [x=1,y=1,nx=8,ny=8, + background=contrast, + color=white, + align={lohi,right}, + state=start] + +\setupcolumnsetareatext + [title] + [\setups{the title}] + +\startsetups[the title] + + \GapText + {\dimexpr\makeupwidth+\backspace\relax} + {6pt} + {RegularBold*default} {sa 4} + {A Title Spanni\+ng 2 Pages} + +\stopsetups + +\starttext + +\startcolumnset[example] + + \dorecurse{30}{\fakewords{50}{100}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-205.tex b/doc/context/sources/general/manuals/columnsets/columnsets-205.tex new file mode 100644 index 000000000..b53709770 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-205.tex @@ -0,0 +1,42 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\usemodule[oldfun] + +\environment columnsets-000 + +\unprotected \def\SpreadGapText#1#2{{\def\+{\blackrule[\c!width=#1]}#2}} + +\definecolumnset[example][n=4,page=left] + +\definecolumnsetarea + [title] + [x=1,y=1,nx=8,ny=8, + background=contrast, + color=white, + align={lohi,right}, + state=start] + +\setupcolumnsetareatext + [title] + [\setups{the title}] + +\startsetups[the title] + + \GapText + {\dimexpr(\makeupwidth+\backspace)} {6pt} + {RegularBold} {sa 4} + {A Title Spanni\+ng 2 Pages} + +\stopsetups + +\starttext + +\startcolumnset[example] + + \dorecurse{30}{\fakewords{50}{100}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-206.tex b/doc/context/sources/general/manuals/columnsets/columnsets-206.tex new file mode 100644 index 000000000..8b9f524b1 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-206.tex @@ -0,0 +1,29 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\definecolumnsetarea + [first] + [x=2,y=4,nx=2,ny=8, + background=contrast, + state=start] + +\definecolumnsetarea + [second] + [x=1,y=20,nx=1,ny=3, + background=contrast, + state=start] + +\starttext + +\startcolumnset[example] + + \dorecurse{50}{\fakewords{50}{100}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-301.tex b/doc/context/sources/general/manuals/columnsets/columnsets-301.tex new file mode 100644 index 000000000..4d21f2b02 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-301.tex @@ -0,0 +1,29 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4] + +\starttext + +\startcolumnset[example] + + 1: \fakewords{50}{75} \column + 2: [] \fakewords{50}{75} \column[yes] + 3: [yes] \fakewords{50}{75} \column[page] + \column[page] % redundant + 4: [page] \fakewords{50}{75} \column[3] + 5: [3] \fakewords{50}{75} \column[4] + 6: [4] \fakewords{50}{75} \column[first] + 7: [first] \fakewords{50}{75} \column[last] + 8: [last] \fakewords{50}{75} \page + 9: (page) \fakewords{50}{75} \page + \page % redundant + 10: (page) \fakewords{50}{75} \column[3*5] + 11: [3*5] \fakewords{50}{75} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-401.tex b/doc/context/sources/general/manuals/columnsets/columnsets-401.tex new file mode 100644 index 000000000..ee91e608c --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-401.tex @@ -0,0 +1,26 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\setupbackgrounds[text][text][background=contrast] + +\definecolor[fakerulecolor][white] + +\setupcolumnset[example:2][distance=36pt] +\setupcolumnset[example:3][distance=72pt] +\setupcolumnset[example:4][distance=24pt] +\setupcolumnset[example:5][distance=48pt] + +\starttext + +\startcolumnset[example] + + \dorecurse{25}{\fakewords{100}{150}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-402.tex b/doc/context/sources/general/manuals/columnsets/columnsets-402.tex new file mode 100644 index 000000000..00db6017c --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-402.tex @@ -0,0 +1,24 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\setupbackgrounds[text][text][background=contrast] + +\setupcolumnset[example] [distance=24pt] +\setupcolumnset[example:1][distance=96pt] + +\definecolor[fakerulecolor][white] + +\starttext + +\startcolumnset[example] + + \dorecurse{25}{\fakewords{100}{150}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-403.tex b/doc/context/sources/general/manuals/columnsets/columnsets-403.tex new file mode 100644 index 000000000..c9bc2e648 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-403.tex @@ -0,0 +1,23 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\setupbackgrounds[text][text][background=contrast] + +\definecolor[fakerulecolor][white] + +\setupcolumnset[example][width=.15\makeupwidth] + +\starttext + +\startcolumnset[example] + + \dorecurse{25}{\fakewords{100}{150}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-404.tex b/doc/context/sources/general/manuals/columnsets/columnsets-404.tex new file mode 100644 index 000000000..05a25acfe --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-404.tex @@ -0,0 +1,34 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=3,page=left] + +\setupbackgrounds[text][text][background=contrast] + +\setupcolumnset[frame=on,framecolor=color-4,rulethickness=1mm] + +\definecolor[fakerulecolor][white] + +\setupcolumnset[example:1][width=2cm] +\setupcolumnset[example:2][width=4cm] +\setupcolumnset[example:3][width=3cm] + +\setupcolumnset[example:4][width=3cm] +\setupcolumnset[example:5][width=4cm] +\setupcolumnset[example:6][width=6cm] + +\starttext + +\startcolumnset[example] + +\dorecurse{15}{ + \dorecurse{3}{\fakewords{10}{15}\par} + \column[yes] +} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-405.tex b/doc/context/sources/general/manuals/columnsets/columnsets-405.tex new file mode 100644 index 000000000..fa20ef34c --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-405.tex @@ -0,0 +1,29 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\setupbackgrounds[text][text][background=contrast] + +\setupcolumnset[frame=on,framecolor=color-4,rulethickness=1mm] + +\definecolor[fakerulecolor][white] + +\setupcolumnset[example:1][width=.3\makeupwidth] + +\starttext + +\startcolumnset[example] + + \fakewords{150}{150} + \column + \fakewords{25}{50} + + \dorecurse{25}{\fakewords{50}{75}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-601.tex b/doc/context/sources/general/manuals/columnsets/columnsets-601.tex new file mode 100644 index 000000000..b139210f4 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-601.tex @@ -0,0 +1,29 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left,direction=reverse] + +\setupbackgrounds[text][text][background=contrast] + +\definecolor[fakerulecolor][color-1] + +\starttext + +\startcolumnset[example] + + \dorecurse{50}{ + \dontleavehmode + \snaptogrid\hbox + {\scale[height=2.5\lineheight]{\color[white]{#1}}}% + \space + \fakewords{30}{60} + %\simulatewords[n=30,m=60,min=1,max=5,color=color-1,line=yes]\par + \par + } + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-701.tex b/doc/context/sources/general/manuals/columnsets/columnsets-701.tex new file mode 100644 index 000000000..b2c50cfaf --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-701.tex @@ -0,0 +1,23 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\setupcolumnset + [example] + [background=contrast] + +\definecolor[fakerulecolor][white] + +\starttext + +\startcolumnset[example] + + \dorecurse{30}{\fakewords{50}{100}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-702.tex b/doc/context/sources/general/manuals/columnsets/columnsets-702.tex new file mode 100644 index 000000000..5b9a879c1 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-702.tex @@ -0,0 +1,27 @@ +content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\setupcolumnset + [example] + [background=contrast, + backgroundoffset=4pt, + frame=on, + framecolor=white, + rulethickness=2pt] + +\definecolor[fakerulecolor][white] + +\starttext + +\startcolumnset[example] + + \dorecurse{30}{\fakewords{50}{100}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-703.tex b/doc/context/sources/general/manuals/columnsets/columnsets-703.tex new file mode 100644 index 000000000..549b49f61 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-703.tex @@ -0,0 +1,34 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=4,page=left] + +\definecolumnsetarea + [title][left] + [x=1,y=1,nx=8,ny=8, + background=contrast,state=repeat] + +\setupcolumnsetareatext + [title][left][\setups{cow}] + +\startsetups[cow] + + \externalfigure + [cow.pdf] + [height=15\lineheight, + width=2\dimexpr\makeupwidth+\backspace\relax] + +\stopsetups + +\starttext + +\startcolumnset[example] + + \dorecurse{30}{\fakewords{50}{100}\par} + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-704.tex b/doc/context/sources/general/manuals/columnsets/columnsets-704.tex new file mode 100644 index 000000000..7fa6cb313 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-704.tex @@ -0,0 +1,69 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\startuseMPgraphic{mpos:par:columns} + path p ; numeric h ; + for i=1 upto nofmultipars : + p := multipars[i] ; + h := bbheight(p) ; + if multikind[i] = "single" : + fill p topenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor \MPcolor{color-1} shadedinto white ; + fill p bottomenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor white shadedinto \MPcolor{color-1} ; + elseif multikind[i] = "first" : + fill p + withshademethod "linear" + withshadedirection shadedup + withcolor \MPcolor{color-2} shadedinto white ; + elseif multikind[i] = "middle" : + fill p topenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor \MPcolor{color-2} shadedinto white ; + fill p bottomenlarged -.5h + withshademethod "linear" + withshadedirection shadedup + withcolor white shadedinto \MPcolor{color-3} ; + elseif multikind[i] = "last" : + fill p + withshademethod "linear" + withshadedirection shadedup + withcolor white shadedinto \MPcolor{color-3} ; + fi ; + endfor ; +\stopuseMPgraphic + +\definecolumnset + [example] + [n=4, + page=left] + +\definetextbackground + [shade] + [location=paragraph, + mp=mpos:par:columns, + before=\blank, + after=\blank] + +\starttext + +\startcolumnset[example] + + \dorecurse {40} { + \starttextbackground[shade] + \fakewords{10}{200} + \stoptextbackground + \par + } + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-801.tex b/doc/context/sources/general/manuals/columnsets/columnsets-801.tex new file mode 100644 index 000000000..1a84f99ab --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-801.tex @@ -0,0 +1,19 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset [example-1] [n=2] +\definecolumnset [example-2] [n=3] + +\starttext \showgrid + + \startcolumnset [example-1] + \dorecurse {1}{\input tufte \par} + \stopcolumnset + \startcolumnset [example-2] + \dorecurse {2}{\input ward \par} + \stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-802.tex b/doc/context/sources/general/manuals/columnsets/columnsets-802.tex new file mode 100644 index 000000000..a126d0012 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-802.tex @@ -0,0 +1,22 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset [example-1] [n=2,balance=yes] +\definecolumnset [example-2] [n=3,balance=yes] + +\starttext \showgrid + + \setupcolumnsetlines[example-1][1][1] [8] + \setupcolumnsetlines[example-1][1][2][10] + + \startcolumnset [example-1] + \dorecurse {1}{\input tufte \par} + \stopcolumnset + \startcolumnset [example-2] + \dorecurse {2}{\input ward \par} + \stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-803.tex b/doc/context/sources/general/manuals/columnsets/columnsets-803.tex new file mode 100644 index 000000000..58a278bb1 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-803.tex @@ -0,0 +1,26 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset [example-1] [n=2,balance=yes] +\definecolumnset [example-2] [n=3,balance=yes] + +\starttext \showgrid + + \setupcolumnsetlines[example-1][1][1] [8] + \setupcolumnsetlines[example-1][1][2][10] + + \setupcolumnsetlines[example-2][1][1][19] + \setupcolumnsetlines[example-2][1][2][18] + \setupcolumnsetlines[example-2][1][3][19] + + \startcolumnset [example-1] + \dorecurse {1}{\input tufte \par} + \stopcolumnset + \startcolumnset [example-2] + \dorecurse {2}{\input ward \par} + \stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-804.tex b/doc/context/sources/general/manuals/columnsets/columnsets-804.tex new file mode 100644 index 000000000..c2b7a6b1e --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-804.tex @@ -0,0 +1,26 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset [example-1] [n=2,balance=yes] +\definecolumnset [example-2] [n=3,balance=yes] + +\starttext \showgrid + + \setupcolumnsetlines[example-1][1][1] [8] + \setupcolumnsetlines[example-1][1][2][10] + + \setupcolumnsetlines[example-2][1][1] [0] + \setupcolumnsetlines[example-2][1][2][-2] + \setupcolumnsetlines[example-2][1][3] [0] + + \startcolumnset [example-1] + \dorecurse {1}{\input tufte \par} + \stopcolumnset + \startcolumnset [example-2] + \dorecurse {6}{\input ward \par} + \stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-805.tex b/doc/context/sources/general/manuals/columnsets/columnsets-805.tex new file mode 100644 index 000000000..fc80e7e9c --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-805.tex @@ -0,0 +1,26 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset [example-1] [n=2,balance=yes] +\definecolumnset [example-2] [n=3,balance=yes] + +\starttext \showgrid + + \setupcolumnsetlines[example-1][1][1] [8] + \setupcolumnsetlines[example-1][1][2][10] + + \setupcolumnsetstart[example-2][1][1][19] + \setupcolumnsetstart[example-2][1][2][17] + \setupcolumnsetstart[example-2][1][3][19] + + \startcolumnset [example-1] + \dorecurse {1}{\input tufte \par} + \stopcolumnset + \startcolumnset [example-2] + \dorecurse {2}{\input ward \par} + \stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-806.tex b/doc/context/sources/general/manuals/columnsets/columnsets-806.tex new file mode 100644 index 000000000..0322a336f --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-806.tex @@ -0,0 +1,26 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset [example-1] [n=2,balance=yes] +\definecolumnset [example-2] [n=3,balance=yes] + +\starttext \showgrid + + \setupcolumnsetlines[example-1][1][1] [8] + \setupcolumnsetlines[example-1][1][2][10] + + \setupcolumnsetstart[example-2][1][1][29] + \setupcolumnsetstart[example-2][1][2][29] + \setupcolumnsetstart[example-2][1][3][29] + + \startcolumnset [example-1] + \dorecurse {1}{\input tufte \par} + \stopcolumnset + \startcolumnset [example-2] + \dorecurse {2}{\input ward \par} + \stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-901.tex b/doc/context/sources/general/manuals/columnsets/columnsets-901.tex new file mode 100644 index 000000000..300458bf5 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-901.tex @@ -0,0 +1,38 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=2,page=left,distance=1cm] + +\setupcolumnset + [example] + [background=contrast] + +\definecolor[fakerulecolor][white] \faketriggertrue + +\setuphead + [section] + [style=\bfd] + +\setuplinenumbering + [style=bold, + distance=0pt, + align=inner] + +\starttext + +\startcolumnset[example] + + \dorecurse{30}{ + \startsection[title=foo #1] + \startlinenumbering + \fakewords{50}{100}\par + \stoplinenumbering + \stopsection + } + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-902.tex b/doc/context/sources/general/manuals/columnsets/columnsets-902.tex new file mode 100644 index 000000000..fda2969af --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-902.tex @@ -0,0 +1,38 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=3,page=left,distance=1cm] + +\setupcolumnset + [example] + [background=contrast] + +\definecolor[fakerulecolor][white] \faketriggertrue + +\setuphead + [section] + [style=\bfd] + +\setuplinenumbering + [style=bold, + distance=0pt, + align=inner] + +\starttext + +\startcolumnset[example] + + \dorecurse{30}{ + \startsection[title=foo #1] + \startlinenumbering + \fakewords{50}{100}\par + \stoplinenumbering + \stopsection + } + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets-903.tex b/doc/context/sources/general/manuals/columnsets/columnsets-903.tex new file mode 100644 index 000000000..68cd31ae2 --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets-903.tex @@ -0,0 +1,41 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\environment columnsets-000 + +\definecolumnset[example][n=3,page=left,distance=1cm] + +\setupcolumnset + [example] + [background=contrast] + +\definecolor[fakerulecolor][white] \faketriggertrue + +\setupblank + [line] + +\setuphead + [section] + [style=\bfd] + +\setuplinenumbering + [style=bold, + distance=0pt, + align=inner] + +\starttext + +\startcolumnset[example] + + \dorecurse{30}{ + \startsection[title=foo #1] + \startlinenumbering + \fakewords{50}{100}\par + \stoplinenumbering + \stopsection + } + +\stopcolumnset + +\stoptext diff --git a/doc/context/sources/general/manuals/columnsets/columnsets.tex b/doc/context/sources/general/manuals/columnsets/columnsets.tex new file mode 100644 index 000000000..7d68872ef --- /dev/null +++ b/doc/context/sources/general/manuals/columnsets/columnsets.tex @@ -0,0 +1,873 @@ +% engine=luatex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\dontcomplain + +\definepagebreak[mine][yes] + +% A complete otf optima pack is too expensive for this (I only have the +% type one set). +% +% \usetypescriptfile +% [type-ghz] +% +% \usetypescript +% [sans] +% [optima-nova] +% +% \setupbodyfont +% [optima-nova,11pt] +% +% \definefont[QuiteLarge][SansBold sa 3] +% \definefont[NotSoLarge][SansBold sa 1.5] +% +% So we could use: +% +% \setupbodyfont +% [pagella,11pt] +% +% \definefont[QuiteLarge][Bold sa 2.50] +% \definefont[NotSoLarge][Bold sa 1.25] +% +% But this one has a matching sans: + +\setupbodyfont + [dejavu,11pt] + +\definefont[QuiteLarge][SansBold sa 2.50] +\definefont[NotSoLarge][SansBold sa 1.25] + +\setuplayout + [backspace=.1\paperwidth, + topspace=.025\paperheight, + header=0.025\paperheight, + footer=0.025\paperheight, + headerdistance=0.025\paperheight, + footerdistance=0.025\paperheight, + width=middle, + height=middle] + +\setuppagenumbering + [alternative=doublesided, + location=] + +\setupwhitespace + [line] + +\setupblank + [line] + +\setuptyping + [blank=halfline] + +\startsetups [pagenumber] + \hbox to .2\paperwidth { + \hss + Page \pagenumber + \hss + } +\stopsetups + +\setupfooter [before=\vfill,after=\vfill,style=\bf,color=color-4] +\setupheader [before=\vfill,after=\vfill,style=\bf,color=color-4] + +\setupfootertexts [] [\setups{pagenumber}] +\setupheadertexts [] [\setups{chapterhead}] + +\startsetups [chapterhead] + \hbox to .2\paperwidth { + \hss + \getmarking[chapter] + \hss + } +\stopsetups + +\setuphead + [chapter] + [header=empty] + +\definecolor[color-1][.5(red,green)] +\definecolor[color-2][.5(green,blue)] +\definecolor[color-3][.5(blue,red)] +\definecolor[color-4][.5(white,black)] +\definecolor[color-5][.5(white,color-4)] +\definecolor[color-6][.2(white,color-4)] + +\startuseMPgraphic{page} +StartPage ; + path p ; + numeric n; n := PageNumber ; + numeric w; w := bbwidth(Page) ; + numeric h; h := bbheight(Page) ; + def DrawBit (expr bit, dx, dy) = + path p ; p := unitsquare xyscaled(w/5,h/40) shifted (dx*w/10,dy*(h-h/40)) ; + if n div bit > 0 : + n := n - (n div bit)*bit ; + fill p withcolor \MPcolor{color-1} ; + else : + fill p withcolor \MPcolor{color-2} ; + fi ; + enddef ; + DrawBit(32,7,1) ; + DrawBit(16,4,1) ; + DrawBit( 8,1,1) ; + DrawBit( 4,7,0) ; + DrawBit( 2,4,0) ; + DrawBit( 1,1,0) ; +StopPage ; +\stopuseMPgraphic + +\startuniqueMPgraphic{frame} + fill OverlayBox withcolor \MPcolor{color-5} ; +\stopuniqueMPgraphic + +\startuniqueMPgraphic{contrast} + fill OverlayBox withcolor \MPcolor{color-4} ; +\stopuniqueMPgraphic + +\defineoverlay[page] [\useMPgraphic{page}] +\defineoverlay[frame] [\useMPgraphic{frame}] +\defineoverlay[contrast][\useMPgraphic{contrast}] + +\setupexternalfigures + [background=frame] + +\definecombination + [sixpages] + [%inbetween=\blank, + style=mono, + distance=.5\bodyfontsize, + width=\textwidth] + +\definecombination + [fourpages] + [%inbetween=\blank, + style=mono, + distance=.5\bodyfontsize, + width=\textwidth] + +\definecombination + [twopages] + [style=mono] + +\definemeasure[twopages] [\dimexpr\dimexpr\textwidth-3 \bodyfontsize\relax/4\relax] +\definemeasure[fourpages] [\dimexpr\dimexpr\textwidth-3 \bodyfontsize\relax/4\relax] +\definemeasure[eightpages][\dimexpr\dimexpr\textwidth-3 \bodyfontsize\relax/4\relax] +\definemeasure[sixpages] [\dimexpr\dimexpr\textwidth-2.5\bodyfontsize\relax/6\relax] + +\starttexdefinition unexpanded OnePage #1 + \startlinecorrection[blank] + \startcombination[twopages][1*1] + {\typesetfile[#1.tex][page=1,lines=15]} {1} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded OneSpread #1 + \startlinecorrection[blank] + \startcombination[twopages][1*1] + {\typesetfile[#1.tex][page=2,lines=15]} {2} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded TwoPages #1 + \startlinecorrection[blank] + \startcombination[twopages][2*1] + {\typesetfile[#1.tex][page=1,width=\measure{twopages}]} {1} + {\typesetfile[#1.tex][page=2,width=\measure{twopages}]} {2} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded TwoSpread #1 + \startlinecorrection[blank] + \startcombination[twopages][2*1] + {\typesetfile[#1.tex][page=2,width=\measure{twopages}]} {2} + {\typesetfile[#1.tex][page=3,width=\measure{twopages}]} {3} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded FourPages #1 + \startlinecorrection[blank] + \startcombination[fourpages][4*1] + {\typesetfile[#1.tex][page=1,width=\measure{fourpages}]} {1} + {\typesetfile[#1.tex][page=2,width=\measure{fourpages}]} {2} + {\typesetfile[#1.tex][page=3,width=\measure{fourpages}]} {3} + {\typesetfile[#1.tex][page=4,width=\measure{fourpages}]} {4} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded FourSpread #1 + \startlinecorrection[blank] + \startcombination[fourpages][4*1] + {\typesetfile[#1.tex][page=2,width=\measure{fourpages}]} {2} + {\typesetfile[#1.tex][page=3,width=\measure{fourpages}]} {3} + {\typesetfile[#1.tex][page=4,width=\measure{fourpages}]} {4} + {\typesetfile[#1.tex][page=5,width=\measure{fourpages}]} {5} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded SixPages #1 + \startlinecorrection[blank] + \startcombination[sixpages][6*1] + {\typesetfile[#1.tex][page=1,width=\measure{sixpages}]} {1} + {\typesetfile[#1.tex][page=2,width=\measure{sixpages}]} {2} + {\typesetfile[#1.tex][page=3,width=\measure{sixpages}]} {3} + {\typesetfile[#1.tex][page=4,width=\measure{sixpages}]} {4} + {\typesetfile[#1.tex][page=5,width=\measure{sixpages}]} {5} + {\typesetfile[#1.tex][page=6,width=\measure{sixpages}]} {6} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded SixSpread #1 + \startlinecorrection[blank] + \startcombination[sixpages][6*1] + {\typesetfile[#1.tex][page=2,width=\measure{sixpages}]} {2} + {\typesetfile[#1.tex][page=3,width=\measure{sixpages}]} {3} + {\typesetfile[#1.tex][page=4,width=\measure{sixpages}]} {4} + {\typesetfile[#1.tex][page=5,width=\measure{sixpages}]} {5} + {\typesetfile[#1.tex][page=6,width=\measure{sixpages}]} {6} + {\typesetfile[#1.tex][page=7,width=\measure{sixpages}]} {7} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded EightPages #1 + \startlinecorrection[blank] + \startcombination[fourpages][4*2] + {\typesetfile[#1.tex][page=1,width=\measure{eightpages}]} {#1 / 1} + {\typesetfile[#1.tex][page=2,width=\measure{eightpages}]} {#1 / 2} + {\typesetfile[#1.tex][page=3,width=\measure{eightpages}]} {#1 / 3} + {\typesetfile[#1.tex][page=4,width=\measure{eightpages}]} {#1 / 4} + {\typesetfile[#1.tex][page=5,width=\measure{eightpages}]} {#1 / 5} + {\typesetfile[#1.tex][page=6,width=\measure{eightpages}]} {#1 / 6} + {\typesetfile[#1.tex][page=7,width=\measure{eightpages}]} {#1 / 7} + {\typesetfile[#1.tex][page=8,width=\measure{eightpages}]} {#1 / 8} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\starttexdefinition unexpanded EightSpread #1 + \startlinecorrection[blank] + \startcombination[fourpages][4*2] + {\typesetfile[#1.tex][page=2,width=\measure{eightpages}]} {#1 / 2} + {\typesetfile[#1.tex][page=3,width=\measure{eightpages}]} {#1 / 3} + {\typesetfile[#1.tex][page=4,width=\measure{eightpages}]} {#1 / 4} + {\typesetfile[#1.tex][page=5,width=\measure{eightpages}]} {#1 / 5} + {\typesetfile[#1.tex][page=6,width=\measure{eightpages}]} {#1 / 6} + {\typesetfile[#1.tex][page=7,width=\measure{eightpages}]} {#1 / 7} + {\typesetfile[#1.tex][page=8,width=\measure{eightpages}]} {#1 / 8} + {\typesetfile[#1.tex][page=9,width=\measure{eightpages}]} {#1 / 9} + \stopcombination + \stoplinecorrection +\stoptexdefinition + +\setuphead + [chapter] + [style=\QuiteLarge, + color=color-3, + number=no] + +\setuplist + [chapter] + [command=\MyListCommand, + alternative=command] + +\starttexdefinition unexpanded MyListCommand #1#2#3 + \snaptogrid + [line,-line]\vbox { + \tfb + \setstrut + \strut#2 + \quad#3 + } +\stoptexdefinition + +\setupmargindata + [style=\tttf, + color=color-3] + +\starttexdefinition unexpanded ShowFile #1 + \margintext + {\cldcontext{string.match("#1","\letterpercent d+")}} + \typefile + [range={environment}] + {#1} +\stoptexdefinition + +% \typefile[range=4] {...} +% \typefile[range={=}]{...} % start after comment lines + +\starttexdefinition unexpanded ShowEnvironmentFile #1 + \margintext + {\cldcontext{string.match("#1","\letterpercent d+")}} + \typefile + [range={=startenvironment}] + {#1} +\stoptexdefinition + +\startdocument + +\startMPpage +StartPage ; + path p ; numeric w, h, d ; picture q ; + if true : + q := image(draw textext.urt("\ssbf COLUMNS") withcolor \MPcolor{color-6}) ; + else : + q := image(draw textext.urt("\ssbf COLUMNSETS") withcolor \MPcolor{color-6}) ; + fi ; + w := bbwidth(Page) ; + h := bbheight(Page) ; + d := h/100 ; + fill Page withcolor \MPcolor{color-1} ; + p := Page xysized (w,d) ; + for i := 5d step 2d until h-5d : + fill p shifted (0,i) withcolor \MPcolor{color-2} ; + endfor + p := Page xysized(w/10,h) ; + for i = 0, .3, .6, .9 : + fill p shifted (i*w,0) withcolor \MPcolor{color-1} withtransparency(1,.75) ; + endfor ; + def do_it(expr sz, sh) = + p := Page xysized sz ; + fill p shifted sh withcolor \MPcolor{color-3} withtransparency(1,.5) ; + draw q xysized (bbwidth(p),bbheight(p)) shifted sh ; + enddef ; + if true : + do_it ((2w/10,17d),(.1w,20d)) ; + do_it ((2w/10,15d),(.1w,56d)) ; + do_it ((2w/10,21d),(.4w,66d)) ; + do_it ((2w/10,13d),(.7w,38d)) ; + do_it ((5w/10,13d),(.4w,13d)) ; + draw textext.urt("\ssbf Hans Hagen") + xysized (5w/10,5d) + shifted (.4w,6d) + withcolor \MPcolor{color-5} ; + else : + do_it ((2w/10,17d),(.1w,15d)) ; + do_it ((2w/10,15d),(.1w,51d)) ; + do_it ((2w/10,21d),(.4w,61d)) ; + do_it ((2w/10,13d),(.7w,31d)) ; + do_it ((5w/10,13d),(.4w, 7d)) ; + fi ; +StopPage ; +\stopMPpage + +\page[empty] \setuppagenumber[number=1] + +\setupbackgrounds + [page] + [background=page] + +\starttitle[title=Contents] + + \placelist[chapter] + +\stoptitle + +\startchapter[title=Introduction] + +This manual introduces {\em column sets}, one of the output routines of \CONTEXT. +Although column sets are mainly meant for typesetting journals in a +semi||automated way, you can also use them for books. We assume that the user is +familiar with \CONTEXT\ and only discuss the commands that are related to column +sets. + +This mechanism performs okay but it needs to be used with care: an occasional +manual intervention is needed to get optimal results. After all, we're operating +in the area where normally click and point desktop publishing is used. + +{\bf For the moment you need to load the new code with: \type{\usemodule[newcolumnsets]}} + +\startlines +Hans Hagen +PRAGMA ADE +Hasselt, 2003\endash2016 +\stoplines + +\stopchapter + +\startchapter[title=Basics] + +As soon as enough content is collected to build a page, \TEX\ will invoke the +output routine. This is not a fixed piece of code, but a collection of macro +calls. The default output routine is a meant for typesetting a single column, as +in this document. A multi||column output routine is available as well. This +routine mixes well with the single column one, and is activated by: + +\starttyping +\startcolumns +some text ... +\stopcolumns +\stoptyping + +In \MKIV\ a new mixed column mechanism has been introduced that will be +developped further and eventually replace the old multi column handler. In \MKII\ +there is also a columnset mechanism that can be used to construct complex multi +column pages. In \MKIV\ this gets replaced by grid columns. All these multi +column mechanisms have in common that the output routine is more complex because +now a page is in fact a collection of pages wrapped onto one. Each column is +(from \TEX's perspective) similar to a one narrow column page. Here we focus on +columnsets (page grids). + +There are some limitations to what you can do with this kind of multi columns, +which is why we have a third routine at out disposal: {\em column sets}. This +routine can be used for rather complex layouts with graphics all over the place, +and text spanning columns or even spreads. There are of course some shortcomings, +which we will discuss later. + +In the examples that follow we use the following style to set up the layout. The +number in the margin serves a reference to the file where this snippet of \TEX\ +is stored. + +\ShowEnvironmentFile{columnsets-000} + +\page[mine] + +Before we will demonstrate more complex layouts, we will introduce a few +features. In the next series of examples we use fake text. You can enlarge the +pages in your viewer if you want to see more detail. + +\FourSpread{columnsets-001} + +These pages were typeset with the following code: + +\ShowFile{columnsets-001} + +We will showmost examples on a spread, so we don't show a first page. On a +spread like above we number columns from~1 to~4, which in practice means that in +this case columns starting on right page start with column~3! + +\SixPages{columnsets-001} + +\page[mine] + +The number of columns is not fixed to two. You can even have a different number +of columns on left and right pages. + +\FourSpread{columnsets-002} + +This time the input is: + +\ShowFile{columnsets-002} + +Again, we started on a right page but showed the spreads. You can see it from the +positioning of the header texts. + +\SixPages{columnsets-002} + +\page[mine] + +In order to get the balancing you want, you can manually influence the height of +a column. + +\FourSpread{columnsets-003} + +When you set the number of column lines to a positive value, that will be the +number of lines. A negative value will be subtracted from the maximum number of +lines. + +\ShowFile{columnsets-003} + +\page[mine] + +In articles you may want to let the introduction span multiple columns. A column +span is defined independent of a column set and shows up as follows: + +\FourSpread{columnsets-004} + +Here we've given the span a background so that it stands out. + +\ShowFile{columnsets-004} + +\page[mine] + +A column span can be positioned like any graphic. Later we will discuss the +placement options in more detail, for the moment all you need to know is that +\type {btlr} tells \CONTEXT\ to place the graphic in the left bottom of the the +text area. + +\FourSpread{columnsets-005} + +Here we pass the \type {default} placement as parameter to the span, but you can +also set it at definition time. We use a brute force simple column splitter to +fake columns inside the span. + +\ShowFile{columnsets-005} + +\page[mine] + +You are not limited to one column span. In this sense a span is like a graphic: +as long as there is room, it will be placed where you want it to be placed. The +main difference between a span and a graphic is that a span expects text and +tries to align the baselines with the rest of the text. In many ways a column +span behaves like a framed text. + +\FourSpread{columnsets-006} + +This time we flushed one of the spans from bottom to top, starting at the right +edge: \type {btrl}. + +\ShowFile{columnsets-006} + +\page[mine] + +Column spans are treated like graphics, which means that they will float if +needed. In the process, the width is limited to the available space, which in +some cases may lead to a smaller span than you may expect. Think of a column +span, calculated (and prepared) in the last column and ending up on the next page +in the first column, where a broader span would have been possible. + +\FourSpread{columnsets-007} + +\ShowFile{columnsets-007} + +\stopchapter + +\startchapter[title=Graphics] + +Most documents have graphics, and therefore column sets can contain them. The +main thing that you have to keep in mind when placing graphics, is that column +sets are based on grids. Therefore spacing around graphics is also grid based. + +\FourSpread{columnsets-101} + +\ShowFile{columnsets-101} + +\page[mine] + +You can tell \CONTEXT\ where it should place the graphic, but this will only be +honored when there is still place. + +\EightSpread{columnsets-102} + +The prefered location is passed as a four character directive: + +\ShowFile{columnsets-102} + +\page[mine] + +The following directives are available: + +\starttabulate[|lT|p|] +\NC btlr \NC flush from bottom to top and left to right \NC \NR +\NC btrl \NC flush from bottom to top and right to left \NC \NR +\NC tblr \NC flush from top to bottom and left to right \NC \NR +\NC tbrl \NC flush from top to bottom and right to left \NC \NR +\NC lrbt \NC flush from left to right and bottom to top \NC \NR +\NC lrtb \NC flush from left to right and top to bottom \NC \NR +\NC rlbt \NC flush from right to left and bottom to top \NC \NR +\NC rltb \NC flush from right to left and top to bottom \NC \NR +\NC here \NC try to place the graphic here \NC \NR +\NC fixd \NC force the graphic here and don't float \NC \NR +\NC fxtb:c*r \NC place the graphic at (c,r) or lower if needed \NC \NR +\NC fxbt:c*r \NC place the graphic at (c,r) or higher if needed \NC \NR +\NC tops \NC place the graphic at the top of the page \NC \NR +\NC bots \NC place the graphic at the bottom of the page \NC \NR +\NC page \NC place the graphic at a separate page \NC \NR +\stoptabulate + +In the next example we show the directional locations: + +\OneSpread{columnsets-103} + +\ShowFile{columnsets-103} + +\stopchapter + +\startchapter[title=Areas] + +So far we have seen texts and graphics that span multiple columns using span +commands and floats placement commands. We have also seen that you can define a +different number of columns for left and right pages. Now that we have arrives at +column areas you will see how we can span information over not only a page but +also over pages in a spread. + +\FourSpread{columnsets-201} + +Being a framed text, by default an area is aligned at the baseline. You can lower +an area by setting the \type {location} to \type {depth}. + +\ShowFile{columnsets-201} + +\page[mine] + +You can position areas on the left, right or next page or on both pages. When you +set \type {state} to \type {repeat}, an area is repeated, otherwise it is only +placed once. + +\FourSpread{columnsets-202} + +Here we just repeat the areas. Normally this only make sense when the content is +worth repeating. + +\ShowFile{columnsets-202} + +\page[mine] + +Areas can span a spread, as is demonstrated in the next example. + +\FourSpread{columnsets-203} + +\ShowFile{columnsets-203} + +\page[mine] + +An application of a spread area is a title. In the next example we show two +spread pages. + +\FourSpread{columnsets-204} + +Watch how we explicitly go to a left page. + +\ShowFile{columnsets-204} + +\page[mine] + +The \type {\GapText} macro is an experimental fun macro and is used to make sure +that we don't end up with a clipped character. + +\startlinecorrection[blank] +\startcombination + {\scale[width=.4\textwidth]{\clip + [nx=2,ny=6,x=2,y=2] + {\typesetfile[columnsets-204.tex][page=2]}}} + {left page} + {\scale[width=.4\textwidth]{\clip + [nx=2,ny=6,x=1,y=2] + {\typesetfile[columnsets-204.tex][page=3]}}} + {right page} +\stopcombination +\stoplinecorrection + +This is a typical example of the kind of optimizations that are needed when you +make documents of styles with text that spans a spread. In the next clip we +visualize the gap. + +\startlinecorrection[blank] +\startcombination + {\scale[width=.4\textwidth]{\clip + [nx=2,ny=6,x=2,y=2] + {\typesetfile[columnsets-205.tex][page=2]}}} + {left page} + {\scale[width=.4\textwidth]{\clip + [nx=2,ny=6,x=1,y=2] + {\typesetfile[columnsets-205.tex][page=3]}}} + {right page} +\stopcombination +\stoplinecorrection + +At some moment you may want to set up an area in advance as we have done in the +following example. + +\FourSpread{columnsets-206} + +The \type {page} key is used to specify the page in the column set that the area +should go into. Column set pages start numbering at~1. The \type {fixed} stands +for left or right, whatever comes first. + +\ShowFile{columnsets-206} + +\stopchapter + +\startchapter[title=Columns] + +You can use \type {\page} to go to a new page in a column set. Likewise you can +use \type {\column} to force a column break. + +\FourPages{columnsets-301} + +This example demonstrates that you can supply \type {\column} with explicit +directives. + +\ShowFile{columnsets-301} + +You can use \type {\column[page]} as an alternative for \type {\page}. + +\stopchapter + +\startchapter[title=Details] + +This chapter will cover a couple of cosmetic details of column sets. {\em Some +features need to be improved, especially in combination with areas, graphics and +alike. We will also provide side floats etc.} + +\FourSpread{columnsets-401} + +You can set the distance between columns for each pair of columns. {\em Todo: +left and right page distances and margins.} + +\ShowFile{columnsets-401} + +\page[mine] + +When you can the distance of the first column as well. This creates a margin. + +\FourSpread{columnsets-402} + +This time we used equal distances: + +\ShowFile{columnsets-402} + +\page[mine] + +The width of columns is normally calculated automatically, but you can also set +the width explicitly: + +\FourSpread{columnsets-403} + +In code: + +\ShowFile{columnsets-403} + +\page[mine] + +For special effects, you can set the width per column. In that case you need to +be aware of the fact that \TEX\ works its way through the document per paragraph. +Changing the width halfway a paragraph is possible but will affect the whole +paragraph. Therefore, this feature works best when you also goto the next column +explicitly. + +\FourSpread{columnsets-404} + +In code: + +\ShowFile{columnsets-404} + +\page[mine] + +If you really want to change the width in the middle of a paragraph, you can do a +trial run and include a breakpoint at the palce where you want it to occur: + +\FourSpread{columnsets-405} + +In the second spread you see how the narrow hsize carries on in the wider +column. A \type {\column} command will synchronize the hsize. + +\ShowFile{columnsets-405} + +% \page[mine] + +\stopchapter + +\startchapter[title=Directions] + +\FourSpread{columnsets-601} + +The direction of flushing columns is determined by the \type {direction} +parameters as demonstrated below. + +\ShowFile{columnsets-601} + +% \page[mine] + +\stopchapter + +\startchapter[title=Backgrounds] + +As with many \CONTEXT\ components, column sets can have backgrounds. + +\FourSpread{columnsets-701} + +Watch how we use the \type {each} keyword to tell \CONTEXT\ that we want to apply +the background to each column of the set. + +\ShowFile{columnsets-701} + +\page[mine] + +Normally, if you apply backgrounds this way, you will also set the background +offset. In a similar fashion you can apply backgrounds to areas and spans. Such +backgrounds can be a color, or any overlay or layer you want. + +\FourSpread{columnsets-702} + +Here we've set the background offset as well as the frame. + +\ShowFile{columnsets-702} + +\page[mine] + +When dealing with areas, you need to be aware of the fact that they are clipped, +the content as well as the background. + +\FourSpread{columnsets-703} + +De default clip offset is two times the lineheight, except in the binding, where +it is set to zero points. You can set the clip offset with the \type {clipoffset} +parameter. + +\ShowFile{columnsets-703} + +\page[mine] + +The text background mechanism is rather well adapted to column sets. The +following example is a variant on an example shown in the manual titled +{details}. + +\EightSpread{columnsets-704} + +Watch how we adapt the background to the fact and extent that the text spans one +or more columns. + +\ShowFile{columnsets-704} + +Backgrounds that follow the paragraph shape also work ok in column sets. + +{\em todo: an example of a bleeding graphic with column feed back (from +techniek)} + +% \page[mine] + +\stopchapter + +\startchapter[title=Numbering lines] + +\FourSpread{columnsets-901} + +This example shows how numbering lines in columns works out. In a two column +layout the numbers end up in the outer margins by default. If you want you can +set the \type {location} to for instance \type {left} or \type {right}. + +\ShowFile{columnsets-901} + +\page[mine] + +\FourSpread{columnsets-902} + +In a three column setup the numbers end up in the left margins.Make sure you make +the distance large enough. + +\ShowFile{columnsets-902} + +% \page[mine] +% +% \FourSpread{columnsets-903} +% +% This example shows again lune numbers but here we made sure that there is no +% stretch in the whitespace. +% +% \ShowFile{columnsets-903} + +\stopchapter + +% \startchapter[title=Spanning and More] +% +% {\em todo: explanation} \page +% +% \TwoPages{columnsets-801} \ShowFile{columnsets-801} \page[mine] +% \TwoPages{columnsets-802} \ShowFile{columnsets-802} \page[mine] +% \TwoPages{columnsets-803} \ShowFile{columnsets-803} \page[mine] +% \TwoPages{columnsets-804} \ShowFile{columnsets-804} \page[mine] +% \TwoPages{columnsets-805} \ShowFile{columnsets-805} \page[mine] +% \TwoPages{columnsets-806} \ShowFile{columnsets-806} \page[mine] +% +% \stopchapter + +\stopdocument diff --git a/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex b/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex new file mode 100644 index 000000000..b4b979874 --- /dev/null +++ b/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex @@ -0,0 +1,43 @@ + +% \usemodule[luacalls] + +\usemodule[mathml] + +\setupexternalfigures + [location=default] + +\setupbackend + [export=yes] + +\setupexport + [svgstyle=mathtest-style, + hyphen=yes, + width=60em] + +\setupbodyfont[pagella] + +\definefloat[graphic][graphics][figure] + +% \environment [mathtest-style] + +\starttext + + \startsection[title=First] + + \startitemize + \startitem one \stopitem + \startitem two \stopitem + \stopitemize + + \startplacefigure[title=First] + \externalfigure[cow.pdf] + \stopplacefigure + + \startplacegraphic[title=Second] + \externalfigure[cow.pdf] + \stopplacegraphic + + some math: \m{e=mc^2} + + \stopsection +\stoptext diff --git a/doc/context/sources/general/manuals/epub/epub-mkiv.tex b/doc/context/sources/general/manuals/epub/epub-mkiv.tex new file mode 100644 index 000000000..6fc4ed9d4 --- /dev/null +++ b/doc/context/sources/general/manuals/epub/epub-mkiv.tex @@ -0,0 +1,466 @@ +% language=uk + +% todo: +% +% metadata +% properties +% \dontleavehmode before hbox +% cover page +% +% http://www.cnet.com/news/google-subtracts-mathml-from-chrome-and-anger-multiplies/ + +% \usemodule[luacalls] + +\usemodule[art-01,abr-02] + +\definehighlight[notabene][style=bold] + +\definecolor[darkorange] [.70(green,red)] +\definecolor[lightorange][.45(orange,white)] +\definecolor[lesswhite] [.90(white)] + +\setuptyping[color=darkorange] +\setuptype [color=darkorange] + +\starttext + +\startMPpage + +numeric w ; w := 21cm ; +numeric h ; h := 29.7cm ; +numeric ww ; ww := 9w/10 ; +numeric oo ; oo := (w-ww) / 2 ; +numeric hh ; hh := h/5.5 ; +path p ; p := unitsquare xysized(w,h) ; + +color orange ; orange := \MPcolor{darkorange} ; % .7[green,red] ; + +fill p enlarged 2mm withcolor orange ; + +draw image ( + draw anchored.top( + textext("\ttbf\setupinterlinespace[line=1.7ex]\framed[frame=off,align=middle,offset=0mm]{\smash{<div/>}\\\smash{<div >}\\\smash{</div>}}") + xsized w, + center topboundary p shifted (0,-12mm)) withcolor \MPcolor{lightorange} ; % 0.45[white,orange] ; + draw anchored.bot( + textext("\ssbf\setupinterlinespace[line=2.2ex]\framed[frame=off,align=middle]{exporting\\xml and epub\\from context}") + xsized w, + center bottomboundary p shifted (0,4mm)) withcolor \MPcolor {lesswhite} ; % 0.90white ; +) ; + +setbounds currentpicture to p ; + +\stopMPpage + +\startsection[title=Introduction] + +There is a pretty long tradition of typesetting math with \TEX\ and it looks like +this program will dominate for many more years. Even if we move to the web, the +simple fact that support for \MATHML\ in some browsers is suboptimal will drive +those who want a quality document to use \PDF\ instead. + +I'm writing this in 2014, at a time when \XML\ is widespread. The idea of \XML\ is +that you code your data in a very structured way, so that it can be manipulated and +(if needed) validated. Text has always been a target for \XML\ which is a follow|-|up +to \SGML\ that was in use by publishers. Because \HTML\ is less structured (and also +quite tolerant with respect to end tags) we prefer to use \XHTML\ but unfortunately +support for that is less widespread. + +Interestingly, documents are probably among the more complex targets of the +\XML\ format. The reason is that unless the author restricts him|/|herself or +gets restricted by the publisher, tag abuse can happen. At \PRAGMA\ we mostly +deal with education|-|related \XML\ and it's not always easy to come up with +something that suits the specific needs of the educational concept behind a +school method. Even if we start out nice and clean, eventually we end up with a +polluted source, often with additional structure needed to satisfy the tools used +for conversion. + +We have been supporting \XML\ from the day it showed up and most of our projects +involve \XML\ in one way or the other. That doesn't mean that we don't use \TEX\ +for coding documents. This manual is for instance a regular \TEX\ document. In +many ways a structured \TEX\ document is much more convenient to edit, especially +if one wants to add a personal touch and do some local page make|-|up. On the other hand, +diverting from standard structure commands makes the document less suitable for +output other than \PDF. There is simply no final solution for coding a document, +it's mostly a matter of taste. + +So we have a dilemma: if we want to have multiple output, frozen \PDF\ as well as +less-controlled \HTML\ output, we can best code in \XML, but when we want to code +comfortably we'd like to use \TEX. There are other ways, like Markdown, that can +be converted to intermediate formats like \TEX, but that is only suitable for +simple documents: the more advanced documents get, the more one has to escape +from the boundaries of (any) document encoding, and then often \TEX\ is not a bad +choice. There is a good reason why \TEX\ survived for so long. + +It is for this reason that in \CONTEXT\ \MKIV\ we can export the content in a +reasonable structured way to \XML. Of course we assume a structured document. It +started out as an experiment because it was relatively easy to implement, and it +is now an integral component. + +\stopsection + +\startsection[title=The output] + +The regular output is an \XML\ file but as we have some more related data it gets +organized in a tree. We also export a few variants. An example is given below: + +\starttyping +./test-export +./test-export/images +./test-export/images/... +./test-export/styles +./test-export/styles/test-defaults.css +./test-export/styles/test-images.css +./test-export/styles/test-styles.css +./test-export/styles/test-templates.css +./test-export/test-raw.xml +./test-export/test-raw.lua +./test-export/test-tag.xhtml +./test-export/test-div.xhtml +\stoptyping + +Say that we have this input: + +\starttyping +\setupbackend + [export=yes] + +\starttext + \startsection[title=First] + \startitemize + \startitem one \stopitem + \startitem two \stopitem + \stopitemize + \stopsection +\stoptext +\stoptyping + +The main export ends up in the \type {test-raw.xml} export file and looks like +the following (we leave out the preamble and style references): + +\starttyping +<document> <!-- with some attributes --> + <section detail="section" chain="section" level="3"> + <sectionnumber>1</sectionnumber> + <sectiontitle>First</sectiontitle> + <sectioncontent> + <itemgroup detail="itemize" chain="itemize" symbol="1" level="1"> + <item> + <itemtag><m:math ..><m:mo>•</m:mo></m:math></itemtag> + <itemcontent>one</itemcontent> + </item> + <item> + <itemtag><m:math ..><m:mo>•</m:mo></m:math></itemtag> + <itemcontent>two</itemcontent> + </item> + </itemgroup> + </sectioncontent> + </section> +</document> +\stoptyping + +This file refers to the stylesheets and therefore renders quite well in a browser +like Firefox that can handle \XHTML\ with arbitrary tags. + +The \type {detail} attribute tells us what instance of the element is used. +Normally the \type {chain} attribute is the same but it can have more values. +For instance, if we have: + +\starttyping +\definefloat[graphic][graphics][figure] + +..... + +\startplacefigure[title=First] + \externalfigure[cow.pdf] +\stopplacefigure + +..... + +\startplacegraphic[title=Second] + \externalfigure[cow.pdf] +\stopplacegraphic +\stoptyping + +we get this: + +\starttyping +<float detail="figure" chain="figure"> + <floatcontent>...</floatcontent> + <floatcaption>...</floatcaption> +</float> +<float detail="graphic" chain="figure graphic"> + <floatcontent>...</floatcontent> + <floatcaption>...</floatcaption> +</float> +\stoptyping + +This makes it possible to style specific categories of floats by using a +(combination of) \type {detail} and|/|or \type {chain} as filters. + +The body of the \type {test-tag.xhtml} file looks similar but it is slightly more +tuned for viewing. For instance, hyperlinks are converted to a way that \CSS\ and +browsers like more. Keep in mind that the raw file can be the base for conversion +to other formats, so that one stays closest to the original structure. + +The \type {test-div.xhtml} file is even more tuned for viewing in browsers as it +completely does away with specific tags. We explicitly don't map onto native +\HTML\ elements because that would make everything look messy and horrible, if only +because there seldom is a relation between those elements and the original. One +can always transform one of the export formats to pure \HTML\ tags if needed. + +\starttyping +<body> + <div class="document"> + <div class="section" id="aut-1"> + <div class="sectionnumber">1</div> + <div class="sectiontitle">First</div> + <div class="sectioncontent"> + <div class="itemgroup itemize symbol-1"> + <div class="item"> + <div class="itemtag"><m:math ...><m:mo>•</m:mo></m:math></div> + <div class="itemcontent">one</div> + </div> + <div class="item"> + <div class="itemtag"><m:math ...><m:mo>•</m:mo></m:math></div> + <div class="itemcontent">two</div> + </div> + </div> + <div class="float figure"> + <div class="floatcontent">...</div></div> + <div class="floatcaption">...></div> + </div> + <div class="float figure graphic"> + <div class="floatcontent">...</div></div> + <div class="floatcaption">...></div> + </div> + </div> + </div> +</body> +\stoptyping + +The default \CSS\ file can deal with tags as well as classes. The file +of additional styles contains definitions of so|-|called highlights. In the \CONTEXT\ source +one is better off using explicit named highlights instead of local font and color +switches because these properties are then exported to the \CSS. The images style +defines all images used. The templates file lists all the elements used and can +be used as a starting point for additional \CSS\ styling. + +Keep in mind that the export is \notabene{not} meant as a one|-|to|-|one visual +representation. It represents structure so that it can be converted to whatever +you like. + +In order to get an export you must start your document with: + +\starttyping +\setupbackend + [export=yes] +\stoptyping + +So, we trigger a specific (extra) backend. In addition you can set up the export: + +\starttyping +\setupexport + [svgstyle=test-basic-style.tex, + cssfile=test-extras.css, + hyphen=yes, + width=60em] +\stoptyping + +The \type {hyphen} option will also export hyphenation information so that the +text can be nicely justified. The \type {svgstyle} option can be used to specify +a file where math is set up; normally this would only contain a \type{bodyfont} setup, +and this option is only needed if you want to create an \EPUB\ file afterwards which +has math represented as \SVG. + +The value of \type {cssfile} ends up as a style reference in the exported files. +You can also pass a comma|-|separated list of names (between curly braces). These +entries come after those of the automatically generated \CSS\ files so you need +to be aware of default properties. + +\stopsection + +\startsection[title=Images] + +Inclusion of images is done in an indirect way. Each image gets an entry in a +special image related stylesheet and then gets referred to by \type {id}. Some +extra information is written to a status file so that the script that creates +\EPUB\ files can deal with the right conversion, for instance from \PDF\ to \SVG. +Because we can refer to specific pages in a \PDF\ file, this subsystem deals with +that too. Images are expected to be in an \type {images} subdirectory and because in \CSS\ +the references are relative to the path where the stylesheet resides, we use +\type {../images} instead. If you do some postprocessing on the files or relocate +them you need to keep in mind that you might have to change these paths in the +image|-|related \CSS\ file. + +\stopsection + +\startsection[title=Epub files] + +At the end of a run with exporting enabled you will get a message to the console that +tells you how to generate an \EPUB\ file. For instance: + +\starttyping +mtxrun --script epub --make --purge test +\stoptyping + +This will create a tree with the following organization: + +\starttyping +./test-epub +./test-epub/META-INF +./test-epub/META-INF/container.xml +./test-epub/OEBPS +./test-epub/OEBPS/content.opf +./test-epub/OEBPS/toc.ncx +./test-epub/OEBPS/nav.xhtml +./test-epub/OEBPS/cover.xhtml +./test-epub/OEBPS/test-div.xhtml +./test-epub/OEBPS/images +./test-epub/OEBPS/images/... +./test-epub/styles +./test-epub/styles/test-defaults.css +./test-epub/styles/test-images.css +./test-epub/styles/test-styles.css +./test-epub/mimetype +\stoptyping + +Images will be moved to this tree as well and if needed they will be converted, +for instance into \SVG. Converted \PDF\ files can have a \typ {page-<number>} in +their name when a specific page has been used. + +You can pass the option \type {--svgmath} in which case math will be converted to +\SVG. The main reason for this feature is that we found out that \MATHML\ support +in browsers is not currently as widespread as might be expected. The best bet is Firefox which +natively supports it. The Chrome browser had it for a while but it got dropped +and math is now delegated to \JAVASCRIPT\ and friends. In Internet Explorer +\MATHML\ should work (but I need to test that again). + +This conversion mechanism is +kind of interesting: one enters \TEX\ math, then gets \MATHML\ in the export, and +that gets rendered by \TEX\ again, but now as a standalone snippet that then gets +converted to \SVG\ and embedded in the result. + +\stopsection + +\startsection[title=Styles] + +One can argue that we should use native \HTML\ elements but since we don't have a nice +guaranteed|-|consistent mapping onto that, it makes no sense to do so. Instead, we +rely on either explicit tags with details and chains or divisions with classes +that combine the tag, detail and chain. The tagged variant has some more +attributes and those that use a fixed set of values become classes in the +division variant. Also, once we start going the (for instance) \type {H1}, \type +{H2}, etc.\ route we're lost when we have more levels than that or use a +different structure. If an \type {H3} can reflect several levels it makes no +sense to use it. The same is true for other tags: if a list is not really a list +than tagging it with \type {LI} is counterproductive. We're often dealing with +very complex documents so basic \HTML\ tagging becomes rather meaningless. + +If you look at the division variant (this is used for \EPUB\ too) you will notice +that there are no empty elements but \type {div} blocks with a comment as content. +This is needed because otherwise they get ignored, which for instance makes table +cells invisible. + +The relation between \type {detail} and \type {chain} (reflected in \type {class}) +can best be seen from the next example. + +\starttyping +\definefloat[myfloata] +\definefloat[myfloatb][myfloatbs][figure] +\definefloat[myfloatc][myfloatcs][myfloatb] +\stoptyping + +This creates two new float instances. The first inherits from the main float +settings, but can have its own properties. The second example inherits from +the \type {figure} so in fact it is part of a chain. The third one has a longer +chain. + +\starttyping +<float detail="myfloata">...</float> +<float detail="myfloatb" chain="figure">...</float> +<float detail="myfloatc" chain="figure myfloatb">...</float> +\stoptyping + +In a \CSS\ style you can now configure tags, details, and chains as well as +classes (we show only a few possibilities). Here, the \CSS\ element on the +first line of each pair is invoked by the \CSS\ selector on the second line. + +\starttyping +div.float.myfloata { } float[detail='myfloata'] { } +div.float.myfloatb { } float[detail='myfloatb'] { } +div.float.figure { } float[detail='figure'] { } +div.float.figure.myfloatb { } float[chain~='figure'][detail='myfloata'] { } +div.myfloata { } *[detail='myfloata'] { } +div.myfloatb { } *[detail='myfloatb'] { } +div.figure { } *[chain~='figure'] { } +div.figure.myfloatb { } *[chain~='figure'][detail='myfloatb'] { } +\stoptyping + +The default styles cover some basics but if you're serious about the export +or want to use \EPUB\ then it makes sense to overload some of it and|/|or +provide additional styling. You can find plenty about \CSS\ and its options +on the Internet. + +\stopsection + +\startsection[title=Coding] + +The default output reflects the structure present in the document. If that is not +enough you can add your own structure, as in: + +\starttyping +\startelement[question] +Is this right? +\stopelement +\stoptyping + +You can also pass attributes: + +\starttyping +\startelement[question][level=difficult] +Is this right? +\stopelement +\stoptyping + +But these will be exported only when you also say: + +\starttyping +\setupexport + [properties=yes] +\stoptyping + +You can create a namespace. The following will generate attributes +like \type {my-level}. + +\starttyping +\setupexport + [properties=my-] +\stoptyping + +In most cases it makes more sense to use highlights: + +\starttyping +\definehighlight + [important] + [style=bold] +\stoptyping + +This has the advantage that the style and color are exported to a special +\CSS\ file. + +Headers, footers, and other content that is part of the page builder are not +exported. If your document has cover pages you might want to hide them too. The +same is true when you create special chapter title rendering with a side +effect that content ends up in the page stream. If something shows up that you +don't want, you can wrap it in an \type {ignore} element: + +\starttyping +\startelement[ignore] +Don't export this. +\stopelement +\stoptyping + +\stopsection + +\stoptext diff --git a/doc/context/sources/general/manuals/languages/languages-appendix.tex b/doc/context/sources/general/manuals/languages/languages-appendix.tex new file mode 100644 index 000000000..d8f33e44a --- /dev/null +++ b/doc/context/sources/general/manuals/languages/languages-appendix.tex @@ -0,0 +1,48 @@ +% language=uk + +\startcomponent languages-appendix + +\environment languages-environment + +\startchapter[title=Appendix][color=darkgray] + +\startsection[title=The language files] + + Todo. + +\stopsection + +\startsection[title=The \type {mtx-patterns} script] + + Todo. + +\stopsection + +\startsection[title=Installed sorters] + +\startbuffer +\usemodule[s-languages-sorting] + +\showinstalledsorting +\stopbuffer + +\typebuffer \blank[2*line] \getbuffer + +\stopsection + +\startsection[title=Verbose counters] + +\startbuffer +\usemodule[s-languages-counters] + +\showverbosecounters[language={en,es}] +\stopbuffer + +\typebuffer \blank[2*line] \getbuffer + +\stopsection + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/languages/languages-basics.tex b/doc/context/sources/general/manuals/languages/languages-basics.tex new file mode 100644 index 000000000..840897096 --- /dev/null +++ b/doc/context/sources/general/manuals/languages/languages-basics.tex @@ -0,0 +1,348 @@ +% language=uk + +\startcomponent languages-basics + +\environment languages-environment + +\startchapter[title=Some basics][color=darkyellow] + +\startsection[title={Introduction}] + +In this chapter we will see how we can toggle between languages. A first +introduction to patterns will be given. Some details of how to control the +hyphenation with specific patterns will be given in a later chapter. + +\stopsection + +\startsection[title={Available languages}] + +When you use the English version of \CONTEXT\ you will default to US English as +main language. This means that hyphenation will be US specific, which by the way +is different from the rules in GB. All labels that are generated by the system +are also in English. Languages can often be accessed by names like \type +{english} or \type {dutch} although it is quite common to use the short tags like +\type {en} and \type {nl}. Because we want to be as compatible as possible with +\MKII, there are quite some synonyms. The following table lists the languages that +for which support is built|-|in.\footnote {More languages can be defined. It is +up to users to provide the information.} + +\startbuffer +\usemodule[languages-system] + +\loadinstalledlanguages +\showinstalledlanguages +\stopbuffer + +\getbuffer + +You can call up such a table with the following commands: + +\typebuffer + +Instead you can run \type {context --global languages-system.mkiv}. + +As you can see, many languages have hyphenation patterns but for Japanese, +Korean, Chinese as well as Arabic languages they make no sense. The patterns are +loaded on demand. The number is the internal number that is used in the engine; a +user never has to use that number. Numbers $<1$ are used to disable hyphenation. +The file tag is used to locate and load a specification. Such files have names +like type {lang-nl.lua}. + +Some languages share the same hyphenation patterns but can have demands that +differ, like labels or quotes. The characters shown in the table are those found +in the pattern files. The number of patterns differs a lot between languages. +This relates to the systematic behind them. Some languages use word stems, others +base their hyphenation on syllables. Some language have inflections which adds to +the complexity while others can combine words in ways that demand special care +for word boundaries. Of course a low or high number can signal a low quality as +well, but most pattern collections are assembled over many years and updated when +for instance spelling rules change. I think that we can safely say that most patterns +are quite stable and of good quality. + +\stopsection + +\startsection[title=Switching] + +The document language is set with + +\starttyping +\mainlanguage[en] +\stoptyping + +but when you want to apply the proper hyphenation rules to an embedded language +you can use: + +\starttyping +\language[en] +\stoptyping + +or just: + +\starttyping +\en +\stoptyping + +The main language determines what labels show up, how numbering happens, in what +way dates get formatted, etc. Normally the \typ {\mainlanguage} command comes +before the \typ {\starttext} command. + +\stopsection + +\startsection[title=Hyphenation] + +In \LUATEX\ each character that gets typeset not only carries a font id and character +code, but also a language number. You can switch language whenever you want and +the change will be carried with the characters. Switching within a word doesn't make +sense but it is permitted: + +\starttabulate[|||T|] +\NC 1 \NC \type{\de incrediblykompliziert} \NC \hyphenatedword{\de incrediblykompliziert} \NC \NR +\NC 2 \NC \type{\en incrediblykompliziert} \NC \hyphenatedword{\en incrediblykompliziert} \NC \NR +\NC 3 \NC \type{\en incredibly\de kompliziert} \NC \hyphenatedword{\en incredibly\de kompliziert} \NC \NR +\NC 4 \NC \type{\en incredibly\de\-kompliziert} \NC \hyphenatedword{\en incredibly\de\-kompliziert} \NC \NR +\NC 5 \NC \type{\en incredibly\de-kompliziert} \NC \hyphenatedword{\en incredibly\de-kompliziert} \NC \NR +\stoptabulate + +In the line 4 we have a \type {\-} between the two words, and in the last +line just a \type {-}. If you look closely you will notice that the snippets +can be quite small. If we typeset a word with a 1mm text width we get this: + +\blank \start \en \hsize 1mm incredibly \par \stop \blank + +If you are familiar with the details of hyphenation, you know that the number of +characters at the end and beginning of a word is controlled by the two variables +\typ {\lefthyphenmin} and \typ {\righthyphenmin}. However, these only influence +the hyphenation process. What bits and pieces eventually end up on a line is +determined by the par builder and there the \type {\hsize} matters. In practice +you will not run into these situations, unless you have extreme long words and a +narrow column. + +Hyphenation normally is limited to regular characters that make up the alphabet of +a language. It is insensitive for capitalization as the following text shows: + +\blank + +\startnarrower +\hyphenatedword {This time the musical distraction while developing code came +from watching youtube performances of Cory Henry (also known from Snarky Puppy, +a conglomerate of excellent players). Just search the web for his name with \quote +{Stevie Wonder and Michael Jackson Tribute}. There is no keyboard he can't play. +Another interesting keyboard player is Sun Rai (a short name for Rai +Thistlethwayte, just google for \quote {The Beatles, Come Together, Live Piano +Acoustic with Loop Pedal}, or do a combined search with \quote {Matt +Chamberlain}. Okay, and talking of keyboards, let's not forget Vika Yermolyeva +(vkgoeswild) as she's one of a kind too on the web. And then there is Jacob +Collier, in one word: incredible (or hyphenated the Dutch way {\nl incredible}, +let me repeat that in French {\fr incredible}).} \footnote {Get me right, there +are of course many more fantastic musicians.} +\stopnarrower + +\blank + +Of course, names are often short and don't need to be hyphenated +(or the left and right settings prohibit it). Another complication with names is +that they can come from another language so we either need to switch language +temporarily or we need to add an exception (more about that later). + +\stopsection + +\startsection[title=Primitives] + +In traditional \TEX\ the language is not a property of a character but is +triggered by a signal in the (so called) list. Think of: + +\starttyping +<language 1>this is <language 2>nederlands<language 1> mixed with english +\stoptyping + +This number is set by the primitive \typ {\language}. Language triggers are +injected into the list depending on the value of this number. There is also a \typ +{\setlanguage} primitive that can inject triggers without setting the \typ +{\language} number. Because in \LUATEX\ the state is kept with the character +you don't need to worry about the subtle differences here. + +In \CONTEXT\ the \typ {\language} and \typ {\setlanguage} commands are overloaded +by a more advanced switch macro. You cannot assume that they work as explained in +general manuals about \TEX. Currently you can still assign a number but that +might change. Just consider the language to be an abstraction and don't mess with +this number. Both commands not only change the current language but also do +specific initializations when needed. + +What characters get involved in hyhenation is historically determines by the so +called \type {\lccode} values. Each character can have such a value which maps +an uppercase to a lowercase character. This concept has been extended in \ETEX\ +where it binds to a pattern set (language). However, in \CONTEXT\ the user never +has to worry about such details. + +% The \type {\patterns} primitive is +% The \type {\hyphenation} primitive is + +In traditional hyphenation there will not be hyphenated if the sum of \typ +{\lefthyphenmin} and \typ {\righthyphenmin} exceeds 62. This limitation is not +present in the to be presented \LUA\ variant of this routine as there is no +good reason for this limitation other than implementation constraints. + +\stopsection + +\startsection[title=Control] + +We already mentioned \typ {\lefthyphenmin} and \typ {\righthyphenmin}. These +two variables control the area in a word that is subjected to hyphenation. +Setting these values is a matter of taste but making them too small can result in +bad hyphenation when the patterns are made with the assumptions that certain +minima are used. Using a \typ {\lefthyphenmin} of 2 while the patterns are made +with a value of 3 in mind is a bad idea. + +\startlinecorrection[blank] +\startluacode +context.bTABLE { option = "stretch", align= "middle" } + context.bTR() + context.bTD { ny = 2, align = "middle,lohi", style = "monobold" } + context.verbatim("\\lefthyphenmin") + context.eTD() + context.bTD { nx = 5, style = "monobold" } + context.verbatim("\\righthyphenmin") + context.eTD() + context.eTR() + context.bTR() + for right=1,5 do + context.bTD() + context.mono(right) + context.eTD() + end + context.eTR() + for left=1,5 do + context.bTR() + context.bTD() + context.mono(left) + context.eTD() + for right=1,5 do + context.bTD() + context("\\lefthyphenmin %s \\righthyphenmin %s \\hyphenatedword{interesting}",left,right) + context.eTD() + end + context.eTR() + end +context.eTABLE() +\stopluacode +\stoplinecorrection + +When \TEX\ breaks a paragraph into lines it will try do so without hyphenation. +When that fails (read: when the badness becomes too high) a next effort will take +hyphenation into account. \footnote {Because in \LUATEX\ we always hyphenate +there is no real gain in trying not to hyphenate. Because in traditional \TEX\ +hyphenation happens on the fly a pass without hyphenating makes more sense.} When +the badness is still too high, an optional emergency pass can be made but only +when the tolerances are set to permit this. In \CONTEXT\ you can try these +settings when you get too many over- or underfull boxes reported on the console. + +\starttyping +\setupalign[tolerant] +\setupalign[verytolerant] +\setupalign[verytolerant,stretch] +\stoptyping + +Personally I tend to use the last setting, especially in automated flows. After +all, \TEX\ will not apply stretch unless it's really needed. + +The two \typ {\*hyphenmin} parameters can be set any time and the current value +is stored with each character. They can also be set with the language which we +will see later. + +When \TEX\ hyphenates words it has to decide where a word starts and ends. In +traditional \TEX\ the words starts normally at a character that falls within the +scope of the hyphenator. It ends at when a box (hlist or vlist) is seen, but also +at a rule, discretionary, accent (forget about this in \CONTEXT) or math. An +example will be given in the chapter that discussed the \LUA\ alternative. + +\stopsection + +\startsection[title=Installing] + + todo + +\stopsection + +\startsection[title=Modes] + +Languages are one of the mechanisms where you can access the current state. There are +for instance two (official) macros that contain the current (main) language: + +\startbuffer +\starttabulate[||Tc|] +\HL +\NC \bf macro \NC \bf value \NC \NR +\HL +\NC \type {\currentmainlanguage} \NC \currentmainlanguage \NC \NR +\NC \type {\currentlanguage} \NC \currentlanguage \NC \NR +\HL +\stoptabulate +\stopbuffer + +\getbuffer + +When we have set \type {\language[nl]} we get this: + +\start \nl \getbuffer \stop + +If you write a style that needs to adapt to a language you can use modes. There +are several ways to do this: + +\startbuffer +\language[nl] + +\startmode[**en] + \color[darkred]{main english} +\stopmode + +\startmode[*en] + \color[darkred]{local english} +\stopmode + +\startmode[**nl] + \color[darkblue]{main dutch} +\stopmode + +\startmode[*nl] + \color[darkblue]{local dutch} +\stopmode + +\startmodeset + [*en] {\color[darkgreen]{english set}} + [*nl] {\color[darkgreen]{dutch set}} +\stopmodeset +\stopbuffer + +\typebuffer + +This typesets: + +\blank \startpacked \setupindenting[no] \getbuffer \stoppacked \blank + +When you use setups you can use the following trick: + +\startbuffer +\language[nl] + +\startsetups language:en + \color[darkorange]{something english} +\stopsetups + +\startsetups language:nl + \color[darkorange]{something dutch} +\stopsetups + +\setups[language:\currentlanguage] +\stopbuffer + +\typebuffer + +As expected we get: + +\blank \start \setupindenting[no] \getbuffer \stop \blank + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/languages/languages-environment.tex b/doc/context/sources/general/manuals/languages/languages-environment.tex new file mode 100644 index 000000000..2669fe0c5 --- /dev/null +++ b/doc/context/sources/general/manuals/languages/languages-environment.tex @@ -0,0 +1,15 @@ +\startenvironment languages-environment + + \environment manuals-explaining-environment + \environment manuals-explaining-cover + + \usemodule [s] [languages-hyphenation] + \usemodule [s] [languages-frequencies] + \usemodule [s] [languages-sorting] + \usemodule [s] [languages-counters] + \usemodule [s] [languages-system] + + \usemodule [s] [math-extensibles] + +\stopenvironment + diff --git a/doc/context/sources/general/manuals/languages/languages-goodies.tex b/doc/context/sources/general/manuals/languages/languages-goodies.tex new file mode 100644 index 000000000..32de54db3 --- /dev/null +++ b/doc/context/sources/general/manuals/languages/languages-goodies.tex @@ -0,0 +1,138 @@ +% language=uk + +\startcomponent languages-goodies + +\environment languages-environment + +\startchapter[title=Goodies][color=darkorange] + +\startsection[title=Introduction] + +There are some features that will only be used in rare cases. They were often +implemented as experiment but found useful enough to keep around. + +\stopsection + +\startsection[title=Spell checking] + +There are some means to check the spelling of words in your document but get it +right: \CONTEXT\ is not a spell|-|checker. These features were added in order to +be able to do some quick checking of documents written by multiple authors. There +are currently three options and we only show a simple examples. + +First you need to load word lists. These are either text files with just words +separated by spacing. + +\starttyping[color=maincolor] +foobar foo-bar foo=bar foo{}{}{}bar foo{}{}{bar} +\stoptyping + +All these words become \type {foobar} which means that one can use words with +discretionary specifications. A text list is loaded with: + +\startbuffer +\loadspellchecklist[en][t:/manuals/lua/words-en.txt] +\stopbuffer + +\typebuffer \getbuffer + +Instead you can load a \LUA\ file with words. Here we use the same structure that +we use for the spell checker provided for \SCITE: + +\starttyping[color=maincolor] +return { + max = 9, + min = 6, + n = 2, + words = { + ["barfoo"] = "Barfoo" + ["foobarred"] = "foobarred", + } +} +\stoptyping + +We use the same load command (you can also load bytecode files with suffix \type +{luc} this way): + +\startbuffer +\loadspellchecklist[nl][t:/scite/data/context/lexers/data/spell-nl.lua] +\stopbuffer + +\typebuffer \getbuffer + +Usage boils down to enabling the checker. If needed we can add more methods. The +first method colors the known and unknown colors. Words shorter then the +threshold of 4 will be skipped. + +\startbuffer +\setupspellchecking[state=start,method=1] +\en Is this written right or is this wromg?\par % m -> n error +\nl Is dit goed geschreven of niet?\par +\setupspellchecking[state=stop] +\stopbuffer + +\typebuffer \startpacked \getbuffer \stoppacked + +You can change the colors: + +\starttyping +\definecolor[word:yes] [g=.75] +\definecolor[word:no] [r=.75] +\stoptyping + +The second method doesn't show anything but produces a file \type +{jobname.words}) with used words. The \type {found} value of \type {list} is used +as key in the produced table. + +\startbuffer +\setupspellchecking[state=start,method=2,list=found] +\en Is this written right or is this wrong?\par +\nl Is dit goed geschreven of niet?\par +\setupspellchecking[state=stop] +\stopbuffer + +\typebuffer \startpacked \getbuffer \stoppacked + +The produced table is: + +\typefile{\jobname.words} + +The result can be traced with a module: + +\startbuffer +\usemodule[s-languages-words] + +\showwords +\stopbuffer + +\typebuffer + +This shows up as: + +\getbuffer + +The third mechanism colors languages differently. We only defined a few colors: + +\starttyping +\definecolor[word:en] [b=.75] +\definecolor[word:de] [r=.75] +\definecolor[word:nl] [g=.75] +\definecolor[word:unknown][r=.75,g=.75] +\stoptyping + +but you can of course define a color for your favourite language in a similar way. + +\startbuffer +\setupspellchecking[state=start,method=3] +\en Is this written right or is this wrong?\par +\nl Is dit goed geschreven of niet?\par +\setupspellchecking[state=stop] +\stopbuffer + +\typebuffer \startpacked \getbuffer \stoppacked + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/languages/languages-hyphenation.tex b/doc/context/sources/general/manuals/languages/languages-hyphenation.tex new file mode 100644 index 000000000..6698717be --- /dev/null +++ b/doc/context/sources/general/manuals/languages/languages-hyphenation.tex @@ -0,0 +1,876 @@ +% language=uk + +\startcomponent languages-hyphenation + +\environment languages-environment + +\startchapter[title=Hyphenation][color=darkmagenta] + +\startsection[title=How it works] + +Proper hyphenation is one of the strong points of \TEX. Hyphenation in \TEX\ is +done using so called hyphenation patterns. Making these patterns is an art +and most users (including me) happily use whatever is available. Patterns can be +created automatically using \type {patgen} but often manual tweaking is needed +too. A pattern looks as follows: + +\starttyping +pat1tern +\stoptyping + +This means as much as: you can split the word \type {pattern} in two pieces, with +a hyphen between the two \type {t}'s. Actually it will also split the word \type +{patterns} because the hyphenation mechanism looks at substrings. When no number +between characters in a pattern is given, a zero is assumed. This means as much +as {\em undefined}. An even number inhibits hyphenation, an odd number permits +it. The larger the number (weight), the more influence it has. A more restricted +pattern is: + +\starttyping +.pat1tern. +\stoptyping + +Here the periods set the word boundaries. The pattern dictionary for us +english has smaller patterns and the next trace shows how these are applied. + +\starthyphenation[traditional] +\showhyphenationtrace[en][pattern] +\stophyphenation + +The effective hyphenation of a word is determined by several factors: + +\startitemize[packed] +\startitem the current language, each language can have different patterns \stopitem +\startitem the characters, as some characters might block hyphenation \stopitem +\startitem the settings of \type {\lefthyphenmin} and \type {\righthyphenmin} \stopitem +\stopitemize + +A place where a word can be hyphenated is called a discretionary. When \TEX\ +analyzes a stream, it will inject discretionary nodes into that stream. + +\starttyping +pat\discretionary{-}{}{}tern. +\stoptyping + +In traditional \TEX\ hyphenation, ligature building and kerning are tightly +interwoven which is quite effective. However, there was also a strong +relationship between the current font and hyphenation. This is a side effect of +traditional \TEX\ having at most 256 characters in a font and the fact that the +used character is fact a reference to a slot in a font. There a character in the +input initially ends up as a character node and eventually becomes a glyph node. +For instance two characters \type {fi} can become a ligature glyph representing +this combination. + +In \LUATEX\ the hyphenation, ligature building and kerning stages are separated +and can be overloaded. In \CONTEXT\ all three can be replaced by code written in +\LUA. Because normally hyphenation happens before font logic is applied, there is +no relationship with font encoding. I wrote the first \LUA\ version of the +hyohenator on a rainy weekend and the result was not that bad so it was presented +at the 2014 \CONTEXT\ meeting. After some polishing I decided to add this routine +to the standard \MKIV\ repertoire which then involved some proper interfacing. + +You can enable the \LUA\ variant with the following command: + +\starttyping +\setuphyphenation[method=traditional] +\stoptyping + +We call this method \type {traditional} because in principle we can have +many more methods and this one is (supposed to be) mostly compatible to the +built-in method. This is a global setting. You can switch back with: + +\starttyping +\setuphyphenation[method=default] +\stoptyping + +In the next sections we will see how we can provide alternatives within the +traditional method. These alternatives can be set local and therefore can operate +over a limited range of characters. + +One complication in interfacing is that \TEX\ has grouping (which permits local +settings) and we want to limit some of the above functionality using groups. At +the same time hyphenation is a paragraph related action so we need to enable the +hyphenation related code at a global level (or at least make sure that it gets +exercised by forcing a \type {\par}). That means that the alternative +hyphenator has to be quite compatible so that we could just enable it for a whole +document. This can have an impact on performance but in practice that can be +neglected. In \LUATEX\ the \LUA\ variant is 4~times slower than the built-in one, +in \LUAJITTEX\ it's 3~times slower. But the good news is that the amount of time +spent in the hyphenator is relatively small compared to other manipulations and +macro expansion. The additional time needed for loading and preparing the +patterns into a more \LUA\ specific format can be neglected. + +You can check how words get hyphenated using the patterns management script: + +\starttyping +>mtxrun --script patterns --hyphenate language + +hyphenator | +hyphenator | . l a n g u a g e . . l a n g u a g e . +hyphenator | 0a2n0 0 0 2 0 0 0 0 0 0 +hyphenator | 2a0n0g0 0 2 2 0 0 0 0 0 0 +hyphenator | 0n1g0u0 0 2 2 1 0 0 0 0 0 +hyphenator | 0g0u4a0 0 2 2 1 0 4 0 0 0 +hyphenator | 2g0e0.0 0 2 2 1 0 4 2 0 0 +hyphenator | .0l2a2n1g0u4a2g0e0. . l a n-g u a g e . +hyphenator | +mtx-patterns | us 3 3 : language : lan-guage +\stoptyping + +\stopsection + +\startsection[title=The last words] + +Mid 2014 we had to upgrade a style for a \PDF\ assembly service: chapters from +(technical) school books are combined into arbitrary new books. There are some +nasty aspects with this flow: for instance, all section numbers in a chapter are +replaced by new numbers and this also involves figure and table prefixes. +It boils down to splitting up books, analyzing the typeset content and +preparing it for replacements. The structure is described in \XML\ files so that +we can generate tables of contents. The reason for not generating from \XML\ +sources is that the publisher doesn't have a \XML\ workflow and that books +already were available. Also, books from several series are combined and even +within a series structure (and rendering) differs. + +What has this to do with hyphenation? Writing a style for such a flow always +results in a more complex one that estimated and as usual it's in the details. +The original style was written in \MKII\ and used some box juggling to achieve +reasonable results but in \MKIV\ we can do better. + +Each chapter has a title and books get titles and subtitles as well. The titles +are typeset each time a new book is composed. This happens within some layout +constraints. Think of constraints like these: + +\startitemize[packed] +\startitem the title goes on top of a shape that doesn't permit much overflow \stopitem +\startitem there can be very long words (not uncommon in Dutch or German) \stopitem +\startitem a short word or hyphenated part should not end up on the last line \stopitem +\startitem the left and right hyphenation minima are at least four \stopitem +\stopitemize + +The last requirement is a compromise because in most cases publishers seem to +want ragged right not hyphenated rendering (at least in Dutch schoolbooks). The +arguments for this are quite weak and probably originate in fear of bad rendering +given past experiences. It's this kind of situations that drive the development +of the more obscure features that ship with \CONTEXT\ and a (partial) solution +for this specific case will be given later. + +If you look at thousands of titles and turn these into (small) paragraphs \TEX\ +does a pretty good job. It's the few exceptions that we need to catch. The next +examples demonstrate such an extreme case. + +\startbuffer[example] +\dorecurse{5} { % dejavu + \startlinecorrection[blank] + \bTABLE + \bTR + \bTD[align=middle,width=2em,foregroundstyle=bold] + #1 + \eTD + \bTD[align={verytolerant,flushleft},width=15em,offset=1ex] + \hsize \dimexpr11\emwidth-#1\dimexpr.5\emwidth\relax + \dontcomplain + \lefthyphenmin=4\righthyphenmin=4 + \blackrule[color=darkyellow,width=\hsize,height=-3pt,depth=5pt]\par + \begstrut\getbuffer[long]\endstrut\par + \eTD + \bTD[align={verytolerant,flushleft},width=15em,offset=1ex] + \sethyphenationfeatures[demo] + \hsize \dimexpr11\emwidth-#1\dimexpr.5\emwidth\relax + \dontcomplain + \blackrule[color=darkyellow,width=\hsize,height=-3pt,depth=5pt]\par + \begstrut\getbuffer[long]\endstrut\par + \eTD + \eTR + \eTABLE + \stoplinecorrection +} +\stopbuffer + +\definehyphenationfeatures + [demo] + [rightwords=1, + lefthyphenmin=4, + righthyphenmin=4] + +\startbuffer[long] +a verylongword and then anevenlongerword +\stopbuffer + +\starthyphenation[traditional] + \enabletrackers[hyphenator.visualize] + \getbuffer[example]\par + \disabletrackers[hyphenator.visualize] +\stophyphenation + +Of course in practice there need to be some reasonable width and when we pose +these limits the longest possible word should fit into the allocated space. In +these examples the rule shows the width. In the right columns we see a red +colored word and that one will not get hyphenated. + +\stopsection + +\startsection[title=Explicit hyphens] + +Another special case that we needed to handle were (compound) words with explicit +hyphens. Because often data comes from \XML\ files we can not really control the +typesetting as in a \TEX\ document where the author sees what gets done. So here +we need a way to turn these hyphens into proper hyphenation directives and at the +same time permit the words to be hyphenated. + +\definehyphenationfeatures + [demo] + [hyphens=yes, + lefthyphenmin=4, + righthyphenmin=4] + +\startbuffer[long] +a very-long-word and then an-even-longer-word +\stopbuffer + +\starthyphenation[traditional] + \enabletrackers[hyphenator.visualize] + \getbuffer[example]\par + \disabletrackers[hyphenator.visualize] +\stophyphenation + +\stopsection + +\startsection[title=Extended patterns] + +As with more opened up mechanisms, in \MKIV\ we can extend functionality. As an +example I have implemented the extensions discussed in the article by László +Németh in the Proceedings of Euro\TEX\ 2006: {\em Hyphenation in OpenOffice.org} +(TUGboat, Volume 27, 2006). The syntax for these extension is somewhat ugly and +involves optional offsets and ranges. \footnote {I'm not sure if there were ever +patterns released that used this syntax.} + +\startbuffer +\registerhyphenationpattern[nl][e1ë/e=e] +\registerhyphenationpattern[nl][a9atje./a=t,1,3] +\registerhyphenationpattern[en][eigh1tee/t=t,5,1] +\registerhyphenationpattern[de][c1k/k=k] +\registerhyphenationpattern[de][schif1f/ff=f,5,2] +\stopbuffer + +\typebuffer \getbuffer + +These patterns result in the following hyphenations: + +\starthyphenation[traditional] + \switchtobodyfont[big] + \starttabulate[|||] + \NC reëel \NC \language[nl]\hyphenatedcoloredword{reëel} \NC \NR + \NC omaatje \NC \language[nl]\hyphenatedcoloredword{omaatje} \NC \NR + \NC eighteen \NC \language[en]\hyphenatedcoloredword{eighteen} \NC \NR + \NC Zucker \NC \language[de]\hyphenatedcoloredword{Zucker} \NC \NR + \NC Schiffahrt \NC \language[de]\hyphenatedcoloredword{Schiffahrt} \NC \NR + \stoptabulate +\stophyphenation + +In a specification, the \type {.} indicates a word boundary and numbers indicate +the weight of a breakpoint. The optional extended specification comes after the +\type {/}. The values separated by a \type {=} are the pre and post sequences: +these end up at the end of the current line and beginning of the next one. The +optional numbers are the start position and length. These default to~1 and~2, so +in the first example they identify \type {eë} (the weights don't count). + +There is a pitfall here. When the language already has patterns that for +instance prohibit a hyphen between \type {e} and type {ë}, like \type{e2ë}, we +need to make sure that we give our new one a higher priority, which is why we +used a \type{e9ë}. + +This feature is somewhat experimental and can be improved. Here is a more \LUA-ish +way of setting such patterns: + +\starttyping +local registerpattern = + languages.hyphenators.traditional.registerpattern + +registerpattern("nl","e1ë", { + start = 1, + length = 2, + before = "e", + after = "e", +} ) + +registerpattern("nl","a9atje./a=t,1,3") +\stoptyping + +Just adding extra patterns to an existing set without much testing is not wise. For +instance we could add these to the dutch dictionary: + +\starttyping +\registerhyphenationpattern[nl][e3ë/e=e] +\registerhyphenationpattern[nl][o3ë/o=e] +\registerhyphenationpattern[nl][e3ï/e=i] +\registerhyphenationpattern[nl][i3ë/i=e] +\registerhyphenationpattern[nl][a5atje./a=t,1,3] +\registerhyphenationpattern[nl][toma8at5je] +\stoptyping + +That would work oke well for words like + +\starttyping +coëfficiënt +geïntroduceerd +copiëren +omaatje +tomaatje +\stoptyping + +However, the last word only goes right because we explicitly added a pattern +for it. One reason is that the existing patterns already contain rules to +prevent weird hyphenations. The same is true for the accented characters. So, +consider these examples and coordinate additional patterns with other users +so that errors can be identified. + +\stopsection + +\startsection[title=Exceptions] + +We have a variant on the \TEX\ primitive \type {\hyphenation}, the official way +to register a specific way to hyphenate a word. + +\startbuffer +\registerhyphenationexception[aaaaa-bbbbb] +aaaaabbbbb \par +\stopbuffer + +\typebuffer + +This code is self explaining and results in: + +\blank + +\starthyphenation[traditional] +\setupindenting[no]\hsize 1mm \lefthyphenmin 1 \righthyphenmin 1 \getbuffer +\stophyphenation + +There can be multiple hyphens and even multiple words in such a specification: + +\startbuffer +\registerhyphenationexception[aaaaa-bbbbb cc-ccc-ddd-dd] +aaaaabbbbb \par +cccccddddd \par +\stopbuffer + +\typebuffer + +We get: + +\blank + +\starthyphenation[traditional] +\setupindenting[no]\hsize 1mm \lefthyphenmin 1 \righthyphenmin 1 \getbuffer +\stophyphenation + + +\stopsection + +\startsection[title=Boundaries] + +A box, rule, math or discretionary will end a word and prohibit hyphenation +of that word. Take this example: + +\startbuffer[demo] +whatever \par +whatever\hbox{!} \par +\vl whatever\vl \par +whatever$x$ \par +whatever-whatever \par +\stopbuffer + +\typebuffer[demo] + +These lines will hyphenate differently and in traditional \TEX\ you need to +insert penalties and|/|or glue to get around it. In the \LUA\ variant we can +enable that limitation. + +\startbuffer +\definehyphenationfeatures + [strict] + [rightedge=tex] +\stopbuffer + +\typebuffer \getbuffer + +Here we show the three variants: traditional \TEX\ and \LUA\ with and without +strict settings. + +\starttabulate[|p|p|p|] +\HL +\NC \ttbf \hbox to 11em{default\hss} +\NC \ttbf \hbox to 11em{traditional\hss} +\NC \ttbf \hbox to 11em{traditional strict\hss} +\NC \NR +\HL +\NC \starthyphenation[default] \hsize1mm \getbuffer[demo] \stophyphenation +\NC \starthyphenation[traditional] \hsize1mm \getbuffer[demo] \stophyphenation +\NC \starthyphenation[traditional] \sethyphenationfeatures[strict] + \hsize1mm \getbuffer[demo] \stophyphenation +\NC \NR +\HL +\stoptabulate + +By default \CONTEXT\ is configured to hyphenate words that start with an +uppercase character. This behaviour is controlled in \TEX\ by the \typ {\uchyph} +variable. A positive value will enable this and a negative one disables it. + +\starttabulate[|p|p|p|p|] +\HL +\NC \ttbf \hbox to 8em{default 0\hss} +\NC \ttbf \hbox to 8em{default 1\hss} +\NC \ttbf \hbox to 8em{traditional 0\hss} +\NC \ttbf \hbox to 8em{traditional 1\hss} +\NC \NR +\HL +\NC \starthyphenation[default] \hsize1mm \uchyph\zerocount TEXified \dontcomplain \stophyphenation +\NC \starthyphenation[traditional] \hsize1mm \uchyph\zerocount TEXified \dontcomplain \stophyphenation +\NC \starthyphenation[default] \hsize1mm \uchyph\plusone TEXified \dontcomplain \stophyphenation +\NC \starthyphenation[traditional] \hsize1mm \uchyph\plusone TEXified \dontcomplain \stophyphenation +\NC \NR +\HL +\stoptabulate + +The \LUA\ variants behaves the same as the built-in implementation (that of course +remains the reference). + +\stopsection + +\startsection[title=Plug-ins] + +The default hyphenator is similar to the built-in one, with a couple of +extensions as mentioned. However, you can plug in your own code, given that it +does return a proper hyphenation result. One reason for providing this plug is +that there are users who want to play with hyphenators based on a different +logic. In \CONTEXT\ we already have some methods to deal with languages that +(for instance) have no spaces but split on words or syllabes. A more tight +integration with the hyphenator can have advantages so I will explore these +options when there is demand. + +A result table indicates where we can break a word. If we have a four character +word and can break after the second character, the result looks like this: + +\starttyping +result = { false, true, false, false } +\stoptyping + +Instead of \type {true} we can also have a table that has entries like the +extensions discussed in a previous section. Let's give an example of a +plug-in. + +\startbuffer +\startluacode + local subset = { + a = true, + e = true, + i = true, + o = true, + u = true, + y = true, + } + + languages.hyphenators.traditional.installmethod("test", + function(dictionary,word,n) + local t = { } + for i=1,#word do + local w = word[i] + if subset[w] then + t[i] = { + before = "<" .. w, + after = w .. ">", + left = false, + right = false, + } + else + t[i] = false + end + end + return t + end + ) +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +Here we hyphenate on vowels and surround them by angle brackets when +split over lines. This alternative is installed as follows: + +\startbuffer +\definehyphenationfeatures + [demo] + [alternative=test] +\stopbuffer + +\typebuffer \getbuffer + +We can now use it as follows: + +\starttyping +\setuphyphenation[method=traditional] +\sethyphenationfeatures[demo] +\stoptyping + +When applied to one the tufte example we get: + +\startbuffer[demo] +\starthyphenation[traditional] + \setuptolerance[tolerant] + \sethyphenationfeatures[demo] + \dontleavehmode + \input tufte\relax +\stophyphenation +\stopbuffer + +\blank \startnarrower \getbuffer[demo] \stopnarrower \blank + +A more realistic (but not perfect) example is the following: + +\startbuffer +\startluacode + local packslashes = false + + local specials = { + ["!"] = "before", ["?"] = "before", + ['"'] = "before", ["'"] = "before", + ["/"] = "before", ["\\"] = "before", + ["#"] = "before", + ["$"] = "before", + ["%"] = "before", + ["&"] = "before", + ["*"] = "before", + ["+"] = "before", ["-"] = "before", + [","] = "before", ["."] = "before", + [":"] = "before", [";"] = "before", + ["<"] = "before", [">"] = "before", + ["="] = "before", + ["@"] = "before", + ["("] = "before", + ["["] = "before", + ["{"] = "before", + ["^"] = "before", ["_"] = "before", + ["`"] = "before", + ["|"] = "before", + ["~"] = "before", + -- + [")"] = "after", + ["]"] = "after", + ["}"] = "after", + } + + languages.hyphenators.traditional.installmethod("url", + function(dictionary,word,n) + local t = { } + local p = nil + for i=1,#word do + local w = word[i] + local s = specials[w] + if s == "after" then + s = { + start = 1, + length = 1, + after = w, + left = false, + right = false, + } + specials[w] = s + elseif s == "before" then + s = { + start = 1, + length = 1, + before = w, + left = false, + right = false, + } + specials[w] = s + end + if not s then + s = false + elseif w == p and w == "/" then + t[i-1] = false + end + t[i] = s + if packslashes then + p = w + end + end + return t + end + ) +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +Again we define a plug: + +\startbuffer +\definehyphenationfeatures + [url] + [characters=all, + alternative=url] +\stopbuffer + +\typebuffer \getbuffer + +So, we only break a line after symbols. + +\startlinecorrection[blank] + \starthyphenation[traditional] + \tt + \sethyphenationfeatures[url] + \scale[width=\hsize]{\hyphenatedcoloredword{http://www.pragma-ade.nl}} + \stophyphenation +\stoplinecorrection + +A quick test can look as follows: + +\startbuffer +\starthyphenation[traditional] + \sethyphenationfeatures[url] + \tt + \dontcomplain + \hsize 1mm + http://www.pragma-ade.nl +\stophyphenation +\stopbuffer + +\typebuffer + +Or: + +\getbuffer + +\stopsection + +\startsection[title=Blocking ligatures] + +Yet another predefined feature is the ability to block a ligature. In +traditional \TEX\ this can be done by putting a \type {{}} between +the characters, although that effect can get lost when the text is +manipulated. The natural way to do this in a \UNICODE\ environment +is to use the special characters \type {zwj} and \type {zwnj}. + +We use the following example lines: + +\startbuffer[sample] +supereffective \blank +superef\zwnj fective +\stopbuffer + +\typebuffer[sample] + +and define two featuresets: + +\startbuffer +\definehyphenationfeatures + [demo-1] + [characters=\zwnj\zwj, + joiners=yes] + +\definehyphenationfeatures + [demo-2] + [joiners=no] +\stopbuffer + +\typebuffer \getbuffer + +We limit the width to 1mm and get: + +\startlinecorrection[blank] +\bTABLE[option=stretch,offset=.5ex] + \bTR + \bTD \tx + \type{method=default} + \eTD + \bTD \tx + \type{method=traditional} + \eTD + \bTD \tx + \type{method=traditional}\par + \type{featureset=demo-1} + \eTD + \bTD \tx + \type{method=traditional}\par + \type{featureset=demo-2} + \eTD + \eTR + \bTR + \bTD + \hsize 1mm \dontcomplain + \starthyphenation[default] + \getbuffer[sample] + \stophyphenation + \eTD + \bTD + \hsize 1mm \dontcomplain + \starthyphenation[traditional] + \getbuffer[sample] + \stophyphenation + \eTD + \bTD + \hsize 1mm \dontcomplain + \starthyphenation[traditional] + \sethyphenationfeatures[demo-1] + \getbuffer[sample] + \stophyphenation + \eTD + \bTD + \hsize 1mm \dontcomplain + \starthyphenation[traditional] + \sethyphenationfeatures[demo-2] + \getbuffer[sample] + \stophyphenation + \eTD + \eTR +\eTABLE +\stoplinecorrection + +\stopsection + +\startsection[title=Special characters] + +The \type {characters} example can be used (to some extend) to do the +same as the breakpoints mechanism (compounds). + +\startbuffer +\definehyphenationfeatures + [demo-3] + [characters={()[]}] +\stopbuffer + +\typebuffer \blank \getbuffer \blank + +\startbuffer[demo] +\starthyphenation[traditional] + \sethyphenationfeatures[demo-3] + \dontcomplain + \hsize 1mm + we use (super)special(ized) patterns +\stophyphenation +\stopbuffer + +\typebuffer[demo] \blank \getbuffer[demo] \blank + +We can make this more clever by adding patterns: + +\startbuffer +\registerhyphenationpattern[en][)9] +\registerhyphenationpattern[en][9(] +\stopbuffer + +\typebuffer \blank \getbuffer \blank + +This gives: + +\blank \getbuffer[demo] \blank + +A detailed trace shows that these patterns get applied: + +\starthyphenation[traditional] + \ttx + \showhyphenationtrace[en][(super)special(ized)] +\stophyphenation + +\unregisterhyphenationpattern[en][)9] +\unregisterhyphenationpattern[en][9(] + +The somewhat weird hyphens at the edges will in practice not show up because +there is always one regular character there. + +\stopsection + +\startsection[title=Counting] + +There is not much you can do about patterns. It's a craft to make them and so +they are shipped with the distribution. In order to hyphenate well, \TEX\ looks +at some character properties. In \CONTEXT\ only the characters used in the +patterns of a language get tagged as valid in a word. + +The following example illustrates that there can be corner cases. In fact, this +example might render differently depending on the patterns available. First we +define an extra language, based on French. + +\startbuffer +\installlanguage[frf][default=fr,patterns=fr,factor=yes] +\stopbuffer + +\typebuffer \getbuffer + +Here we set the \type {factor} parameter which tells the loader that it should +look at the characters used in a special way: some count for none, and some count +for more than one when determining the min values used to determine if and where +hyphenation is to be applied. + +\startbuffer +\startmixedcolumns[n=3,balance=yes] + \hsize 1mm \dontcomplain + \language[fr] aesop oedipus æsop œdipus \column + \hsize 1mm \dontcomplain + \language[frf] aesop oedipus æsop œdipus \column + \startexceptions æ-sop \stopexceptions + \hsize 1mm \dontcomplain + \language[frf] aesop oedipus æsop œdipus +\stopmixedcolumns +\stopbuffer + +\typebuffer + +We get three (when writing this manual) different columns: + +\getbuffer + +The trick is in the \type {factor}: when set to \type {yes} an \type {æ} is +counted as two characters. Combining marks count as zero but you will not +find them being used as we already resolve them in an earlier stage. + +\startluacode +context.startcolumns { n = 2 } +context.starttabulate { "|Tc|c|c|l|" } +for u, data in table.sortedhash(languages.hjcounts) do + if data.category ~= "combining" then + context.NC() context("%05U",u) + context.NC() context("%c",u) + context.NC() context(data.count) + context.NC() context(data.category) + context.NC() context.NR() + end +end +context.stoptabulate() +context.stopcolumns() +\stopluacode + +It is very unlikely to find an \type {ffi} in the input and even an \type {ij} is +rare. The \type {æ} is marked as character and the \type {œ} a ligatyure in +\UNICODE. Maybe all the characters here are dubious but al least we provide a +way to experiment with them. + +\stopsection + +\startsection[title=Tracing] + +Among the tracing options (low level trackers) there is one for pattern developers: + +\startbuffer +\usemodule[s-languages-hyphenation] + +\startcomparepatterns[de,nl,en,fr] + \input zapf \quad (\showcomparepatternslegend) +\stopcomparepatterns +\stopbuffer + +\typebuffer + +The different hyphenation points are shown with colored bars. Some valid points +might not be shown because the font engine can collapse successive +discretionaries. + +\getbuffer + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/languages/languages-introduction.tex b/doc/context/sources/general/manuals/languages/languages-introduction.tex new file mode 100644 index 000000000..25bbb1a90 --- /dev/null +++ b/doc/context/sources/general/manuals/languages/languages-introduction.tex @@ -0,0 +1,69 @@ +% language=uk + +\startcomponent languages-introduction + +\environment languages-environment + +\startchapter[title=Introduction][color=darkgray] + +This document describes an important property of the \TEX\ typesetting system and +\CONTEXT\ in particular: the ability to deal with different languages at the same +time. With languages we refer to natural languages. So, we're not going to +discuss the \TEX\ language itself, not \METAPOST, nor \LUA. + +The original application of \TEX\ was English that uses the Latin script. The +fonts that came with \TEX\ were suitable for that usage. When lines became too +long they could be hyphenated using so called hyphenation patterns. Due to the +implementation for many years there was a close relationship between fonts and +hyphenation. Although at some point many more languages and scripts were +supported, it was only when the \UNICODE\ aware variants showed up that +hyphenation and fonts were decoupled. This makes it much more easier to mix +languages that use different scripts. Although Greek, Cyrillic, Arabic, Chinese, +Japanese, Korean and other languages have been supported for a while using +(sometimes dirty) tricks, we now have cleaner implementations. + +We can hyphenate words in all languages (and scripts) that have a need for it, +that is, split it at the end of a line and add a symbol before and|/|or after the +break. The way words are broken into parts is called hyphenation and so called +patterns are used to achieve that goal. The way these patterns are constructed +and applied was part of the research related to \TEX\ development. The method +used is also applied in other programs and is probably one of the few popular +ways to deal with hyphenation. There have been ideas about extensions that cover +the demands of certain languages but so far nothing better has shown up. In the +end \TEX\ does a pretty decent job and more advanced tricks don't necessarily +lead to better results. + +Hyphenation is driven by a language number and that's about it. This means that +one cannot claim that \TEX\ in its raw form supports languages, other than that +it can hyphenate and use fonts that provide the glyphs. It's upto a macro package +to wrap this into a mechanism that provides the user an interface. So, when we +speak about language support, hyphenation is only one aspect. Labels, like the +\type {figure} in {\em figure~1.2} need to adapt to the main document language. +When dates are shown they can be language specific. Scientific units and math +function names can also be subjected to translation. Registers and other lists +have to be sorted according to specific rules. Spacing dan differ per language. + +In this manual we will cover some of functionality in \CONTEXT\ \MKIV\ that +relates to languages (and scripts). This manual is a compliment to other manuals, +articles and documentation. Here we mostly focus on the language aspects. Some of +the content (or maybe most) might looks alien and complex to you. This is because +one purpose of this manual is to provide a place to wrap up some aspects of +\CONTEXT. If you're not interested in that, just stick to the more general +manuals that also cover language aspects. + +\startnotabene + This document is still under construction. The functionality discussed here + will stay and more might show up. Of course there are errors, and they're all + mine. The text is not checked for spelling errors. Feel free to let me know + what should get added. +\stopnotabene + +\startlines +Hans Hagen +PRAGMA ADE, Hasselt NL +2013 \emdash\ 2016 +\stoplines + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/languages/languages-labels.tex b/doc/context/sources/general/manuals/languages/languages-labels.tex new file mode 100644 index 000000000..6c806ab1c --- /dev/null +++ b/doc/context/sources/general/manuals/languages/languages-labels.tex @@ -0,0 +1,141 @@ +% language=uk + +\startcomponent languages-labels + +\environment languages-environment + +\startchapter[title=Labels][color=darkcyan] + +\startsection[title=Introduction] + +When we started using \TEX, I naturally started with plain \TEX. But it didn't +take long before we tried \LATEX. Because our documents were in Dutch one of the +first fights with this package was to get rid of the english labels. Because +rather soon we decided to cook up an alternative package, a decent label +mechanism was one of the first things to show up. And as soon as multiple +language typesetting gets into view, such a mechanism becomes one of those +language dependent features. In this chapter the basics will be covered. + +\stopsection + +\startsection[title=Defining labels] + +Before we define a label we need to define a label class. You probably seldom +need that but this is how it's done: + +\startbuffer +\definelabelclass [mylabel] +\stopbuffer + +\typebuffer \getbuffer + +There are some classes predefined: + +\starttabulate[|lB|l|] + \NC head \NC (complete) titles like \headtext {chapter} and \headtext {figure} \NC \NR + \NC label \NC in||text labels like \labeltext {chapter} and \labeltext {figure} \NC \NR + \NC mathlabel \NC function names like \mathlabeltext{sin} and \mathlabeltext{cos} \NC \NR + \NC taglabel \NC labels used for tagging purposed in the backend \NC \NR + \NC btxlabel \NC labels used in typesetting bibliographic items \NC \NR +\stoptabulate + +The physical units mechanism also uses labels: unit, operator, prefix and suffix. +All these labels are defined per language with a fall back on english. + +Given that we have defined class \type {mylabel}, a label itself is set like +this: + +\startbuffer +\setupmylabeltext + [en] + [first={<after first}, + second={{before second>},{<after second}}] +\stopbuffer + +\typebuffer \getbuffer + +The first argument (the language) is optional. In the next section we will see +how these labels are used. A lot of labels are predefined, in \MKIV\ this happens +in the file \type {lang-txt.lua}. There is no need to adapt this file as you can +always add labels run time. + +\stopsection + +\startsection[title=Using labels] + +How a label is called depends on the way it needs to be used. In any case the +main language set determines the language of the label. So, when in an Dutch text +we temporary switch to German, the Dutch labels are used. + +\startbuffer +\starttabulate[||||] + \NC \bf command \NC \ttbf first \NC \ttbf {second} \NC \NR + \HL + \NC \type {\leftmylabeltext {tag}} \NC \leftmylabeltext {first} \NC \leftmylabeltext {second} \NC \NR + \NC \type {\rightmylabeltext{tag}} \NC \rightmylabeltext{first} \NC \rightmylabeltext{second} \NC \NR + \NC \type {\mylabeltext {tag}} \NC \mylabeltext {first} \NC \mylabeltext {second} \NC \NR + \NC \type {\mylabeltexts {tag}{text}} \NC \mylabeltexts {first}{text} \NC \mylabeltexts {second}{text} \NC \NR +\stoptabulate +\stopbuffer + +\getbuffer + +\stopsection + +\startsection[title=Hooks] + +Some mechanisms have label support built in, most noticeably sections +heads and numbered items, like figure captions. + +\startbuffer +\definehead + [myhead] + [subsection] + +\setuphead + [myhead] + [bodypartlabel=bodypartmyhead] + +\setuplabeltext + [en] + [bodypartmyhead=My Head: ] + +\myhead{Welcome} +\stopbuffer + +\typebuffer \getbuffer + +The head text label class can be used as follows: + +\startbuffer +\setupheadtext + [SomeHead=Just A Title] + +\subsection + [title=\headtext{SomeHead}] +\stopbuffer + +\typebuffer \getbuffer + +A label will obey the style settings, as in: + +\startbuffer +\definehead + [MyFancyHead] + [subsection] + [style={\bs\setcharactercasing[Words]}] + +\setupheadtext + [SomeHead=just another title] + +\MyFancyHead + [title=\headtext{SomeHead}] +\stopbuffer + +\typebuffer \getbuffer + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/languages/languages-mkiv.tex b/doc/context/sources/general/manuals/languages/languages-mkiv.tex new file mode 100644 index 000000000..98ca84814 --- /dev/null +++ b/doc/context/sources/general/manuals/languages/languages-mkiv.tex @@ -0,0 +1,61 @@ +% language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. + +\enablemode[simple] % ,oversized + +\startbuffer[abstract] + + This book explains how we support languages (and scripts) in \CONTEXT\ \MKIV\ + and \LUATEX. Some of the mechanisms discussed are generic and not \CONTEXT\ + specific. We discuss the way languages are dealt with in the engine, + hyphenation, standard features and additional goodies. Tracing and the + extensibility of code are also discussed. + +\stopbuffer + +\environment languages-environment + +\startdocument + [author=Hans Hagen, + title=Languages in \ConTeXt, + subtitle=explaining luatex and mkiv, + affiliation=PRAGMA ADE, + comment=work in progress, + cover:color:1=darkmagenta, + cover:color:2=darkorange, + cover:color:3=darkyellow, + cover:color:4=darkcyan, + cover:color:5=darkgray] + + \startfrontmatter + \component manuals-explaining-contents + \component languages-introduction + \stopfrontmatter + + \startbodymatter + \component languages-basics + \component languages-hyphenation + \component languages-labels + \component languages-numbering + \component languages-typesetting + \component languages-goodies + \component languages-sorting + \stopbodymatter + + \startappendices + \component languages-appendix + \stopappendices + +\stopdocument diff --git a/doc/context/sources/general/manuals/languages/languages-numbering.tex b/doc/context/sources/general/manuals/languages/languages-numbering.tex new file mode 100644 index 000000000..3464826df --- /dev/null +++ b/doc/context/sources/general/manuals/languages/languages-numbering.tex @@ -0,0 +1,307 @@ +% language=uk + +\startcomponent languages-numbering + +\environment languages-environment + +\startchapter[title=Numbering][color=darkgreen] + +\startsection[title=Introduction] + +Numbering is complex and in \CONTEXT\ it's not easy either. This is because we +not only have 1, 2, 3 \unknown\ but also sub numbers like 1a, 1b, 1ic \unknown\ +or 1.a, 1.b, 1.c \unknown\ There can be many levels, different separators, final +symbols. As we're talking languages we only discuss conversion here: the +mechanism that turns a number in for instance a letter. It happens that the +mapping from a number onto a letter is language dependent. The next lines show +how English, Spanish and Slovenian numbers: + +\blank +\startpacked +\startcolor[maincolor] +\dontleavehmode + {\ttbf\mainlanguage[en]\dorecurse{28} + {\hbox to 1.5em{\convertnumber{alphabetic}{#1}\hss}}}\par +\dontleavehmode + {\ttbf\mainlanguage[es]\dorecurse{28} + {\hbox to 1.5em{\convertnumber{alphabetic}{#1}\hss}}}\par +\dontleavehmode + {\ttbf\mainlanguage[sl]\dorecurse{28} + {\hbox to 1.5em{\convertnumber{alphabetic}{#1}\hss}}}\par +\stopcolor +\stoppacked +\blank + +You convert a number into a letter with: + +\starttyping +\convertnumber{alphabetic}{15} +\stoptyping + +There is also \type {\uconvertnumber} which does not expand unless typesetting +is going on. Normally you don't need to bother about this. + +The \type {alphabetic} converter adapts to the current main language. When a +language has no special alphabet, the regular 26 characters are used. + +A converter can also convert to a roman numeral, a language specific ordered +list, a day or month, an ordinal string and again there can be a language +specific conversion. The general conversion macro takes a conversion name and +a number. When a conversion can be set (for instance in an itemized list, or in +section numbering) you can use these names. You can define additional +converters if needed, as long as the converter can handle a number. + +\starttyping +\defineconversion [alphabetic] [\alphabeticnumerals] +\stoptyping + +Here \type {\alphabeticnumerals} is a converter. If you look into the source of +\CONTEXT\ you will see that many converters are calling out to \LUA, where we +have implemented those specific conversions. The following table has long and +short names. The short one are historic. + +\starttabulate +\FL +\NC month \NC \type {\monthlong} \NC \NR +\NC month:mnem \NC \type {\monthshort} \NC \NR +\ML +\NC character \NC \type {\character} \NC \NR +\NC Character \NC \type {\Character} \NC \NR +\NC characters \NC \type {\characters} \NC \NR +\NC Characters \NC \type {\Characters} \NC \NR +\ML +\NC AK \NC \type {\smallcappedcharacters} \NC \NR +\NC KA \NC \type {\smallcappedcharacters} \NC \NR +\ML +\NC alphabetic a \NC \type {\alphabeticnumerals} \NC \NR +\NC Alphabetic A \NC \type {\Alphabeticnumerals} \NC \NR +\ML +\NC number numbers n \NC \type {\numbers} \NC \NR +\NC Numbers N \NC \type {\Numbers} \NC \NR +\NC mediaeval m \NC \type {\mediaeval} \NC \NR +\ML +\NC word words \NC \type {\verbosenumber} \NC \NR +\NC Word Words \NC \type {\VerboseNumber} \NC \NR +\ML +\NC ordinal \NC \type {\ordinalnumber} \NC \NR +\NC Ordinal \NC \type {\Ordinalnumber} \NC \NR +\ML +\NC romannumerals i r \NC \type {\romannumerals} \NC \NR +\NC Romannumerals I R \NC \type {\Romannumerals} \NC \NR +\ML +\NC o \NC \type {\oldstylenumerals} \NC \NR +\NC O \NC \type {\oldstylenumerals} \NC \NR +\NC or \NC \type {\oldstyleromannumerals} \NC \NR +\ML +\NC KR \NC \type {\smallcappedromannumerals} \NC \NR +\NC RK \NC \type {\smallcappedromannumerals} \NC \NR +\ML +\NC greek g \NC \type {\greeknumerals} \NC \NR +\NC Greek G \NC \type {\Greeknumerals} \NC \NR +\NC mathgreek \NC \type {\mathgreek} \NC \NR +\ML +\NC abjadnumerals \NC \type {\abjadnumerals} \NC \NR +\NC abjadnodotnumerals \NC \type {\abjadnodotnumerals} \NC \NR +\NC abjadnaivenumerals \NC \type {\abjadnaivenumerals} \NC \NR +\ML +\NC thainumerals \NC \type {\thainumerals} \NC \NR +\NC devanagarinumerals \NC \type {\devanagarinumerals} \NC \NR +\NC gurmurkhinumerals \NC \type {\gurmurkhinumerals} \NC \NR +\NC gujaratinumerals \NC \type {\gujaratinumerals} \NC \NR +\NC tibetannumerals \NC \type {\tibetannumerals} \NC \NR +\NC greeknumerals \NC \type {\greeknumerals} \NC \NR +\NC Greeknumerals \NC \type {\Greeknumerals} \NC \NR +\NC arabicnumerals \NC \type {\arabicnumerals} \NC \NR +\NC persiannumerals \NC \type {\persiannumerals} \NC \NR +\NC arabicexnumerals \NC \type {\arabicexnumerals} \NC \NR +\NC arabicdecimals \NC \type {\arabicdecimals} \NC \NR +\NC persiandecimals \NC \type {\persiandecimals} \NC \NR +\ML +\NC koreannumerals kr \NC \type {\koreannumerals} \NC \NR +\NC koreanparenthesisnumerals kr-p \NC \type {\koreanparenthesisnumerals} \NC \NR +\NC koreancirclenumerals kr-c \NC \type {\koreancirclenumerals} \NC \NR +\ML +\NC chinesenumerals cn \NC \type {\chinesenumerals} \NC \NR +\NC chinesecapnumerals cn-c \NC \type {\chinesecapnumerals} \NC \NR +\NC chineseallnumerals cn-a \NC \type {\chineseallnumerals} \NC \NR +\ML +\NC sloveniannumerals \NC \type {\sloveniannumerals} \NC \NR +\NC slovenianNumerals \NC \type {\slovenianNumerals} \NC \NR +\ML +\NC spanishnumerals \NC \type {\spanishnumerals} \NC \NR +\NC spanishNumerals \NC \type {\spanishNumerals} \NC \NR +\LR +\stoptabulate + +The \type {alphabetic} and \type {Alphabetic} converters adapt to slovenian and +spanish as do their small capped alternatives. There are more general helpers for it +too: + +\starttyping +\languagecharacters{number} +\languageCharacters{number} +\stoptyping + +Also language related is the \type {\continuednumber} macro. Here we see an +application: + +\startbuffer +1 \continuednumber{1} +1, 2 \continuednumber{2} +1, 2, 3 \continuednumber{3} +\stopbuffer + +\typebuffer + +What renders as: + +\startlines[color=maincolor] +\getbuffer +\stoplines + +Such a macro is typically used in combination with counters ant it just typesets +a label text depending on the valu ebeing non|-|zero. + +\startbuffer +\setuplabeltext[en][continued={and so on}] +1, 2, 3 \continuednumber{3} +1, 2, 3 \convertnumber{continued}{3} +\stopbuffer + +\typebuffer + +This gives: + +\startlines[color=maincolor] +\getbuffer +\stoplines + +In the rare case that you want to check if a conversion is defined you can use + +\starttyping +\doifelseconversiondefined{name}{true}{false} +\stoptyping + +So, + +\startbuffer +\doifelseconversiondefined{characters}{we can convert}{forget about it} +\stopbuffer + +\typebuffer + +Gives: + +\startlines[color=maincolor] +\getbuffer +\stoplines + +There are also some non language related converters that we mention here for +completeness: + +\blank +\type {set 0}: \startcolor[maincolor]\dorecurse{20}{\convertnumber{set 0}{#1} }\stopcolor\par +\type {set 1}: \startcolor[maincolor]\dorecurse{20}{\convertnumber{set 1}{#1} }\stopcolor\par +\type {set 2}: \startcolor[maincolor]\dorecurse{20}{\convertnumber{set 2}{#1} }\stopcolor\par +\type {set 3}: \startcolor[maincolor]\dorecurse{20}{\convertnumber{set 3}{#1} }\stopcolor\par +\blank + +When a set overruns we start again at the first element. + +The ordinal converter produces output like \color [maincolor] {\convertnumber +{ordinal}{123}} and \color [maincolor] {\convertnumber {ordinal}{654}}. The +corresponding string renderer is \type {\highordinalstr}. + +% quite limited currently op not documented here: +% +% \wordtonumber{two}{3} +% \wordtonumber{fivethousand}{unknown} + +\stopsection + +\startsection[title=Dates] + +Dates are also language dependent. The following macros take a number and return +the name of the month or day. + +\starttabulate +\NC \type {\monthlong } \NC \monthlong {10} \NC \NR +\NC \type {\monthshort} \NC \monthshort{10} \NC \NR +\NC \type {\MONTH } \NC \MONTH {10} \NC \NR +\NC \type {\MONTHLONG } \NC \MONTHLONG {10} \NC \NR +\NC \type {\MONTHSHORT} \NC \MONTHSHORT{10} \NC \NR +\NC \type {\weekday } \NC \weekday {5} \NC \NR +\NC \type {\WEEKDAY } \NC \WEEKDAY {5} \NC \NR +\stoptabulate + +The current date can be typeset with \type {\currentdate} and a +specific date with \type {\date}, for instance: + +\startbuffer +\currentdate[weekday,day,month,year] +\currentdate[WEEKDAY,day,MONTH,year] +\date[d=12,m=12,y=1998][weekday] +\date[d=12,m=12,y=1998] +\stopbuffer + +\typebuffer + +\startlines[color=maincolor] +\getbuffer +\stoplines + +Possible elements of the specification are: + +\starttabulate +\FL +\NC + ord \NC ordinal suffix \NC \NR +\NC ++ highord \NC high ordinal suffix \NC \NR +\ML +\NC mnem: \NC mnemonic prefix \NC \NR +\ML +\NC Y y year \NC year 4 digits \NC \NR +\NC yy \NC year 2 digits \NC \NR +\ML +\NC M \NC month 1 or 2 digits \NC \NR +\NC mm \NC month 2 digits \NC \NR +\ML +\NC D \NC day 1 or 2 digits \NC \NR +\NC dd \NC day 2 digits \NC \NR +\ML +\NC W \NC 1 digit \NC \NR +\ML +\NC month m \NC language dependent (can be mnemonic) \NC \NR +\NC day d \NC language dependent \NC \NR +\NC weekday w \NC language dependent \NC \NR +\ML +\NC MONTH \NC month uppercased \NC \NR +\NC WEEKDAY \NC weekday uppercased \NC \NR +\ML +\NC referral \NC YYYMMDD \NC \NR +\ML +\NC space \\ \NC space \NC \NR +\NC <word> \NC word \NC \NR +\LL +\stoptabulate + +There are also some converters built in (more can be added), for instance: + +\startbuffer +The current {\em gregorian} date \currentdate [month, day, {, }, year] is +in {\em jalali} \currentdate [jalali:to, month, day, {, }, year] but we +can also as a specific one, so {\em jalali} \date [y=1395, m=4, d=18] +[month, day, {, }, year] is {\em gregorian} \date [y=1395, m=4, d=18] +[jalali:from, month, day, {, }, year]. +\stopbuffer + +\typebuffer \startnarrower \getbuffer \stopnarrower + +\stopsection + +% \startsection[title=Counters] +% +% \stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/languages/languages-sorting.tex b/doc/context/sources/general/manuals/languages/languages-sorting.tex new file mode 100644 index 000000000..ce24f385c --- /dev/null +++ b/doc/context/sources/general/manuals/languages/languages-sorting.tex @@ -0,0 +1,235 @@ +% language=uk + +\startcomponent languages-sorting + +\environment languages-environment + +\startchapter[title=Sorting][color=darkblue] + +\startsection[title=Introduction] + +Sorting is complex, not so much for English, Dutch, German, etc. only texts but +there are languages and scripts that are more demanding. There are several +complications: + +\startitemize + + \startitem + There can be characters that have accents, like à, á, â, ã, ä + \unknown\ that have a base shape a and in an index these often end up + close to each other. The order can differ per language. + \stopitem + + \startitem + There are upper and lowercase words and there can be different + expectations to them being mixed or separated. + \stopitem + \startitem + Some scripts have characters that are combinations, like Æ, and + one might want to see them as one character or two, in which the + second one obeys the sorting order. The shape can dominate here. + \stopitem + \startitem + Some scripts, like Japanese, are a combination of several scripts + and sorting then depends on normalization. + \stopitem + \startitem + When there are many glyphs, like in Chinese, the order can depend + on the complexity of the glyph and when we're lucky that order is + reflected in the numeric character order. + \stopitem +\stopitemize + +Often the rules are somewhat strict and one can doubt of the same rules would +have been imposed if computers had been developed earlier. Given discussions one +can doubt if the rules are really consistent or just there because someone (or a +group) with influence set the standard (not so much different from grammar). So, +if we deal with sorting, we do that in such a way that users can (to some extend) +influence the outcome. After all, one important aspect of typesetting and +organizing content is that the users gets the feeling of control and a diversion +from a standard can be part of that. The reader will often not notice these +details. In the next sections we will explore the way sorting is done in +\CONTEXT. The method evolved over a few decades. In \MKII\ sorting happened +between runs and it was just part of the processing of a document that users +never really saw in action. Sorting just happened and few users will have noticed +that we moved from a \MODULA\ program to a \PERL\ script and ended up with a +\RUBY\ script. In fact, there is a \LUA\ replacement but it never got tested well +because we moved in to \MKIV. There all happens inside the engine using \LUA. +Some principles stayed the same but we are more flexible now. + +\stopsection + +\startsection[title=How it works] + +How does sorting work out? Take these words: + +\startlines +abracadabra +abräcàdábra +àbracádabrä +ábracadàbra +äbrácadabrà +\stoplines + +As long as they end up in an order where the reader can find it, we're okay. +After all we're pretty good in pattern recognition. + +There are probably many ways to implement a sorter but the one we uses is more or +less a follow up on the one we had for over a decade and was the result of an +evolution based on user demand. It boils down to cleaning up the string in such a +way that it can be split into meaningful characters. One can argue that we should +use some kd of standardized sorting method but the problem is that we always have +to deal with for instance embedded tex commands and mixed content, for instance +numbers. And users using the same language can have different opinions about the +rules too. + +A word (or sequence of words) is split into characters. Because there can be +\TEX\ commands in there some cleanup happens beforehand. After that we create +several lists with numbers that will be compared when sorting two entries. + +\startluacode + +-- local ignoredoffset = sorters.constants.ignoredoffset +-- local replacementoffset = sorters.constants.replacementoffset +-- local digitsoffset = sorters.constants.digitsoffset +-- local digitsmaximum = sorters.constants.digitsmaximum + +local context = context + +local utfchar = utf.char +local utfyte = utf.byte +local concat = table.concat +local gsub = string.gsub +local formatters = string.formatters + +local f_char = formatters["%s"] +local f_byte = formatters["x%02X"] + +local meaning = { + ch = "raw character", + mm = "minus mapping", + zm = "zero mapping", + pm = "plus mapping", + mc = "lowercase - 1", + zc = "lowercase", + pc = "lowercase + 1", + uc = "unicode", +} + +local function show(s,key,bodyfont) + local c = s[key] + local t = { } + for i=1,#c do + local ci = c[i] + if type(ci) == "string" then + t[i] = f_char(ci) + else + t[i] = f_byte(ci) + end + end + t = concat(t,"~") + context.NC() context.maincolor() context(key) + context.NC() context.maincolor() context(meaning[key]) + context.NC() if bodyfont then context.switchtobodyfont{bodyfont} end context(t) + context.NC() context.NR() +end + +function document.ShowSortSplit(str,language,bodyfont) + sorters.setlanguage(language or "en") + local s = sorters.splitters.utf(str) + context.starttabulate{ "|Tl|Tlj2|Tp|" } + context.FL() + context.NC() + context.NC() context.maincolor() context(language) + context.NC() if bodyfont then context.switchtobodyfont{bodyfont} end context.maincolor() context(str) + context.NC() context.NR() + context.ML() + show(s,"ch",bodyfont) + show(s,"uc") + show(s,"zc") + show(s,"mc") + show(s,"pc") + show(s,"zm") + show(s,"mm") + show(s,"pm") + context.LL() + context.stoptabulate() +end + +\stopluacode + +We can best demonstrate this with a few examples. As usual an English language +example is trivial. + +\ctxlua{document.ShowSortSplit("abracadabra","en")} + +When we add an uppercase character we get a slightly different outcome: + +\ctxlua{document.ShowSortSplit("Abracadabra","en")} + +Some characters will be split, like \type {æ}: + +\ctxlua{document.ShowSortSplit("æsop","en")} + +It gets more complex when langiage specific demands kick in. Compare an English, German +and Austrian split: + +\ctxlua{document.ShowSortSplit("Abräcàdábra","en")} +\ctxlua{document.ShowSortSplit("Abräcàdábra","de")} +\ctxlua{document.ShowSortSplit("Abräcàdábra","de-at")} + +The way a character gets replaced, like \type {ä} into \type {ae}, is defined in +\type {sort-lan.lua} using \LUA\ tables. We will not explain all the obscure +details here; most of the work is already done, so users are not bothered by +these definitions. And new ones can often be made by copying and adapting an +existing one. + +The sorting itself is specified by a sequence: + +\starttabulate[|TlCT{maincolor}|Tl|] +\NC default \NC zc,pc,zm,pm,uc \NC \NR +\NC before \NC mm,mc,uc \NC \NR +\NC after \NC pm,mc,uc \NC \NR +\NC first \NC pc,mm,uc \NC \NR +\NC last \NC mc,mm,uc \NC \NR +\stoptabulate + +The raw character is what we get after the (language specific) replacement has +been applied and the unicodes are used when comparing. Lowercasing is done using +the \UNICODE\ lowercase code, but one can define language specific ones too. The +plus and minus variants can be used to force lowercase before or after uppercase. +The mapping is based on an alphabet specification so this can differ per language +and again we also provide plus and minus values that depend on case. When a +character has no case we use shapes instead. For instance, the shape of \type +{à} is \type {a}. Digits are treated special and currently get an offset so that +they end up last in the sort order. + +\defineregister[jindex] + +\startbuffer +ぱあ \jindex{ぱあ} +ぱー \jindex{ぱー} +ぱぁ \jindex{ぱぁ} +\stopbuffer + +{\switchtobodyfont[ipaex]\startlines\typebuffer\stoplines} + +This three entry index\jindex{ぱあ}\jindex{ぱー}\jindex{ぱぁ} should be sorted in the order: +{\switchtobodyfont[ipaex]\ruledhbox{ぱー}\enspace\ruledhbox{ぱぁ}\enspace\ruledhbox{ぱあ}}. + +{\mainlanguage[jp]\switchtobodyfont[ipaex]\placeregister[jindex][language=jp,n=1,method=default]} +{\mainlanguage[jp]\switchtobodyfont[ipaex]\placeregister[jindex][language=jp,n=1,method=zm]} + +\ctxlua{document.ShowSortSplit("ぱあ","jp","ipaex")} +\ctxlua{document.ShowSortSplit("ぱー","jp","ipaex")} +\ctxlua{document.ShowSortSplit("ぱぁ","jp","ipaex")} + +{\em To be continued!} + +\stopsection + +% ぱー $\prec$ ぱぁ $\prec$ ぱあ + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/lua/lua-mkiv.tex b/doc/context/sources/general/manuals/lua/lua-mkiv.tex new file mode 100644 index 000000000..40e885eac --- /dev/null +++ b/doc/context/sources/general/manuals/lua/lua-mkiv.tex @@ -0,0 +1,139 @@ +% language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. + +\usemodule[art-01,abr-02] + +\setupbodyfont + [10pt] + +\definecolor + [maincolor] + [b=.4] + +\usesymbols + [cc] + +\setuptype + [color=maincolor] + +\setuptyping + [color=maincolor] + +\definefont + [TitlePageFont] + [file:lmmonolt10-bold.otf] + +\setuphead + [color=maincolor] + +\setupinteraction + [hidden] + +\startdocument + [metadata:author=Hans Hagen, + metadata:title={Lua, the context libraries}, + author=Hans Hagen, + affiliation=PRAGMA ADE, + location=Hasselt NL, + title=Lua, + subtitle=the context libraries, + support=www.contextgarden.net, + website=www.pragma-ade.nl] + +\startMPpage + + StartPage ; + + numeric w ; w := bbwidth(Page) ; + numeric h ; h := bbheight(Page) ; + + fill Page withcolor \MPcolor{maincolor} ; + + draw textext.urt("\TitlePageFont \getvariable{document}{title}") xsized (0.8w) shifted (.1w,.2h) withcolor .80white ; + draw textext.top("\TitlePageFont \getvariable{document}{subtitle}") xsized (0.8w) shifted (.5w,.1h) withcolor .60white ; + + StopPage ; + +\stopMPpage + +\startsubject[title=Contents] + +\placelist[section][alternative=a] + +\stopsubject + +\startsection[title=Introduction] + +Once we started the \LUATEX\ project it didn't take long for \CONTEXT\ to use +the \LUA\ language extensively. And so, rather soon, a bunch of libraries +evolved that provided all kind of helpers. Because \LUATEX\ can also act as +a \LUA\ interpreter, and because we have \type {mtxrun} as script runner +we can also use some of those libraries outside \CONTEXT. So, for me, a rather +natural way to run a \LUA\ script is: + +\starttyping +mtxrun --script myscript.lua <optional arguments> +\stoptyping + +The advantage of this approach is that you operate in the same file domain as +your \TEX\ runs as all file locators are preloaded as well. However, in some +cases this is not possible, for instance when you run a stock \LUA\ or some +embedded version. For this we provide an alternative mechanism. + +\stopsection + +\startsection[title=Making libraries] + +In the \CONTEXT\ distribution there is a script called \type {mtxlibs.lua} that +can create a library for you that has the basic general purpose \CONTEXT\ +libraries on board, as well as whatever more you specify. + +\starttyping +lua mtxlibs.lua --selfmerge myproject-a-libs.lua +lua mtxlibs.lua --selfmerge myproject-b-libs.lua \ + trac-lmx +lua mtxlibs.lua --selfmerge myproject-c-libs.lua \ + util-sql util-sql-imp-client util-sql-imp-library +\stoptyping + +Here we create three libs. The first one has only the core libraries. You can +read more about what they provide in the \type {cld-mkiv.pdf} manual. The second +library includes code for creating web pages. The third variant preloads \SQL\ +support. + +You can best run this file in its own directory, in the \CONTEXT\ tree, so that +it knows where to find the libraries needed. Of course you can put the result +everywhere you want, preferably alongside your normal scripts. As we merge code, +this is a rather good way to prevent compatibility issues. After all, some of +the code might get improved. + +You can \type {require("mtxlibs")} directly in which case it will load the core +libraries runtime. Of course this means that \LUA\ should be able to figure out +where it can find them. + +\stopsection + +\startsubject[title={Colofon}] + +\starttabulate[|B|p|] +\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR +\NC version \NC \currentdate \NC \NR +\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR +\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR +\stoptabulate + +\stopsubject + +\stopdocument diff --git a/doc/context/sources/general/manuals/luatex/luatex-contents.tex b/doc/context/sources/general/manuals/luatex/luatex-contents.tex new file mode 100644 index 000000000..6d06b3ef0 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-contents.tex @@ -0,0 +1,20 @@ +\environment luatex-style +\environment luatex-logos + +\startcomponent luatex-contents + +\starttitle[title=Contents] + +\start + + \definecolor[maincolor][black] + + \placelist + [chapter,section,subsection] + [criterium=text] + +\stop + +\stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex b/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex new file mode 100644 index 000000000..d55eef286 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-enhancements.tex @@ -0,0 +1,892 @@ +% language=uk + +\environment luatex-style +\environment luatex-logos + +\startcomponent luatex-enhancements + +\startchapter[reference=enhancements,title={Basic \TEX\ enhancements}] + +\section{Introduction} + +From day one, \LUATEX\ has offered extra features compared to the superset of +\PDFTEX\ and \ALEPH. This has not been limited to the possibility to execute +\LUA\ code via \type {\directlua}, but \LUATEX\ also adds functionality via new +\TEX|-|side primitives or extensions to existing ones. + +When \LUATEX\ starts up in \quote {iniluatex} mode (\type {luatex -ini}), it +defines only the primitive commands known by \TEX82 and the one extra command +\type {\directlua}. As is fitting, a \LUA\ function has to be called to add the +extra primitives to the user environment. The simplest method to get access to +all of the new primitive commands is by adding this line to the format generation +file: + +\starttyping +\directlua { tex.enableprimitives('',tex.extraprimitives()) } +\stoptyping + +But be aware that the curly braces may not have the proper \type {\catcode} +assigned to them at this early time (giving a \quote {Missing number} error), so +it may be needed to put these assignments before the above line: + +\starttyping +\catcode `\{=1 +\catcode `\}=2 +\stoptyping + +More fine|-|grained primitives control is possible and you can look up the +details in \in {section} [luaprimitives]. For simplicity's sake, this manual +assumes that you have executed the \type {\directlua} command as given above. + +The startup behaviour documented above is considered stable in the sense that +there will not be backward|-|incompatible changes any more. We have promoted some +rather generic \PDFTEX\ primitives to core \LUATEX\ ones, and the ones inherited +frome \ALEPH\ (\OMEGA) are also promoted. Effectively this means that we now only +have the \type {tex}, \type {etex} and \type {luatex} sets left. + +In \in {Chapter} [modifications] we discuss several primitives that are derived +from \PDFTEX\ and \ALEPH\ (\OMEGA). Here we stick to real new ones. In the +chapters on fonts and math we discuss a few more new ones. + +\section{Version information} + +\subsection {\type {\luatexbanner}, \type {\luatexversion} and \type {\luatexrevision}} + +There are three new primitives to test the version of \LUATEX: + +\starttabulate[|l|pl|pl|] +\NC \bf primitive \NC \bf explanation \NC \bf value \NC \NR +\NC \type {\luatexbanner} \NC the banner reported on the command line \NC \luatexbanner \NC \NR +\NC \type {\luatexversion} \NC a combination of major and minor number \NC \the\luatexversion \NC \NR +\NC \type {\luatexrevision} \NC the revision number, the current value is \NC \luatexrevision \NC \NR +\stoptabulate + +The official \LUATEX\ version is defined as follows: + +\startitemize +\startitem + The major version is the integer result of \type {\luatexversion} divided by + 100. The primitive is an \quote {internal variable}, so you may need to prefix + its use with \type {\the} depending on the context. +\stopitem +\startitem + The minor version is the two-digit result of \type {\luatexversion} modulo 100. +\stopitem +\startitem + The revision is the given by \type {\luatexrevision}. This primitive expands to + a positive integer. +\stopitem +\startitem + The full version number consists of the major version, minor version and + revision, separated by dots. +\stopitem +\stopitemize + +\subsection{\type {\formatname}} + +The \type {\formatname} syntax is identical to \type {\jobname}. In \INITEX, the +expansion is empty. Otherwise, the expansion is the value that \type {\jobname} had +during the \INITEX\ run that dumped the currently loaded format. You can use this +token list to provide your own version info. + +\section{\UNICODE\ text support} + +\subsection {Extended ranges} + +Text input and output is now considered to be \UNICODE\ text, so input characters +can use the full range of \UNICODE\ ($2^{20}+2^{16}-1 = \hbox{0x10FFFF}$). Later +chapters will talk of characters and glyphs. Although these are not +interchangeable, they are closely related. During typesetting, a character is +always converted to a suitable graphic representation of that character in a +specific font. However, while processing a list of to|-|be|-|typeset nodes, its +contents may still be seen as a character. Inside \LUATEX\ there is no clear +separation between the two concepts. Because the subtype of a glyph node can be +changed in \LUA\ it is up to the user: subtypes larger than 255 indicate that +font processing has happened. + +A few primitives are affected by this, all in a similar fashion: each of them has +to accommodate for a larger range of acceptable numbers. For instance, \type +{\char} now accepts values between~0 and $1{,}114{,}111$. This should not be a +problem for well|-|behaved input files, but it could create incompatibilities for +input that would have generated an error when processed by older \TEX|-|based +engines. The affected commands with an altered initial (left of the equals sign) +or secondary (right of the equals sign) value are: \type {\char}, \type +{\lccode}, \type {\uccode}, \type {\catcode}, \type {\sfcode}, \type {\efcode}, +\type {\lpcode}, \type {\rpcode}, \type {\chardef}. + +As far as the core engine is concerned, all input and output to text files is +\UTF-8 encoded. Input files can be pre|-|processed using the \type {reader} +callback. This will be explained in a later chapter. + +Output in byte|-|sized chunks can be achieved by using characters just outside of +the valid \UNICODE\ range, starting at the value $1{,}114{,}112$ (0x110000). When +the time comes to print a character $c>=1{,}114{,}112$, \LUATEX\ will actually +print the single byte corresponding to $c$ minus 1{,}114{,}112. + +Output to the terminal uses \type {^^} notation for the lower control range +($c<32$), with the exception of \type {^^I}, \type {^^J} and \type {^^M}. These +are considered \quote {safe} and therefore printed as|-|is. You can disable +escaping with \type {texio.setescape(false)} in which case you get the normal +characters on the console. + +Normalization of the \UNICODE\ input can be handled by a macro package during +callback processing (this will be explained in \in {section} [iocallback]). + +\subsection{\type {\Uchar}} + +The expandable command \type {\Uchar} reads a number between~0 and $1{,}114{,}111$ +and expands to the associated \UNICODE\ character. + +\section{Extended tables} + +All traditional \TEX\ and \ETEX\ registers can be 16-bit numbers. The affected +commands are: + +\startfourcolumns +\starttyping +\count +\dimen +\skip +\muskip +\marks +\toks +\countdef +\dimendef +\skipdef +\muskipdef +\toksdef +\insert +\box +\unhbox +\unvbox +\copy +\unhcopy +\unvcopy +\wd +\ht +\dp +\setbox +\vsplit +\stoptyping +\stopfourcolumns + +Because font memory management has been rewritten, character properties in fonts +are no longer shared among fonts instances that originate from the same metric +file. + +\section{Attributes} + +\subsection{Attribute registers} + +Attributes are a completely new concept in \LUATEX. Syntactically, they behave a +lot like counters: attributes obey \TEX's nesting stack and can be used after +\type {\the} etc.\ just like the normal \type {\count} registers. + +\startsyntax +\attribute <16-bit number> <optional equals> <32-bit number>!crlf +\attributedef <csname> <optional equals> <16-bit number> +\stopsyntax + +Conceptually, an attribute is either \quote {set} or \quote {unset}. Unset +attributes have a special negative value to indicate that they are unset, that +value is the lowest legal value: \type {-"7FFFFFFF} in hexadecimal, a.k.a. +$-2147483647$ in decimal. It follows that the value \type {-"7FFFFFFF} cannot be +used as a legal attribute value, but you {\it can\/} assign \type {-"7FFFFFFF} to +\quote {unset} an attribute. All attributes start out in this \quote {unset} +state in \INITEX. + +Attributes can be used as extra counter values, but their usefulness comes mostly +from the fact that the numbers and values of all \quote {set} attributes are +attached to all nodes created in their scope. These can then be queried from any +\LUA\ code that deals with node processing. Further information about how to use +attributes for node list processing from \LUA\ is given in~\in {chapter}[nodes]. + +Attributes are stored in a sorted (sparse) linked list that are shared when +possible. This permits efficient testing and updating. + +\subsection{Box attributes} + +Nodes typically receive the list of attributes that is in effect when they are +created. This moment can be quite asynchronous. For example: in paragraph +building, the individual line boxes are created after the \type {\par} command has +been processed, so they will receive the list of attributes that is in effect +then, not the attributes that were in effect in, say, the first or third line of +the paragraph. + +Similar situations happen in \LUATEX\ regularly. A few of the more obvious +problematic cases are dealt with: the attributes for nodes that are created +during hyphenation, kerning and ligaturing borrow their attributes from their +surrounding glyphs, and it is possible to influence box attributes directly. + +When you assemble a box in a register, the attributes of the nodes contained in +the box are unchanged when such a box is placed, unboxed, or copied. In this +respect attributes act the same as characters that have been converted to +references to glyphs in fonts. For instance, when you use attributes to implement +color support, each node carries information about its eventual color. In that +case, unless you implement mechanisms that deal with it, applying a color to +already boxed material will have no effect. Keep in mind that this +incompatibility is mostly due to the fact that separate specials and literals are +a more unnatural approach to colors than attributes. + +It is possible to fine-tune the list of attributes that are applied to a \type +{hbox}, \type {vbox} or \type {vtop} by the use of the keyword \type {attr}. An +example: + +\starttyping +\attribute2=5 +\setbox0=\hbox {Hello} +\setbox2=\hbox attr1=12 attr2=-"7FFFFFFF{Hello} +\stoptyping + +This will set the attribute list of box~2 to $1=12$, and the attributes of box~0 +will be $2=5$. As you can see, assigning the maximum negative value causes an +attribute to be ignored. + +The \type {attr} keyword(s) should come before a \type {to} or \type {spread}, if +that is also specified. + +\section{\LUA\ related primitives} + +\subsection{\type {\directlua}} + +In order to merge \LUA\ code with \TEX\ input, a few new primitives are needed. +The primitive \type {\directlua} is used to execute \LUA\ code immediately. The +syntax is + +\startsyntax +\directlua <general text>!crlf +\directlua <16-bit number> <general text> +\stopsyntax + +The \syntax {<general text>} is expanded fully, and then fed into the \LUA\ +interpreter. After reading and expansion has been applied to the \syntax +{<general text>}, the resulting token list is converted to a string as if it was +displayed using \type {\the\toks}. On the \LUA\ side, each \type {\directlua} +block is treated as a separate chunk. In such a chunk you can use the \type +{local} directive to keep your variables from interfering with those used by the +macro package. + +The conversion to and from a token list means that you normally can not use \LUA\ +line comments (starting with \type {--}) within the argument. As there typically +will be only one \quote {line} the first line comment will run on until the end +of the input. You will either need to use \TEX|-|style line comments (starting +with \%), or change the \TEX\ category codes locally. Another possibility is to +say: + +\starttyping +\begingroup +\endlinechar=10 +\directlua ... +\endgroup +\stoptyping + +Then \LUA\ line comments can be used, since \TEX\ does not replace line endings +with spaces. + +Likewise, the \syntax {<16-bit number>} designates a name of a \LUA\ chunk and is +taken from the \type {lua.name} array (see the documentation of the \type {lua} +table further in this manual). When a chunk name starts with a \type {@} it will +be displayed as a file name. This is a side effect of the way \LUA\ implements +error handling. + +The \type {\directlua} command is expandable. Since it passes \LUA\ code to the +\LUA\ interpreter its expansion from the \TEX\ viewpoint is usually empty. +However, there are some \LUA\ functions that produce material to be read by \TEX, +the so called print functions. The most simple use of these is \type +{tex.print(<string> s)}. The characters of the string \type {s} will be placed on +the \TEX\ input buffer, that is, \quote {before \TEX's eyes} to be read by \TEX\ +immediately. For example: + +\startbuffer +\count10=20 +a\directlua{tex.print(tex.count[10]+5)}b +\stopbuffer + +\typebuffer + +expands to + +\getbuffer + +Here is another example: + +\startbuffer +$\pi = \directlua{tex.print(math.pi)}$ +\stopbuffer + +\typebuffer + +will result in + +\getbuffer + +Note that the expansion of \type {\directlua} is a sequence of characters, not of +tokens, contrary to all \TEX\ commands. So formally speaking its expansion is +null, but it places material on a pseudo-file to be immediately read by \TEX, as +\ETEX's \type {\scantokens}. For a description of print functions look at \in +{section} [sec:luaprint]. + +Because the \syntax {<general text>} is a chunk, the normal \LUA\ error handling +is triggered if there is a problem in the included code. The \LUA\ error messages +should be clear enough, but the contextual information is still pretty bad. +Often, you will only see the line number of the right brace at the end of the +code. + +While on the subject of errors: some of the things you can do inside \LUA\ code +can break up \LUATEX\ pretty bad. If you are not careful while working with the +node list interface, you may even end up with assertion errors from within the +\TEX\ portion of the executable. + +The behaviour documented in the above subsection is considered stable in the sense +that there will not be backward-incompatible changes any more. + +\subsection{\type {\latelua}} + +Contrary to \type {\directlua}, \type {\latelua} stores \LUA\ code in a whatsit +that will be processed at the time of shipping out. Its intended use is a cross +between \PDF\ literals (often available as \type {\pdfliteral}) and the +traditional \TEX\ extension \type {\write}. Within the \LUA\ code you can print +\PDF\ statements directly to the \PDF\ file via \type {pdf.print}, or you can +write to other output streams via \type {texio.write} or simply using \LUA\ \IO\ +routines. + +\startsyntax +\latelua <general text>!crlf +\latelua <16-bit number> <general text> +\stopsyntax + +Expansion of macros in the final \type {<general text>} is delayed until just +before the whatsit is executed (like in \type {\write}). With regard to \PDF\ +output stream \type {\latelua} behaves as \PDF\ page literals. The \syntax +{name <general text>} and \syntax {<16-bit number>} behave in the same way as +they do for \type {\directlua} + +\subsection{\type {\luaescapestring}} + +This primitive converts a \TEX\ token sequence so that it can be safely used as +the contents of a \LUA\ string: embedded backslashes, double and single quotes, +and newlines and carriage returns are escaped. This is done by prepending an +extra token consisting of a backslash with category code~12, and for the line +endings, converting them to \type {n} and \type {r} respectively. The token +sequence is fully expanded. + +\startsyntax +\luaescapestring <general text> +\stopsyntax + +Most often, this command is not actually the best way to deal with the +differences between the \TEX\ and \LUA. In very short bits of \LUA\ +code it is often not needed, and for longer stretches of \LUA\ code it +is easier to keep the code in a separate file and load it using \LUA's +\type {dofile}: + +\starttyping +\directlua { dofile('mysetups.lua') } +\stoptyping + +\subsection{\type {\luafunction}} + +The \type {\directlua} commands involves tokenization of its argument (after +picking up an optional name or number specification). The tokenlist is then +converted into a string and given to \LUA\ to turn into a function that is +called. The overhead is rather small but when you use this primitive hundreds of +thousands of times, it can become noticeable. For this reason there is a variant +call available: \type {\luafunction}. This command is used as follows: + +\starttyping +\directlua { + local t = lua.get_functions_table() + t[1] = function() tex.print("!") end + t[2] = function() tex.print("?") end +} + +\luafunction1 +\luafunction2 +\stoptyping + +Of course the functions can also be defined in a separate file. There is no limit +on the number of functions apart from normal \LUA\ limitations. Of course there +is the limitation of no arguments but that would involve parsing and thereby give +no gain. The function, when called in fact gets one argument, being the index, so +in the following example the number \type {8} gets typeset. + +\starttyping +\directlua { + local t = lua.get_functions_table() + t[8] = function(slot) tex.print(slot) end +} +\stoptyping + +\section {Alignments} + +\subsection{\tex {alignmark}} + +This primitive duplicates the functionality of \type {#} inside alignment +preambles. + +\subsection{\tex {aligntab}} + +This primitive duplicates the functionality of \type {&} inside alignments and +preambles. + +\section{Catcode tables} + +Catcode tables are a new feature that allows you to switch to a predefined +catcode regime in a single statement. You can have a practically unlimited number +of different tables. This subsystem is backward compatible: if you never use the +following commands, your document will not notice any difference in behaviour +compared to traditional \TEX. The contents of each catcode table is independent +from any other catcode tables, and their contents is stored and retrieved from +the format file. + +\subsection{\type {\catcodetable}} + +\startsyntax +\catcodetable <15-bit number> +\stopsyntax + +The primitive \type {\catcodetable} switches to a different catcode table. Such a +table has to be previously created using one of the two primitives below, or it +has to be zero. Table zero is initialized by \INITEX. + +\subsection{\type {\initcatcodetable}} + +\startsyntax +\initcatcodetable <15-bit number> +\stopsyntax + +The primitive \type {\initcatcodetable} creates a new table with catcodes identical +to those defined by \INITEX: + +\starttabulate[|r|l|l|l|] +\NC 0 \NC \tttf \letterbackslash \NC \NC \type {escape} \NC\NR +\NC 5 \NC \tttf \letterhat\letterhat M \NC return \NC \type {car_ret} \NC\NR +\NC 9 \NC \tttf \letterhat\letterhat @ \NC null \NC \type {ignore} \NC\NR +\NC 10 \NC \tttf <space> \NC space \NC \type {spacer} \NC\NR +\NC 11 \NC {\tttf a} \endash\ {\tttf z} \NC \NC \type {letter} \NC\NR +\NC 11 \NC {\tttf A} \endash\ {\tttf Z} \NC \NC \type {letter} \NC\NR +\NC 12 \NC everything else \NC \NC \type {other} \NC\NR +\NC 14 \NC \tttf \letterpercent \NC \NC \type {comment} \NC\NR +\NC 15 \NC \tttf \letterhat\letterhat ? \NC delete \NC \type {invalid_char} \NC\NR +\stoptabulate + +The new catcode table is allocated globally: it will not go away after the +current group has ended. If the supplied number is identical to the currently +active table, an error is raised. + +\subsection{\type {\savecatcodetable}} + +\startsyntax +\savecatcodetable <15-bit number> +\stopsyntax + +\type {\savecatcodetable} copies the current set of catcodes to a new table with +the requested number. The definitions in this new table are all treated as if +they were made in the outermost level. + +The new table is allocated globally: it will not go away after the current group +has ended. If the supplied number is the currently active table, an error is +raised. + +\section{Suppressing errors} + +\subsection{\type {\suppressfontnotfounderror}} + +\startsyntax +\suppressfontnotfounderror = 1 +\stopsyntax + +If this integer parameter is non|-|zero, then \LUATEX\ will not complain about +font metrics that are not found. Instead it will silently skip the font +assignment, making the requested csname for the font \type {\ifx} equal to \type +{\nullfont}, so that it can be tested against that without bothering the user. + +\subsection{\type {\suppresslongerror}} + +\startsyntax +\suppresslongerror = 1 +\stopsyntax + +If this integer parameter is non|-|zero, then \LUATEX\ will not complain about +\type {\par} commands encountered in contexts where that is normally prohibited +(most prominently in the arguments of non-long macros). + +\subsection{\type {\suppressifcsnameerror}} + +\startsyntax +\suppressifcsnameerror = 1 +\stopsyntax + +If this integer parameter is non|-|zero, then \LUATEX\ will not complain about +non-expandable commands appearing in the middle of a \type {\ifcsname} expansion. +Instead, it will keep getting expanded tokens from the input until it encounters +an \type {\endcsname} command. If the input expansion is unbalanced with respect +to \type {\csname} \ldots \type {\endcsname} pairs, the \LUATEX\ process may hang +indefinitely. + +\subsection{\type {\suppressoutererror}} + +\startsyntax +\suppressoutererror = 1 +\stopsyntax + +If this new integer parameter is non|-|zero, then \LUATEX\ will not complain +about \type {\outer} commands encountered in contexts where that is normally +prohibited. + +\subsection{\type {\suppressmathparerror}} + +The following setting will permit \type {\par} tokens in a math formula: + +\startsyntax +\suppressmathparerror = 1 +\stopsyntax + +So, the next code is valid then: + +\starttyping +$ x + 1 = + +a $ +\stoptyping + +\section {Math} + +\subsection{Extensions} + +We will cover math in its own chapter because not only the font subsystem and +spacing model have been enhanced (thereby introducing many new primitives) but +also because some more control has been added to existing functionality. + +\subsection{\type {\matheqnogapstep}} + +By default \TEX\ will add one quad between the equation and the number. This is +hard coded. A new primitive can control this: + +\startsyntax +\matheqnogapstep = 1000 +\stopsyntax + +Because a math quad from the math text font is used instead of a dimension, we +use a step to control the size. A value of zero will suppress the gap. The step +is divided by 1000 which is the usual way to mimmick floating point factors in +\TEX. + +\section{Fonts} + +\subsection{Font syntax} + +\LUATEX\ will accept a braced argument as a font name: + +\starttyping +\font\myfont = {cmr10} +\stoptyping + +This allows for embedded spaces, without the need for double quotes. Macro +expansion takes place inside the argument. + +\subsection{\type {\fontid}} + +\startsyntax +\fontid\font +\stopsyntax + +This primitive expands into a number. It is not a register so there is no need to +prefix with \type {\number} (and using \type {\the} gives an error). The currently +used font id is \fontid\font. Here are some more: + +\starttabulate[|l|c|] +\NC \type {\bf} \NC \bf \fontid\font \NC \NR +\NC \type {\it} \NC \it \fontid\font \NC \NR +\NC \type {\bi} \NC \bi \fontid\font \NC \NR +\stoptabulate + +These numbers depend on the macro package used because each one has its own way +of dealing with fonts. They can also differ per run, as they can depend on the +order of loading fonts. For instance, when in \CONTEXT\ virtual math \UNICODE\ +fonts are used, we can easily get over a hundred ids in use. Not all ids have to +be bound to a real font, after all it's just a number. + +\subsection{\type {\setfontid}} + +The primitive \type {\setfontid} can be used to enable a font with the given id +(which of course needs to be a valid one). + +\subsection{\type {\noligs} and \type {\nokerns}} + +These primitives prohibit ligature and kerning insertion at the time when the +initial node list is built by \LUATEX's main control loop. You can enable these +primitives when you want to do node list processing of \quote {characters}, where +\TEX's normal processing would get in the way. + +\startsyntax +\noligs <integer>!crlf +\nokerns <integer> +\stopsyntax + +These primitives can also be implemented by overloading the ligature building and +kerning functions, i.e.\ by assigning dummy functions to their associated +callbacks. Keep in mind that when you define a font (using \LUA) you can also +omit the kern and ligature tables, which has the same effect as the above. + +\subsection{\type{\nospaces}} + +This new primitive can be used to overrule the usual \type {\spaceskip} +related heuristics when a space character is seen in a text flow. The +value~\type{1} triggers no injection while \type{2} results in injection of +a zero skip. Below we see the results for four characters separated by a +space. + +\startlinecorrection +\startcombination[3*2] + {\ruledhbox to 5cm{\vtop{\hsize 10mm\nospaces=0\relax x x x x \par}\hss}} {\type {0 / hsize 10mm}} + {\ruledhbox to 5cm{\vtop{\hsize 10mm\nospaces=1\relax x x x x \par}\hss}} {\type {1 / hsize 10mm}} + {\ruledhbox to 5cm{\vtop{\hsize 10mm\nospaces=2\relax x x x x \par}\hss}} {\type {2 / hsize 10mm}} + {\ruledhbox to 5cm{\vtop{\hsize 1mm\nospaces=0\relax x x x x \par}\hss}} {\type {0 / hsize 1mm}} + {\ruledhbox to 5cm{\vtop{\hsize 1mm\nospaces=1\relax x x x x \par}\hss}} {\type {1 / hsize 1mm}} + {\ruledhbox to 5cm{\vtop{\hsize 1mm\nospaces=2\relax x x x x \par}\hss}} {\type {2 / hsize 1mm}} +\stopcombination +\stoplinecorrection + +\section{Tokens, commands and strings} + +\subsection{\type {\scantextokens}} + +The syntax of \type {\scantextokens} is identical to \type {\scantokens}. This +primitive is a slightly adapted version of \ETEX's \type {\scantokens}. The +differences are: + +\startitemize +\startitem + The last (and usually only) line does not have a \type {\endlinechar} + appended. +\stopitem +\startitem + \type {\scantextokens} never raises an EOF error, and it does not execute + \type {\everyeof} tokens. +\stopitem +\startitem + There are no \quote {\unknown\ while end of file \unknown} error tests + executed. This allows the expansion to end on a different grouping level or + while a conditional is still incomplete. +\stopitem +\stopitemize + +\subsection{\type {\toksapp}, \type {\tokspre}, \type {\etoksapp} and \type {\etokspre}} + +Instead of: + +\starttyping +\toks0\expandafter{\the\toks0 foo} +\stoptyping + +you can use: + +\starttyping +\etoksapp0{foo} +\stoptyping + +The \type {pre} variants prepend instead of append, and the \type {e} variants +expand the passed general text. + +\subsection{\type {\csstring}, \type {\begincsname} and \type {\lastnamedcs}} + +These are somewhat special. The \type {\csstring} primitive is like +\type {\string} but it omits the leading escape character. This can be +somewhat more efficient that stripping it of afterwards. + +The \type {\begincsname} primitive is like \type {\csname} but doesn't create +a relaxed equivalent when there is no such name. It is equivalent to + +\starttyping +\ifcsname foo\endcsname + \csname foo\endcsname +\fi +\stoptyping + +The advantage is that it saves a lookup (don't expect much speedup) but more +important is that it avoids using the \type {\if}. + +The \type {\lastnamedcs} is one that should be used with care. The above +example could be written as: + +\starttyping +\ifcsname foo\endcsname + \lastnamedcs +\fi +\stoptyping + +This is slightly more efficient than constructing the string twice (deep down in +\LUATEX\ this also involves some \UTF8 juggling), but probably more relevant is +that it saves a few tokens and can make code a bit more more readable. + +\subsection{\type {\clearmarks}} + +This primitive complements the \ETEX\ mark primitives and clears a mark class +completely, resetting all three connected mark texts to empty. It is an +immediate command. + +\startsyntax +\clearmarks <16-bit number> +\stopsyntax + +\subsection{\type{\letcharcode}} + +This primitive is still experimental but can be used to assign a meaning to an active +character, as in: + +\starttyping +\def\foo{bar} \letcharcode123\foo +\stoptyping + +This can be a bit nicer that using the uppercase tricks (using the property of +\type {\uppercase} that it treats active characters special). + +\section{Boxes, rules and leaders} + +\subsection{\type {\outputbox}} + +\startsyntax +\outputbox = 65535 +\stopsyntax + +This new integer parameter allows you to alter the number of the box that will be +used to store the page sent to the output routine. Its default value is 255, and +the acceptable range is from 0 to 65535. + +\subsection{\type {\vpack}, \type {\hpack} and \type {\tpack}} + +These three primitives are like \type {\vbox}, \type {\hbox} and \type {\vtop} +but don't apply the related callbacks. + +\subsection{\type {\vsplit}} + +The \type {\vsplit} primitive has to be followed by a specification of the +required height. As alternative for the \type {to} keyword you can use \type +{upto} to get a split of the given size but result has the natural dimensions +then. + +\subsection{Images and Forms} + +These two concepts are now core concepts and no longer whatsits. They are in fact +now implemented as rules with special properties. Normal rules have subtype~0, +saved boxes have subtype~1 and images have subtype~2. This has the positive side +effect that whenever we need to take content with dimensions into account, when we +look at rule nodes, we automatically also deal with these two types. + +The syntax of the \type {\save...resource} is the same as in \PDFTEX\ but you +should consider them to be backend specific. This means that a macro package +should treat them as such and check for the current output mode if applicable. +Here are the equivalents: + +\starttabulate[|l|l|] +\NC \type {\saveboxresource} \EQ \type {\pdfxform} \NC \NR +\NC \type {\saveimageresource} \EQ \type {\pdfximage} \NC \NR +\NC \type {\useboxresource} \EQ \type {\pdfrefxform} \NC \NR +\NC \type {\useimageresource} \EQ \type {\pdfrefximage} \NC \NR +\NC \type {\lastsavedboxresourceindex} \EQ \type {\pdflastxform} \NC \NR +\NC \type {\lastsavedimageresourceindex} \EQ \type {\pdflastximage} \NC \NR +\NC \type {\lastsavedimageresourcepages} \EQ \type {\pdflastximagepages} \NC \NR +\stoptabulate + +\LUATEX\ accepts optional dimension parameters for \type {\use...resource} in the +same format as for rules. With images, these dimensions are then used instead of +the ones given to \type {\useimageresource} but the original dimensions are not +overwritten, so that a \type {\useimageresource} without dimensions still +provides the image with dimensions defined by \type {\saveimageresource}. These +optional parameters are not implemented for \type {\saveboxresource}. + +\starttyping +\useimageresource width 20mm height 10mm depth 5mm \lastsavedimageresourceindex +\useboxresource width 20mm height 10mm depth 5mm \lastsavedboxresourceindex +\stoptyping + +The box resources are of course implemented in the backend and therefore we do +support the \type {attr} and \type {resources} keys that accept a token list. New +is the \type {type} key. When set to non|-|zero the \type {/Type} entry is +omitted. A value of 1 or 3 still writes a \type {/BBox}, while 2 or 3 will write +a \type {/Matrix}. + +\subsection{\type {\nohrule} and \type {\novrule}} + +Because introducing a new keyword can cause incompatibilities, two new primitives +were introduced: \type {\nohrule} and \type {\novrule}. These can be used to +reserve space. This is often more efficient than creating an empty box with fake +dimensions). + +\subsection{\type {\gleaders}} + +This type of leaders is anchored to the origin of the box to be shipped out. So +they are like normal \type {\leaders} in that they align nicely, except that the +alignment is based on the {\it largest\/} enclosing box instead of the {\it +smallest\/}. The \type {g} stresses this global nature. + +\section {Languages} + +\subsection{\type {\hyphenationmin}} + +This primitive can be used to set the minimal word length, so setting it to a value +of~$5$ means that only words of 6 characters and more will be hyphenated, of course +within the constraints of the \type {\lefthyphenmin} and \type {\righthyphenmin} +values (as stored in the glyph node). This primitive accepts a number and stores +the value with the language. + +\subsection{\type {\boundary}, \type {\noboundary}, \type {\protrusionboundary} and \type +{\wordboundary}} + +The \type {\noboundary} commands used to inject a whatsit node but now injects a normal +node with type \type {boundary} and subtype~0. In addition you can say: + +\starttyping +x\boundary 123\relax y +\stoptyping + +This has the same effect but the subtype is now~1 and the value~123 is stored. +The traditional ligature builder still sees this as a cancel boundary directive +but at the \LUA\ end you can implement different behaviour. The added benefit of +passing this value is a side effect of the generalization. The subtypes~2 and~3 +are used to control protrusion and word boundaries in hyphenation. + +\section{Control and debugging} + +\subsection {Tracing} + +If \type {\tracingonline} is larger than~2, the node list display will also print +the node number of the nodes. + +\subsection{\type {\outputmode} and \type {\draftmode}} + +The \type {\outputmode} variable tells \LUATEX\ what it has to produce: + +\starttabulate[|l|l|] +\NC \type {0} \NC \DVI\ code \NC \NR +\NC \type {1} \NC \PDF\ code \NC \NR +\stoptabulate + +The value of the \type {\draftmode} counter signals the backend if it should +output less. The \PDF\ backend accepts a value of~$1$, while the \DVI\ backend +ignores the value. + +\section {Files} + +\subsection{File syntax} + +\LUATEX\ will accept a braced argument as a file name: + +\starttyping +\input {plain} +\openin 0 {plain} +\stoptyping + +This allows for embedded spaces, without the need for double quotes. Macro +expansion takes place inside the argument. + +\subsection{Writing to file} + +You can now open upto 127 files with \type {\openout}. When no file is open +writes will go to the console and log. As a consequence a system command is +no longer possible but one can use \type {os.execute} to do the same. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luatex/luatex-fonts.tex b/doc/context/sources/general/manuals/luatex/luatex-fonts.tex new file mode 100644 index 000000000..90412ea81 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-fonts.tex @@ -0,0 +1,719 @@ +% language=uk + +\environment luatex-style +\environment luatex-logos + +\startcomponent luatex-fonts + +\startchapter[reference=fonts,title={Font structure}] + +\section {The font tables} + +All \TEX\ fonts are represented to \LUA\ code as tables, and internally as +\CCODE~structures. All keys in the table below are saved in the internal font +structure if they are present in the table returned by the \type {define_font} +callback, or if they result from the normal \TFM|/|\VF\ reading routines if there +is no \type {define_font} callback defined. + +The column \quote {\VF} means that this key will be created by the \type +{font.read_vf()} routine, \quote {\TFM} means that the key will be created by the +\type {font.read_tfm()} routine, and \quote{used} means whether or not the +\LUATEX\ engine itself will do something with the key. + +The top|-|level keys in the table are as follows: + +\starttabulate[|Tl|c|c|c|l|p|] +\NC \rmbf key \NC \bf vf \NC \bf tfm \NC \bf used \NC \bf value type \NC \bf description \NC \NR +\NC name \NC yes \NC yes \NC yes \NC string \NC metric (file) name \NC \NR +\NC area \NC no \NC yes \NC yes \NC string \NC (directory) location, typically empty \NC \NR +\NC used \NC no \NC yes \NC yes \NC boolean\NC indicates usage (initial: false) \NC \NR +\NC characters \NC yes \NC yes \NC yes \NC table \NC the defined glyphs of this font \NC \NR +\NC checksum \NC yes \NC yes \NC no \NC number \NC default: 0 \NC \NR +\NC designsize \NC no \NC yes \NC yes \NC number \NC expected size (default: 655360 == 10pt) \NC \NR +\NC direction \NC no \NC yes \NC yes \NC number \NC default: 0 \NC \NR +\NC encodingbytes \NC no \NC no \NC yes \NC number \NC default: depends on \type {format} \NC \NR +\NC encodingname \NC no \NC no \NC yes \NC string \NC encoding name \NC \NR +\NC fonts \NC yes \NC no \NC yes \NC table \NC locally used fonts \NC \NR +\NC psname \NC no \NC no \NC yes \NC string \NC This is the \POSTSCRIPT\ fontname in the incoming font + source, and it's used as fontname identifier in the \PDF\ + output. This has to be a valid string, e.g.\ no spaces + and such, as the backend will not do a cleanup. This gives + complete control to the loader. \NC \NR +\NC fullname \NC no \NC no \NC yes \NC string \NC output font name, used as a fallback in the \PDF\ output + if the \type {psname} is not set \NC \NR +\NC header \NC yes \NC no \NC no \NC string \NC header comments, if any \NC \NR +\NC hyphenchar \NC no \NC no \NC yes \NC number \NC default: \TEX's \type {\hyphenchar} \NC \NR +\NC parameters \NC no \NC yes \NC yes \NC hash \NC default: 7 parameters, all zero \NC \NR +\NC size \NC no \NC yes \NC yes \NC number \NC loaded (at) size. (default: same as designsize) \NC \NR +\NC skewchar \NC no \NC no \NC yes \NC number \NC default: \TEX's \type {\skewchar} \NC \NR +\NC type \NC yes \NC no \NC yes \NC string \NC basic type of this font \NC \NR +\NC format \NC no \NC no \NC yes \NC string \NC disk format type \NC \NR +\NC embedding \NC no \NC no \NC yes \NC string \NC \PDF\ inclusion \NC \NR +\NC filename \NC no \NC no \NC yes \NC string \NC the name of the font on disk \NC \NR +\NC tounicode \NC no \NC yes \NC yes \NC number \NC When this is set to~1 \LUATEX\ assumes per|-|glyph + tounicode entries are present in the font. \NC \NR +\NC stretch \NC no \NC no \NC yes \NC number \NC the \quote {stretch} value from \type + {\expandglyphsinfont} \NC \NR +\NC shrink \NC no \NC no \NC yes \NC number \NC the \quote {shrink} value from \type + {\expandglyphsinfont} \NC \NR +\NC step \NC no \NC no \NC yes \NC number \NC the \quote {step} value from \type + {\expandglyphsinfont} \NC \NR +\NC auto_expand \NC no \NC no \NC yes \NC boolean\NC the \quote {autoexpand} keyword from \crlf + \type {\expandglyphsinfont} \NC \NR +\NC expansion_factor \NC no \NC no \NC no \NC number \NC the actual expansion factor of an expanded font \NC \NR +\NC attributes \NC no \NC no \NC yes \NC string \NC the \type {\pdffontattr} \NC \NR +\NC cache \NC no \NC no \NC yes \NC string \NC This key controls caching of the \LUA\ table on the + \TEX\ end where \type {yes} means: use a reference to + the table that is passed to \LUATEX\ (this is the + default), and no \type {no} means: don't store the + table reference, don't cache any \LUA\ data for this + font while \type {renew} means: don't store the table + reference, but save a reference to the table that is + created at the first access to one of its fields in font. + Note: the saved reference is thread|-|local, so be + careful when you are using coroutines: an error will be + thrown if the table has been cached in one thread, but + you reference it from another thread. \NC \NR +\NC nomath \NC no \NC no \NC yes \NC boolean\NC This key allows a minor speedup for text fonts. If it + is present and true, then \LUATEX\ will not check the + character entries for math|-|specific keys. \NC \NR +\NC slant \NC no \NC no \NC yes \NC number \NC This has the same semantics as the \type {SlantFont} + operator in font map files. \NC \NR +\NC extent \NC no \NC no \NC yes \NC number \NC This has the same semantics as the \type {ExtendFont} + operator in font map files. \NC \NR +\stoptabulate + +The key \type {name} is always required. The keys \type {stretch}, \type +{shrink}, \type {step} and optionally \type {auto_expand} only have meaning when +used together: they can be used to replace a post|-|loading \type +{\expandglyphsinfont} command. The \type {expansion_factor} is value that can be +present inside a font in \type {font.fonts}. It is the actual expansion factor (a +value between \type {-shrink} and \type {stretch}, with step \type {step}) of a +font that was automatically generated by the font expansion algorithm. The key +\type {attributes} can be used to set font attributes in the \PDF\ file. The key +\type {used} is set by the engine when a font is actively in use, this makes sure +that the font's definition is written to the output file (\DVI\ or \PDF). The +\TFM\ reader sets it to false. The \type {direction} is a number signalling the +\quote {normal} direction for this font. There are sixteen possibilities: + +\starttabulate[|Tc|Tc|Tc|Tc|] +\NC \rmbf number \NC \rmbf meaning \NC \rmbf number \NC \rmbf meaning \NC\NR +\NC 0 \NC LT \NC 8 \NC TT \NC\NR +\NC 1 \NC LL \NC 9 \NC TL \NC\NR +\NC 2 \NC LB \NC 10 \NC TB \NC\NR +\NC 3 \NC LR \NC 11 \NC TR \NC\NR +\NC 4 \NC RT \NC 12 \NC BT \NC\NR +\NC 5 \NC RL \NC 13 \NC BL \NC\NR +\NC 6 \NC RB \NC 14 \NC BB \NC\NR +\NC 7 \NC RR \NC 15 \NC BR \NC\NR +\stoptabulate + +These are \OMEGA|-|style direction abbreviations: the first character indicates +the \quote {first} edge of the character glyphs (the edge that is seen first in +the writing direction), the second the \quote {top} side. Keep in mind that +\LUATEX\ has a bit different directional model so these values are not used for +anything. + +The \type {parameters} is a hash with mixed key types. There are seven possible +string keys, as well as a number of integer indices (these start from 8 up). The +seven strings are actually used instead of the bottom seven indices, because that +gives a nicer user interface. + +The names and their internal remapping are: + +\starttabulate[|lT|c|] +\NC \rmbf name \NC \rmbf remapping \NC\NR +\NC slant \NC 1 \NC\NR +\NC space \NC 2 \NC\NR +\NC space_stretch \NC 3 \NC\NR +\NC space_shrink \NC 4 \NC\NR +\NC x_height \NC 5 \NC\NR +\NC quad \NC 6 \NC\NR +\NC extra_space \NC 7 \NC\LR +\stoptabulate + +The keys \type {type}, \type {format}, \type {embedding}, \type {fullname} and +\type {filename} are used to embed \OPENTYPE\ fonts in the result \PDF. + +The \type {characters} table is a list of character hashes indexed by an integer +number. The number is the \quote {internal code} \TEX\ knows this character by. + +Two very special string indexes can be used also: \type {left_boundary} is a +virtual character whose ligatures and kerns are used to handle word boundary +processing. \type {right_boundary} is similar but not actually used for anything +(yet). + +Other index keys are ignored. + +Each character hash itself is a hash. For example, here is the character \quote +{f} (decimal 102) in the font \type {cmr10 at 10pt}: + +\starttyping +[102] = { + ['width'] = 200250, + ['height'] = 455111, + ['depth'] = 0, + ['italic'] = 50973, + ['kerns'] = { + [63] = 50973, + [93] = 50973, + [39] = 50973, + [33] = 50973, + [41] = 50973 + }, + ['ligatures'] = { + [102] = { + ['char'] = 11, + ['type'] = 0 + }, + [108] = { + ['char'] = 13, + ['type'] = 0 + }, + [105] = { + ['char'] = 12, + ['type'] = 0 + } + } +} +\stoptyping + +The following top|-|level keys can be present inside a character hash: + +\starttabulate[|lT|c|c|c|l|p|] +\NC \rmbf key \NC \bf vf \NC \bf tfm \NC \bf used \NC \bf type \NC \bf description \NC\NR +\NC width \NC yes \NC yes \NC yes \NC number \NC character's width, in sp (default 0) \NC\NR +\NC height \NC no \NC yes \NC yes \NC number \NC character's height, in sp (default 0) \NC\NR +\NC depth \NC no \NC yes \NC yes \NC number \NC character's depth, in sp (default 0) \NC\NR +\NC italic \NC no \NC yes \NC yes \NC number \NC character's italic correction, in sp (default zero) \NC\NR +\NC top_accent \NC no \NC no \NC maybe \NC number \NC character's top accent alignment place, in sp (default zero) \NC\NR +\NC bot_accent \NC no \NC no \NC maybe \NC number \NC character's bottom accent alignment place, in sp (default zero) \NC\NR +\NC left_protruding \NC no \NC no \NC maybe \NC number \NC character's \type {\lpcode} \NC\NR +\NC right_protruding \NC no \NC no \NC maybe \NC number \NC character's \type {\rpcode} \NC\NR +\NC expansion_factor \NC no \NC no \NC maybe \NC number \NC character's \type {\efcode} \NC\NR +\NC tounicode \NC no \NC no \NC maybe \NC string \NC character's \UNICODE\ equivalent(s), in \UTF|-|16BE hexadecimal format \NC\NR +\NC next \NC no \NC yes \NC yes \NC number \NC the \quote {next larger} character index \NC\NR +\NC extensible \NC no \NC yes \NC yes \NC table \NC the constituent parts of an extensible recipe \NC\NR +\NC vert_variants \NC no \NC no \NC yes \NC table \NC constituent parts of a vertical variant set \NC \NR +\NC horiz_variants \NC no \NC no \NC yes \NC table \NC constituent parts of a horizontal variant set \NC \NR +\NC kerns \NC no \NC yes \NC yes \NC table \NC kerning information \NC\NR +\NC ligatures \NC no \NC yes \NC yes \NC table \NC ligaturing information \NC\NR +\NC commands \NC yes \NC no \NC yes \NC array \NC virtual font commands \NC\NR +\NC name \NC no \NC no \NC no \NC string \NC the character (\POSTSCRIPT) name \NC\NR +\NC index \NC no \NC no \NC yes \NC number \NC the (\OPENTYPE\ or \TRUETYPE) font glyph index \NC\NR +\NC used \NC no \NC yes \NC yes \NC boolean \NC typeset already (default: false)? \NC\NR +\NC mathkern \NC no \NC no \NC yes \NC table \NC math cut-in specifications \NC\NR +\stoptabulate + +The values of \type {top_accent}, \type {bot_accent} and \type {mathkern} are +used only for math accent and superscript placement, see the \at {math chapter} +[math] in this manual for details. + +The values of \type {left_protruding} and \type {right_protruding} are used only +when \type {\protrudechars} is non-zero. + +Whether or not \type {expansion_factor} is used depends on the font's global +expansion settings, as well as on the value of \type {\adjustspacing}. + +The usage of \type {tounicode} is this: if this font specifies a \type +{tounicode=1} at the top level, then \LUATEX\ will construct a \type {/ToUnicode} +entry for the \PDF\ font (or font subset) based on the character|-|level \type +{tounicode} strings, where they are available. If a character does not have a +sensible \UNICODE\ equivalent, do not provide a string either (no empty strings). + +If the font level \type {tounicode} is not set, then \LUATEX\ will build up \type +{/ToUnicode} based on the \TEX\ code points you used, and any character-level +\type {tounicodes} will be ignored. The string format is exactly the format that +is expected by Adobe \CMAP\ files (\UTF-16BE in hexadecimal encoding), minus the +enclosing angle brackets. For instance the \type {tounicode} for a \type {fi} +ligature would be \type {00660069}. When you pass a number the conversion will be +done for you. + +The presence of \type {extensible} will overrule \type {next}, if that is also +present. It in in turn can be overruled by \type {vert_variants}. + +The \type {extensible} table is very simple: + +\starttabulate[|lT|l|p|] +\NC \rmbf key \NC \bf type \NC \bf description \NC\NR +\NC top \NC number \NC top character index \NC\NR +\NC mid \NC number \NC middle character index \NC\NR +\NC bot \NC number \NC bottom character index \NC\NR +\NC rep \NC number \NC repeatable character index \NC\NR +\stoptabulate + +The \type {horiz_variants} and \type {vert_variants} are arrays of components. +Each of those components is itself a hash of up to five keys: + +\starttabulate[|lT|l|p|] +\NC \rmbf key \NC \bf type \NC \bf explanation \NC\NR +\NC glyph \NC number \NC The character index. Note that this is an encoding number, not a name. \NC \NR +\NC extender \NC number \NC One (1) if this part is repeatable, zero (0) otherwise. \NC \NR +\NC start \NC number \NC The maximum overlap at the starting side (in scaled points). \NC \NR +\NC end \NC number \NC The maximum overlap at the ending side (in scaled points). \NC \NR +\NC advance \NC number \NC The total advance width of this item. It can be zero or missing, + then the natural size of the glyph for character \type {component} + is used. \NC \NR +\stoptabulate + +The \type {kerns} table is a hash indexed by character index (and \quote +{character index} is defined as either a non|-|negative integer or the string +value \type {right_boundary}), with the values the kerning to be applied, in +scaled points. + +The \type {ligatures} table is a hash indexed by character index (and \quote +{character index} is defined as either a non|-|negative integer or the string +value \type {right_boundary}), with the values being yet another small hash, with +two fields: + +\starttabulate[|lT|l|p|] +\NC \rmbf key \NC \bf type \NC \bf description \NC \NR +\NC type \NC number \NC the type of this ligature command, default 0 \NC \NR +\NC char \NC number \NC the character index of the resultant ligature \NC \NR +\stoptabulate + +The \type {char} field in a ligature is required. + +The \type {type} field inside a ligature is the numerical or string value of one +of the eight possible ligature types supported by \TEX. When \TEX\ inserts a new +ligature, it puts the new glyph in the middle of the left and right glyphs. The +original left and right glyphs can optionally be retained, and when at least one +of them is kept, it is also possible to move the new \quote {insertion point} +forward one or two places. The glyph that ends up to the right of the insertion +point will become the next \quote {left}. + +\starttabulate[|l|c|l|l|] +\NC \bf textual (Knuth) \NC \bf number \NC \bf string \NC result \NC\NR +\NC \type{l + r =: n} \NC 0 \NC \type{=:} \NC \type{|n} \NC\NR +\NC \type{l + r =:| n} \NC 1 \NC \type{=:|} \NC \type{|nr} \NC\NR +\NC \type{l + r |=: n} \NC 2 \NC \type{|=:} \NC \type{|ln} \NC\NR +\NC \type{l + r |=:| n} \NC 3 \NC \type{|=:|} \NC \type{|lnr} \NC\NR +\NC \type{l + r =:|> n} \NC 5 \NC \type{=:|>} \NC \type{n|r} \NC\NR +\NC \type{l + r |=:> n} \NC 6 \NC \type{|=:>} \NC \type{l|n} \NC\NR +\NC \type{l + r |=:|> n} \NC 7 \NC \type{|=:|>} \NC \type{l|nr} \NC\NR +\NC \type{l + r |=:|>> n} \NC 11 \NC \type{|=:|>>} \NC \type{ln|r} \NC\NR +\stoptabulate + +The default value is~0, and can be left out. That signifies a \quote {normal} +ligature where the ligature replaces both original glyphs. In this table the~\type {|} +indicates the final insertion point. + +The \type {commands} array is explained below. + +\section {Real fonts} + +Whether or not a \TEX\ font is a \quote {real} font that should be written to the +\PDF\ document is decided by the \type {type} value in the top|-|level font +structure. If the value is \type {real}, then this is a proper font, and the +inclusion mechanism will attempt to add the needed font object definitions to the +\PDF. Values for \type {type} are: + +\starttabulate[|Tl|p|] +\NC \rmbf value \NC \rmbf description \NC\NR +\NC real \NC this is a base font \NC\NR +\NC virtual \NC this is a virtual font \NC\NR +\stoptabulate + +The actions to be taken depend on a number of different variables: + +\startitemize[packed] +\startitem + Whether the used font fits in an 8-bit encoding scheme or not. +\stopitem +\startitem + The type of the disk font file. +\stopitem +\startitem + The level of embedding requested. +\stopitem +\stopitemize + +A font that uses anything other than an 8-bit encoding vector has to be written +to the \PDF\ in a different way. + +The rule is: if the font table has \type {encodingbytes} set to~2, then this is a +wide font, in all other cases it isn't. The value~2 is the default for \OPENTYPE\ +and \TRUETYPE\ fonts loaded via \LUA. For \TYPEONE\ fonts, you have to set \type +{encodingbytes} to~2 explicitly. For \PK\ bitmap fonts, wide font encoding is not +supported at all. + +If no special care is needed, \LUATEX\ currently falls back to the +mapfile|-|based solution used by \PDFTEX\ and \DVIPS. This behaviour might +silently be removed in the future, in which case the related primitives and \LUA\ +functions will become no|-|ops. + +If a \quote {wide} font is used, the new subsystem kicks in, and some +extra fields have to be present in the font structure. In this case, \LUATEX\ +does not use a map file at all. + +The extra fields are: \type {format}, \type {embedding}, \type {fullname}, \type +{cidinfo} (as explained above), \type {filename}, and the \type {index} key in +the separate characters. + +Values for \type {format} are: + +\starttabulate[|Tl|p|] +\NC \rmbf value \NC \rmbf description \NC \NR +\NC type1 \NC this is a \POSTSCRIPT\ \TYPEONE\ font \NC \NR +\NC type3 \NC this is a bitmapped (\PK) font \NC \NR +\NC truetype \NC this is a \TRUETYPE\ or \TRUETYPE|-|based \OPENTYPE\ font \NC \NR +\NC opentype \NC this is a \POSTSCRIPT|-|based \OPENTYPE\ font \NC \NR +\stoptabulate + +\type {type3} fonts are provided for backward compatibility only, and do not +support the new wide encoding options. + +Values for \type {embedding} are: + +\starttabulate[|Tl|p|] +\NC \rmbf value \NC \rmbf description \NC \NR +\NC no \NC don't embed the font at all \NC \NR +\NC subset \NC include and atttempt to subset the font \NC \NR +\NC full \NC include this font in its entirety \NC \NR +\stoptabulate + +The other fields are used as follows: The \type {fullname} will be the +\POSTSCRIPT|/|\PDF\ font name. The \type {cidinfo} will be used as the character +set (the CID \type {/Ordering} and \type {/Registry} keys). The \type {filename} +points to the actual font file. If you include the full path in the \type +{filename} or if the file is in the local directory, \LUATEX\ will run a little +bit more efficient because it will not have to re|-|run the \type {find_xxx_file} +callback in that case. + +Be careful: when mixing old and new fonts in one document, it is possible to +create \POSTSCRIPT\ name clashes that can result in printing errors. When this +happens, you have to change the \type {fullname} of the font. + +Typeset strings are written out in a wide format using 2~bytes per glyph, using +the \type {index} key in the character information as value. The overall effect +is like having an encoding based on numbers instead of traditional (\POSTSCRIPT) +name|-|based reencoding. The way to get the correct \type {index} numbers for +\TYPEONE\ fonts is by loading the font via \type {fontloader.open} and use the table +indices as \type {index} fields. + +In order to make sure that cut and paste of the final document works okay you can +best make sure that there is a \type {tounicode} vector enforced. + +\section[virtualfonts]{Virtual fonts} + +\subsection{The structure} + +You have to take the following steps if you want \LUATEX\ to treat the returned +table from \type {define_font} as a virtual font: + +\startitemize[packed] +\startitem + Set the top|-|level key \type {type} to \type {virtual}. +\stopitem +\startitem + Make sure there is at least one valid entry in \type {fonts} (see below). +\stopitem +\startitem + Give a \type {commands} array to every character (see below). +\stopitem +\stopitemize + +The presence of the toplevel \type {type} key with the specific value \type +{virtual} will trigger handling of the rest of the special virtual font fields in +the table, but the mere existence of 'type' is enough to prevent \LUATEX\ from +looking for a virtual font on its own. + +Therefore, this also works \quote {in reverse}: if you are absolutely certain +that a font is not a virtual font, assigning the value \type {base} or \type +{real} to \type {type} will inhibit \LUATEX\ from looking for a virtual font +file, thereby saving you a disk search. + +The \type {fonts} is another \LUA\ array. The values are one- or two|-|key +hashes themselves, each entry indicating one of the base fonts in a virtual font. +In case your font is referring to itself, you can use the \type {font.nextid()} +function which returns the index of the next to be defined font which is probably +the currently defined one. + +An example makes this easy to understand + +\starttyping +fonts = { + { name = 'ptmr8a', size = 655360 }, + { name = 'psyr', size = 600000 }, + { id = 38 } +} +\stoptyping + +says that the first referenced font (index 1) in this virtual font is \type +{ptrmr8a} loaded at 10pt, and the second is \type {psyr} loaded at a little over +9pt. The third one is previously defined font that is known to \LUATEX\ as font id +\quote {38}. + +The array index numbers are used by the character command definitions that are +part of each character. + +The \type {commands} array is a hash where each item is another small array, +with the first entry representing a command and the extra items being the +parameters to that command. The allowed commands and their arguments are: + +\starttabulate[|Tl|l|l|p|] +\NC \rmbf command name \NC \bf arguments \NC \bf type \NC \bf description \NC\NR +\NC font \NC 1 \NC number \NC select a new font from the local \type {fonts} table\NC\NR +\NC char \NC 1 \NC number \NC typeset this character number from the current font, + and move right by the character's width\NC\NR +\NC node \NC 1 \NC node \NC output this node (list), and move right + by the width of this list\NC\NR +\NC slot \NC 2 \NC number \NC a shortcut for the combination of a font and char command\NC\NR +\NC push \NC 0 \NC \NC save current position\NC\NR +\NC nop \NC 0 \NC \NC do nothing \NC\NR +\NC pop \NC 0 \NC \NC pop position \NC\NR +\NC rule \NC 2 \NC 2 numbers \NC output a rule $ht*wd$, and move right.\NC\NR +\NC down \NC 1 \NC number \NC move down on the page\NC\NR +\NC right \NC 1 \NC number \NC move right on the page\NC\NR +\NC special \NC 1 \NC string \NC output a \type {\special} command\NC\NR +\NC lua \NC 1 \NC string \NC execute a \LUA\ script (at \type {\latelua} time)\NC\NR +\NC image \NC 1 \NC image \NC output an image (the argument can be either an \type + {<image>} variable or an \type {image_spec} table)\NC\NR +\NC comment \NC any \NC any \NC the arguments of this command are ignored\NC\NR +\stoptabulate + +When a font id is set to~0 then it will be replaced by the currently assigned +font id. This prevents the need for hackery with future id's (normally one could +use \type {font.nextid} but when more complex fonts are built in the meantime +other instances could have been loaded. + +Here is a rather elaborate glyph commands example: + +\starttyping +... +commands = { + { 'push' }, -- remember where we are + { 'right', 5000 }, -- move right about 0.08pt + { 'font', 3 }, -- select the fonts[3] entry + { 'char', 97 }, -- place character 97 (ASCII 'a') + { 'pop' }, -- go all the way back + { 'down', -200000 }, -- move upwards by about 3pt + { 'special', 'pdf: 1 0 0 rg' } -- switch to red color + { 'rule', 500000, 20000 } -- draw a bar + { 'special','pdf: 0 g' } -- back to black +} +... +\stoptyping + +The default value for \type {font} is always~1 at the start of the +\type {commands} array. Therefore, if the virtual font is essentially only a +re|-|encoding, then you do usually not have create an explicit \quote {font} +command in the array. + +Rules inside of \type {commands} arrays are built up using only two dimensions: +they do not have depth. For correct vertical placement, an extra \type {down} +command may be needed. + +Regardless of the amount of movement you create within the \type {commands}, the +output pointer will always move by exactly the width that was given in the \type +{width} key of the character hash. Any movements that take place inside the \type +{commands} array are ignored on the upper level. + +\subsection{Artificial fonts} + +Even in a \quote {real} font, there can be virtual characters. When \LUATEX\ +encounters a \type {commands} field inside a character when it becomes time to +typeset the character, it will interpret the commands, just like for a true +virtual character. In this case, if you have created no \quote {fonts} array, +then the default (and only) \quote {base} font is taken to be the current font +itself. In practice, this means that you can create virtual duplicates of +existing characters which is useful if you want to create composite characters. + +Note: this feature does {\it not\/} work the other way around. There can not be +\quote {real} characters in a virtual font! You cannot use this technique for +font re-encoding either; you need a truly virtual font for that (because +characters that are already present cannot be altered). + +\subsection{Example virtual font} + +Finally, here is a plain \TEX\ input file with a virtual font demonstration: + +\startbuffer +\directlua { + callback.register('define_font', + function (name,size) + if name == 'cmr10-red' then + f = font.read_tfm('cmr10',size) + f.name = 'cmr10-red' + f.type = 'virtual' + f.fonts = {{ name = 'cmr10', size = size }} + for i,v in pairs(f.characters) do + if (string.char(i)):find('[tacohanshartmut]') then + v.commands = { + {'special','pdf: 1 0 0 rg'}, + {'char',i}, + {'special','pdf: 0 g'}, + } + else + v.commands = {{'char',i}} + end + end + else + f = font.read_tfm(name,size) + end + return f + end + ) +} + +\font\myfont = cmr10-red at 10pt \myfont This is a line of text \par +\font\myfontx= cmr10 at 10pt \myfontx Here is another line of text \par +\stopbuffer + +\typebuffer + +\section{The \type {font} library} + +The font library provides the interface into the internals of the font system, +and also it contains helper functions to load traditional \TEX\ font metrics +formats. Other font loading functionality is provided by the \type {fontloader} +library that will be discussed in the next section. + +\subsection{Loading a \TFM\ file} + +The behavior documented in this subsection is considered stable in the sense that +there will not be backward-incompatible changes any more. + +\startfunctioncall +<table> fnt = + font.read_tfm(<string> name, <number> s) +\stopfunctioncall + +The number is a bit special: + +\startitemize +\startitem + If it is positive, it specifies an \quote {at size} in scaled points. +\stopitem +\startitem + If it is negative, its absolute value represents a \quote {scaled} + setting relative to the designsize of the font. +\stopitem +\stopitemize + +The internal structure of the metrics font table that is returned is explained in +\in {chapter} [fonts]. + +\subsection{Loading a \VF\ file} + +The behavior documented in this subsection is considered stable in the sense that +there will not be backward-incompatible changes any more. + +\startfunctioncall +<table> vf_fnt = + font.read_vf(<string> name, <number> s) +\stopfunctioncall + +The meaning of the number \type {s} and the format of the returned table are +similar to the ones in the \type {read_tfm()} function. + +\subsection{The fonts array} + +The whole table of \TEX\ fonts is accessible from \LUA\ using a virtual array. + +\starttyping +font.fonts[n] = { ... } +<table> f = font.fonts[n] +\stoptyping + +See \in {chapter} [fonts] for the structure of the tables. Because this is a +virtual array, you cannot call \type {pairs} on it, but see below for the \type +{font.each} iterator. + +The two metatable functions implementing the virtual array are: + +\startfunctioncall +<table> f = font.getfont(<number> n) +font.setfont(<number> n, <table> f) +\stopfunctioncall + +Note that at the moment, each access to the \type {font.fonts} or call to \type +{font.getfont} creates a \LUA\ table for the whole font. This process can be quite +slow. In a later version of \LUATEX, this interface will change (it will start +using userdata objects instead of actual tables). + +Also note the following: assignments can only be made to fonts that have already +been defined in \TEX, but have not been accessed {\it at all\/} since that +definition. This limits the usability of the write access to \type {font.fonts} +quite a lot, a less stringent ruleset will likely be implemented later. + +\subsection{Checking a font's status} + +You can test for the status of a font by calling this function: + +\startfunctioncall +<boolean> f = + font.frozen(<number> n) +\stopfunctioncall + +The return value is one of \type {true} (unassignable), \type {false} (can be +changed) or \type {nil} (not a valid font at all). + +\subsection{Defining a font directly} + +You can define your own font into \type {font.fonts} by calling this function: + +\startfunctioncall +<number> i = + font.define(<table> f) +\stopfunctioncall + +The return value is the internal id number of the defined font (the index into +\type {font.fonts}). If the font creation fails, an error is raised. The table +is a font structure, as explained in \in {chapter} [fonts]. + +\subsection{Projected next font id} + +\startfunctioncall +<number> i = + font.nextid() +\stopfunctioncall + +This returns the font id number that would be returned by a \type {font.define} +call if it was executed at this spot in the code flow. This is useful for virtual +fonts that need to reference themselves. + +\subsection{Font id} + +\startfunctioncall +<number> i = + font.id(<string> csname) +\stopfunctioncall + +This returns the font id associated with \type {csname} string, or $-1$ if \type +{csname} is not defined. + +\subsection{Currently active font} + +\startfunctioncall +<number> i = font.current() +font.current(<number> i) +\stopfunctioncall + +This gets or sets the currently used font number. + +\subsection{Maximum font id} + +\startfunctioncall +<number> i = + font.max() +\stopfunctioncall + +This is the largest used index in \type {font.fonts}. + +\subsection{Iterating over all fonts} + +\startfunctioncall +for i,v in font.each() do + ... +end +\stopfunctioncall + +This is an iterator over each of the defined \TEX\ fonts. The first returned +value is the index in \type {font.fonts}, the second the font itself, as a \LUA\ +table. The indices are listed incrementally, but they do not always form an array +of consecutive numbers: in some cases there can be holes in the sequence. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luatex/luatex-introduction.tex b/doc/context/sources/general/manuals/luatex/luatex-introduction.tex new file mode 100644 index 000000000..8ab8b4463 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-introduction.tex @@ -0,0 +1,121 @@ +% language=uk + +\environment luatex-style +\environment luatex-logos + +\startcomponent luatex-introduction + +\startchapter[title=Introduction] + +This is the reference manual of \LUATEX. We don't claim it is complete and we +assume that the reader knows about \TEX\ as described in \quotation {The \TEX\ +Book}, the \quotation {\ETEX\ manual}, the \quotation {\PDFTEX\ manual}, etc. +Additional reference material is published in journals of user groups and +\CONTEXT\ related documentation. + +It took about a decade to reach stable version 1.0, but for good reason. +Successive versions brought new functionality, more control, some cleanup of +internals and experimental features evolved into stable ones or were dropped. +Already quite early \LUATEX\ could be used for production and it was used on a +daily basis by the authors. Successive versions sometimes demanded a adaption to +the \LUA\ interfacing, but the concepts were unchanged. The current version can +be considered stable in functionality and there will be no fundamental changes. +Of course we then can decide to move towards version 2.00 with different +properties. + +Don't expect \LUATEX\ to behave the same as \PDFTEX ! Although the core +functionality of that 8 bit engine was starting point, it has been combined with +the directional support of \OMEGA\ (\ALEPH). But, \LUATEX\ can behave different +due to its wide (32 bit) characters, many registers and large memory support. +There is native \UTF\ input, support for large (more that 8 bit) fonts, and the +math machinery is tuned for \OPENTYPE\ math. There is support for directional +typesetting too. The log output can differ from other engines and will likely +differ more as we move forward. When you run plain \TEX\ for sure \LUATEX\ runs +slower than \PDFTEX\ but when you run for instance \CONTEXT\ \MKIV\ in many cases +it runs faster, especially when you have a bit more complex documents or input. +Anyway, 32 bit all||over combined with more features has a price, but on a modern +machine this is no real problem. + +Testing is done with \CONTEXT, but \LUATEX\ should work fine with other macro +packages too. For that purpose we provide generic font handlers that are mostly +the same as used in \CONTEXT. Discussing specific implementations is beyond this +manual. Even when we keep \LUATEX\ lean and mean, we already have enough to +discuss here. + +\LUATEX\ consists of a number of interrelated but (still) distinguishable parts. +The organization of the source code is adapted so that it can glue all these +components together. We continue cleaning up side effects of the accumulated +code in \TEX\ engines (especially code that is not needed any longer). + +\startitemize[packed] + \startitem + Most of \PDFTEX\ version 1.40.9, converted to \CCODE. Some experimental + features have been removed and some utility macros are not inherited as + their functionality can be done in \LUA. The number of backend interface + commands has been reduced to a few. The extensions are separated from the + core (which we keep close to the original \TEX\ core). Some mechanisms + like expansion and protrusion can behave different from the original due + to some cleanup and optimization. Some whatsit based functionality (image + support and reusable content) is now core functionality. + \stopitem + \startitem + The direction model and some other bits from \ALEPH\ RC4 (derived from + \OMEGA) is included. The related primitives are part of core \LUATEX\ but + at the node level directional support is no longer based on so called + whatsits but on real nodes. In fact, whatsits are now only used for + backend specific extensions. + \stopitem + \startitem + Neither \ALEPH's I/O translation processes, nor tcx files, nor \ENCTEX\ + can be used, these encoding|-|related functions are superseded by a + \LUA|-|based solution (reader callbacks). In a similar fashion all file + \IO\ can be intercepted. + \stopitem + \startitem + We currently use \LUA\ 5.2.*. At some point we might decide to move to + 5.3.* but that is yet to be decided. There are few \LUA\ libraries that + we consider part of the core \LUA\ machinery, for instance \type {lpeg}. + There are additional \LUA\ libraries that interface to the internals of + \TEX. + \stopitem + \startitem + There are various \TEX\ extensions but only those that cannot be done + using the \LUA\ interfaces. The math machinery often has two code paths: + one traditional and the other more suitable for wide \OPENTYPE\ fonts. + \stopitem + \startitem + The fontloader uses parts of \FONTFORGE\ 2008.11.17 combined with + additional code specific for usage in a \TEX\ engine. We try to minimize + specific font support to what \TEX\ needs: character references and + dimensions and delegate everything else to \LUA. That way we keep \TEX\ + open for extensions without touching the core. + \stopitem + \startitem + The \METAPOST\ library is integral part of \LUATEX. This gives \TEX\ some + graphical capabilities using a relative high speed graphical subsystem. + Again \LUA\ is used as glue between the frontend and backend. Further + development of \METAPOST\ is closely related to \LUATEX. + \stopitem +\stopitemize + +The \TEXLIVE\ version is to be considered the current stable version. Any version +between the yearly \TEXLIVE\ releases are to be considered beta. The beta +releases are normally available via the \CONTEXT\ distribution channels (the +garden and so called minimals). + +\blank[1*big] + +Hans Hagen, Harmut Henkel, \crlf +Taco Hoekwater \& Luigi Scarso + +\blank[3*big] + +\starttabulate +\NC Version \EQ \currentdate \NC \NR +\NC \LUATEX \EQ Snapshot \number\luatexversion.\luatexrevision \NC \NR +\NC \CONTEXT \EQ \contextversion \NC \NR +\stoptabulate + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luatex/luatex-languages.tex b/doc/context/sources/general/manuals/luatex/luatex-languages.tex new file mode 100644 index 000000000..ad7b7b9d6 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-languages.tex @@ -0,0 +1,770 @@ +% language=uk + +\environment luatex-style +\environment luatex-logos + +\startcomponent luatex-languages + +\startchapter[reference=languages,title={Languages, characters, fonts and glyphs}] + +\LUATEX's internal handling of the characters and glyphs that eventually become +typeset is quite different from the way \TEX82 handles those same objects. The +easiest way to explain the difference is to focus on unrestricted horizontal mode +(i.e.\ paragraphs) and hyphenation first. Later on, it will be easy to deal +with the differences that occur in horizontal and math modes. + +In \TEX82, the characters you type are converted into \type {char_node} records +when they are encountered by the main control loop. \TEX\ attaches and processes +the font information while creating those records, so that the resulting \quote +{horizontal list} contains the final forms of ligatures and implicit kerning. +This packaging is needed because we may want to get the effective width of for +instance a horizontal box. + +When it becomes necessary to hyphenate words in a paragraph, \TEX\ converts (one +word at time) the \type {char_node} records into a string by replacing ligatures +with their components and ignoring the kerning. Then it runs the hyphenation +algorithm on this string, and converts the hyphenated result back into a \quote +{horizontal list} that is consecutively spliced back into the paragraph stream. +Keep in mind that the paragraph may contain unboxed horizontal material, which +then already contains ligatures and kerns and the words therein are part of the +hyphenation process. + +Those \type {char_node} records are somewhat misnamed, as they are glyph +positions in specific fonts, and therefore not really \quote {characters} in the +linguistic sense. There is no language information inside the \type {char_node} +records at all. Instead, language information is passed along using \type +{language whatsit} records inside the horizontal list. + +In \LUATEX, the situation is quite different. The characters you type are always +converted into \type {glyph_node} records with a special subtype to identify them +as being intended as linguistic characters. \LUATEX\ stores the needed language +information in those records, but does not do any font|-|related processing at +the time of node creation. It only stores the index of the current font and a +reference to a character in that font. + +When it becomes necessary to typeset a paragraph, \LUATEX\ first inserts all +hyphenation points right into the whole node list. Next, it processes all the +font information in the whole list (creating ligatures and adjusting kerning), +and finally it adjusts all the subtype identifiers so that the records are \quote +{glyph nodes} from now on. + +\section[charsandglyphs]{Characters and glyphs} + +\TEX82 (including \PDFTEX) differentiates between \type {char_node}s and \type +{lig_node}s. The former are simple items that contained nothing but a \quote +{character} and a \quote {font} field, and they lived in the same memory as +tokens did. The latter also contained a list of components, and a subtype +indicating whether this ligature was the result of a word boundary, and it was +stored in the same place as other nodes like boxes and kerns and glues. + +In \LUATEX, these two types are merged into one, somewhat larger structure called +a \type {glyph_node}. Besides having the old character, font, and component +fields, and the new special fields like \quote {attr} (see~\in {section} +[glyphnodes]), these nodes also contain: + +\startitemize + +\startitem A subtype, split into four main types: + + \startitemize + \startitem + \type {character}, for characters to be hyphenated: the lowest bit + (bit 0) is set to 1. + \stopitem + \startitem + \type {glyph}, for specific font glyphs: the lowest bit (bit 0) is + not set. + \stopitem + \startitem + \type {ligature}, for ligatures (bit 1 is set) + \stopitem + \startitem + \type {ghost}, for \quote {ghost objects} (bit 2 is set) + \stopitem + \stopitemize + + The latter two make further use of two extra fields (bits 3 and 4): + + \startitemize + \startitem + \type {left}, for ligatures created from a left word boundary and for + ghosts created from \type {\leftghost} + \stopitem + \startitem + \type {right}, for ligatures created from a right word boundary and + for ghosts created from \type {\rightghost} + \stopitem + \stopitemize + + For ligatures, both bits can be set at the same time (in case of a + single|-|glyph word). + +\stopitem + +\startitem + \type {glyph_node}s of type \quote {character} also contain language data, + split into four items that were current when the node was created: the + \type {\setlanguage} (15 bits), \type {\lefthyphenmin} (8 bits), \type + {\righthyphenmin} (8 bits), and \type {\uchyph} (1 bit). +\stopitem + +\stopitemize + +Incidentally, \LUATEX\ allows 16383 separate languages, and words can be 256 +characters long. The language is stored with each character. You can set +\type {\firstvalidlanguage} to for instance~1 and make thereby language~0 +an ignored hyphenation language. + +The new primitive \type {\hyphenationmin} can be used to signal the minimal length +of a word. This value stored with the (current) language. + +Because the \type {\uchyph} value is saved in the actual nodes, its handling is +subtly different from \TEX82: changes to \type {\uchyph} become effective +immediately, not at the end of the current partial paragraph. + +Typeset boxes now always have their language information embedded in the nodes +themselves, so there is no longer a possible dependency on the surrounding +language settings. In \TEX82, a mid-paragraph statement like \type {\unhbox0} would +process the box using the current paragraph language unless there was a +\type {\setlanguage} issued inside the box. In \LUATEX, all language variables are +already frozen. + +In traditional \TEX\ the process of hyphenation is driven by \type {lccode}s. In +\LUATEX\ we made this dependency less strong. There are several strategies +possible. When you do nothing, the currently used \type {lccode}s are used, when +loading patterns, setting exceptions or hyphenating a list. + +When you set \type {\savinghyphcodes} to a value larger than zero the current set +of \type {lccode}s will be saved with the language. In that case changing a \type +{lccode} afterwards has no effect. However, you can adapt the set with: + +\starttyping +\hjcode`a=`a +\stoptyping + +This change is global which makes sense if you keep in mind that the moment that +hyphenation happens is (normally) when the paragraph or a horizontal box is +constructed. When \type {\savinghyphcodes} was zero when the language got +initialized you start out with nothing, otherwise you already have a set. + +When a \type {\hjcode} is larger than $0$ but smaller than $32$ is indicates the +to be used length. In the following example we map a character (\type {x}) onto +another one in the patterns and tell the engine that \type {œ} counts as one +character. Because traditionally zero itself is reserved for inhibiting +hyphenation, a value of $32$ counts as zero. + +\starttyping +% assuming french patterns: +foobar % foo-bar + +\hjcode`x=`o + +fxxbar % fxx-bar + +\lefthyphenmin3 + +œdipus % œdi-pus + +\lefthyphenmin4 + +œdipus % œdipus + +\hjcode`œ=2 + +œdipus % œdi-pus + +\hjcode`i=32 +\hjcode`d=32 + +œdipus % œdipus +\stoptyping + +Carrying all this information with each glyph would give too much overhead and +also make the process of setting up thee codes more complex. A solution with +\type {hjcode} sets was considered but rejected because in practice the current +approach is sufficient and it would not be compatible anyway. + +Beware: the values are always saved in the format, independent of the setting +of \type {\savinghyphcodes} at the moment the format is dumped. + +A boundary node normally would mark the end of a word which interferes with for +instance discretionary injection. For this you can use the \type {\wordboundary} +as trigger. Here are a few examples of usage: + +\startbuffer + discrete---discrete +\stopbuffer +\typebuffer \start \dontcomplain \hsize 1pt \getbuffer \par \stop +\startbuffer + discrete\discretionary{}{}{---}discrete +\stopbuffer +\typebuffer \start \dontcomplain \hsize 1pt \getbuffer \par \stop +\startbuffer + discrete\wordboundary\discretionary{}{}{---}discrete +\stopbuffer +\typebuffer \start \dontcomplain \hsize 1pt \getbuffer \par \stop +\startbuffer + discrete\wordboundary\discretionary{}{}{---}\wordboundary discrete +\stopbuffer +\typebuffer \start \dontcomplain \hsize 1pt \getbuffer \par \stop +\startbuffer + discrete\wordboundary\discretionary{---}{}{}\wordboundary discrete +\stopbuffer +\typebuffer \start \dontcomplain \hsize 1pt \getbuffer \par \stop + +We only accept an explicit hyphen when there is a preceding glyph and we skip a +sequence of explicit hyphens as that normally indicates a \type {--} or \type +{---} ligature in which case we can in a worse case usage get bad node lists +later on due to messed up ligature building as these dashes are ligatures in base +fonts. This is a side effect of the separating the hyphenation, ligaturing and +kerning steps. + +The start and end of a characters is signalled by a glue, penalty, kern or boundary +node. But by default also a hlist, vlist, rule, dir, whatsit, ins, and adjust node +indicate a start or end. You can omit the last set from the test by setting +\type {\hyphenationbounds} to a non|-|zero value: + +\starttabulate[|Tl|l|] +\NC 0 \NC not strict \NC \NR +\NC 1 \NC strict start \NC \NR +\NC 2 \NC strict end \NC \NR +\NC 3 \NC strict start and strict end \NC \NR +\stoptabulate + +\section{The main control loop} + +In \LUATEX's main loop, almost all input characters that are to be typeset are +converted into \type {glyph} node records with subtype \quote {character}, but +there are a few exceptions. + +First, the \type {\accent} primitives creates nodes with subtype \quote {glyph} +instead of \quote {character}: one for the actual accent and one for the +accentee. The primary reason for this is that \type {\accent} in \TEX82 is +explicitly dependent on the current font encoding, so it would not make much +sense to attach a new meaning to the primitive's name, as that would invalidate +many old documents and macro packages. \footnote {Of course, modern packages will +not use the \type {\accent} primitive at all but try to map directly on composed +characters.} A secondary reason is that in \TEX82, \type {\accent} prohibits +hyphenation of the current word. Since in \LUATEX\ hyphenation only takes place +on \quote {character} nodes, it is possible to achieve the same effect. + +This change of meaning did happen with \type {\char}, that now generates \quote +{glyph} nodes with a character subtype. In traditional \TEX\ there was a strong +relationship between the 8|-|bit input encoding, hyphenation and glyphs taken +from a font. In \LUATEX\ we have \UTF\ input, and in most cases this maps +directly to a character in a font, apart from glyph replacement in the font +engine. If you want to access arbitrary glyphs in a font directly you can always +use \LUA\ to do so, because fonts are available as \LUA\ table. + +Second, all the results of processing in math mode eventually become nodes with +\quote {glyph} subtypes. + +Third, the \ALEPH|-|derived commands \type {\leftghost} and \type {\rightghost} +create nodes of a third subtype: \quote {ghost}. These nodes are ignored +completely by all further processing until the stage where inter|-|glyph kerning +is added. + +Fourth, automatic discretionaries are handled differently. \TEX82 inserts an +empty discretionary after sensing an input character that matches the \type +{\hyphenchar} in the current font. This test is wrong in our opinion: whether or +not hyphenation takes place should not depend on the current font, it is a +language property. \footnote {When \TEX\ showed up we didn't have \UNICODE\ yet +and being limited to eight bits meant that one sometimes had to compromise +between supporting character input, glyph rendering, hyphenation.} + +In \LUATEX, it works like this: if \LUATEX\ senses a string of input characters +that matches the value of the new integer parameter \type {\exhyphenchar}, it will +insert an explicit discretionary after that series of nodes. Initex sets the \type +{\exhyphenchar=`\-}. Incidentally, this is a global parameter instead of a +language-specific one because it may be useful to change the value depending on +the document structure instead of the text language. + +The insertion of discretionaries after a sequence of explicit hyphens happens at +the same time as the other hyphenation processing, {\it not\/} inside the main +control loop. + +The only use \LUATEX\ has for \type {\hyphenchar} is at the check whether a word +should be considered for hyphenation at all. If the \type {\hyphenchar} of the +font attached to the first character node in a word is negative, then hyphenation +of that word is abandoned immediately. This behaviour is added for backward +compatibility only, and the use of \type {\hyphenchar=-1} as a means of +preventing hyphenation should not be used in new \LUATEX\ documents. + +Fifth, \type {\setlanguage} no longer creates whatsits. The meaning of \type +{\setlanguage} is changed so that it is now an integer parameter like all others. +That integer parameter is used in \type {\glyph_node} creation to add language +information to the glyph nodes. In conjunction, the \type {\language} primitive is +extended so that it always also updates the value of \type {\setlanguage}. + +Sixth, the \type {\noboundary} command (that prohibits word boundary processing +where that would normally take place) now does create nodes. These nodes are +needed because the exact place of the \type {\noboundary} command in the input +stream has to be retained until after the ligature and font processing stages. + +Finally, there is no longer a \type {main_loop} label in the code. Remember that +\TEX82 did quite a lot of processing while adding \type {char_nodes} to the +horizontal list? For speed reasons, it handled that processing code outside of +the \quote {main control} loop, and only the first character of any \quote {word} +was handled by that \quote {main control} loop. In \LUATEX, there is no longer a +need for that (all hard work is done later), and the (now very small) bits of +character|-|handling code have been moved back inline. When \type +{\tracingcommands} is on, this is visible because the full word is reported, +instead of just the initial character. + +\section[patternsexceptions]{Loading patterns and exceptions} + +The hyphenation algorithm in \LUATEX\ is quite different from the one in \TEX82, +although it uses essentially the same user input. + +After expansion, the argument for \type {\patterns} has to be proper \UTF8 with +individual patterns separated by spaces, no \type {\char} or \type {\chardef}d +commands are allowed. The current implementation quite strict and will reject all +non|-|\UNICODE\ characters. + +Likewise, the expanded argument for \type {\hyphenation} also has to be proper +\UTF8, but here a bit of extra syntax is provided: + +\startitemize[n] +\startitem + Three sets of arguments in curly braces (\type {{}{}{}}) indicates a desired + complex discretionary, with arguments as in \type {\discretionary}'s command in + normal document input. +\stopitem +\startitem + A \type {-} indicates a desired simple discretionary, cf.\ \type {\-} and \type + {\discretionary{-}{}{}} in normal document input. +\stopitem +\startitem + Internal command names are ignored. This rule is provided especially for \type + {\discretionary}, but it also helps to deal with \type {\relax} commands that + may sneak in. +\stopitem +\startitem + An \type {=} indicates a (non|-|discretionary) hyphen in the document input. +\stopitem +\stopitemize + +The expanded argument is first converted back to a space-separated string while +dropping the internal command names. This string is then converted into a +dictionary by a routine that creates key|-|value pairs by converting the other +listed items. It is important to note that the keys in an exception dictionary +can always be generated from the values. Here are a few examples: + +\starttabulate[|l|l|l|] +\NC \bf value \NC \bf implied key (input) \NC \bf effect \NC\NR +\NC \type {ta-ble} \NC table \NC \type {ta\-ble} ($=$ \type {ta\discretionary{-}{}{}ble}) \NC\NR +\NC \type {ba{k-}{}{c}ken} \NC backen \NC \type {ba\discretionary{k-}{}{c}ken} \NC\NR +\stoptabulate + +The resultant patterns and exception dictionary will be stored under the language +code that is the present value of \type {\language}. + +In the last line of the table, you see there is no \type {\discretionary} command +in the value: the command is optional in the \TEX-based input syntax. The +underlying reason for that is that it is conceivable that a whole dictionary of +words is stored as a plain text file and loaded into \LUATEX\ using one of the +functions in the \LUA\ \type {lang} library. This loading method is quite a bit +faster than going through the \TEX\ language primitives, but some (most?) of that +speed gain would be lost if it had to interpret command sequences while doing so. + +It is possible to specify extra hyphenation points in compound words by using +\type {{-}{}{-}} for the explicit hyphen character (replace \type {-} by the +actual explicit hyphen character if needed). For example, this matches the word +\quote {multi|-|word|-|boundaries} and allows an extra break inbetween \quote +{boun} and \quote {daries}: + +\starttyping +\hyphenation{multi{-}{}{-}word{-}{}{-}boun-daries} +\stoptyping + +The motivation behind the \ETEX\ extension \type {\savinghyphcodes} was that +hyphenation heavily depended on font encodings. This is no longer true in +\LUATEX, and the corresponding primitive is basically ignored. Because we now +have \type {hjcode}, the case relate codes can be used exclusively for \type +{\uppercase} and \type {\lowercase}. + +\section{Applying hyphenation} + +The internal structures \LUATEX\ uses for the insertion of discretionaries in +words is very different from the ones in \TEX82, and that means there are some +noticeable differences in handling as well. + +First and foremost, there is no \quote {compressed trie} involved in hyphenation. +The algorithm still reads \PATGEN-generated pattern files, but \LUATEX\ uses a +finite state hash to match the patterns against the word to be hyphenated. This +algorithm is based on the \quote {libhnj} library used by \OPENOFFICE, which in +turn is inspired by \TEX. + +There are a few differences between \LUATEX\ and \TEX82 that are a direct result +of the implementation: + +\startitemize +\startitem + \LUATEX\ happily hyphenates the full \UNICODE\ character range. +\stopitem +\startitem + Pattern and exception dictionary size is limited by the available memory + only, all allocations are done dynamically. The trie|-|related settings in + \type {texmf.cnf} are ignored. +\stopitem +\startitem + Because there is no \quote {trie preparation} stage, language patterns never + become frozen. This means that the primitive \type {\patterns} (and its \LUA\ + counterpart \type {lang.patterns}) can be used at any time, not only in + ini\TEX. +\stopitem +\startitem + Only the string representation of \type {\patterns} and \type {\hyphenation} is + stored in the format file. At format load time, they are simply + re|-|evaluated. It follows that there is no real reason to preload languages + in the format file. In fact, it is usually not a good idea to do so. It is + much smarter to load patterns no sooner than the first time they are actually + needed. +\stopitem +\startitem + \LUATEX\ uses the language-specific variables \type {\prehyphenchar} and \type + {\posthyphenchar} in the creation of implicit discretionaries, instead of + \TEX82's \type {\hyphenchar}, and the values of the language|-|specific variables + \type {\preexhyphenchar} and \type {\postexhyphenchar} for explicit + discretionaries (instead of \TEX82's empty discretionary). +\stopitem +\startitem + The value of the two counters related to hyphenation, \type {\hyphenpenalty} + and \type {\exhyphenpenalty}, are now stored in the discretionary nodes. This + permits a local overload for explicit \type {\discretionary} commands. The + value current when the hyphenation pass is applied is used. When no callbacks + are used this is compatible with traditional \TEX. When you apply the \LUA\ + \type {lang.hyphenate} function the current values are used. +\stopitem +\stopitemize + +Because we store penalties in the disc node the \type {\discretionary} command has +been extended to accept an optional penalty specification, so you can do the +following: + +\startbuffer +\hsize1mm +1:foo{\hyphenpenalty 10000\discretionary{}{}{}}bar\par +2:foo\discretionary penalty 10000 {}{}{}bar\par +3:foo\discretionary{}{}{}bar\par +\stopbuffer + +\typebuffer + +This results in: + +\blank \start \getbuffer \stop \blank + +Inserted characters and ligatures inherit their attributes from the nearest glyph +node item (usually the preceding one, but the following one for the items +inserted at the left-hand side of a word). + +Word boundaries are no longer implied by font switches, but by language switches. +One word can have two separate fonts and still be hyphenated correctly (but it +can not have two different languages, the \type {\setlanguage} command forces a +word boundary). + +All languages start out with \type {\prehyphenchar=`\-}, \type {\posthyphenchar=0}, +\type {\preexhyphenchar=0} and \type {\postexhyphenchar=0}. When you assign the +values of one of these four parameters, you are actually changing the settings +for the current \type {\language}, this behaviour is compatible with \type {\patterns} +and \type {\hyphenation}. + +\LUATEX\ also hyphenates the first word in a paragraph. Words can be up to 256 +characters long (up from 64 in \TEX82). Longer words generate an error right now, +but eventually either the limitation will be removed or perhaps it will become +possible to silently ignore the excess characters (this is what happens in +\TEX82, but there the behaviour cannot be controlled). + +If you are using the \LUA\ function \type {lang.hyphenate}, you should be aware +that this function expects to receive a list of \quote {character} nodes. It will +not operate properly in the presence of \quote {glyph}, \quote {ligature}, or +\quote {ghost} nodes, nor does it know how to deal with kerning. + +The hyphenation exception dictionary is maintained as key|-|value hash, and that +is also dynamic, so the \type {hyph_size} setting is not used either. + +\section{Applying ligatures and kerning} + +After all possible hyphenation points have been inserted in the list, \LUATEX\ +will process the list to convert the \quote {character} nodes into \quote {glyph} +and \quote {ligature} nodes. This is actually done in two stages: first all +ligatures are processed, then all kerning information is applied to the result +list. But those two stages are somewhat dependent on each other: If the used font +makes it possible to do so, the ligaturing stage adds virtual \quote {character} +nodes to the word boundaries in the list. While doing so, it removes and +interprets \type {\noboundary} nodes. The kerning stage deletes those word +boundary items after it is done with them, and it does the same for \quote +{ghost} nodes. Finally, at the end of the kerning stage, all remaining \quote +{character} nodes are converted to \quote {glyph} nodes. + +This work separation is worth mentioning because, if you overrule from \LUA\ only +one of the two callbacks related to font handling, then you have to make sure you +perform the tasks normally done by \LUATEX\ itself in order to make sure that the +other, non|-|overruled, routine continues to function properly. + +Work in this area is not yet complete, but most of the possible cases are handled +by our rewritten ligaturing engine. At some point all of the possible inputs will +become supported. \footnote {Not all of this makes sense because we nowadays have +\OPENTYPE\ fonts and ligature building can happen in ,any different ways there.} + +For example, take the word \type {office}, hyphenated \type {of-fice}, using a +\quote {normal} font with all the \type {f}-\type {f} and \type {f}-\type {i} +type ligatures: + +\starttabulate[|l|l|] +\NC Initial: \NC \type {{o}{f}{f}{i}{c}{e}} \NC\NR +\NC After hyphenation: \NC \type {{o}{f}{{-},{},{}}{f}{i}{c}{e}} \NC\NR +\NC First ligature stage: \NC \type {{o}{{f-},{f},{<ff>}}{i}{c}{e}} \NC\NR +\NC Final result: \NC \type {{o}{{f-},{<fi>},{<ffi>}}{c}{e}} \NC\NR +\stoptabulate + +That's bad enough, but let us assume that there is also a hyphenation point +between the \type {f} and the \type {i}, to create \type {of-f-ice}. Then the +final result should be: + +\starttyping +{o}{{f-}, + {{f-}, + {i}, + {<fi>}}, + {{<ff>-}, + {i}, + {<ffi>}}}{c}{e} +\stoptyping + +with discretionaries in the post-break text as well as in the replacement text of +the top-level discretionary that resulted from the first hyphenation point. + +Here is that nested solution again, in a different representation: + +\starttabulate[|l|l|l|l|] +\NC \NC pre \NC post \NC replace \NC \NR +\NC topdisc \NC \type {f-}$^1$ \NC sub1 \NC sub2 \NC \NR +\NC sub1 \NC \type {f-}$^2$ \NC \type {i}$^3$ \NC \type {<fi>}$^4$ \NC \NR +\NC sub2 \NC \type {<ff>-}$^5$\NC \type {i}$^6$ \NC \type {<ffi>}$^7$ \NC \NR +\stoptabulate + +When line breaking is choosing its breakpoints, the following fields will +eventually be selected: + +\starttabulate[|l|l|l|] +\NC \type {of-f-ice} \NC \type {f-}$^1$ \NC \NR +\NC \NC \type {f-}$^2$ \NC \NR +\NC \NC \type {i}$^3$ \NC \NR +\NC \type {of-fice} \NC \type {f-}$^1$ \NC \NR +\NC \NC \type {<fi>}$^4$ \NC \NR +\NC \type {off-ice} \NC \type {<ff>-}$^5$ \NC \NR +\NC \NC \type {i}$^6$ \NC \NR +\NC \type {office} \NC \type {<ffi>}$^7$ \NC \NR +\stoptabulate + +The current solution in \LUATEX\ is not able to handle nested discretionaries, +but it is in fact smart enough to handle this fictional \type {of-f-ice} example. +It does so by combining two sequential discretionary nodes as if they were a +single object (where the second discretionary node is treated as an extension of +the first node). + +One can observe that the \type {of-f-ice} and \type {off-ice} cases both end with +the same actual post replacement list (\type {i}), and that this would be the +case even if that \type {i} was the first item of a potential following ligature +like \type {ic}. This allows \LUATEX\ to do away with one of the fields, and thus +make the whole stuff fit into just two discretionary nodes. + +The mapping of the seven list fields to the six fields in this discretionary node +pair is as follows: + +\starttabulate[|l|p|] +\NC \bf field \NC \bf description \NC \NR +\NC \type {disc1.pre} \NC \type {f-}$^1$ \NC \NR +\NC \type {disc1.post} \NC \type {<fi>}$^4$ \NC \NR +\NC \type {disc1.replace} \NC \type {<ffi>}$^7$ \NC \NR +\NC \type {disc2.pre} \NC \type {f-}$^2$ \NC \NR +\NC \type {disc2.post} \NC \type {i}$^{3{,}6}$\NC \NR +\NC \type {disc2.replace} \NC \type {<ff>-}$^5$\NC \NR +\stoptabulate + +What is actually generated after ligaturing has been applied is therefore: + +\starttyping +{o}{{f-}, + {<fi>}, + {<ffi>}} + {{f-}, + {i}, + {<ff>-}}{c}{e} +\stoptyping + +The two discretionaries have different subtypes from a discretionary appearing on +its own: the first has subtype 4, and the second has subtype 5. The need for +these special subtypes stems from the fact that not all of the fields appear in +their \quote {normal} location. The second discretionary especially looks odd, +with things like the \type {<ff>-} appearing in \type {disc2.replace}. The fact +that some of the fields have different meanings (and different processing code +internally) is what makes it necessary to have different subtypes: this enables +\LUATEX\ to distinguish this sequence of two joined discretionary nodes from the +case of two standalone discretionaries appearing in a row. + +Of course there is still that relationship with fonts: ligatures can be implemented by +mapping a sequence of glyphs onto one glyph, but also by selective replacement and +kerning. This means that the above examples are just representing the traditional +approach. + +\section{Breaking paragraphs into lines} + +This code is still almost unchanged, but because of the above|-|mentioned changes +with respect to discretionaries and ligatures, line breaking will potentially be +different from traditional \TEX. The actual line breaking code is still based on +the \TEX82 algorithms, and it does not expect there to be discretionaries inside +of discretionaries. + +But that situation is now fairly common in \LUATEX, due to the changes to the +ligaturing mechanism. And also, the \LUATEX\ discretionary nodes are implemented +slightly different from the \TEX82 nodes: the \type {no_break} text is now +embedded inside the disc node, where previously these nodes kept their place in +the horizontal list. In traditional \TEX\ the discretionary node contains a +counter indicating how many nodes to skip, but in \LUATEX\ we store the pre, post +and replace text in the discretionary node. + +The combined effect of these two differences is that \LUATEX\ does not always use +all of the potential breakpoints in a paragraph, especially when fonts with many +ligatures are used. Of course kerning also complicates matters here. + +\section{The \type {lang} library} + +This library provides the interface to \LUATEX's structure +representing a language, and the associated functions. + +\startfunctioncall +<language> l = lang.new() +<language> l = lang.new(<number> id) +\stopfunctioncall + +This function creates a new userdata object. An object of type \type {<language>} +is the first argument to most of the other functions in the \type {lang} +library. These functions can also be used as if they were object methods, using +the colon syntax. + +Without an argument, the next available internal id number will be assigned to +this object. With argument, an object will be created that links to the internal +language with that id number. + +\startfunctioncall +<number> n = lang.id(<language> l) +\stopfunctioncall + +returns the internal \type {\language} id number this object refers to. + +\startfunctioncall +<string> n = lang.hyphenation(<language> l) +lang.hyphenation(<language> l, <string> n) +\stopfunctioncall + +Either returns the current hyphenation exceptions for this language, or adds new +ones. The syntax of the string is explained in~\in {section} +[patternsexceptions]. + +\startfunctioncall +lang.clear_hyphenation(<language> l) +\stopfunctioncall + +Clears the exception dictionary (string) for this language. + +\startfunctioncall +<string> n = lang.clean(<language> l, <string> o) +<string> n = lang.clean(<string> o) +\stopfunctioncall + +Creates a hyphenation key from the supplied hyphenation value. The syntax of the +argument string is explained in~\in {section} [patternsexceptions]. This function +is useful if you want to do something else based on the words in a dictionary +file, like spell|-|checking. + +\startfunctioncall +<string> n = lang.patterns(<language> l) +lang.patterns(<language> l, <string> n) +\stopfunctioncall + +Adds additional patterns for this language object, or returns the current set. +The syntax of this string is explained in~\in {section} [patternsexceptions]. + +\startfunctioncall +lang.clear_patterns(<language> l) +\stopfunctioncall + +Clears the pattern dictionary for this language. + +\startfunctioncall +<number> n = lang.prehyphenchar(<language> l) +lang.prehyphenchar(<language> l, <number> n) +\stopfunctioncall + +Gets or sets the \quote {pre|-|break} hyphen character for implicit hyphenation +in this language (initially the hyphen, decimal 45). + +\startfunctioncall +<number> n = lang.posthyphenchar(<language> l) +lang.posthyphenchar(<language> l, <number> n) +\stopfunctioncall + +Gets or sets the \quote {post|-|break} hyphen character for implicit hyphenation +in this language (initially null, decimal~0, indicating emptiness). + +\startfunctioncall +<number> n = lang.preexhyphenchar(<language> l) +lang.preexhyphenchar(<language> l, <number> n) +\stopfunctioncall + +Gets or sets the \quote {pre|-|break} hyphen character for explicit hyphenation +in this language (initially null, decimal~0, indicating emptiness). + +\startfunctioncall +<number> n = lang.postexhyphenchar(<language> l) +lang.postexhyphenchar(<language> l, <number> n) +\stopfunctioncall + +Gets or sets the \quote {post|-|break} hyphen character for explicit hyphenation +in this language (initially null, decimal~0, indicating emptiness). + +\startfunctioncall +<boolean> success = lang.hyphenate(<node> head) +<boolean> success = lang.hyphenate(<node> head, <node> tail) +\stopfunctioncall + +Inserts hyphenation points (discretionary nodes) in a node list. If \type {tail} +is given as argument, processing stops on that node. Currently, \type {success} +is always true if \type {head} (and \type {tail}, if specified) are proper nodes, +regardless of possible other errors. + +Hyphenation works only on \quote {characters}, a special subtype of all the glyph +nodes with the node subtype having the value \type {1}. Glyph modes with +different subtypes are not processed. See \in {section~} [charsandglyphs] for +more details. + +The following two commands can be used to set or query hj codes: + +\startfunctioncall +lang.sethjcode(<language> l, <number> char, <number> usedchar) +<number> usedchar = lang.gethjcode(<language> l, <number> char) +\stopfunctioncall + +When you set a hjcode the current sets get initialized unless the set was already +initialized due to \type {\savinghyphcodes} being larger than zero. + +\stopchapter + +\stopcomponent + +% \parindent0pt \hsize=1.1cm +% 12-34-56 \par +% 12-34-\hbox{56} \par +% 12-34-\vrule width 1em height 1.5ex \par +% 12-\hbox{34}-56 \par +% 12-\vrule width 1em height 1.5ex-56 \par +% \hjcode`\1=`\1 \hjcode`\2=`\2 \hjcode`\3=`\3 \hjcode`\4=`\4 \vskip.5cm +% 12-34-56 \par +% 12-34-\hbox{56} \par +% 12-34-\vrule width 1em height 1.5ex \par +% 12-\hbox{34}-56 \par +% 12-\vrule width 1em height 1.5ex-56 \par + diff --git a/doc/context/sources/general/manuals/luatex/luatex-logos.tex b/doc/context/sources/general/manuals/luatex/luatex-logos.tex new file mode 100644 index 000000000..7406dd602 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-logos.tex @@ -0,0 +1,19 @@ +\startenvironment luatex-logos + +\logo[DFONT] {dfont} +\logo[CFF] {cff} +\logo[CMAP] {CMap} +\logo[PATGEN] {patgen} +\logo[MP] {MetaPost} +\logo[METAPOST] {MetaPost} +\logo[MPLIB] {MPlib} +\logo[COCO] {coco} +\logo[SUNOS] {SunOS} +\logo[BSD] {bsd} +\logo[SYSV] {sysv} +\logo[DPI] {dpi} +\logo[DLL] {dll} +\logo[OPENOFFICE]{OpenOffice} +\logo[OCP] {OCP} + +\stopenvironment diff --git a/doc/context/sources/general/manuals/luatex/luatex-lua.tex b/doc/context/sources/general/manuals/luatex/luatex-lua.tex new file mode 100644 index 000000000..0960f8032 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-lua.tex @@ -0,0 +1,572 @@ +% language=uk + +\environment luatex-style +\environment luatex-logos + +\startcomponent luatex-lua + +\startchapter[reference=lua,title={\LUA\ general}] + +\section[init]{Initialization} + +\subsection{\LUATEX\ as a \LUA\ interpreter} + +There are some situations that make \LUATEX\ behave like a standalone \LUA\ +interpreter: + +\startitemize[packed] +\startitem + if a \type {--luaonly} option is given on the commandline, or +\stopitem +\startitem + if the executable is named \type {texlua} or \type {luatexlua}, or +\stopitem +\startitem + if the only non|-|option argument (file) on the commandline has the extension + \type {lua} or \type {luc}. +\stopitem +\stopitemize + +In this mode, it will set \LUA's \type {arg[0]} to the found script name, pushing +preceding options in negative values and the rest of the command line in the +positive values, just like the \LUA\ interpreter. + +\LUATEX\ will exit immediately after executing the specified \LUA\ script and is, +in effect, a somewhat bulky stand alone \LUA\ interpreter with a bunch of extra +preloaded libraries. + +\subsection{\LUATEX\ as a \LUA\ byte compiler} + +There are two situations that make \LUATEX\ behave like the \LUA\ byte compiler: + +\startitemize[packed] +\startitem if a \type {--luaconly} option is given on the command line, or \stopitem +\startitem if the executable is named \type {texluac} \stopitem +\stopitemize + +In this mode, \LUATEX\ is exactly like \type {luac} from the stand alone \LUA\ +distribution, except that it does not have the \type {-l} switch, and that it +accepts (but ignores) the \type {--luaconly} switch. + +\subsection{Other commandline processing} + +When the \LUATEX\ executable starts, it looks for the \type {--lua} command line +option. If there is no \type {--lua} option, the command line is interpreted in a +similar fashion as the other \TEX\ engines. Some options are accepted but have no +consequence. The following command|-|line options are understood: + +\starttabulate[|lT|p|] +\NC --credits \NC display credits and exit \NC \NR +\NC --debug-format \NC enable format debugging \NC \NR +\NC --draftmode \NC switch on draft mode i.e.\ generate no output in \PDF\ mode \NC \NR +\NC --[no-]file-line-error \NC disable/enable \type {file:line:error} style messages \NC \NR +\NC --[no-]file-line-error-style \NC aliases of \type {--[no-]file-line-error} \NC \NR +\NC --fmt=FORMAT \NC load the format file \type {FORMAT} \NC\NR +\NC --halt-on-error \NC stop processing at the first error\NC \NR +\NC --help \NC display help and exit \NC\NR +\NC --ini \NC be \type {iniluatex}, for dumping formats \NC\NR +\NC --interaction=STRING \NC set interaction mode: \type {batchmode}, \type {nonstopmode}, \type {scrollmode} or \type {errorstopmode} \NC \NR +\NC --jobname=STRING \NC set the job name to \type {STRING} \NC \NR +\NC --kpathsea-debug=NUMBER \NC set path searching debugging flags according to the bits of \type {NUMBER} \NC \NR +\NC --lua=FILE \NC load and execute a \LUA\ initialization script \NC\NR +\NC --[no-]mktex=FMT \NC disable/enable \type {mktexFMT} generation with \type {FMT} is \type {tex} or \type {tfm} \NC \NR +\NC --nosocket \NC disable the \LUA\ socket library \NC\NR +\NC --output-comment=STRING \NC use \type {STRING} for \DVI\ file comment instead of date (no effect for \PDF) \NC \NR +\NC --output-directory=DIR \NC use \type {DIR} as the directory to write files to \NC \NR +\NC --output-format=FORMAT \NC use \type {FORMAT} for job output; \type {FORMAT} is \type {dvi} or \type {pdf} \NC \NR +\NC --progname=STRING \NC set the program name to \type {STRING} \NC \NR +\NC --recorder \NC enable filename recorder \NC \NR +\NC --safer \NC disable easily exploitable \LUA\ commands \NC\NR +\NC --[no-]shell-escape \NC disable/enable system calls \NC \NR +\NC --shell-restricted \NC restrict system calls to a list of commands given in \type {texmf.cnf} \NC \NR +\NC --synctex=NUMBER \NC enable \type {synctex} \NC \NR +\NC --utc \NC use utc times when applicable \NC \NR +\NC --version \NC display version and exit \NC \NR +\stoptabulate + +Some of the traditional flags are just ignored: \type {--etex}, \type +{--translate-file}, \type {--8bit}. \type {--[no-]parse-first-line}, \type +{--default-translate-file}. Also, we no longer support write18 because \type +{os.execute} can do the same. + +The value to use for \type {\jobname} is decided as follows: + +\startitemize +\startitem + If \type {--jobname} is given on the command line, its argument will be the + value for \type {\jobname}, without any changes. The argument will not be + used for actual input so it need not exist. The \type {--jobname} switch only + controls the \type {\jobname} setting. +\stopitem +\startitem + Otherwise, \type {\jobname} will be the name of the first file that is read + from the file system, with any path components and the last extension (the + part following the last \type {.}) stripped off. +\stopitem +\startitem + An exception to the previous point: if the command line goes into interactive + mode (by starting with a command) and there are no files input via \type + {\everyjob} either, then the \type {\jobname} is set to \type {texput} as a + last resort. +\stopitem +\stopitemize + +The file names for output files that are generated automatically are created by +attaching the proper extension (\type {log}, \type {pdf}, etc.) to the found +\type {\jobname}. These files are created in the directory pointed to by \type +{--output-directory}, or in the current directory, if that switch is not present. + +\blank + +Without the \type {--lua} option, command line processing works like it does in +any other web2c-based typesetting engine, except that \LUATEX\ has a few extra +switches. + +If the \type {--lua} option is present, \LUATEX\ will enter an alternative mode +of command line processing in comparison to the standard web2c programs. + +In this mode, a small series of actions is taken in order. First, it will parse +the command line as usual, but it will only interpret a small subset of the +options immediately: \type {--safer}, \type {--nosocket}, \type +{--[no-]shell-escape}, \type {--enable-write18}, \type {--disable-write18}, \type +{--shell-restricted}, \type {--help}, \type {--version}, and \type {--credits}. + +Next \LUATEX\ searches for the requested \LUA\ initialization script. If it +cannot be found using the actual name given on the command line, a second attempt +is made by prepending the value of the environment variable \type {LUATEXDIR}, if +that variable is defined in the environment. + +Then it checks the various safety switches. You can use those to disable some +\LUA\ commands that can easily be abused by a malicious document. At the moment, +\type {--safer} \type {nil}s the following functions: + +\starttabulate[|l|l|] +\NC \bf library \NC \bf functions \NC \NR +\NC \type {os} \NC \type {execute} \type {exec} \type {spawn} \type {setenv} \type {rename} \type {remove} \type {tmpdir} \NC \NR +\NC \type {io} \NC \type {popen} \type {output} \type {tmpfile} \NC \NR +\NC \type {lfs} \NC \type {rmdir} \type {mkdir} \type {chdir} \type {lock} \type {touch} \NC \NR +\stoptabulate + +Furthermore, it disables loading of compiled \LUA\ libraries and it makes \type +{io.open()} fail on files that are opened for anything besides reading. + +When \LUATEX\ starts it set the locale to a neutral value. If for some reason you +use \type {os.locale}, you need to make sure you \type {nil} it afterwards +because otherwise it can interfere with code that for instance generates dates. +You can nil the locale with + +\starttyping +os.setlocale(nil.nil) +\stoptyping + +The \type {--nosocket} option makes the socket library unavailable, so that \LUA\ +cannot use networking. + +The switches \type {--[no-]shell-escape}, \type {--[enable|disable]-write18}, and +\type {--shell-restricted} have the same effects as in \PDFTEX, and additionally +make \type {io.popen()}, \type {os.execute}, \type {os.exec} and \type {os.spawn} +adhere to the requested option. + +Next the initialization script is loaded and executed. From within the script, +the entire command line is available in the \LUA\ table \type {arg}, beginning with +\type {arg[0]}, containing the name of the executable. As consequence warnings +about unrecognized options are suppressed. + +Command line processing happens very early on. So early, in fact, that none of +\TEX's initializations have taken place yet. For that reason, the tables that +deal with typesetting, like \type {tex}, \type {token}, \type {node} and +\type {pdf}, are off|-|limits during the execution of the startup file (they +are \type {nil}'d). Special care is taken that \type {texio.write} and \type +{texio.write_nl} function properly, so that you can at least report your actions +to the log file when (and if) it eventually becomes opened (note that \TEX\ does +not even know its \type {\jobname} yet at this point). See \in {chapter} [libraries] +for more information about the \LUATEX-specific \LUA\ extension tables. + +Everything you do in the \LUA\ initialization script will remain visible during +the rest of the run, with the exception of the \TEX\ specific libraries like +\type {tex}, \type {token}, \type {node} and \type {pdf} tables. These will be +initialized to their documented state after the execution of the script. You +should not store anything in variables or within tables with these four global +names, as they will be overwritten completely. + +We recommend you use the startup file only for your own \TEX|-|independent +initializations (if you need any), to parse the command line, set values in the +\type {texconfig} table, and register the callbacks you need. + +\LUATEX\ allows some of the command line options to be overridden by reading +values from the \type {texconfig} table at the end of script execution (see the +description of the \type {texconfig} table later on in this document for more +details on which ones exactly). + +Unless the \type {texconfig} table tells \LUATEX\ not to initialize \KPATHSEA\ +at all (set \type {texconfig.kpse_init} to \type {false} for that), \LUATEX\ +acts on some more command line options after the initialization script is +finished: in order to initialize the built|-|in \KPATHSEA\ library properly, +\LUATEX\ needs to know the correct program name to use, and for that it needs to +check \type {--progname}, or \type {--ini} and \type {--fmt}, if \type +{--progname} is missing. + +\section{\LUA\ behaviour} + +\LUA s \type {tostring} function (and \type {string.format} may return values in +scientific notation, thereby confusing the \TEX\ end of things when it is used as +the right|-|hand side of an assignment to a \type {\dimen} or \type {\count}. + +Loading dynamic \LUA\ libraries will fail if there are two \LUA\ libraries loaded +at the same time (which will typically happen on \type {win32}, because there is +one \LUA\ 5.2 inside \LUATEX, and another will likely be linked to the \DLL\ file +of the module itself). + +\LUATEX\ is able to use the kpathsea library to find \type {require()}d modules. +For this purpose, \type {package.searchers[2]} is replaced by a different loader +function, that decides at runtime whether to use kpathsea or the built|-|in core +\LUA\ function. It uses \KPATHSEA\ when that is already initialized at that point +in time, otherwise it reverts to using the normal \type {package.path} loader. + +Initialization of \KPATHSEA\ can happen either implicitly (when \LUATEX\ starts +up and the startup script has not set \type {texconfig.kpse_init} to false), or +explicitly by calling the \LUA\ function \type {kpse.set_program_name()}. + +\LUATEX\ is able to use dynamically loadable \LUA\ libraries, unless +\type {--safer} was given as an option on the command line. For this purpose, +\type {package.searchers[3]} is replaced by a different loader function, that +decides at runtime whether to use \KPATHSEA\ or the built|-|in core \LUA\ +function. It uses \KPATHSEA\ when that is already initialized at that point in +time, otherwise it reverts to using the normal \type {package.cpath} loader. + +This functionality required an extension to kpathsea: + +\startnarrower +There is a new kpathsea file format: \type {kpse_clua_format} that searches for +files with extension \type {.dll} and \type {.so}. The \type {texmf.cnf} setting +for this variable is \type {CLUAINPUTS}, and by default it has this value: + +\starttyping +CLUAINPUTS=.:$SELFAUTOLOC/lib/{$progname,$engine,}/lua// +\stoptyping + +This path is imperfect (it requires a \TDS\ subtree below the binaries +directory), but the architecture has to be in the path somewhere, and the +currently simplest way to do that is to search below the binaries directory only. +Of course it no big deal to write an alternative loader and use that in a macro +package. + +One level up (a \type {lib} directory parallel to \type {bin}) would have been +nicer, but that is not doable because \TEXLIVE\ uses a \type {bin/<arch>} +structure. +\stopnarrower + +In keeping with the other \TEX|-|like programs in \TEXLIVE, the two \LUA\ functions +\type {os.execute} and \type {io.popen}, as well as the two new functions \type +{os.exec} and \type {os.spawn} that are explained below, take the value of \type +{shell_escape} and|/|or \type {shell_escape_commands} in account. Whenever +\LUATEX\ is run with the assumed intention to typeset a document (and by that we +mean that it is called as \type {luatex}, as opposed to \type {texlua}, and that +the command line option \type {--luaonly} was not given), it will only run the +four functions above if the matching \type {texmf.cnf} variable(s) or their \type +{texconfig} (see \in {section} [texconfig]) counterparts allow execution of the +requested system command. In \quote {script interpreter} runs of \LUATEX, these +settings have no effect, and all four functions function as normal. + +The \type {f:read("*line")} and \type {f:lines()} functions from the io library +have been adjusted so that they are line|-|ending neutral: any of \type {LF}, +\type {CR} or \type {CR+LF} are acceptable line endings. + +\type {luafilesystem} has been extended: there are two extra boolean functions +(\type {lfs.isdir(filename)} and \type {lfs.isfile(filename)}) and one extra +string field in its attributes table (\type {permissions}). There is an +additional function \type {lfs.shortname()} which takes a file name and returns +its short name on \type {win32} platforms. On other platforms, it just returns +the given argument. The file name is not tested for existence. Finally, for +non|-|\type {win32} platforms only, there is the new function \type +{lfs.readlink()} hat takes an existing symbolic link as argument and returns its +content. It returns an error on \type {win32}. + +The \type {string} library has an extra function: \type {string.explode(s[,m])}. +This function returns an array containing the string argument \type {s} split +into sub-strings based on the value of the string argument \type {m}. The second +argument is a string that is either empty (this splits the string into +characters), a single character (this splits on each occurrence of that +character, possibly introducing empty strings), or a single character followed by +the plus sign \type {+} (this special version does not create empty sub-strings). +The default value for \type {m} is \quote {\type { +}} (multiple spaces). Note: +\type {m} is not hidden by surrounding braces as it would be if this function was +written in \TEX\ macros. + +The \type {string} library also has six extra iterators that return strings +piecemeal: + +\startitemize +\startitem + \type {string.utfvalues(s)}: an integer value in the \UNICODE\ range +\stopitem +\startitem + \type {string.utfcharacters(s)}: a string with a single \UTF-8 token in it +\stopitem +\startitem + \type {string.characters(s)} \NC a string containing one byte +\stopitem +\startitem + \type {string.characterpairs(s)} two strings each containing one byte or an + empty second string if the string length was odd +\stopitem +\startitem + \type {string.bytes(s)} a single byte value +\stopitem +\startitem + \type {string.bytepairs(s)} two byte values or nil instead of a number as + its second return value if the string length was odd +\stopitem +\stopitemize + +The \type {string.characterpairs()} and \type {string.bytepairs()} iterators +are useful especially in the conversion of \UTF16 encoded data into \UTF8. + +There is also a two|-|argument form of \type {string.dump()}. The second argument +is a boolean which, if true, strips the symbols from the dumped data. This +matches an extension made in \type {luajit}. + +The \type {string} library functions \type {len}, \type {lower}, \type {sub} +etc.\ are not \UNICODE|-|aware. For strings in the \UTF8 encoding, i.e., strings +containing characters above code point 127, the corresponding functions from the +\type {slnunicode} library can be used, e.g., \type {unicode.utf8.len}, \type +{unicode.utf8.lower} etc.\ The exceptions are \type {unicode.utf8.find}, that +always returns byte positions in a string, and \type {unicode.utf8.match} and +\type {unicode.utf8.gmatch}. While the latter two functions in general {\it +are} \UNICODE|-|aware, they fall|-|back to non|-|\UNICODE|-|aware behavior when +using the empty capture \type {()} but other captures work as expected. For the +interpretation of character classes in \type {unicode.utf8} functions refer to +the library sources at \hyphenatedurl {http://luaforge.net/projects/sln}. Version +5.3 of \LUA\ will provide some native \UTF8 support. + +\blank + +The \type {os} library has a few extra functions and variables: + +\startitemize + +\startitem + \type {os.selfdir} is a variable that holds the directory path of the + actual executable. For example: \type {\directlua {tex.sprint(os.selfdir)}}. +\stopitem + +\startitem + \type {os.exec(commandline)} is a variation on \type {os.execute}. Here + \type {commandline} can be either a single string or a single table. + + If the argument is a table \LUATEX\ first checks if there is a value at + integer index zero. If there is, this is the command to be executed. + Otherwise, it will use the value at integer index one. If neither are + present, nothing at all happens. + + The set of consecutive values starting at integer~1 in the table are the + arguments that are passed on to the command (the value at index~1 becomes + \type {arg[0]}). The command is searched for in the execution path, so there + is normally no need to pass on a fully qualified path name. + + If the argument is a string, then it is automatically converted into a table + by splitting on whitespace. In this case, it is impossible for the command + and first argument to differ from each other. + + In the string argument format, whitespace can be protected by putting (part + of) an argument inside single or double quotes. One layer of quotes is + interpreted by \LUATEX, and all occurrences of \type {\"}, \type {\'} or \type + {\\} within the quoted text are unescaped. In the table format, there is no + string handling taking place. + + This function normally does not return control back to the \LUA\ script: the + command will replace the current process. However, it will return the two + values \type {nil} and \type {error} if there was a problem while + attempting to execute the command. + + On \MSWINDOWS, the current process is actually kept in memory until after the + execution of the command has finished. This prevents crashes in situations + where \TEXLUA\ scripts are run inside integrated \TEX\ environments. + + The original reason for this command is that it cleans out the current + process before starting the new one, making it especially useful for use in + \TEXLUA. +\stopitem + +\startitem + \type {os.spawn(commandline)} is a returning version of \type {os.exec}, + with otherwise identical calling conventions. + + If the command ran ok, then the return value is the exit status of the + command. Otherwise, it will return the two values \type {nil} and \type + {error}. +\stopitem + +\startitem + \type {os.setenv(key,value)} sets a variable in the environment. Passing + \type {nil} instead of a value string will remove the variable. +\stopitem + +\startitem + \type {os.env} is a hash table containing a dump of the variables and + values in the process environment at the start of the run. It is writeable, + but the actual environment is {\em not\/} updated automatically. +\stopitem + +\startitem + \type {os.gettimeofday()} returns the current \quote {\UNIX\ time}, but as a + float. This function is not available on the \SUNOS\ platforms, so do not use + this function for portable documents. +\stopitem + +\startitem + \type {os.times()}returns the current process times according to \ the + \UNIX\ C library function \quote {times}. This function is not available on + the \MSWINDOWS\ and \SUNOS\ platforms, so do not use this function for + portable documents. +\stopitem + +\startitem + \type {os.tmpdir()} creates a directory in the \quote {current directory} + with the name \type {luatex.XXXXXX} where the \type {X}-es are replaced by a + unique string. The function also returns this string, so you can \type + {lfs.chdir()} into it, or \type {nil} if it failed to create the directory. + The user is responsible for cleaning up at the end of the run, it does not + happen automatically. +\stopitem + +\startitem + \type {os.type} is a string that gives a global indication of the class of + operating system. The possible values are currently \type {windows}, \type + {unix}, and \type {msdos} (you are unlikely to find this value \quote {in the + wild}). +\stopitem + +\startitem + \type {os.name} is a string that gives a more precise indication of the + operating system. These possible values are not yet fixed, and for \type + {os.type} values \type {windows} and \type {msdos}, the \type {os.name} + values are simply \type {windows} and \type {msdos} + + The list for the type \type {unix} is more precise: \type {linux}, \type + {freebsd}, \type {kfreebsd}, \type {cygwin}, \type {openbsd}, \type + {solaris}, \type {sunos} (pre-solaris), \type {hpux}, \type {irix}, \type + {macosx}, \type {gnu} (hurd), \type {bsd} (unknown, but \BSD|-|like), \type + {sysv} (unknown, but \SYSV|-|like), \type {generic} (unknown). +\stopitem + +\startitem + \type {os.uname()} returns a table with specific operating system + information acquired at runtime. The keys in the returned table are all + string valued, and their names are: \type {sysname}, \type {machine}, \type + {release}, \type {version}, and \type {nodename}. +\stopitem + +\stopitemize + +In stock \LUA, many things depend on the current locale. In \LUATEX, we can't do +that, because it makes documents unportable. While \LUATEX\ is running if +forces the following locale settings: + +\starttyping +LC_CTYPE=C +LC_COLLATE=C +LC_NUMERIC=C +\stoptyping + +\section {\LUA\ modules} + +Some modules that are normally external to \LUA\ are statically linked in with +\LUATEX, because they offer useful functionality: + +\startitemize + +\startitem + \type {slnunicode}, from the \type {selene} libraries, \hyphenatedurl + {http://luaforge.net/projects/sln}. This library has been slightly extended + so that the \type {unicode.utf8.*} functions also accept the first 256 values + of plane~18. This is the range \LUATEX\ uses for raw binary output, as + explained above. +\stopitem + +\startitem + \type {luazip}, from the kepler project, \hyphenatedurl + {http://www.keplerproject.org/luazip/}. +\stopitem + +\startitem + \type {luafilesystem}, also from the kepler project, \hyphenatedurl + {http://www.keplerproject.org/luafilesystem/}. +\stopitem + +\startitem + \type {lpeg}, by Roberto Ierusalimschy, \hyphenatedurl + {http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html}. This library is not + \UNICODE|-|aware, but interprets strings on a byte|-|per|-|byte basis. This + mainly means that \type {lpeg.S} cannot be used with \UTF8 characters encoded + in more than two bytes, and thus \type {lpeg.S} will look for one of those + two bytes when matching, not the combination of the two. The same is true for + \type {lpeg.R}, although the latter will display an error message if used + with multibyte characters. Therefore \type {lpeg.R('aä')} results in the + message \type {bad argument #1 to 'R' (range must have two characters)}, + since to \type {lpeg}, \type {ä} is two 'characters' (bytes), so \type {aä} + totals three. In practice this is no real issue. +\stopitem + +\startitem + \type {lzlib}, by Tiago Dionizio, \hyphenatedurl + {http://luaforge.net/projects/lzlib/}. +\stopitem + +\startitem + \type {md5}, by Roberto Ierusalimschy \hyphenatedurl + {http://www.inf.puc-rio.br/~roberto/md5/md5-5/md5.html}. +\stopitem + +\startitem + \type {luasocket}, by Diego Nehab \hyphenatedurl + {http://w3.impa.br/~diego/software/luasocket/}. The \type {.lua} support + modules from \type {luasocket} are also preloaded inside the executable, + there are no external file dependencies. +\stopitem + +\stopitemize + +At some point (this also depends on distributions) \LUATEX\ might have these +libraries loaded on demand. For this reason you can best use \type {require} to +make sure they are loaded. + +\section{Testing} + +For development reasons you can influence the used startup date and time. This can +be done in two ways. + +\startitemize[n] + +\startitem + By setting the environmment variable \type {SOURCE_DATE_EPOCH}. This will + influence the \TEX\ parameters \type {time} and \type {date}, the random seed, + the \PDF\ timestamp and the \PDF\ id that is derived from the time as well. This + variable is consulted when the \KPSE\ library is enabled. Resolving is + delegated to this library. +\stopitem + +\startitem + By setting the \type {start_time} variable in the \type {texconfig} table; as + with other variables we use the internal name there. For compatibility + reasons we also honour a \type {SOURCE_DATE_EPOCH} entry. It should be noted + that there are no such variables in other engines and this method is only + relevant in case the while setup happens in \LUA. +\stopitem + +\stopitemize + +When Universal Time is needed, you can pass the flag \type {utc} to the engine. This +property also works when the date and time are set by \LUATEX\ itself. It has a +complementary entry \type {use_utc_time} in the \type {texconfig} table. + +{\em To some extend a cleaner solution would be to have a flag that disables all +variable data in one go (like filenames and so) but we just follow the method +implemented in \PDFTEX\ where primitives are used to influence other properties.} + +{\em In \CONTEXT\ we provide the command line argument \type {--nodates} that +does bit more disabling of dates.} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luatex/luatex-math.tex b/doc/context/sources/general/manuals/luatex/luatex-math.tex new file mode 100644 index 000000000..cb8d198b1 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-math.tex @@ -0,0 +1,1049 @@ +% language=uk + +\environment luatex-style +\environment luatex-logos + +\startcomponent luatex-math + +\startchapter[reference=math,title={Math}] + +The handling of mathematics in \LUATEX\ differs quite a bit from how \TEX82 (and +therefore \PDFTEX) handles math. First, \LUATEX\ adds primitives and extends some +others so that \UNICODE\ input can be used easily. Second, all of \TEX82's +internal special values (for example for operator spacing) have been made +accessible and changeable via control sequences. Third, there are extensions that +make it easier to use \OPENTYPE\ math fonts. And finally, there are some +extensions that have been proposed or considered in the past that are now added +to the engine. + +\section{The current math style} + +It is possible to discover the math style that will be used for a formula in an +expandable fashion (while the math list is still being read). To make this +possible, \LUATEX\ adds the new primitive: \type {\mathstyle}. This is a \quote +{convert command} like e.g. \type {\romannumeral}: its value can only be read, +not set. + +\subsection{\type {\mathstyle}} + +The returned value is between 0 and 7 (in math mode), or $-1$ (all other modes). +For easy testing, the eight math style commands have been altered so that the can +be used as numeric values, so you can write code like this: + +\starttyping +\ifnum\mathstyle=\textstyle + \message{normal text style} +\else \ifnum\mathstyle=\crampedtextstyle + \message{cramped text style} +\fi \fi +\stoptyping + +\subsection{\type {\Ustack}} + +There are a few math commands in \TEX\ where the style that will be used is not +known straight from the start. These commands (\type {\over}, \type {\atop}, +\type {\overwithdelims}, \type {\atopwithdelims}) would therefore normally return +wrong values for \type {\mathstyle}. To fix this, \LUATEX\ introduces a special +prefix command: \type {\Ustack}: + +\starttyping +$\Ustack {a \over b}$ +\stoptyping + +The \type {\Ustack} command will scan the next brace and start a new math group +with the correct (numerator) math style. + +\section{Unicode math characters} + +Character handling is now extended up to the full \UNICODE\ range (the \type {\U} +prefix), which is compatible with \XETEX. + +The math primitives from \TEX\ are kept as they are, except for the ones that +convert from input to math commands: \type {mathcode}, and \type {delcode}. These +two now allow for a 21-bit character argument on the left hand side of the equals +sign. + +Some of the new \LUATEX\ primitives read more than one separate value. This is +shown in the tables below by a plus sign in the second column. + +The input for such primitives would look like this: + +\starttyping +\def\overbrace{\Umathaccent 0 1 "23DE } +\stoptyping + +The altered \TEX82 primitives are: + +\starttabulate[|l|l|r|c|l|r|] +\NC \bf primitive \NC \bf min \NC \bf max \NC \kern 2em \NC \bf min \NC \bf max \NC \NR +\NC \type {\mathcode} \NC 0 \NC 10FFFF \NC = \NC 0 \NC 8000 \NC \NR +\NC \type {\delcode} \NC 0 \NC 10FFFF \NC = \NC 0 \NC FFFFFF \NC \NR +\stoptabulate + +The unaltered ones are: + +\starttabulate[|l|l|r|] +\NC \bf primitive \NC \bf min \NC \bf max \NC \NR +\NC \type {\mathchardef} \NC 0 \NC 8000 \NC \NR +\NC \type {\mathchar} \NC 0 \NC 7FFF \NC \NR +\NC \type {\mathaccent} \NC 0 \NC 7FFF \NC \NR +\NC \type {\delimiter} \NC 0 \NC 7FFFFFF \NC \NR +\NC \type {\radical} \NC 0 \NC 7FFFFFF \NC \NR +\stoptabulate + +For practical reasons \type {\mathchardef} will silently accept values larger +that \type {0x8000} and interpret it as \type {\Umathcharnumdef}. This is needed +to satisfy older macro packages. + +The following new primitives are compatible with \XETEX: + +% somewhat fuzzy: + +\starttabulate[|l|l|r|c|l|r|] +\NC \bf primitive \NC \bf min \NC \bf max \NC \kern 2em \NC \bf min \NC \bf max \NC \NR +\NC \type {\Umathchardef} \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{1}} \NC \NC \NC \NC \NR +\NC \type {\Umathcharnumdef}\rlap{\high{5}} \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NC \NC \NC \NR +\NC \type {\Umathcode} \NC 0 \NC 10FFFF \NC = \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{1}} \NC \NR +\NC \type {\Udelcode} \NC 0 \NC 10FFFF \NC = \NC 0+0 \NC FF+10FFFF\rlap{\high{2}} \NC \NR +\NC \type {\Umathchar} \NC 0+0+0 \NC 7+FF+10FFFF \NC \NC \NC \NC \NR +\NC \type {\Umathaccent} \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{2,4}} \NC \NC \NC \NC \NR +\NC \type {\Udelimiter} \NC 0+0+0 \NC 7+FF+10FFFF\rlap{\high{2}} \NC \NC \NC \NC \NR +\NC \type {\Uradical} \NC 0+0 \NC FF+10FFFF\rlap{\high{2}} \NC \NC \NC \NC \NR +\NC \type {\Umathcharnum} \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NC \NC \NC \NR +\NC \type {\Umathcodenum} \NC 0 \NC 10FFFF \NC = \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NR +\NC \type {\Udelcodenum} \NC 0 \NC 10FFFF \NC = \NC -80000000 \NC 7FFFFFFF\rlap{\high{3}} \NC \NR +\stoptabulate + +Specifications typically look like: + +\starttyping +\Umathchardef\xx="1"0"456 +\Umathcode 123="1"0"789 +\stoptyping + +Note 1: The new primitives that deal with delimiter|-|style objects do not set up a +\quote {large family}. Selecting a suitable size for display purposes is expected +to be dealt with by the font via the \type {\Umathoperatorsize} parameter (more +information can be found in a following section). + +Note 2: For these three primitives, all information is packed into a single +signed integer. For the first two (\type {\Umathcharnum} and \type +{\Umathcodenum}), the lowest 21 bits are the character code, the 3 bits above +that represent the math class, and the family data is kept in the topmost bits +(This means that the values for math families 128--255 are actually negative). +For \type {\Udelcodenum} there is no math class. The math family information is +stored in the bits directly on top of the character code. Using these three +commands is not as natural as using the two- and three|-|value commands, so +unless you know exactly what you are doing and absolutely require the speedup +resulting from the faster input scanning, it is better to use the verbose +commands instead. + +Note 3: The \type {\Umathaccent} command accepts optional keywords to control +various details regarding math accents. See \in {section} [mathacc] below for +details. + +New primitives that exist in \LUATEX\ only (all of these will be explained +in following sections): + +\starttabulate[|l|l|l|l|] +\NC \bf primitive \NC \bf value range (in hex) \NC \NR +\NC \type {\Uroot} \NC 0+0--FF+10FFFF$^2$ \NC \NR +\NC \type {\Uoverdelimiter} \NC 0+0--FF+10FFFF$^2$ \NC \NR +\NC \type {\Uunderdelimiter} \NC 0+0--FF+10FFFF$^2$ \NC \NR +\NC \type {\Udelimiterover} \NC 0+0--FF+10FFFF$^2$ \NC \NR +\NC \type {\Udelimiterunder} \NC 0+0--FF+10FFFF$^2$ \NC \NR +\stoptabulate + +\section{Cramped math styles} + +\LUATEX\ has four new primitives to set the cramped math styles directly: + +\starttyping +\crampeddisplaystyle +\crampedtextstyle +\crampedscriptstyle +\crampedscriptscriptstyle +\stoptyping + +These additional commands are not all that valuable on their own, but they come +in handy as arguments to the math parameter settings that will be added shortly. + +In Eijkhouts \quotation {\TEX\ by Topic} the rules for handling styles in scripts +are described as follows: + +\startitemize +\startitem + In any style superscripts and subscripts are taken from the next smaller style. + Exception: in display style they are taken in script style. +\stopitem +\startitem + Subscripts are always in the cramped variant of the style; superscripts are only + cramped if the original style was cramped. +\stopitem +\startitem + In an \type {..\over..} formula in any style the numerator and denominator are + taken from the next smaller style. +\stopitem +\startitem + The denominator is always in cramped style; the numerator is only in cramped + style if the original style was cramped. +\stopitem +\startitem + Formulas under a \type {\sqrt} or \type {\overline} are in cramped style. +\stopitem +\stopitemize + +In \LUATEX\ one can set the styles in more detail which means that you sometimes +have to set both normal and cramped styles to get the effect you want. If we +force styles in the script using \type {\scriptstyle} and \type {\crampedscriptstyle} +we get this: + +\startbuffer[demo] +\starttabulate +\NC default \NC $b_{x=xx}^{x=xx}$ \NC \NR +\NC script \NC $b_{\scriptstyle x=xx}^{\scriptstyle x=xx}$ \NC \NR +\NC crampedscript \NC $b_{\crampedscriptstyle x=xx}^{\crampedscriptstyle x=xx}$ \NC \NR +\stoptabulate +\stopbuffer + +\getbuffer[demo] + +Now we set the following parameters + +\startbuffer[setup] +\Umathordrelspacing\scriptstyle=30mu +\Umathordordspacing\scriptstyle=30mu +\stopbuffer + +\typebuffer[setup] + +This gives: + +\start\getbuffer[setup,demo]\stop + +But, as this is not what is expected (visually) we should say: + +\startbuffer[setup] +\Umathordrelspacing\scriptstyle=30mu +\Umathordordspacing\scriptstyle=30mu +\Umathordrelspacing\crampedscriptstyle=30mu +\Umathordordspacing\crampedscriptstyle=30mu +\stopbuffer + +\typebuffer[setup] + +Now we get: + +\start\getbuffer[setup,demo]\stop + +\section{Math parameter settings} + +In \LUATEX, the font dimension parameters that \TEX\ used in math typesetting are +now accessible via primitive commands. In fact, refactoring of the math engine +has resulted in many more parameters than were accessible before. + +\starttabulate +\NC \bf primitive name \NC \bf description \NC \NR +\NC \type {\Umathquad} \NC the width of 18 mu's \NC \NR +\NC \type {\Umathaxis} \NC height of the vertical center axis of + the math formula above the baseline \NC \NR +\NC \type {\Umathoperatorsize} \NC minimum size of large operators in display mode \NC \NR +\NC \type {\Umathoverbarkern} \NC vertical clearance above the rule \NC \NR +\NC \type {\Umathoverbarrule} \NC the width of the rule \NC \NR +\NC \type {\Umathoverbarvgap} \NC vertical clearance below the rule \NC \NR +\NC \type {\Umathunderbarkern} \NC vertical clearance below the rule \NC \NR +\NC \type {\Umathunderbarrule} \NC the width of the rule \NC \NR +\NC \type {\Umathunderbarvgap} \NC vertical clearance above the rule \NC \NR +\NC \type {\Umathradicalkern} \NC vertical clearance above the rule \NC \NR +\NC \type {\Umathradicalrule} \NC the width of the rule \NC \NR +\NC \type {\Umathradicalvgap} \NC vertical clearance below the rule \NC \NR +\NC \type {\Umathradicaldegreebefore}\NC the forward kern that takes place before placement of + the radical degree \NC \NR +\NC \type {\Umathradicaldegreeafter} \NC the backward kern that takes place after placement of + the radical degree \NC \NR +\NC \type {\Umathradicaldegreeraise} \NC this is the percentage of the total height and depth of + the radical sign that the degree is raised by; it is + expressed in \type {percents}, so 60\% is expressed as the + integer $60$ \NC \NR +\NC \type {\Umathstackvgap} \NC vertical clearance between the two + elements in a \type {\atop} stack \NC \NR +\NC \type {\Umathstacknumup} \NC numerator shift upward in \type {\atop} stack \NC \NR +\NC \type {\Umathstackdenomdown} \NC denominator shift downward in \type {\atop} stack \NC \NR +\NC \type {\Umathfractionrule} \NC the width of the rule in a \type {\over} \NC \NR +\NC \type {\Umathfractionnumvgap} \NC vertical clearance between the numerator and the rule \NC \NR +\NC \type {\Umathfractionnumup} \NC numerator shift upward in \type {\over} \NC \NR +\NC \type {\Umathfractiondenomvgap} \NC vertical clearance between the denominator and the rule \NC \NR +\NC \type {\Umathfractiondenomdown} \NC denominator shift downward in \type {\over} \NC \NR +\NC \type {\Umathfractiondelsize} \NC minimum delimiter size for \type {\...withdelims} \NC \NR +\NC \type {\Umathlimitabovevgap} \NC vertical clearance for limits above operators \NC \NR +\NC \type {\Umathlimitabovebgap} \NC vertical baseline clearance for limits above operators \NC \NR +\NC \type {\Umathlimitabovekern} \NC space reserved at the top of the limit \NC \NR +\NC \type {\Umathlimitbelowvgap} \NC vertical clearance for limits below operators \NC \NR +\NC \type {\Umathlimitbelowbgap} \NC vertical baseline clearance for limits below operators \NC \NR +\NC \type {\Umathlimitbelowkern} \NC space reserved at the bottom of the limit \NC \NR +\NC \type {\Umathoverdelimitervgap} \NC vertical clearance for limits above delimiters \NC \NR +\NC \type {\Umathoverdelimiterbgap} \NC vertical baseline clearance for limits above delimiters \NC \NR +\NC \type {\Umathunderdelimitervgap} \NC vertical clearance for limits below delimiters \NC \NR +\NC \type {\Umathunderdelimiterbgap} \NC vertical baseline clearance for limits below delimiters \NC \NR +\NC \type {\Umathsubshiftdrop} \NC subscript drop for boxes and subformulas \NC \NR +\NC \type {\Umathsubshiftdown} \NC subscript drop for characters \NC \NR +\NC \type {\Umathsupshiftdrop} \NC superscript drop (raise, actually) for boxes and subformulas \NC \NR +\NC \type {\Umathsupshiftup} \NC superscript raise for characters \NC \NR +\NC \type {\Umathsubsupshiftdown} \NC subscript drop in the presence of a superscript \NC \NR +\NC \type {\Umathsubtopmax} \NC the top of standalone subscripts cannot be higher than this + above the baseline \NC \NR +\NC \type {\Umathsupbottommin} \NC the bottom of standalone superscripts cannot be less than + this above the baseline \NC \NR +\NC \type {\Umathsupsubbottommax} \NC the bottom of the superscript of a combined super- and subscript + be at least as high as this above the baseline \NC \NR +\NC \type {\Umathsubsupvgap} \NC vertical clearance between super- and subscript \NC \NR +\NC \type {\Umathspaceafterscript} \NC additional space added after a super- or subscript \NC \NR +\NC \type {\Umathconnectoroverlapmin}\NC minimum overlap between parts in an extensible recipe \NC \NR +\stoptabulate + +Each of the parameters in this section can be set by a command like this: + +\starttyping +\Umathquad\displaystyle=1em +\stoptyping + +they obey grouping, and you can use \type {\the\Umathquad\displaystyle} if +needed. + +\section{Skips around display math} + +The injection of \type {\abovedisplayskip} and \type {\belowdisplayskip} is not +symmetrical. An above one is always inserted, also when zero, but the below is +only inserted when larger than zero. Especially the later mkes it sometimes hard +to fully control spacing. Therefore \LUATEX\ comes with a new directive: \type +{\mathdisplayskipmode}. The following values apply: + +\starttabulate +\NC 0 \NC normal \TEX\ behaviour: always above, only below when larger than zero \NC \NR +\NC 1 \NC always \NC \NR +\NC 2 \NC only when not zero \NC \NR +\NC 3 \NC never, not even when not zero \NC \NR +\stoptabulate + +\section{Font-based Math Parameters} + +While it is nice to have these math parameters available for tweaking, it would +be tedious to have to set each of them by hand. For this reason, \LUATEX\ +initializes a bunch of these parameters whenever you assign a font identifier to +a math family based on either the traditional math font dimensions in the font +(for assignments to math family~2 and~3 using \TFM|-|based fonts like \type +{cmsy} and \type {cmex}), or based on the named values in a potential \type +{MathConstants} table when the font is loaded via Lua. If there is a \type +{MathConstants} table, this takes precedence over font dimensions, and in that +case no attention is paid to which family is being assigned to: the \type +{MathConstants} tables in the last assigned family sets all parameters. + +In the table below, the one|-|letter style abbreviations and symbolic tfm font +dimension names match those using in the \TeX book. Assignments to \type +{\textfont} set the values for the cramped and uncramped display and text styles, +\type {\scriptfont} sets the script styles, and \type {\scriptscriptfont} sets +the scriptscript styles, so we have eight parameters for three font sizes. In the +\TFM\ case, assignments only happen in family~2 and family~3 (and of course only +for the parameters for which there are font dimensions). + +Besides the parameters below, \LUATEX\ also looks at the \quote {space} font +dimension parameter. For math fonts, this should be set to zero. + +\start + +\switchtobodyfont[8pt] + +\starttabulate[|l|l|l|p|] +\NC \bf variable \NC \bf style \NC \bf default value opentype \NC \bf default value tfm \NC \NR +\NC \type {\Umathaxis} \NC -- \NC AxisHeight \NC axis_height \NC \NR +\NC \type {\Umathoperatorsize} \NC D, D' \NC DisplayOperatorMinHeight \NC $^6$ \NC \NR +\NC \type {\Umathfractiondelsize} \NC D, D' \NC FractionDelimiterDisplayStyleSize$^9$ \NC delim1 \NC \NR +\NC \NC T, T', S, S', SS, SS' \NC FractionDelimiterSize$^9$ \NC delim2 \NC \NR +\NC \type {\Umathfractiondenomdown} \NC D, D' \NC FractionDenominatorDisplayStyleShiftDown \NC denom1 \NC \NR +\NC \NC T, T', S, S', SS, SS' \NC FractionDenominatorShiftDown \NC denom2 \NC \NR +\NC \type {\Umathfractiondenomvgap} \NC D, D' \NC FractionDenominatorDisplayStyleGapMin \NC 3*default_rule_thickness \NC \NR +\NC \NC T, T', S, S', SS, SS' \NC FractionDenominatorGapMin \NC default_rule_thickness \NC \NR +\NC \type {\Umathfractionnumup} \NC D, D' \NC FractionNumeratorDisplayStyleShiftUp \NC num1 \NC \NR +\NC \NC T, T', S, S', SS, SS' \NC FractionNumeratorShiftUp \NC num2 \NC \NR +\NC \type {\Umathfractionnumvgap} \NC D, D' \NC FractionNumeratorDisplayStyleGapMin \NC 3*default_rule_thickness \NC \NR +\NC \NC T, T', S, S', SS, SS' \NC FractionNumeratorGapMin \NC default_rule_thickness \NC \NR +\NC \type {\Umathfractionrule} \NC -- \NC FractionRuleThickness \NC default_rule_thickness \NC \NR +\NC \type {\Umathskewedfractionhgap} \NC -- \NC SkewedFractionHorizontalGap \NC math_quad/2 \NC \NR +\NC \type {\Umathskewedfractionvgap} \NC -- \NC SkewedFractionVerticalGap \NC math_x_height \NC \NR +\NC \type {\Umathlimitabovebgap} \NC -- \NC UpperLimitBaselineRiseMin \NC big_op_spacing3 \NC \NR +\NC \type {\Umathlimitabovekern} \NC -- \NC 0$^1$ \NC big_op_spacing5 \NC \NR +\NC \type {\Umathlimitabovevgap} \NC -- \NC UpperLimitGapMin \NC big_op_spacing1 \NC \NR +\NC \type {\Umathlimitbelowbgap} \NC -- \NC LowerLimitBaselineDropMin \NC big_op_spacing4 \NC \NR +\NC \type {\Umathlimitbelowkern} \NC -- \NC 0$^1$ \NC big_op_spacing5 \NC \NR +\NC \type {\Umathlimitbelowvgap} \NC -- \NC LowerLimitGapMin \NC big_op_spacing2 \NC \NR +\NC \type {\Umathoverdelimitervgap} \NC -- \NC StretchStackGapBelowMin \NC big_op_spacing1 \NC \NR +\NC \type {\Umathoverdelimiterbgap} \NC -- \NC StretchStackTopShiftUp \NC big_op_spacing3 \NC \NR +\NC \type {\Umathunderdelimitervgap} \NC-- \NC StretchStackGapAboveMin \NC big_op_spacing2 \NC \NR +\NC \type {\Umathunderdelimiterbgap} \NC-- \NC StretchStackBottomShiftDown \NC big_op_spacing4 \NC \NR +\NC \type {\Umathoverbarkern} \NC -- \NC OverbarExtraAscender \NC default_rule_thickness \NC \NR +\NC \type {\Umathoverbarrule} \NC -- \NC OverbarRuleThickness \NC default_rule_thickness \NC \NR +\NC \type {\Umathoverbarvgap} \NC -- \NC OverbarVerticalGap \NC 3*default_rule_thickness \NC \NR +\NC \type {\Umathquad} \NC -- \NC <font_size(f)>$^1$ \NC math_quad \NC \NR +\NC \type {\Umathradicalkern} \NC -- \NC RadicalExtraAscender \NC default_rule_thickness \NC \NR +\NC \type {\Umathradicalrule} \NC -- \NC RadicalRuleThickness \NC <not set>$^2$ \NC \NR +\NC \type {\Umathradicalvgap} \NC D, D' \NC RadicalDisplayStyleVerticalGap \NC (default_rule_thickness+\crlf + (abs(math_x_height)/4))$^3$ \NC \NR +\NC \NC T, T', S, S', SS, SS' \NC RadicalVerticalGap \NC (default_rule_thickness+\crlf + (abs(default_rule_thickness)/4))$^3$ \NC \NR +\NC \type {\Umathradicaldegreebefore} \NC -- \NC RadicalKernBeforeDegree \NC <not set>$^2$ \NC \NR +\NC \type {\Umathradicaldegreeafter} \NC -- \NC RadicalKernAfterDegree \NC <not set>$^2$ \NC \NR +\NC \type {\Umathradicaldegreeraise} \NC -- \NC RadicalDegreeBottomRaisePercent \NC <not set>$^{2,7}$ \NC \NR +\NC \type {\Umathspaceafterscript} \NC -- \NC SpaceAfterScript \NC script_space$^4$ \NC \NR +\NC \type {\Umathstackdenomdown} \NC D, D' \NC StackBottomDisplayStyleShiftDown \NC denom1 \NC \NR +\NC \NC T, T', S, S', SS, SS' \NC StackBottomShiftDown \NC denom2 \NC \NR +\NC \type {\Umathstacknumup} \NC D, D' \NC StackTopDisplayStyleShiftUp \NC num1 \NC \NR +\NC \NC T, T', S, S', SS, SS' \NC StackTopShiftUp \NC num3 \NC \NR +\NC \type {\Umathstackvgap} \NC D, D' \NC StackDisplayStyleGapMin \NC 7*default_rule_thickness \NC \NR +\NC \NC T, T', S, S', SS, SS' \NC StackGapMin \NC 3*default_rule_thickness \NC \NR +\NC \type {\Umathsubshiftdown} \NC -- \NC SubscriptShiftDown \NC sub1 \NC \NR +\NC \type {\Umathsubshiftdrop} \NC -- \NC SubscriptBaselineDropMin \NC sub_drop \NC \NR +\NC \type {\Umathsubsupshiftdown} \NC -- \NC SubscriptShiftDownWithSuperscript$^8$ \NC \NC \NR +\NC \NC \NC \quad\ or SubscriptShiftDown \NC sub2 \NC \NR +\NC \type {\Umathsubtopmax} \NC -- \NC SubscriptTopMax \NC (abs(math_x_height * 4) / 5) \NC \NR +\NC \type {\Umathsubsupvgap} \NC -- \NC SubSuperscriptGapMin \NC 4*default_rule_thickness \NC \NR +\NC \type {\Umathsupbottommin} \NC -- \NC SuperscriptBottomMin \NC (abs(math_x_height) / 4) \NC \NR +\NC \type {\Umathsupshiftdrop} \NC -- \NC SuperscriptBaselineDropMax \NC sup_drop \NC \NR +\NC \type {\Umathsupshiftup} \NC D \NC SuperscriptShiftUp \NC sup1 \NC \NR +\NC \NC T, S, SS, \NC SuperscriptShiftUp \NC sup2 \NC \NR +\NC \NC D', T', S', SS' \NC SuperscriptShiftUpCramped \NC sup3 \NC \NR +\NC \type {\Umathsupsubbottommax} \NC -- \NC SuperscriptBottomMaxWithSubscript \NC (abs(math_x_height * 4) / 5) \NC \NR +\NC \type {\Umathunderbarkern} \NC -- \NC UnderbarExtraDescender \NC default_rule_thickness \NC \NR +\NC \type {\Umathunderbarrule} \NC -- \NC UnderbarRuleThickness \NC default_rule_thickness \NC \NR +\NC \type {\Umathunderbarvgap} \NC -- \NC UnderbarVerticalGap \NC 3*default_rule_thickness \NC \NR +\NC \type {\Umathconnectoroverlapmin} \NC -- \NC MinConnectorOverlap \NC 0$^5$ \NC \NR +\stoptabulate + +\stop + +Note 1: \OPENTYPE\ fonts set \type {\Umathlimitabovekern} and \type +{\Umathlimitbelowkern} to zero and set \type {\Umathquad} to the font size of the +used font, because these are not supported in the \type {MATH} table, + +Note 2: Traditional \TFM\ fonts do not set \type {\Umathradicalrule} because +\TEX82\ uses the height of the radical instead. When this parameter is indeed not +set when \LUATEX\ has to typeset a radical, a backward compatibility mode will +kick in that assumes that an oldstyle \TEX\ font is used. Also, they do not set +\type {\Umathradicaldegreebefore}, \type {\Umathradicaldegreeafter}, and \type +{\Umathradicaldegreeraise}. These are then automatically initialized to +$5/18$quad, $-10/18$quad, and 60. + +Note 3: If \TFM\ fonts are used, then the \type {\Umathradicalvgap} is not set +until the first time \LUATEX\ has to typeset a formula because this needs +parameters from both family~2 and family~3. This provides a partial backward +compatibility with \TEX82, but that compatibility is only partial: once the \type +{\Umathradicalvgap} is set, it will not be recalculated any more. + +Note 4: When \TFM\ fonts are used a similar situation arises with respect to +\type {\Umathspaceafterscript}: it is not set until the first time \LUATEX\ has +to typeset a formula. This provides some backward compatibility with \TEX82. But +once the \type {\Umathspaceafterscript} is set, \type {\scriptspace} will never +be looked at again. + +Note 5: Traditional \TFM\ fonts set \type {\Umathconnectoroverlapmin} to zero +because \TEX82\ always stacks extensibles without any overlap. + +Note 6: The \type {\Umathoperatorsize} is only used in \type {\displaystyle}, and +is only set in \OPENTYPE\ fonts. In \TFM\ font mode, it is artificially set to +one scaled point more than the initial attempt's size, so that always the \quote +{first next} will be tried, just like in \TEX82. + +Note 7: The \type {\Umathradicaldegreeraise} is a special case because it is the +only parameter that is expressed in a percentage instead of as a number of scaled +points. + +Note 8: \type {SubscriptShiftDownWithSuperscript} does not actually exist in the +\quote {standard} \OPENTYPE\ math font Cambria, but it is useful enough to be +added. + +Note 9: \type {FractionDelimiterDisplayStyleSize} and \type +{FractionDelimiterSize} do not actually exist in the \quote {standard} \OPENTYPE\ +math font Cambria, but were useful enough to be added. + +\section{Math spacing setting} + +Besides the parameters mentioned in the previous sections, there are also 64 new +primitives to control the math spacing table (as explained in Chapter~18 of the +\TEX book). The primitive names are a simple matter of combining two math atom +types, but for completeness' sake, here is the whole list: + +\starttwocolumns +\starttyping +\Umathordordspacing +\Umathordopspacing +\Umathordbinspacing +\Umathordrelspacing +\Umathordopenspacing +\Umathordclosespacing +\Umathordpunctspacing +\Umathordinnerspacing +\Umathopordspacing +\Umathopopspacing +\Umathopbinspacing +\Umathoprelspacing +\Umathopopenspacing +\Umathopclosespacing +\Umathoppunctspacing +\Umathopinnerspacing +\Umathbinordspacing +\Umathbinopspacing +\Umathbinbinspacing +\Umathbinrelspacing +\Umathbinopenspacing +\Umathbinclosespacing +\Umathbinpunctspacing +\Umathbininnerspacing +\Umathrelordspacing +\Umathrelopspacing +\Umathrelbinspacing +\Umathrelrelspacing +\Umathrelopenspacing +\Umathrelclosespacing +\Umathrelpunctspacing +\Umathrelinnerspacing +\Umathopenordspacing +\Umathopenopspacing +\Umathopenbinspacing +\Umathopenrelspacing +\Umathopenopenspacing +\Umathopenclosespacing +\Umathopenpunctspacing +\Umathopeninnerspacing +\Umathcloseordspacing +\Umathcloseopspacing +\Umathclosebinspacing +\Umathcloserelspacing +\Umathcloseopenspacing +\Umathcloseclosespacing +\Umathclosepunctspacing +\Umathcloseinnerspacing +\Umathpunctordspacing +\Umathpunctopspacing +\Umathpunctbinspacing +\Umathpunctrelspacing +\Umathpunctopenspacing +\Umathpunctclosespacing +\Umathpunctpunctspacing +\Umathpunctinnerspacing +\Umathinnerordspacing +\Umathinneropspacing +\Umathinnerbinspacing +\Umathinnerrelspacing +\Umathinneropenspacing +\Umathinnerclosespacing +\Umathinnerpunctspacing +\Umathinnerinnerspacing +\stoptyping +\stoptwocolumns + +These parameters are of type \type {\muskip}, so setting a parameter can be done +like this: + +\starttyping +\Umathopordspacing\displaystyle=4mu plus 2mu +\stoptyping + +They are all initialized by \type {initex} to the values mentioned in the table +in Chapter~18 of the \TEX book. + +Note 1: for ease of use as well as for backward compatibility, \type +{\thinmuskip}, \type {\medmuskip} and \type {\thickmuskip} are treated +especially. In their case a pointer to the corresponding internal parameter is +saved, not the actual \type {\muskip} value. This means that any later changes to +one of these three parameters will be taken into account. + +Note 2: Careful readers will realise that there are also primitives for the items +marked \type {*} in the \TEX book. These will not actually be used as those +combinations of atoms cannot actually happen, but it seemed better not to break +orthogonality. They are initialized to zero. + +\section[mathacc]{Math accent handling} + +\LUATEX\ supports both top accents and bottom accents in math mode, and math +accents stretch automatically (if this is supported by the font the accent comes +from, of course). Bottom and combined accents as well as fixed-width math accents +are controlled by optional keywords following \type {\Umathaccent}. + +The keyword \type {bottom} after \type {\Umathaccent} signals that a bottom accent +is needed, and the keyword \type {both} signals that both a top and a bottom +accent are needed (in this case two accents need to be specified, of course). + +Then the set of three integers defining the accent is read. This set of integers +can be prefixed by the \type {fixed} keyword to indicate that a non-stretching +variant is requested (in case of both accents, this step is repeated). + +A simple example: + +\starttyping +\Umathaccent both fixed 0 0 "20D7 fixed 0 0 "20D7 {example} +\stoptyping + +If a math top accent has to be placed and the accentee is a character and has a +non-zero \type {top_accent} value, then this value will be used to place the +accent instead of the \type {\skewchar} kern used by \TEX82. + +The \type {top_accent} value represents a vertical line somewhere in the +accentee. The accent will be shifted horizontally such that its own \type +{top_accent} line coincides with the one from the accentee. If the \type +{top_accent} value of the accent is zero, then half the width of the accent +followed by its italic correction is used instead. + +The vertical placement of a top accent depends on the \type {x_height} of the +font of the accentee (as explained in the \TEX book), but if value that turns out +to be zero and the font had a \type {MathConstants} table, then \type +{AccentBaseHeight} is used instead. + +The vertical placement of a bottom accent is straight below the accentee, no +correction takes place. + +Possible locations are \type {top}, \type {bottom}, \type {both} and \type +{center}. When no location is given \type {top} is assumed. An additional +parameter \type {fraction} can be specified followed by a number; a value of for +instance 1200 means that the criterium is 1.2 times the width of the nuclues. The +fraction only applies to the stepwise selected shapes and is mostly meant for the +\type {overlay} location. It also works for the other locations but then it +concerns the width. + +\section{Math root extension} + +The new primitive \type {\Uroot} allows the construction of a radical noad +including a degree field. Its syntax is an extension of \type {\Uradical}: + +\starttyping +\Uradical <fam integer> <char integer> <radicand> +\Uroot <fam integer> <char integer> <degree> <radicand> +\stoptyping + +The placement of the degree is controlled by the math parameters \type +{\Umathradicaldegreebefore}, \type {\Umathradicaldegreeafter}, and \type +{\Umathradicaldegreeraise}. The degree will be typeset in \type +{\scriptscriptstyle}. + +\section{Math kerning in super- and subscripts} + +The character fields in a \LUA|-|loaded \OPENTYPE\ math font can have a \quote +{mathkern} table. The format of this table is the same as the \quote {mathkern} +table that is returned by the \type {fontloader} library, except that all height +and kern values have to be specified in actual scaled points. + +When a super- or subscript has to be placed next to a math item, \LUATEX\ checks +whether the super- or subscript and the nucleus are both simple character items. +If they are, and if the fonts of both character items are \OPENTYPE\ fonts (as +opposed to legacy \TEX\ fonts), then \LUATEX\ will use the \OPENTYPE\ math +algorithm for deciding on the horizontal placement of the super- or subscript. + +This works as follows: + +\startitemize + \startitem + The vertical position of the script is calculated. + \stopitem + \startitem + The default horizontal position is flat next to the base character. + \stopitem + \startitem + For superscripts, the italic correction of the base character is added. + \stopitem + \startitem + For a superscript, two vertical values are calculated: the bottom of the + script (after shifting up), and the top of the base. For a subscript, the two + values are the top of the (shifted down) script, and the bottom of the base. + \stopitem + \startitem + For each of these two locations: + \startitemize + \startitem + find the math kern value at this height for the base (for a subscript + placement, this is the bottom_right corner, for a superscript + placement the top_right corner) + \stopitem + \startitem + find the math kern value at this height for the script (for a + subscript placement, this is the top_left corner, for a superscript + placement the bottom_left corner) + \stopitem + \startitem + add the found values together to get a preliminary result. + \stopitem + \stopitemize + \stopitem + \startitem + The horizontal kern to be applied is the smallest of the two results from + previous step. + \stopitem +\stopitemize + +The math kern value at a specific height is the kern value that is specified by the +next higher height and kern pair, or the highest one in the character (if there is no +value high enough in the character), or simply zero (if the character has no math kern +pairs at all). + +\section{Scripts on horizontally extensible items like arrows} + +The primitives \type {\Uunderdelimiter} and \type {\Uoverdelimiter} allow the +placement of a subscript or superscript on an automatically extensible item and +\type {\Udelimiterunder} and \type {\Udelimiterover} allow the placement of an +automatically extensible item as a subscript or superscript on a nucleus. The +input: + +% these produce radical noads .. in fact the code base has the numbers wrong for +% quite a while, so no one seems to use this + +\startbuffer +$\Uoverdelimiter 0 "2194 {\hbox{\strut overdelimiter}}$ +$\Uunderdelimiter 0 "2194 {\hbox{\strut underdelimiter}}$ +$\Udelimiterover 0 "2194 {\hbox{\strut delimiterover}}$ +$\Udelimiterunder 0 "2194 {\hbox{\strut delimiterunder}}$ +\stopbuffer + +\typebuffer will render this: + +\blank \startnarrower \getbuffer \stopnarrower \blank + +The vertical placements are controlled by \type {\Umathunderdelimiterbgap}, \type +{\Umathunderdelimitervgap}, \type {\Umathoverdelimiterbgap}, and \type +{\Umathoverdelimitervgap} in a similar way as limit placements on large operators. +The superscript in \type {\Uoverdelimiter} is typeset in a suitable scripted style, +the subscript in \type {\Uunderdelimiter} is cramped as well. + +These primitives accepts an option \type {width} specification. When used the +also optional keywords \type {left}, \type {middle} and \type {right} will +determine what happens when a requested size can't be met (which can happen when +we step to successive larger variants). + +An extra primitive \type {\Uhextensible} is available that can be used like this: + +\startbuffer +$\Uhextensible width 10cm 0 "2194$ +\stopbuffer + +\typebuffer This will render this: + +\blank \startnarrower \getbuffer \stopnarrower \blank + +Here you can also pass options, like: + +\startbuffer +$\Uhextensible width 1pt middle 0 "2194$ +\stopbuffer + +\typebuffer This gives: + +\blank \startnarrower \getbuffer \stopnarrower \blank + +\LUATEX\ internally uses a structure that supports \OPENTYPE\ \quote +{MathVariants} as well as \TFM\ \quote {extensible recipes}. In most cases where +font metrics are involved we have a different code path for traditional fonts end +\OPENTYPE\ fonts. + +\section {Extracting values} + +You can extract the components of a math character. Say that we have defined: + +\starttyping +\Umathcode 1 2 3 4 +\stoptyping + +then + +\starttyping +[\Umathcharclass1] [\Umathcharfam1] [\Umathcharslot1] +\stoptyping + +will return: + +\starttyping +[2] [3] [4] +\stoptyping + +These commands are provides as convenience. Before they came available you could +do the following: + +\starttyping +\def\Umathcharclass{\directlua{tex.print(tex.getmathcode(token.scan_int())[1])}} +\def\Umathcharfam {\directlua{tex.print(tex.getmathcode(token.scan_int())[2])}} +\def\Umathcharslot {\directlua{tex.print(tex.getmathcode(token.scan_int())[3])}} +\stoptyping + +\section{fractions} + +The \type {\abovewithdelims} command accepts a keyword \type {exact}. When issued +the extra space relative to the rule thickness is not added. One can of course +use the \type {\Umathfraction..gap} commands to influence the spacing. Also the +rule is still positioned around the math axis. + +\starttyping +$$ { {a} \abovewithdelims() exact 4pt {b} }$$ +\stoptyping + +The math parameter table contains some parameters that specify a horizontal and +vertical gap for skewed fractions. Of course some guessing is needed in order to +implement something that uses them. And so we now provide a primitive similar to the +other fraction related ones but with a few options so that one can influence the +rendering. Of course a user can also mess around a bit with the parameters +\type {\Umathskewedfractionhgap} and \type {\Umathskewedfractionvgap}. + +The syntax used here is: + +\starttyping +{ {1} \Uskewed / <options> {2} } +{ {1} \Uskewedwithdelims / () <options> {2} } +\stoptyping + +where the options can be \type {noaxis} and \type {exact}. By default we add half +the axis to the shifts and by default we zero the width of the middle character. +For Latin Modern The result looks as follows: + +\def\ShowA#1#2#3{$x + { {#1} \Uskewed / #3 {#2} } + x$} +\def\ShowB#1#2#3{$x + { {#1} \Uskewedwithdelims / () #3 {#2} } + x$} + +\start + \switchtobodyfont[modern] + \starttabulate[||||||] + \NC \NC + \ShowA{a}{b}{} \NC + \ShowA{1}{2}{} \NC + \ShowB{a}{b}{} \NC + \ShowB{1}{2}{} \NC + \NR + \NC \type{exact} \NC + \ShowA{a}{b}{exact} \NC + \ShowA{1}{2}{exact} \NC + \ShowB{a}{b}{exact} \NC + \ShowB{1}{2}{exact} \NC + \NR + \NC \type{noaxis} \NC + \ShowA{a}{b}{noaxis} \NC + \ShowA{1}{2}{noaxis} \NC + \ShowB{a}{b}{noaxis} \NC + \ShowB{1}{2}{noaxis} \NC + \NR + \NC \type{exact noaxis} \NC + \ShowA{a}{b}{exact noaxis} \NC + \ShowA{1}{2}{exact noaxis} \NC + \ShowB{a}{b}{exact noaxis} \NC + \ShowB{1}{2}{exact noaxis} \NC + \NR + \stoptabulate +\stop + +\section {Other Math changes} + +\subsection {Verbose versions of single-character math commands} + +\LUATEX\ defines six new primitives that have the same function as +\type {^}, \type {_}, \type {$}, and \type {$$}: %$ + +\starttabulate[|l|l|l|l|] +\NC \bf primitive \NC \bf explanation \NC \NR +\NC \type {\Usuperscript} \NC Duplicates the functionality of \type {^} \NC \NR +\NC \type {\Usubscript} \NC Duplicates the functionality of \type {_} \NC \NR +\NC \type {\Ustartmath} \NC Duplicates the functionality of \type {$}, % $ + when used in non-math mode. \NC \NR +\NC \type {\Ustopmath} \NC Duplicates the functionality of \type {$}, % $ + when used in inline math mode. \NC \NR +\NC \type {\Ustartdisplaymath} \NC Duplicates the functionality of \type {$$}, % $$ + when used in non-math mode. \NC \NR +\NC \type {\Ustopdisplaymath} \NC Duplicates the functionality of \type {$$}, % $$ + when used in display math mode. \NC \NR +\stoptabulate + +The \type {\Ustopmath} and \type {\Ustopdisplaymath} primitives check if the current +math mode is the correct one (inline vs.\ displayed), but you can freely intermix +the four mathon|/|mathoff commands with explicit dollar sign(s). + +\subsection{Allowed math commands in non-math modes} + +The commands \type {\mathchar}, and \type {\Umathchar} and control sequences that +are the result of \type {\mathchardef} or \type {\Umathchardef} are also +acceptable in the horizontal and vertical modes. In those cases, the \type +{\textfont} from the requested math family is used. + +\section{Math surrounding skips} + +Inline math is surrounded by (optional) \type {\mathsurround} spacing but that is fixed +dimension. There is now an additional parameter \type {\mathsurroundskip}. When set to a +non|-|zero value (or zero with some stretch or shrink) this parameter will replace +\type {\mathsurround}. By using an additional parameter instead of changing the nature +of \type {\mathsurround}, we can remain compatible. + +% \section{Math todo} +% +% The following items are still todo. +% +% \startitemize +% \startitem +% Pre-scripts. +% \stopitem +% \startitem +% Multi-story stacks. +% \stopitem +% \startitem +% Flattened accents for high characters (maybe). +% \stopitem +% \startitem +% Better control over the spacing around displays and handling of equation numbers. +% \stopitem +% \startitem +% Support for multi|-|line displays using \MATHML\ style alignment points. +% \stopitem +% \stopitemize + +\subsection {Delimiters: \type{\Uleft}, \type {\Umiddle} and \type {\Uright}} + +Normally you will force delimiters to certain sizes by putting an empty box or +rule next to it. The resulting delimiter will either be a character from the +stepwise size range or an extensible. The latter can be quite differently +positioned that the characters as it depends on the fit as well as the fact if +the used characters in the font have depth or height. Commands like (plain \TEX +s) \type {\big} need use this feature. In \LUATEX\ we provide a bit more control +by three variants that supporting optional parameters \type {height}, \type +{depth} and \type {axis}. The following example uses this: + +\startbuffer +\Uleft height 30pt depth 10pt \Udelimiter "0 "0 "000028 +\quad x\quad +\Umiddle height 40pt depth 15pt \Udelimiter "0 "0 "002016 +\quad x\quad +\Uright height 30pt depth 10pt \Udelimiter "0 "0 "000029 +\quad \quad \quad +\Uleft height 30pt depth 10pt axis \Udelimiter "0 "0 "000028 +\quad x\quad +\Umiddle height 40pt depth 15pt axis \Udelimiter "0 "0 "002016 +\quad x\quad +\Uright height 30pt depth 10pt axis \Udelimiter "0 "0 "000029 +\stopbuffer + +\typebuffer + +\startlinecorrection +\ruledhbox{\mathematics{\getbuffer}} +\stoplinecorrection + +The keyword \type {exact} can be used as directive that the real dimensions +should be applied when the criteria can't be met which can happen when we're +still stepping through the successively larger variants. When no dimensions are +given the \type {noaxis} command can be used to prevent shifting over the axis. + +You can influence the final class with the keyword \type {class} which will +influence the spacing. + +\subsection{Fixed scripts} + +We have three parameters that are used for this fixed anchoring: + +\starttabulate[|l|l|] +\NC $d$ \NC \type {\Umathsubshiftdown} \NC \NR +\NC $u$ \NC \type {\Umathsupshiftup} \NC \NR +\NC $s$ \NC \type {\Umathsubsupshiftdown} \NC \NR +\stoptabulate + +When we set \type {\mathscriptsmode} to a value other than zero these are used +for calculating fixed positions. This is something that is needed for instance +for chemistry. You can manipulate the mentioned variables to achive different +effects. + +\def\SampleMath#1% + {$\mathscriptsmode#1\mathupright CH_2 + CH^+_2 + CH^2_2$} + +\starttabulate[|c|c|c|l|] +\NC \bf mode \NC \bf down \NC \bf up \NC \NC \NR +\NC 0 \NC dynamic \NC dynamic \NC \SampleMath{0} \NC \NR +\NC 1 \NC $d$ \NC $u$ \NC \SampleMath{1} \NC \NR +\NC 2 \NC $s$ \NC $u$ \NC \SampleMath{2} \NC \NR +\NC 3 \NC $s$ \NC $u + s - d$ \NC \SampleMath{3} \NC \NR +\NC 4 \NC $d + (s-d)/2$ \NC $u + (s-d)/2$ \NC \SampleMath{4} \NC \NR +\NC 5 \NC $d$ \NC $u + s - d$ \NC \SampleMath{5} \NC \NR +\stoptabulate + +The value of this parameter obeys grouping but applies to the whole current +formula. + +% if needed we can put the value in stylenodes but maybe more should go there + +\subsection {Tracing} + +Because there are quite some math related parameters and values, it is possible +to limit tracing. Only when \type {tracingassigns} and|/|or \type +{tracingrestores} are set to~2 or more they will be traced. + +\subsection {Math options} + +The logic in the math engine is rather complex and there are often no universal +solutions (read: what works out well for one font, fails for another). Therefore +some variations in the implementation will be driven by options for which a new +primitive \type {\mathoption} has been introduced (so that we don't end up with +many new commands). The approach of options also permits us to see what effect a +specific solution has. + +\subsubsection {\type {\mathoption noitaliccompensation}} + +This option compensates placement for characters with a built|-|in italic +correction. + +\startbuffer +{\showboxes\int}\quad +{\showboxes\int_{|}^{|}}\quad +{\showboxes\int\limits_{|}^{|}} +\stopbuffer + +\typebuffer + +Gives (with computer modern that has such italics): + +\startlinecorrection[blank] + \switchtobodyfont[modern] + \startcombination[nx=2,ny=2,distance=5em] + {\mathoption noitaliccompensation 0\relax \mathematics{\getbuffer}} + {\nohyphens\type{0:inline}} + {\mathoption noitaliccompensation 0\relax \mathematics{\displaymath\getbuffer}} + {\nohyphens\type{0:display}} + {\mathoption noitaliccompensation 1\relax \mathematics{\getbuffer}} + {\nohyphens\type{1:inline}} + {\mathoption noitaliccompensation 1\relax \mathematics{\displaymath\getbuffer}} + {\nohyphens\type{1:display}} + \stopcombination +\stoplinecorrection + +\subsubsection {\type {\mathoption nocharitalic}} + +When two characters follow each other italic correction can interfere. The +following example shows what this option does: + +\startbuffer +\catcode"1D443=11 +\catcode"1D444=11 +\catcode"1D445=11 +P( PP PQR +\stopbuffer + +\typebuffer + +Gives (with computer modern that has such italics): + +\startlinecorrection[blank] + \switchtobodyfont[modern] + \startcombination[nx=2,ny=2,distance=5em] + {\mathoption nocharitalic 0\relax \mathematics{\getbuffer}} + {\nohyphens\type{0:inline}} + {\mathoption nocharitalic 0\relax \mathematics{\displaymath\getbuffer}} + {\nohyphens\type{0:display}} + {\mathoption nocharitalic 1\relax \mathematics{\getbuffer}} + {\nohyphens\type{1:inline}} + {\mathoption nocharitalic 1\relax \mathematics{\displaymath\getbuffer}} + {\nohyphens\type{1:display}} + \stopcombination +\stoplinecorrection + +\subsubsection {\type {\mathoption useoldfractionscaling}} + +This option has been introduced as solution for tracker item 604 for fuzzy cases +around either or not present fraction related settings for new fonts. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luatex/luatex-modifications.tex b/doc/context/sources/general/manuals/luatex/luatex-modifications.tex new file mode 100644 index 000000000..549cfe377 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-modifications.tex @@ -0,0 +1,1220 @@ +% language=uk + +\environment luatex-style +\environment luatex-logos + +\startcomponent luatex-modifications + +\startchapter[reference=modifications,title={Modifications}] + +\startsection[title=The merged engines] + +\startsubsection[title=The need for change] + +The first version of \LUATEX\ only had a few extra primitives and it was largely +the same as \PDFTEX. Then we merged substantial parts of \ALEPH\ into the code +and got more primitives. When we got more stable the decision was made to clean +up the rather hybrid nature of the program. This means that some primitives have +been promoted to core primitives, often with a different name, and that others +were removed. This made it possible to start cleaning up the code base. In \in +{chapter} [enhancements] we discussed some new primitives, here we will cover +most of the adapted ones. + +Besides the expected changes caused by new functionality, there are a number of +not|-|so|-|expected changes. These are sometimes a side|-|effect of a new +(conflicting) feature, or, more often than not, a change neccessary to clean up +the internal interfaces. These will also be mentioned. + +\stopsubsection + +\startsubsection[title=Changes from \TEX\ 3.1415926] + +Of course it all starts with traditional \TEX. Even if we started with \PDFTEX, +most still comes from the original. But we divert a bit. + +\startitemize + +\startitem + The current code base is written in \CCODE, not \PASCAL. We use \CWEB\ when + possible. As a consequence instead of one large file plus change files, we + now have multiple files organized in categories like \type {tex}, \type + {pdf}, \type {lang}, \type {font}, \type {lua}, etc. There are some artefacts + of the conversion to \CCODE, but in due time we will clean up the source code + and make sure that the documentation is done right. Many files are in the + \CWEB\ format, but others, like those interfacing to \LUA, are \CCODE\ files. + Of course we want to stay as close as possible to the original so that the + documentation of the fundamentals behind \TEX\ by Don Knuth still applies. +\stopitem + +\startitem + See \in {chapter} [languages] for many small changes related to paragraph + building, language handling and hyphenation. The most important change is + that adding a brace group in the middle of a word (like in \type {of{}fice}) + does not prevent ligature creation. +\stopitem + +\startitem + There is no pool file, all strings are embedded during compilation. +\stopitem + +\startitem + The specifier \type {plus 1 fillll} does not generate an error. The extra + \quote{l} is simply typeset. +\stopitem + +\startitem + The upper limit to \type {\endlinechar} and \type {\newlinechar} is 127. +\stopitem + +\startitem + Magnification (\type {\mag}) is only supported in \DVI\ output mode. You can + set this parameter and it even works with \type {true} units till you switch + to \PDF\ output mode. When you use \PDF\ output you can best not touch the + \type {\mag} variable. This fuzzy behaviour is not much different from using + \PDF\ backend related functionality while eventually \DVI\ output is + required. + + After the output mode has been frozen (normally that happens when the first + page is shipped out) or when \PDF\ output is enabled, the \type {true} + specification is ignored. When you preload a plain format adapted to + \LUATEX\ it can be that the \type {\mag} parameter already has been set. +\stopitemize + +\stopsubsection + +\startsubsection[title=Changes from \ETEX\ 2.2] + +Being the de factor standard extension of course we provide the \ETEX\ +functionality, but with a few small adaptations. + +\startitemize + +\startitem + The \ETEX\ functionality is always present and enabled so the prepended + asterisk or \type {-etex} switch for \INITEX\ is not needed. +\stopitem + +\startitem + The \TEXXET\ extension is not present, so the primitives \type + {\TeXXeTstate}, \type {\beginR}, \type {\beginL}, \type {\endR} and \type + {\endL} are missing. Instead we use the \OMEGA\ approach to directionality. +\stopitem + +\startitem + Some of the tracing information that is output by \ETEX's \type + {\tracingassigns} and \type {\tracingrestores} is not there. +\stopitem + +\startitem + Register management in \LUATEX\ uses the \ALEPH\ model, so the maximum value + is 65535 and the implementation uses a flat array instead of the mixed + flat|\&|sparse model from \ETEX. +\stopitem + +\startitem + When kpathsea is used to find files, \LUATEX\ uses the \type {ofm} file + format to search for font metrics. In turn, this means that \LUATEX\ looks at + the \type {OFMFONTS} configuration variable (like \OMEGA\ and \ALEPH) instead + of \type {TFMFONTS} (like \TEX\ and \PDFTEX). Likewise for virtual fonts + (\LUATEX\ uses the variable \type {OVFFONTS} instead of \type {VFFONTS}). +\stopitem + +\stopitemize + +\stopsubsection + +\startsubsection[title=Changes from \PDFTEX\ 1.40] + +Because we want to produce \PDF\ the most natural starting point was the popular +\PDFTEX\ program. We inherit the stable features, dropped most of the +experimental code and promoted some functionality to core \LUATEX\ functionality +which in turn triggered renaming primitives. + +For compatibility reasons we still refer to \type {\pdf...} commands but \LUATEX\ +has a different backend interface. Instead of these primitives there are three +interfacing primitives: \type {\pdfextension}, \type {\pdfvariable} and +\type {\pdffeedback} that take keywords and optional further arguments. This way +we can extend the features when needed but don't need to adapt the core engine. +The front- and backend are decoupled as much as possible. + +\startitemize + +\startitem + The (experimental) support for snap nodes has been removed, because it is + much more natural to build this functionality on top of node processing and + attributes. The associated primitives that are now gone are: \type + {\pdfsnaprefpoint}, \type {\pdfsnapy}, and \type {\pdfsnapycomp}. +\stopitem + +\startitem + The (experimental) support for specialized spacing around nodes has also been + removed. The associated primitives that are now gone are: \type + {\pdfadjustinterwordglue}, \type {\pdfprependkern}, and \type + {\pdfappendkern}, as well as the five supporting primitives \type + {\knbscode}, \type {\stbscode}, \type {\shbscode}, \type {\knbccode}, and + \type {\knaccode}. +\stopitem + +\startitem + A number of \quote {\PDFTEX\ primitives} have been removed as they can be + implemented using \LUA: + + \start \raggedright + \type {\pdfelapsedtime}, \type {\pdfescapehex}, \type {\pdfescapename}, \type + {\pdfescapestring}, \type {\pdffiledump}, \type {\pdffilemoddate}, \type + {\pdffilesize}, \type {\pdfforcepagebox}, \type {\pdflastmatch}, \type + {\pdfmatch}, \type {\pdfmdfivesum}, \type {\pdfmovechars}, \type + {\pdfoptionalwaysusepdfpagebox}, \type {\pdfoptionpdfinclusionerrorlevel}, + \type {\pdfresettimer}, \type {\pdfshellescape}, \type {\pdfstrcmp} and \type + {\pdfunescapehex} + \par \stop +\stopitem + +\startitem + The version related primitives \type {\pdftexbanner}, \type {\pdftexversion} + and \type {\pdftexrevision} are no longer present as there is no longer a + relationship with \PDFTEX\ development. +\stopitem + +\startitem + The experimental snapper mechanism has been removed and therefore also the + primitives: + + \start \raggedright + \type {\pdfignoreddimen}, \type {\pdffirstlineheight}, \type + {\pdfeachlineheight}, \type {\pdfeachlinedepth} and \type + {\pdflastlinedepth} + \par \stop +\stopitem + +\startitem + The experimental primitives \type {\primitive}, \type {\ifprimitive}, \type + {\ifabsnum} and \type {\ifabsdim} are promoted to core primitives. The \type + {\pdf*} prefixed originals are not available. +\stopitem + +\startitem + The \PNG\ transparency fix from 1.40.6 is not applied as high|-|level support + is pending. Because \LUATEX\ has a different subsystem for managing images, + more diversion from its ancestor happened in the meantime. +\stopitem + +\startitem + Two extra token lists are provides, \type {\pdfxformresources} and \type + {\pdfxformattr}, as an alternative to \type {\pdfxform} keywords. +\stopitem + +\startitem + The current version of \LUATEX\ no longer replaces and|/|or merges fonts in + embedded \PDF\ files with fonts of the enveloping \PDF\ document. This + regression may be temporary, depending on how the rewritten font backend will + look like. +\stopitem + +\startitem + The primitives \type {\pdfpagewidth} and \type {\pdfpageheight} have been removed + because \type {\pagewidth} and \type {\pageheight} have that purpose. +\stopitem + +\startitem + The primitives \type {\pdfnormaldeviate}, \type {\pdfuniformdeviate}, \type + {\pdfsetrandomseed} and \type {\pdfrandomseed} have been promoted to core + primitives without \type {pdf} prefix so the original commands are no longer + recognized. +\stopitem + +\startitem + The primitives \type {\ifincsname}, \type {\expanded} and \type {\quitvmode} + are now core primitives. +\stopitem + +\startitem + As the hz and protrusion mechanism are part of the core the related + primitives \type {\lpcode}, \type {\rpcode}, \type {\efcode}, \type + {\leftmarginkern}, \type {\rightmarginkern} are promoted to core primitives. The + two commands \type {\protrudechars} and \type {\adjustspacing} replace their + prefixed with \type {\pdf} originals. +\stopitem + +\startitem + The hz optimization code has been partially redone so that we no longer need + to create extra font instances. The front- and backend have been decoupled + and more efficient (\PDF) code is generated. +\stopitem + +\startitem + When \type {\adjustspacing} has value~2, hz optimization will be applied to + glyphs and kerns. When the value is~3, only glyphs will be treated. A value + smaller than~2 disables this feature. +\stopitem + +\startitem + The \type {\tagcode} primitive is promoted to core primitive. +\stopitem + +\startitem + The \type {\letterspacefont} feature is now part of the core but will not be + changed (improved). We just provide it for legacy use. +\stopitem + +\startitem + The \type {\pdfnoligatures} primitive is now \type {\ignoreligaturesinfont}. +\stopitem + +\startitem + The \type {\pdfcopyfont} primitive is now \type {\copyfont}. +\stopitem + +\startitem + The \type {\pdffontexpand} primitive is now \type {\expandglyphsinfont}. +\stopitem + +\startitem + Because position tracking is also available in \DVI\ mode the \type + {\savepos}, \type {\lastxpos} and \type {\lastypos} commands now replace + their \type {pdf} prefixed originals. +\stopitem + +\startitem + The introspective primitives \type {\pdflastximagecolordepth} and \type + {\pdfximagebbox} have been removed. One can use external applications to + determine these properties or use the built|-|in \type {img} library. +\stopitem + +\startitem + The initializers \type {\pdfoutput} has been replaced by \type {\outputmode} and + \type {\pdfdraftmode} is now \type {\draftmode}. +\stopitem + +\startitem + The pixel multiplier dimension \type {\pdfpxdimen} lots its prefix and is now calles + \type {\pxdimen}. +\stopitem + +\startitem + An extra \type {\pdfimageaddfilename} option has been added that can be used to block + writing the filename to the \PDF\ file. +\stopitem + +\startitem + The primitive \type {\pdftracingfonts} is now \type {\tracingfonts} as it + doesn't relate to the backend. +\stopitem + +\startitem + The experimental primitive \type {\pdfinsertht} is kept as \type {\insertht}. +\stopitem + +\startitem + The promotion of primitives to core primitives as well as the separation of + font- and backend means that the initialization namespace \type {pdftex} is + gone. +\stopitem + +\stopitemize + +One change involves the so called xforms and ximages. In \PDFTEX\ these are +implemented as so called whatsits. But contrary to other whatsits they have +dimensions that need to be taken into account when for instance calculating +optimal line breaks. In \LUATEX\ these are now promoted to normal nodes, which +simplifies code that needs those dimensions. + +Another reason for promotion is that these are useful concepts. Backends can +provide the ability to use content that has been rendered in several places, +and images are also common. For that reason we also changed the names: + +\starttabulate[|l|l|] +\NC \bf new name \NC \bf old name \NC \NR +\NC \type {\saveboxresource} \NC \type {\pdfxform} \NC \NR +\NC \type {\saveimageresource} \NC \type {\pdfximage} \NC \NR +\NC \type {\useboxresource} \NC \type {\pdfrefxform} \NC \NR +\NC \type {\useimageresource} \NC \type {\pdfrefximage} \NC \NR +\NC \type {\lastsavedboxresourceindex} \NC \type {\pdflastxform} \NC \NR +\NC \type {\lastsavedimageresourceindex} \NC \type {\pdflastximage} \NC \NR +\NC \type {\lastsavedimageresourcepages} \NC \type {\pdflastximagepages} \NC \NR +\stoptabulate + +There are a few \type {\pdffeedback} features that relate to this but these are +typical backend specific ones. The index that gets returned is to be considered +as \quote {just a number} and although it still has the same meaning (object +related) as before, you should not depend on that. + +The protrusion detection mechanism is enhanced a bit to enable a bit more complex +situations. When protrusion characters are identified some nodes are skipped: + +\startitemize[packed] +\startitem zero glue \stopitem +\startitem penalties \stopitem +\startitem empty discretionaries \stopitem +\startitem normal zero kerns \stopitem +\startitem rules with zero dimensions \stopitem +\startitem math nodes with a surround of zero \stopitem +\startitem dir nodes \stopitem +\startitem empty horizontal lists \stopitem +\startitem local par nodes \stopitem +\startitem inserts, marks and adjusts \stopitem +\startitem boundaries \stopitem +\startitem whatsits \stopitem +\stopitemize + +Because this can not be enough, you can also use a protrusion boundary node to +make the next node being ignored. When the value is~1 or~3, the next node will be +ignored in the test when locating a left boundary condition. When the value is~2 +or~3, the previous node will be ignored when locating a right boundary condition +(the search goes from right to left). This permits protrusion combined with for +instance content moved into the margin: + +\starttyping +\protrusionboundary1\llap{!\quad}«Who needs protrusion?» +\stoptyping + +\stopsubsection + +\startsubsection[title=Changes from \ALEPH\ RC4] + +Because we wanted proper directional typesetting the \ALEPH\ mechanisms looked +most attractive. These are rather close to the ones provided by \OMEGA, so what +we say next applies to both these programs. + +\startitemize + +\startitem + The extended 16-bit math primitives (\type {\omathcode} etc.) have been + removed. +\stopitem + +\startitem + The \OCP\ processing has been removed completely and as a consequence, the + following primitives have been removed: + + \start \raggedright + \type {\ocp}, \type {\externalocp}, \type {\ocplist}, \type {\pushocplist}, + \type {\popocplist}, \type {\clearocplists}, \type {\addbeforeocplist}, \type + {\addafterocplist}, \type {\removebeforeocplist}, \type {\removeafterocplist} + and \type {\ocptracelevel} + \par \stop +\stopitem + +\startitem + \LUATEX\ only understands 4~of the 16~direction specifiers of \ALEPH: \type + {TLT} (latin), \type {TRT} (arabic), \type {RTT} (cjk), \type {LTL} + (mongolian). All other direction specifiers generate an error. +\stopitem + +\startitem + The input translations from \ALEPH\ are not implemented, the related + primitives are not available: + + \start \raggedright + \type {\DefaultInputMode}, \type {\noDefaultInputMode}, \type {\noInputMode}, + \type {\InputMode}, \type {\DefaultOutputMode}, \type {\noDefaultOutputMode}, + \type {\noOutputMode}, \type {\OutputMode}, \type {\DefaultInputTranslation}, + \type {\noDefaultInputTranslation}, \type {\noInputTranslation}, \type + {\InputTranslation}, \type {\DefaultOutputTranslation}, \type + {\noDefaultOutputTranslation}, \type {\noOutputTranslation} and \type + {\OutputTranslation} + \par \stop +\stopitem + +\startitem + Several bugs have been fixed an confusing implementation details have been sorted + out. +\stopitem + +\startitem + The scanner for direction specifications now allows an optional space after + the direction is completely parsed. +\stopitem + +\startitem + The \type {^^} notation has been extended: after \type {^^^^} four hexadecimal + characters are expected and after \type {^^^^^^} six hexadecimal characters + have to be given. The original \TEX\ interpretation is still valid for the + \type {^^} case but the four and six variants do no backtracking, i.e.\ when + they are not followed by the right number of hexadecimal digits they issue an + error message. Because \type{^^^} is a normal \TEX\ case, we don't support the + odd number of \type {^^^^^} either. +\stopitem + +\startitem + Glues {\it immediately after} direction change commands are not legal + breakpoints. +\stopitem + +\startitem + Several mechanisms that need to be right|-|to|-|left aware have been + improved. For instance placement of formula numbers. +\stopitem + +\startitem + The page dimension related primitives \type {\pagewidth} and \type + {\pageheight} have been promoted to core primitives. The \type {\hoffset} and + \type {\voffset} primitives have been fixed. +\stopitem + +\startitem + The primitives \type {\charwd}, \type {\charht}, \type {\chardp} and \type + {\charit} have been removed as we have the \ETEX\ variants \type + {\fontchar*}. +\stopitem + +\startitem + The two dimension registers \type {\pagerightoffset} and \type + {\pagebottomoffset} are now core primitives. +\stopitem + +\startitem + The direction related primitives \type {\pagedir}, \type {\bodydir}, \type + {\pardir}, \type {\textdir}, \type {\mathdir} and \type {\boxdir} are now + core primitives. +\stopitem + +\startitem + The promotion of primitives to core primitives as well as the removed of all + others means that the initialization namespace \type {aleph} is gone. +\stopitem + +\stopitemize + +The above let's itself summarize as: we took the 32 bit aspects and much of the +directional mechanisms. + +\stopsubsection + +\startsubsection[title=Changes from standard \WEBC] + +The compilation framework is \WEBC\ and we keep using that but without the +\PASCAL\ to \CCODE\ step. This framework also provides some common features that +deal with reading bytes from files and locating files in \TDS. This is what we do +different: + +\startitemize + +\startitem + There is no mltex support. +\stopitem + +\startitem + There is no enctex support. +\stopitem + +\startitem + The following encoding related command line switches are silently ignored, + even in non|-|\LUA\ mode: \type {-8bit}, \type {-translate-file}, \type + {-mltex}, \type {-enc} and \type {-etex}. +\stopitem + +\startitem + The \type {\openout} whatsits are not written to the log file. +\stopitem + +\startitem + Some of the so|-|called \WEBC\ extensions are hard to set up in non|-|\KPSE\ + mode because \type {texmf.cnf} is not read: \type {shell-escape} is off (but + that is not a problem because of \LUA's \type {os.execute}), and the paranoia + checks on \type {openin} and \type {openout} do not happen. However, it is + easy for a \LUA\ script to do this itself by overloading \type {io.open}. +\stopitem + +\startitem + The \quote{E} option does not do anything useful. +\stopitem + +\stopitemize + +\stopsubsection + +\stopsection + +\startsection[reference=backendprimitives,title=The backend primitives \type {\pdf*}] + +In a previous section we mentioned that some \PDFTEX\ primitives were removed and +others promoted to core \LUATEX\ primitives. That is only part of the story. In +order to separate the backend specific primitives in de code these commands are +now replaced by only a few. In traditional \TEX\ we only had the \DVI\ backend +but now we have two: \DVI\ and \PDF. Additional functionality is implemented as +\quote {extensions} in \TEX speak. By separating more strickly we are able to +keep the core (fontend) clean and stable. If for some reason an extra backend +option is needed, it can be implemented without touching the core. The three +\PDF\ backend related primitives are + +\starttyping +\pdfextension command [specification] +\pdfvariable name +\pdffeedback name +\stoptyping + +An extension triggers further parsing, depending on the command given. A variable is +a (kind of) register and can be read and written, while a feedback is reporting +something (as it comes from the backend it's normally a sequence of tokens). + +In order for \LUATEX\ to be more than just \TEX\ you need to enable primitives. That +has already be the case right from the start. If you want the traditional \PDFTEX\ +primitives (for as far their functionality is still around) you now can do this: + +\starttyping +\protected\def\pdfliteral {\pdfextension literal} +\protected\def\pdfcolorstack {\pdfextension colorstack} +\protected\def\pdfsetmatrix {\pdfextension setmatrix} +\protected\def\pdfsave {\pdfextension save\relax} +\protected\def\pdfrestore {\pdfextension restore\relax} +\protected\def\pdfobj {\pdfextension obj } +\protected\def\pdfrefobj {\pdfextension refobj } +\protected\def\pdfannot {\pdfextension annot } +\protected\def\pdfstartlink {\pdfextension startlink } +\protected\def\pdfendlink {\pdfextension endlink\relax} +\protected\def\pdfoutline {\pdfextension outline } +\protected\def\pdfdest {\pdfextension dest } +\protected\def\pdfthread {\pdfextension thread } +\protected\def\pdfstartthread {\pdfextension startthread } +\protected\def\pdfendthread {\pdfextension endthread\relax} +\protected\def\pdfinfo {\pdfextension info } +\protected\def\pdfcatalog {\pdfextension catalog } +\protected\def\pdfnames {\pdfextension names } +\protected\def\pdfincludechars {\pdfextension includechars } +\protected\def\pdffontattr {\pdfextension fontattr } +\protected\def\pdfmapfile {\pdfextension mapfile } +\protected\def\pdfmapline {\pdfextension mapline } +\protected\def\pdftrailer {\pdfextension trailer } +\protected\def\pdfglyphtounicode {\pdfextension glyphtounicode } +\stoptyping + +The introspective primitives can be defined as: + +\starttyping +\def\pdftexversion {\numexpr\pdffeedback version\relax} +\def\pdftexrevision {\pdffeedback revision} +\def\pdflastlink {\numexpr\pdffeedback lastlink\relax} +\def\pdfretval {\numexpr\pdffeedback retval\relax} +\def\pdflastobj {\numexpr\pdffeedback lastobj\relax} +\def\pdflastannot {\numexpr\pdffeedback lastannot\relax} +\def\pdfxformname {\numexpr\pdffeedback xformname\relax} +\def\pdfcreationdate {\pdffeedback creationdate} +\def\pdffontname {\numexpr\pdffeedback fontname\relax} +\def\pdffontobjnum {\numexpr\pdffeedback fontobjnum\relax} +\def\pdffontsize {\dimexpr\pdffeedback fontsize\relax} +\def\pdfpageref {\numexpr\pdffeedback pageref\relax} +\def\pdfcolorstackinit {\pdffeedback colorstackinit} +\stoptyping + +The configuration related registers have become: + +\starttyping +\edef\pdfcompresslevel {\pdfvariable compresslevel} +\edef\pdfobjcompresslevel {\pdfvariable objcompresslevel} +\edef\pdfdecimaldigits {\pdfvariable decimaldigits} +\edef\pdfgamma {\pdfvariable gamma} +\edef\pdfimageresolution {\pdfvariable imageresolution} +\edef\pdfimageapplygamma {\pdfvariable imageapplygamma} +\edef\pdfimagegamma {\pdfvariable imagegamma} +\edef\pdfimagehicolor {\pdfvariable imagehicolor} +\edef\pdfimageaddfilename {\pdfvariable imageaddfilename} +\edef\pdfpkresolution {\pdfvariable pkresolution} +\edef\pdfpkfixeddpi {\pdfvariable pkfixeddpi} +\edef\pdfinclusioncopyfonts {\pdfvariable inclusioncopyfonts} +\edef\pdfinclusionerrorlevel {\pdfvariable inclusionerrorlevel} +\edef\pdfignoreunknownimages {\pdfvariable ignoreunknownimages} +\edef\pdfgentounicode {\pdfvariable gentounicode} +\edef\pdfpagebox {\pdfvariable pagebox} +\edef\pdfminorversion {\pdfvariable minorversion} +\edef\pdfuniqueresname {\pdfvariable uniqueresname} + +\edef\pdfhorigin {\pdfvariable horigin} +\edef\pdfvorigin {\pdfvariable vorigin} +\edef\pdflinkmargin {\pdfvariable linkmargin} +\edef\pdfdestmargin {\pdfvariable destmargin} +\edef\pdfthreadmargin {\pdfvariable threadmargin} +\edef\pdfxformmargin {\pdfvariable xformmargin} + +\edef\pdfpagesattr {\pdfvariable pagesattr} +\edef\pdfpageattr {\pdfvariable pageattr} +\edef\pdfpageresources {\pdfvariable pageresources} +\edef\pdfxformattr {\pdfvariable xformattr} +\edef\pdfxformresources {\pdfvariable xformresources} +\edef\pdfpkmode {\pdfvariable pkmode} + +\edef\pdfsuppressoptionalinfo {\pdfvariable suppressoptionalinfo } +\edef\pdftrailerid {\pdfvariable trailerid } +\stoptyping + +The variables are internal ones, so they are anonymous. When you ask for the +meaning of a few previously defined ones: + +\starttyping +\meaning\pdfhorigin +\meaning\pdfcompresslevel +\meaning\pdfpageattr +\stoptyping + +you will get: + +\starttyping +macro:->[internal backend dimension] +macro:->[internal backend integer] +macro:->[internal backend tokenlist] +\stoptyping + +The \type {\edef} can also be an \type {\def} but it's a bit more efficient +to expand the lookup related register beforehand. After that you can adapt +the defaults; these are: + +\starttyping +\pdfcompresslevel 9 +\pdfobjcompresslevel 1 % used: (0,9) +\pdfdecimaldigits 4 % used: (3,6) +\pdfgamma 1000 +\pdfimageresolution 71 +\pdfimageapplygamma 0 +\pdfimagegamma 2200 +\pdfimagehicolor 1 +\pdfimageaddfilename 1 +\pdfpkresolution 72 +\pdfpkfixeddpi 0 +\pdfinclusioncopyfonts 0 +\pdfinclusionerrorlevel 0 +\pdfignoreunknownimages 0 +\pdfgentounicode 0 +\pdfpagebox 0 +\pdfminorversion 4 +\pdfuniqueresname 0 + +\pdfhorigin 1in +\pdfvorigin 1in +\pdflinkmargin 0pt +\pdfdestmargin 0pt +\pdfthreadmargin 0pt +\pdfxformmargin 0pt +\stoptyping + +If you also want some backward compatibility, you can add: + +\starttyping +\let\pdfpagewidth \pagewidth +\let\pdfpageheight \pageheight + +\let\pdfadjustspacing \adjustspacing +\let\pdfprotrudechars \protrudechars +\let\pdfnoligatures \ignoreligaturesinfont +\let\pdffontexpand \expandglyphsinfont +\let\pdfcopyfont \copyfont + +\let\pdfxform \saveboxresource +\let\pdflastxform \lastsavedboxresourceindex +\let\pdfrefxform \useboxresource + +\let\pdfximage \saveimageresource +\let\pdflastximage \lastsavedimageresourceindex +\let\pdflastximagepages\lastsavedimageresourcepages +\let\pdfrefximage \useimageresource + +\let\pdfsavepos \savepos +\let\pdflastxpos \lastxpos +\let\pdflastypos \lastypos + +\let\pdfoutput \outputmode +\let\pdfdraftmode \draftmode + +\let\pdfpxdimen \pxdimen + +\let\pdfinsertht \insertht + +\let\pdfnormaldeviate \normaldeviate +\let\pdfuniformdeviate \uniformdeviate +\let\pdfsetrandomseed \setrandomseed +\let\pdfrandomseed \randomseed + +\let\pdfprimitive \primitive +\let\ifpdfprimitive \ifprimitive + +\let\ifpdfabsnum \ifabsnum +\let\ifpdfabsdim \ifabsdim +\stoptyping + +And even: + +\starttyping +\newdimen\pdfeachlineheight +\newdimen\pdfeachlinedepth +\newdimen\pdflastlinedepth +\newdimen\pdffirstlineheight +\newdimen\pdfignoreddimen +\stoptyping + +The backend is derived from \PDFTEX\ so the same syntax applies. However, the +\type {outline} command accepts a \type {objnum} followed by a number. No +checking takes place so when this is used it had better be a valid (flushed) +object. + +In order to be (more or less) compatible with \PDFTEX\ we also support the +option to suppress some info: + +\starttyping +\pdfvariable suppressoptionalinfo \numexpr + 0 + + 1 % PTEX.FullBanner + + 2 % PTEX.FileName + + 4 % PTEX.PageNumber + + 8 % PTEX.InfoDict + + 16 % Creator + + 32 % CreationDate + + 64 % ModDate + + 128 % Producer + + 256 % Trapped + + 512 % ID +\relax +\stoptyping + +In addition you can overload the trailer id, but we don't do any checking on +validity, so you have to pass a valid array. The following is like the ones +normally generated by the engine: + +\starttyping +\pdfvariable trailerid {[ + <FA052949448907805BA83C1E78896398> + <FA052949448907805BA83C1E78896398> +]} +\stoptyping + +So, you even need to include the brackets! + +Although we started from a merge of \PDFTEX\ and \ALEPH, by now the code base as +well as functionality has diverted from those parents. Here we show the options +that can be passed to the extensions. + +\starttexsyntax +\pdfextension literal + [ direct | page ] { tokens } +\stoptexsyntax + +\starttexsyntax +\pdfextension dest + num integer | name { tokens }!crlf + [ fitbh | fitbv | fitb | fith| fitv | fit | + fitr <rule spec> | xyz [ zoom <integer> ] +\stoptexsyntax + +\starttexsyntax +\pdfextension annot + reserveobjnum | useobjnum <integer> + { tokens } +\stoptexsyntax + +\starttexsyntax +\pdfextension save +\stoptexsyntax + +\starttexsyntax +\pdfextension restore +\stoptexsyntax + +\starttexsyntax +\pdfextension setmatrix + { tokens } +\stoptexsyntax + +\starttexsyntax +[ \immediate ] \pdfextension obj + reserveobjnum +\stoptexsyntax + +\starttexsyntax +[ \immediate ] \pdfextension obj + [ useobjnum <integer> ] + [ uncompressed ] + [ stream [ attr { tokens } ] ] + [ file ] + { tokens } +\stoptexsyntax + +\starttexsyntax +\pdfextension refobj + <integer> +\stoptexsyntax + +\starttexsyntax +\pdfextension colorstack + <integer> + set { tokens } | push { tokens } | pop | current +\stoptexsyntax + +\starttexsyntax +\pdfextension startlink + [ attr { tokens } ] + user { tokens } | goto | thread + [ file { tokens } ] + [ page <integer> { tokens } | name { tokens } | num integer ] + [ newwindow | nonewwindow ] +\stoptexsyntax + +\starttexsyntax +\pdfextension endlink +\stoptexsyntax + +\starttexsyntax +\pdfextension startthread + num <integer> | name { tokens } +\stoptexsyntax + +\starttexsyntax +\pdfextension endthread +\stoptexsyntax + +\starttexsyntax +\pdfextension thread + num <integer> | name { tokens } +\stoptexsyntax + +\starttexsyntax +\pdfextension outline + [ attr { tokens } ] + [ useobjnum <integer> ] + [ count <integer> ] + { tokens } +\stoptexsyntax + +\starttexsyntax +\pdfextension glyphtounicode + { tokens } + { tokens } +\stoptexsyntax + +\starttexsyntax +\pdfextension catalog + { tokens } + [ openaction + user { tokens } | goto | thread + [ file { tokens } ] + [ page <integer> { tokens } | name { tokens } | num <integer> ] + [ newwindow | nonewwindow ] ] +\stoptexsyntax + +\starttexsyntax +\pdfextension fontattr + <integer> + {tokens} +\stoptexsyntax + +\starttexsyntax +\pdfextension mapfile + {tokens} +\stoptexsyntax + +\starttexsyntax +\pdfextension mapline + {tokens} +\stoptexsyntax + +\starttexsyntax +\pdfextension includechars + {tokens} +\stoptexsyntax + +\starttexsyntax +\pdfextension info + {tokens} +\stoptexsyntax + +\starttexsyntax +\pdfextension names + {tokens} +\stoptexsyntax + +\starttexsyntax +\pdfextension trailer + {tokens} +\stoptexsyntax + +\stopsection + +\startsection[title=Directions] + +The directional model in \LUATEX\ is inherited from \OMEGA|/|\ALEPH\ but we tried +to improve it a bit. At some point we played with recovery of modes but that was +disabled later on when we found that it interfered with nested directions. That +itself had as side effect that the node list was no longer balanced with respect +to directional nodes which in turn can give side effects when a series of dir +changes happens without grouping. + +The current (0.97 onward) approach is that we again make the list balanced but +try to avoid some side effects. What happens is quite intuitive if we forget +about spaces (turned into glue) but even there what happens makes sense if you +look at it in detail. However that logic makes in|-|group switching kind of +useless when no proper nested grouping is used: switching from right to left +several times nested, results in spacing ending up after each other due to nested +mirroring. Of course a sane macro package will manage this for the user but here +we are discussing the low level dir injection. + +This is what happens: + +\starttyping +\textdir TRT nur {\textdir TLT run \textdir TRT NUR} nur +\stoptyping + +This becomes stepwise: + +\startnarrower +\starttyping +injected: [+TRT]nur {[+TLT]run [+TRT]NUR} nur +balanced: [+TRT]nur {[+TLT]run [-TLT][+TRT]NUR[-TRT]} nur[-TRT] +result : run {RUNrun } run +\stoptyping +\stopnarrower + +And this: + +\starttyping +\textdir TRT nur {nur \textdir TLT run \textdir TRT NUR} nur +\stoptyping + +becomes: + +\startnarrower +\starttyping +injected: [+TRT]nur {nur [+TLT]run [+TRT]NUR} nur +balanced: [+TRT]nur {nur [+TLT]run [-TLT][+TRT]NUR[-TRT]} nur[-TRT] +result : run {run RUNrun } run +\stoptyping +\stopnarrower + +Now, in the following examples watch where we put the braces: + +\startbuffer +\textdir TRT nur {{\textdir TLT run} {\textdir TRT NUR}} nur +\stopbuffer + +\typebuffer + +This becomes: + +\startnarrower +\getbuffer +\stopnarrower + +Compare this to: + +\startbuffer +\textdir TRT nur {{\textdir TLT run }{\textdir TRT NUR}} nur +\stopbuffer + +\typebuffer + +Which renders as: + +\startnarrower +\getbuffer +\stopnarrower + +So how do we deal with the next? + +\startbuffer +\def\ltr{\textdir TLT\relax} +\def\rtl{\textdir TRT\relax} + +run {\rtl nur {\ltr run \rtl NUR \ltr run \rtl NUR} nur} +run {\ltr run {\rtl nur \ltr RUN \rtl nur \ltr RUN} run} +\stopbuffer + +\typebuffer + +It gets typeset as: + +\startnarrower +\startlines +\getbuffer +\stoplines +\stopnarrower + +We could define the two helpers to look back, pick up a skip, remove it and +inject it after the dir node. But that way we loose the subtype information that +for some applications can be handy to be kept as|-|is. This is why we now have a +variant of \type {\textdir} which injects the balanced node before the skip. +Instead of the previous definition we can use: + +\startbuffer[def] +\def\ltr{\linedir TLT\relax} +\def\rtl{\linedir TRT\relax} +\stopbuffer + +\typebuffer[def] + +and this time: + +\startbuffer[txt] +run {\rtl nur {\ltr run \rtl NUR \ltr run \rtl NUR} nur} +run {\ltr run {\rtl nur \ltr RUN \rtl nur \ltr RUN} run} +\stopbuffer + +\typebuffer[txt] + +comes out as a properly spaced: + +\startnarrower +\startlines +\getbuffer[def,txt] +\stoplines +\stopnarrower + +Anything more complex that this, like combination of skips and penalties, or +kerns, should be handled in the input or macro package because there is no way we +can predict the expected behaviour. In fact, the \type {\linedir} is just a +convenience extra which could also have been implemented using node list parsing. + +Another adaptation to the \ALEPH\ directional model is control over shapes driven +by \type {\hangindent} and \type {\parshape}. This is controlled by a new parameter +\type {\shapemode}: + +\starttabulate[|cTB|c|] +\NC \NC \bf \type {\hangindent} \NC \bf \type {\parshape} \NC \NR +\NC 0 \NC normal \NC normal \NC \NR +\NC 1 \NC mirrored \NC normal \NC \NR +\NC 2 \NC normal \NC mirrored \NC \NR +\NC 3 \NC mirrored \NC mirrored \NC \NR +\stoptabulate + +The value is reset to zero (like \type {\hangindent} and \type {\parshape}) +after the paragraph is done with. You can use negative values to preven t +this. + +In \in {figure} [fig:shapemode] a few examples are given. + +\startplacefigure[reference=fig:shapemode,title={The effect of \type {shapemode}.}] + \startcombination[2*3] + {\ruledvbox \bgroup \setuptolerance[verytolerant] + \hsize .45\textwidth \switchtobodyfont[6pt] + \pardir TLT \textdir TLT + \hangindent 40pt \hangafter -3 + \leftskip10pt \input tufte \par + \egroup} {TLT: hangindent} + {\ruledvbox \bgroup \setuptolerance[verytolerant] + \hsize .45\textwidth \switchtobodyfont[6pt] + \pardir TLT \textdir TLT + \parshape 4 0pt .8\hsize 10pt .8\hsize 20pt .8\hsize 0pt \hsize + \input tufte \par + \egroup} {TLT: parshape} + {\ruledvbox \bgroup \setuptolerance[verytolerant] + \hsize .45\textwidth \switchtobodyfont[6pt] + \pardir TRT \textdir TRT + \hangindent 40pt \hangafter -3 + \leftskip10pt \input tufte \par + \egroup} {TRT: hangindent mode 0} + {\ruledvbox \bgroup \setuptolerance[verytolerant] + \hsize .45\textwidth \switchtobodyfont[6pt] + \pardir TRT \textdir TRT + \parshape 4 0pt .8\hsize 10pt .8\hsize 20pt .8\hsize 0pt \hsize + \input tufte \par + \egroup} {TRT: parshape mode 0} + {\ruledvbox \bgroup \setuptolerance[verytolerant] + \hsize .45\textwidth \switchtobodyfont[6pt] + \shapemode=3 + \pardir TRT \textdir TRT + \hangindent 40pt \hangafter -3 + \leftskip10pt \input tufte \par + \egroup} {TRT: hangindent mode 1 & 3} + {\ruledvbox \bgroup \setuptolerance[verytolerant] + \hsize .45\textwidth \switchtobodyfont[6pt] + \shapemode=3 + \pardir TRT \textdir TRT + \parshape 4 0pt .8\hsize 10pt .8\hsize 20pt .8\hsize 0pt \hsize + \input tufte \par + \egroup} {TRT: parshape mode 2 & 3} + \stopcombination +\stopplacefigure + +\stopsection + +\startsection[title=Implementation notes] + +\startsubsection[title=Memory allocation] + +The single internal memory heap that traditional \TEX\ used for tokens and nodes +is split into two separate arrays. Each of these will grow dynamically when +needed. + +The \type {texmf.cnf} settings related to main memory are no longer used (these +are: \type {main_memory}, \type {mem_bot}, \type {extra_mem_top} and \type +{extra_mem_bot}). \quote {Out of main memory} errors can still occur, but the +limiting factor is now the amount of RAM in your system, not a predefined limit. + +Also, the memory (de)allocation routines for nodes are completely rewritten. The +relevant code now lives in the C file \type {texnode.c}, and basically uses a +dozen or so \quote {avail} lists instead of a doubly|-|linked model. An extra +function layer is added so that the code can ask for nodes by type instead of +directly requisitioning a certain amount of memory words. + +Because of the split into two arrays and the resulting differences in the data +structures, some of the macros have been duplicated. For instance, there are now +\type {vlink} and \type {vinfo} as well as \type {token_link} and \type +{token_info}. All access to the variable memory array is now hidden behind a +macro called \type {vmem}. We mention this because using the \TEX book as +reference is still quite valid but not for memory related details. Another +significate detail is that we have double linked node lists and that some nodes +carry more data. + +The implementation of the growth of two arrays (via reallocation) introduces a +potential pitfall: the memory arrays should never be used as the left hand side +of a statement that can modify the array in question. Details like this are +of no concern to users. + +The input line buffer and pool size are now also reallocated when needed, and the +\type {texmf.cnf} settings \type {buf_size} and \type {pool_size} are silently +ignored. + +\stopsubsection + +\startsubsection[title=Sparse arrays] + +The \type {\mathcode}, \type {\delcode}, \type {\catcode}, \type {\sfcode}, \type +{\lccode} and \type {\uccode} (and the new \type {\hjcode}) tables are now sparse +arrays that are implemented in~\CCODE. They are no longer part of the \TEX\ +\quote {equivalence table} and because each had 1.1 million entries with a few +memory words each, this makes a major difference in memory usage. + +The \type {\catcode}, \type {\sfcode}, \type {\lccode}, \type {\uccode} and \type +{\hjcode} assignments do not yet show up when using the \ETEX\ tracing routines +\type {\tracingassigns} and \type {\tracingrestores}. + +A side|-|effect of the current implementation is that \type {\global} is now more +expensive in terms of processing than non|-|global assignments. + +The glyph ids within a font are also managed by means of a sparse array as glyph +ids can go up to index $2^{21}-1$. + +\stopsubsection + +\startsubsection[title=Simple single-character csnames] + +Single|-|character commands are no longer treated specially in the internals, +they are stored in the hash just like the multiletter csnames. + +The code that displays control sequences explicitly checks if the length is one +when it has to decide whether or not to add a trailing space. + +Active characters are internally implemented as a special type of multi|-|letter +control sequences that uses a prefix that is otherwise impossible to obtain. + +\stopsubsection + +\startsubsection[title=Compressed format] + +The format is passed through \type {zlib}, allowing it to shrink to roughly half +of the size it would have had in uncompressed form. This takes a bit more \CPU\ +cycles but much less disk \IO, so it should still be faster. + +\stopsubsection + +\startsubsection[title=Binary file reading] + +All of the internal code is changed in such a way that if one of the \type +{read_xxx_file} callbacks is not set, then the file is read by a \CCODE\ function +using basically the same convention as the callback: a single read into a buffer +big enough to hold the entire file contents. While this uses more memory than the +previous code (that mostly used \type {getc} calls), it can be quite a bit faster +(depending on your \IO\ subsystem). + +\stopsubsection + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luatex/luatex-nodes.tex b/doc/context/sources/general/manuals/luatex/luatex-nodes.tex new file mode 100644 index 000000000..8d32ab287 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-nodes.tex @@ -0,0 +1,1915 @@ +% language=uk + +\environment luatex-style +\environment luatex-logos + +\startcomponent luatex-nodes + +\startchapter[reference=nodes,title={Nodes}] + +\section{\LUA\ node representation} + +\TEX's nodes are represented in \LUA\ as userdata object with a variable set of +fields. In the following syntax tables, such the type of such a userdata object +is represented as \syntax {<node>}. + +The current return value of \type {node.types()} is: +\startluacode + for id, name in table.sortedhash(node.types()) do + context.type(name) + context(" (%s), ",id) + end + context.removeunwantedspaces() + context.removepunctuation() +\stopluacode +. % period + +The \type {\lastnodetype} primitive is \ETEX\ compliant. The valid range is still +$[-1,15]$ and glyph nodes (formerly known as char nodes) have number~0 while +ligature nodes are mapped to~7. That way macro packages can use the same symbolic +names as in traditional \ETEX. Keep in mind that these \ETEX\ node numbers are +different from the real internal ones and that there are more \ETEX\ node types +than~15. + +You can ask for a list of fields with the \type {node.fields} (which takes an id) +and for valid subtypes with \type {node.subtypes} (which takes a string because +eventually we might support more used enumerations). + +\subsection{Attributes} + +The newly introduced attribute registers are non|-|trivial, because the value +that is attached to a node is essentially a sparse array of key|-|value pairs. It +is generally easiest to deal with attribute lists and attributes by using the +dedicated functions in the \type {node} library, but for completeness, here is +the low|-|level interface. + +\subsubsection{attribute_list nodes} + +An \type {attribute_list} item is used as a head pointer for a list of attribute +items. It has only one user-visible field: + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC next \NC node \NC pointer to the first attribute \NC \NR +\stoptabulate + +\subsubsection{attribute nodes} + +A normal node's attribute field will point to an item of type \type +{attribute_list}, and the \type {next} field in that item will point to the first +defined \quote {attribute} item, whose \type {next} will point to the second +\quote {attribute} item, etc. + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC next \NC node \NC pointer to the next attribute \NC \NR +\NC number \NC number \NC the attribute type id \NC \NR +\NC value \NC number \NC the attribute value \NC \NR +\stoptabulate + +As mentioned it's better to use the official helpers rather than edit these +fields directly. For instance the \type {prev} field is used for other purposes +and there is no double linked list. + +\subsection{Main text nodes} + +These are the nodes that comprise actual typesetting commands. A few fields are +present in all nodes regardless of their type, these are: + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC next \NC node \NC the next node in a list, or nil \NC \NR +\NC id \NC number \NC the node's type (\type {id}) number \NC \NR +\NC subtype \NC number \NC the node \type {subtype} identifier \NC \NR +\stoptabulate + +The \type {subtype} is sometimes just a stub entry. Not all nodes actually use +the \type {subtype}, but this way you can be sure that all nodes accept it as a +valid field name, and that is often handy in node list traversal. In the +following tables \type {next} and \type {id} are not explicitly mentioned. + +Besides these three fields, almost all nodes also have an \type {attr} field, and +there is a also a field called \type {prev}. That last field is always present, +but only initialized on explicit request: when the function \type {node.slide()} +is called, it will set up the \type {prev} fields to be a backwards pointer in +the argument node list. By now most of \TEX's node processing makes sure that the +\type {prev} nodes are valid but there can be exceptions, especially when the +internal magic uses a leading \type {temp} nodes to temporarily store a state. + +\subsubsection{hlist nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{list} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC width \NC number \NC the width of the box \NC \NR +\NC height \NC number \NC the height of the box \NC \NR +\NC depth \NC number \NC the depth of the box \NC \NR +\NC shift \NC number \NC a displacement perpendicular to the character progression direction \NC \NR +\NC glue_order \NC number \NC a number in the range $[0,4]$, indicating the glue order \NC \NR +\NC glue_set \NC number \NC the calculated glue ratio \NC \NR +\NC glue_sign \NC number \NC 0 = \type {normal}, 1 = \type {stretching}, 2 = \type {shrinking} \NC \NR +\NC head/list \NC node \NC the first node of the body of this list \NC \NR +\NC dir \NC string \NC the direction of this box, see~\in[dirnodes] \NC \NR +\stoptabulate + +A warning: never assign a node list to the \type {head} field unless you are sure +its internal link structure is correct, otherwise an error may result. + +Note: the field name \type {head} and \type {list} are both valid. Sometimes it +makes more sense to refer to a list by \type {head}, sometimes \type {list} makes +more sense. + +\subsubsection{vlist nodes} + +This node is similar to \type {hlist}, except that \quote {shift} is a displacement +perpendicular to the line progression direction, and \quote {subtype} only has +the values 0, 4, and~5. + +\subsubsection{rule nodes} + +Contrary to traditional \TEX, \LUATEX\ has more subtypes because we also use +rules to store reuseable objects and images. User nodes are invisible and can be +intercepted by a callback. + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{rule} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC width \NC number \NC the width of the rule where the special value $-1073741824$ is used for \quote {running} glue dimensions \NC \NR +\NC height \NC number \NC the height of the rule (can be negative) \NC \NR +\NC depth \NC number \NC the depth of the rule (can be negative) \NC \NR +\NC dir \NC string \NC the direction of this rule, see~\in[dirnodes] \NC \NR +\NC index \NC number \NC an optional index that can be referred to \NC \NR +\stoptabulate + +\subsubsection{ins nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC the insertion class \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC cost \NC number \NC the penalty associated with this insert \NC \NR +\NC height \NC number \NC height of the insert \NC \NR +\NC depth \NC number \NC depth of the insert \NC \NR +\NC head/list \NC node \NC the first node of the body of this insert \NC \NR +\stoptabulate + +There is a set of extra fields that concern the associated glue: \type {width}, +\type {stretch}, \type {stretch_order}, \type {shrink} and \type {shrink_order}. +These are all numbers. + +A warning: never assign a node list to the \type {head} field unless you are sure +its internal link structure is correct, otherwise an error may be result. You can use +\type {list} instead (often in functions you want to use local variable swith similar +names and both names are equally sensible). + +\subsubsection{mark nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC unused \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC class \NC number \NC the mark class \NC \NR +\NC mark \NC table \NC a table representing a token list \NC \NR +\stoptabulate + +\subsubsection{adjust nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{adjust} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC head/list \NC node \NC adjusted material \NC \NR +\stoptabulate + +A warning: never assign a node list to the \type {head} field unless you are sure +its internal link structure is correct, otherwise an error may be result. + +\subsubsection{disc nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{disc} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC pre \NC node \NC pointer to the pre|-|break text \NC \NR +\NC post \NC node \NC pointer to the post|-|break text \NC \NR +\NC replace \NC node \NC pointer to the no|-|break text \NC \NR +\NC penalty \NC number \NC the penalty associated with the break, normally \type {\hyphenpenalty} or \type {\exhyphenpenalty} \NC \NR +\stoptabulate + +The subtype numbers~4 and~5 belong to the \quote {of-f-ice} explanation given +elsewhere. + +These disc nodes are kind of special as at some point they also keep information +about breakpoints and nested ligatures. The \type {pre}, \type {post} and \type +{replace} fields at the \LUA\ end are in fact indirectly accessed and have a +\type {prev} pointer that is not \type {nil}. This means that when you mess +around with the head of these (three) lists, you also need to reassign them +because that will restore the proper \type {prev} pointer, so: + +\starttyping +pre = d.pre +-- change the list starting with pre +d.pre = pre +\stoptyping + +Otherwise you can end up with an invalid internal perception of reality and +\LUATEX\ might even decide to crash on you. It also means that running forward +over for instance \type {pre} is ok but backward you need to stop at \type {pre}. +And you definitely must not mess with the node that \type {prev} points to, if +only because it is not really an node but part of the disc data structure (so +freeing it again might crash \LUATEX). + +\subsubsection{math nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{math} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC surround \NC number \NC width of the \type {\mathsurround} kern \NC \NR +\stoptabulate + +There is a set of extra fields that concern the associated glue: \type {width}, +\type {stretch}, \type {stretch_order}, \type {shrink} and \type {shrink_order}. +These are all numbers. + +\subsubsection{glue nodes} + +Skips are about the only type of data objects in traditional \TEX\ that are not a +simple value. The structure that represents the glue components of a skip is +called a \type {glue_spec}, and it has the following accessible fields: + +\starttabulate[|lT|l|p|] +\NC \rmbf key \NC \bf type \NC \bf explanation \NC \NR +\NC width \NC number \NC the horizontal or vertical displacement \NC \NR +\NC stretch \NC number \NC extra (positive) displacement or stretch amount \NC \NR +\NC stretch_order \NC number \NC factor applied to stretch amount \NC \NR +\NC shrink \NC number \NC extra (negative) displacement or shrink amount\NC \NR +\NC shrink_order \NC number \NC factor applied to shrink amount \NC \NR +\stoptabulate + +The effective width of some glue subtypes depends on the stretch or shrink needed +to make the encapsulating box fit its dimensions. For instance, in a paragraph +lines normally have glue representing spaces and these stretch of shrink to make +the content fit in the available space. The \type {effective_glue} function that +takes a glue node and a parent (hlist or vlist) returns the effective width of +that glue item. + +A gluespec node is a special kind of node that is used for storing a set of glue +values in registers. Originally they were also used to store properties of glue +nodes (using a system of reference counts) but we now keep these properties in +the glue nodes themselves, which gives a cleaner interface to \LUA. + +The indirect spec approach was in fact an optimization in the original \TEX\ +code. First of all it can save quite some memory because all these spaces that +become glue now share the same specification (only the reference count is +incremented), and zero testing is also a bit faster because only the pointer has +to be checked (this is no longer true for engines that implement for instance +protrusion where we really need to ensure that zero is zero when we test for +bounds). Another side effect is that glue specifications are read|-|only, so in +the end copies need to be made when they are used from \LUA\ (each assignment to +a field can result in a new copy). So in the end the advantages of sharing are +not that high (and nowadays memory is less an issue, also given that a glue node +is only a few memory words larger than a spec). + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{glue} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC leader \NC node \NC pointer to a box or rule for leaders \NC \NR +\stoptabulate + +In addition there are the \type {width}, \type {stretch} \type {stretch_order}, +\type {shrink}, and \type {shrink_order} fields. Note that we use the key \type +{width} in both horizontal and vertical glue. This suits the \TEX\ internals well +so we decided to stick to that naming. + +A regular word space also results in a \type {spaceskip} subtype (this used to be +a \type {userskip} with subtype zero). + +\subsubsection{kern nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{kern} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC kern \NC number \NC fixed horizontal or vertical advance \NC \NR +\stoptabulate + +\subsubsection{penalty nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC not used \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC penalty \NC number \NC the penalty value \NC \NR +\stoptabulate + +\subsubsection[glyphnodes]{glyph nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \rmbf type \NC \rmbf explanation \NC \NR +\NC subtype \NC number \NC bitfield \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC char \NC number \NC the chatacter index in the font \NC \NR +\NC font \NC number \NC the font identifier \NC \NR +\NC lang \NC number \NC the language identifier \NC \NR +\NC left \NC number \NC the frozen \type {\lefthyphenmnin} value \NC \NR +\NC right \NC number \NC the frozen \type {\righthyphenmnin} value \NC \NR +\NC uchyph \NC boolean \NC the frozen \type {\uchyph} value \NC \NR +\NC components \NC node \NC pointer to ligature components \NC \NR +\NC xoffset \NC number \NC a virtual displacement in horizontal direction \NC \NR +\NC yoffset \NC number \NC a virtual displacement in vertical direction \NC \NR +\NC xadvance \NC number \NC an additional advance after the glyph (experimental) \NC \NR +\NC width \NC number \NC the (original) width of the character \NC \NR +\NC height \NC number \NC the (original) height of the character\NC \NR +\NC depth \NC number \NC the (original) depth of the character\NC \NR +\NC expansion_factor \NC number \NC the to be applied expansion_factor \NC \NR +\stoptabulate + +The \type {width}, \type {height} and \type {depth} values are read|-|only. The +\type {expansion_factor} is assigned in the parbuilder and used in the backend. + +A warning: never assign a node list to the components field unless you are sure +its internal link structure is correct, otherwise an error may be result. Valid +bits for the \type {subtype} field are: + +\starttabulate[|c|l|] +\NC \rmbf bit \NC \bf meaning \NC \NR +\NC 0 \NC character \NC \NR +\NC 1 \NC ligature \NC \NR +\NC 2 \NC ghost \NC \NR +\NC 3 \NC left \NC \NR +\NC 4 \NC right \NC \NR +\stoptabulate + +See \in {section} [charsandglyphs] for a detailed description of the \type +{subtype} field. + +The \type {expansion_factor} has been introduced as part of the separation +between font- and backend. It is the result of extensive experiments with a more +efficient implementation of expansion. Early versions of \LUATEX\ already +replaced multiple instances of fonts in the backend by scaling but contrary to +\PDFTEX\ in \LUATEX\ we now also got rid of font copies in the frontend and +replaced them by expansion factors that travel with glyph nodes. Apart from a +cleaner approach this is also a step towards a better separation between front- +and backend. + +The \type {is_char} function checks if a node is a glyph node with a subtype still +less than 256. This function can be used to determine if applying font logic to a +glyph node makes sense. The value \type {nil} gets returned when the node is not +a glyph, a character number is returned if the node is still tagged as character +and \type {false} gets returned otherwise. When nil is returned, the id is also +returned. The \type {is_glyph} variant doesn't check for a subtype being less +than 256, so it returns either the character value or nil plus the id. These +helpers are not always faster than separate calls but they sometimes permit +making more readable tests. + +\subsubsection{boundary nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{boundary} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC value \NC number \NC values 0--255 are reserved \NC \NR +\stoptabulate + +This node relates to the \type {\noboundary}, \type {\boundary}, \type +{\protrusionboundary} and \type {\wordboundary} primitives. + +\subsubsection{local_par nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC pen_inter \NC number \NC local interline penalty (from \type {\localinterlinepenalty}) \NC \NR +\NC pen_broken \NC number \NC local broken penalty (from \type {\localbrokenpenalty}) \NC \NR +\NC dir \NC string \NC the direction of this par. see~\in [dirnodes] \NC \NR +\NC box_left \NC node \NC the \type {\localleftbox} \NC \NR +\NC box_left_width \NC number \NC width of the \type {\localleftbox} \NC \NR +\NC box_right \NC node \NC the \type {\localrightbox} \NC \NR +\NC box_right_width \NC number \NC width of the \type {\localrightbox} \NC \NR +\stoptabulate + +A warning: never assign a node list to the \type {box_left} or \type {box_right} +field unless you are sure its internal link structure is correct, otherwise an +error may be result. + +\subsubsection[dirnodes]{dir nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC dir \NC string \NC the direction (but see below) \NC \NR +\NC level \NC number \NC nesting level of this direction whatsit \NC \NR +\stoptabulate + +A note on \type {dir} strings. Direction specifiers are three|-|letter +combinations of \type {T}, \type {B}, \type {R}, and \type {L}. + +These are built up out of three separate items: + +\startitemize[packed] +\startitem + the first is the direction of the \quote{top} of paragraphs. +\stopitem +\startitem + the second is the direction of the \quote{start} of lines. +\stopitem +\startitem + the third is the direction of the \quote{top} of glyphs. +\stopitem +\stopitemize + +However, only four combinations are accepted: \type {TLT}, \type {TRT}, \type +{RTT}, and \type {LTL}. + +Inside actual \type {dir} whatsit nodes, the representation of \type {dir} is not +a three-letter but a four|-|letter combination. The first character in this case +is always either \type {+} or \type {-}, indicating whether the value is pushed +or popped from the direction stack. + +\subsubsection{margin_kern nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{margin_kern} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC width \NC number \NC the advance of the kern \NC \NR +\NC glyph \NC node \NC the glyph to be used \NC \NR +\stoptabulate + +\subsection{Math nodes} + +These are the so||called \quote {noad}s and the nodes that are specifically +associated with math processing. Most of these nodes contain subnodes so that the +list of possible fields is actually quite small. First, the subnodes: + +\subsubsection{Math kernel subnodes} + +Many object fields in math mode are either simple characters in a specific family +or math lists or node lists. There are four associated subnodes that represent +these cases (in the following node descriptions these are indicated by the word +\type {<kernel>}). + +The \type {next} and \type {prev} fields for these subnodes are unused. + +\subsubsubsection{math_char and math_text_char subnodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC char \NC number \NC the character index \NC \NR +\NC fam \NC number \NC the family number \NC \NR +\stoptabulate + +The \type {math_char} is the simplest subnode field, it contains the character +and family for a single glyph object. The \type {math_text_char} is a special +case that you will not normally encounter, it arises temporarily during math list +conversion (its sole function is to suppress a following italic correction). + +\subsubsubsection{sub_box and sub_mlist subnodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC head/list \NC node \NC list of nodes \NC \NR +\stoptabulate + +These two subnode types are used for subsidiary list items. For \type {sub_box}, +the \type {head} points to a \quote {normal} vbox or hbox. For \type {sub_mlist}, +the \type {head} points to a math list that is yet to be converted. + +A warning: never assign a node list to the \type {head} field unless you are sure +its internal link structure is correct, otherwise an error may be result. + +\subsubsection{Math delimiter subnode} + +There is a fifth subnode type that is used exclusively for delimiter fields. As +before, the \type {next} and \type {prev} fields are unused. + +\subsubsubsection{delim subnodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC small_char \NC number \NC character index of base character \NC \NR +\NC small_fam \NC number \NC family number of base character \NC \NR +\NC large_char \NC number \NC character index of next larger character \NC \NR +\NC large_fam \NC number \NC family number of next larger character \NC \NR +\stoptabulate + +The fields \type {large_char} and \type {large_fam} can be zero, in that case the +font that is sed for the \type {small_fam} is expected to provide the large +version as an extension to the \type {small_char}. + +\subsubsection{Math core nodes} + +First, there are the objects (the \TEX book calls then \quote {atoms}) that are +associated with the simple math objects: ord, op, bin, rel, open, close, punct, +inner, over, under, vcent. These all have the same fields, and they are combined +into a single node type with separate subtypes for differentiation. + +\subsubsubsection{simple nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{noad} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC nucleus \NC kernel node \NC base \NC \NR +\NC sub \NC kernel node \NC subscript \NC \NR +\NC sup \NC kernel node \NC superscript \NC \NR +\stoptabulate + +\subsubsubsection{accent nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{accent} \NC \NR +\NC nucleus \NC kernel node \NC base \NC \NR +\NC sub \NC kernel node \NC subscript \NC \NR +\NC sup \NC kernel node \NC superscript \NC \NR +\NC accent \NC kernel node \NC top accent \NC \NR +\NC bot_accent \NC kernel node \NC bottom accent \NC \NR +\stoptabulate + +\subsubsubsection{style nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC style \NC string \NC contains the style \NC \NR +\stoptabulate + +There are eight possibilities for the string value: one of \quote {display}, +\quote {text}, \quote {script}, or \quote {scriptscript}. Each of these can have +a trailing \type {'} to signify \quote {cramped} styles. + +\subsubsubsection{choice nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC display \NC node \NC list of display size alternatives \NC \NR +\NC text \NC node \NC list of text size alternatives \NC \NR +\NC script \NC node \NC list of scriptsize alternatives \NC \NR +\NC scriptscript \NC node \NC list of scriptscriptsize alternatives \NC \NR +\stoptabulate + +A warning: never assign a node list to the display, text, script, or +scriptscript field unless you are sure its internal link structure is +correct, otherwise an error may be result. + +\subsubsubsection{radical nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{radical} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC nucleus \NC kernel node \NC base \NC \NR +\NC sub \NC kernel node \NC subscript \NC \NR +\NC sup \NC kernel node \NC superscript \NC \NR +\NC left \NC delimiter node \NC \NC \NR +\NC degree \NC kernel node \NC only set by \type {\Uroot} \NC \NR +\stoptabulate + +A warning: never assign a node list to the nucleus, sub, sup, left, or degree +field unless you are sure its internal link structure is correct, otherwise an +error may be result. + +\subsubsubsection{fraction nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC width \NC number \NC (optional) width of the fraction \NC \NR +\NC num \NC kernel node \NC numerator \NC \NR +\NC denom \NC kernel node \NC denominator \NC \NR +\NC left \NC delimiter node \NC left side symbol \NC \NR +\NC right \NC delimiter node \NC right side symbol\NC \NR +\stoptabulate + +A warning: never assign a node list to the num, or denom field unless you are +sure its internal link structure is correct, otherwise an error may be result. + +\subsubsubsection{fence nodes} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC subtype \NC number \NC \showsubtypes{fence} \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC delim \NC delimiter node \NC delimiter specification \NC \NR +\stoptabulate + +\subsection{whatsit nodes} + +Whatsit nodes come in many subtypes that you can ask for by running +\type {node.whatsits()}: +\startluacode + for id, name in table.sortedpairs(node.whatsits()) do + context.type(name) + context(" (%s), ",id) + end + context.removeunwantedspaces() + context.removepunctuation() +\stopluacode +. % period + +\subsubsection{front|-|end whatsits} + +\subsubsubsection{open whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC stream \NC number \NC \TEX's stream id number \NC \NR +\NC name \NC string \NC file name \NC \NR +\NC ext \NC string \NC file extension \NC \NR +\NC area \NC string \NC file area (this may become obsolete) \NC \NR +\stoptabulate + +\subsubsubsection{write whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC stream \NC number \NC \TEX's stream id number \NC \NR +\NC data \NC table \NC a table representing the token list to be written \NC \NR +\stoptabulate + +\subsubsubsection{close whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC stream \NC number \NC \TEX's stream id number \NC \NR +\stoptabulate + +\subsubsubsection{user_defined whatsits} + +User|-|defined whatsit nodes can only be created and handled from \LUA\ code. In +effect, they are an extension to the extension mechanism. The \LUATEX\ engine +will simply step over such whatsits without ever looking at the contents. + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC user_id \NC number \NC id number \NC \NR +\NC type \NC number \NC type of the value \NC \NR +\NC value \NC number \NC a \LUA\ number \NC \NR +\NC \NC node \NC a node list \NC \NR +\NC \NC string \NC a \LUA\ string \NC \NR +\NC \NC table \NC a \LUA\ table \NC \NR +\stoptabulate + +The \type {type} can have one of six distinct values. The number is the \ASCII\ +value if the first character if the type name (so you can use string.byte("l") +instead of \type {108}). + +\starttabulate[|lT|lT|p|] +\NC \rmbf value \NC \bf meaning \NC \bf explanation \NC \NR +\NC 97 \NC a \NC list of attributes (a node list) \NC \NR +\NC 100 \NC d \NC a \LUA\ number \NC \NR +\NC 108 \NC l \NC a \LUA\ value (table, number, boolean, etc) \NC \NR +\NC 110 \NC n \NC a node list \NC \NR +\NC 115 \NC s \NC a \LUA\ string \NC \NR +\NC 116 \NC t \NC a \LUA\ token list in \LUA\ table form (a list of triplets) \NC \NR +\stoptabulate + +\subsubsubsection{save_pos whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\stoptabulate + +\subsubsubsection{late_lua whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC data \NC string \NC data to execute \NC \NR +\NC string \NC string \NC data to execute \NC \NR +\NC name \NC string \NC the name to use for \LUA\ error reporting \NC \NR +\stoptabulate + +The difference between \type {data} and \type {string} is that on assignment, the +\type {data} field is converted to a token list, cf. use as \type {\latelua}. The +\type {string} version is treated as a literal string. + +\subsubsection{\DVI\ backend whatsits} + +\subsubsection{special whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC data \NC string \NC the \type {\special} information \NC \NR +\stoptabulate + +\subsubsection{\PDF\ backend whatsits} + +\subsubsubsection{pdf_literal whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC mode \NC number \NC the \quote {mode} setting of this literal \NC \NR +\NC data \NC string \NC the \type {\pdfliteral} information \NC \NR +\stoptabulate + +Possible mode values are: + +\starttabulate[|lT|p|] +\NC \rmbf value \NC \rmbf \PDFTEX\ keyword \NC \NR +\NC 0 \NC setorigin \NC \NR +\NC 1 \NC page \NC \NR +\NC 2 \NC direct \NC \NR +\stoptabulate + +\subsubsubsection{pdf_refobj whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC objnum \NC number \NC the referenced \PDF\ object number \NC \NR +\stoptabulate + +\subsubsubsection{pdf_annot whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC width \NC number \NC the width (not used in calculations) \NC \NR +\NC height \NC number \NC the height (not used in calculations) \NC \NR +\NC depth \NC number \NC the depth (not used in calculations) \NC \NR +\NC objnum \NC number \NC the referenced \PDF\ object number \NC \NR +\NC data \NC string \NC the annotation data \NC \NR +\stoptabulate + +\subsubsubsection{pdf_start_link whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC width \NC number \NC the width (not used in calculations) \NC \NR +\NC height \NC number \NC the height (not used in calculations) \NC \NR +\NC depth \NC number \NC the depth (not used in calculations) \NC \NR +\NC objnum \NC number \NC the referenced \PDF\ object number \NC \NR +\NC link_attr \NC table \NC the link attribute token list \NC \NR +\NC action \NC node \NC the action to perform \NC \NR +\stoptabulate + +\subsubsubsection{pdf_end_link whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC \NC \NR +\stoptabulate + +\subsubsubsection{pdf_dest whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC width \NC number \NC the width (not used in calculations) \NC \NR +\NC height \NC number \NC the height (not used in calculations) \NC \NR +\NC depth \NC number \NC the depth (not used in calculations) \NC \NR +\NC named_id \NC number \NC is the \type {dest_id} a string value? \NC \NR +\NC dest_id \NC number \NC the destination id \NC \NR +\NC \NC string \NC the destination name \NC \NR +\NC dest_type \NC number \NC type of destination \NC \NR +\NC xyz_zoom \NC number \NC the zoom factor (times 1000) \NC \NR +\NC objnum \NC number \NC the \PDF\ object number \NC \NR +\stoptabulate + +\subsubsubsection{pdf_action whatsits} + +These are a special kind of item that only appears inside \PDF\ start link +objects. + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC action_type \NC number \NC the kind of action involved \NC \NR +\NC action_id \NC number or string \NC token list reference or string \NC \NR +\NC named_id \NC number \NC the index of the destination \NC \NR +\NC file \NC string \NC the target filename \NC \NR +\NC new_window \NC number \NC the window state of the target \NC \NR +\NC data \NC string \NC the name of the destination \NC \NR +\stoptabulate + +Valid action types are: + +\starttabulate[|lT|lT|] +\NC 0 \NC page \NC \NR +\NC 1 \NC goto \NC \NR +\NC 2 \NC thread \NC \NR +\NC 3 \NC user \NC \NR +\stoptabulate + +Valid window types are: + +\starttabulate[|lT|lT|] +\NC 0 \NC notset \NC \NR +\NC 1 \NC new \NC \NR +\NC 2 \NC nonew \NC \NR +\stoptabulate + +\subsubsubsection{pdf_thread whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC width \NC number \NC the width (not used in calculations) \NC \NR +\NC height \NC number \NC the height (not used in calculations) \NC \NR +\NC depth \NC number \NC the depth (not used in calculations) \NC \NR +\NC named_id \NC number \NC is \type {tread_id} a string value? \NC \NR +\NC tread_id \NC number \NC the thread id \NC \NR +\NC \NC string \NC the thread name \NC \NR +\NC thread_attr \NC number \NC extra thread information \NC \NR +\stoptabulate + +\subsubsubsection{pdf_start_thread whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC width \NC number \NC the width (not used in calculations) \NC \NR +\NC height \NC number \NC the height (not used in calculations) \NC \NR +\NC depth \NC number \NC the depth (not used in calculations) \NC \NR +\NC named_id \NC number \NC is \type {tread_id} a string value? \NC \NR +\NC tread_id \NC number \NC the thread id \NC \NR +\NC \NC string \NC the thread name \NC \NR +\NC thread_attr \NC number \NC extra thread information \NC \NR +\stoptabulate + +\subsubsubsection{pdf_end_thread whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC \NC \NR +\stoptabulate + +\subsubsubsection{pdf_colorstack whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC stack \NC number \NC colorstack id number \NC \NR +\NC command \NC number \NC command to execute \NC \NR +\NC data \NC string \NC data \NC \NR +\stoptabulate + +\subsubsubsection{pdf_setmatrix whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\NC data \NC string \NC data \NC \NR +\stoptabulate + +\subsubsubsection{pdf_save whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\stoptabulate + +\subsubsubsection{pdf_restore whatsits} + +\starttabulate[|lT|l|p|] +\NC \rmbf field \NC \bf type \NC \bf explanation \NC \NR +\NC attr \NC node \NC list of attributes \NC \NR +\stoptabulate + +\section{The \type {node} library} + +The \type {node} library contains functions that facilitate dealing with (lists +of) nodes and their values. They allow you to create, alter, copy, delete, and +insert \LUATEX\ node objects, the core objects within the typesetter. + +\LUATEX\ nodes are represented in \LUA\ as userdata with the metadata type +\type {luatex.node}. The various parts within a node can be accessed using +named fields. + +Each node has at least the three fields \type {next}, \type {id}, and \type +{subtype}: + +\startitemize[intro] + +\startitem + The \type {next} field returns the userdata object for the next node in a + linked list of nodes, or \type {nil}, if there is no next node. +\stopitem + +\startitem + The \type {id} indicates \TEX's \quote{node type}. The field \type {id} has a + numeric value for efficiency reasons, but some of the library functions also + accept a string value instead of \type {id}. +\stopitem + +\startitem + The \type {subtype} is another number. It often gives further information + about a node of a particular \type {id}, but it is most important when + dealing with \quote {whatsits}, because they are differentiated solely based + on their \type {subtype}. +\stopitem + +\stopitemize + +The other available fields depend on the \type {id} (and for \quote {whatsits}, +the \type {subtype}) of the node. Further details on the various fields and their +meanings are given in~\in{chapter}[nodes]. + +Support for \type {unset} (alignment) nodes is partial: they can be queried and +modified from \LUA\ code, but not created. + +Nodes can be compared to each other, but: you are actually comparing indices into +the node memory. This means that equality tests can only be trusted under very +limited conditions. It will not work correctly in any situation where one of the +two nodes has been freed and|/|or reallocated: in that case, there will be false +positives. + +At the moment, memory management of nodes should still be done explicitly by the +user. Nodes are not \quote {seen} by the \LUA\ garbage collector, so you have to +call the node freeing functions yourself when you are no longer in need of a node +(list). Nodes form linked lists without reference counting, so you have to be +careful that when control returns back to \LUATEX\ itself, you have not deleted +nodes that are still referenced from a \type {next} pointer elsewhere, and that +you did not create nodes that are referenced more than once. + +There are statistics available with regards to the allocated node memory, which +can be handy for tracing. + +\subsection{Node handling functions} + +\subsubsection{\type {node.is_node}} + +\startfunctioncall +<boolean> t = + node.is_node(<any> item) +\stopfunctioncall + +This function returns true if the argument is a userdata object of +type \type {<node>}. + +\subsubsection{\type {node.types}} + +\startfunctioncall +<table> t = + node.types() +\stopfunctioncall + +This function returns an array that maps node id numbers to node type strings, +providing an overview of the possible top|-|level \type {id} types. + +\subsubsection{\type {node.whatsits}} + +\startfunctioncall +<table> t = + node.whatsits() +\stopfunctioncall + +\TEX's \quote{whatsits} all have the same \type {id}. The various subtypes are +defined by their \type {subtype} fields. The function is much like \type +{node.types}, except that it provides an array of \type {subtype} mappings. + +\subsubsection{\type {node.id}} + +\startfunctioncall +<number> id = + node.id(<string> type) +\stopfunctioncall + +This converts a single type name to its internal numeric representation. + +\subsubsection{\type {node.subtype}} + +\startfunctioncall +<number> subtype = + node.subtype(<string> type) +\stopfunctioncall + +This converts a single whatsit name to its internal numeric representation (\type +{subtype}). + +\subsubsection{\type {node.type}} + +\startfunctioncall +<string> type = + node.type(<any> n) +\stopfunctioncall + +In the argument is a number, then this function converts an internal numeric +representation to an external string representation. Otherwise, it will return +the string \type {node} if the object represents a node, and \type {nil} +otherwise. + +\subsubsection{\type {node.fields}} + +\startfunctioncall +<table> t = + node.fields(<number> id) +<table> t = + node.fields(<number> id, <number> subtype) +\stopfunctioncall + +This function returns an array of valid field names for a particular type of +node. If you want to get the valid fields for a \quote {whatsit}, you have to +supply the second argument also. In other cases, any given second argument will +be silently ignored. + +This function accepts string \type {id} and \type {subtype} values as well. + +\subsubsection{\type {node.has_field}} + +\startfunctioncall +<boolean> t = + node.has_field(<node> n, <string> field) +\stopfunctioncall + +This function returns a boolean that is only true if \type {n} is +actually a node, and it has the field. + +\subsubsection{\type {node.new}} + +\startfunctioncall +<node> n = + node.new(<number> id) +<node> n = + node.new(<number> id, <number> subtype) +\stopfunctioncall + +Creates a new node. All of the new node's fields are initialized to either zero +or \type {nil} except for \type {id} and \type {subtype} (if supplied). If you +want to create a new whatsit, then the second argument is required, otherwise it +need not be present. As with all node functions, this function creates a node on +the \TEX\ level. + +This function accepts string \type {id} and \type {subtype} values as well. + +\subsubsection{\type {node.free} and \type {node.flush_node}} + +\startfunctioncall +<node> next = + node.free(<node> n) +flush_node(<node> n) +\stopfunctioncall + +Removes the node \type {n} from \TEX's memory. Be careful: no checks are done on +whether this node is still pointed to from a register or some \type {next} field: +it is up to you to make sure that the internal data structures remain correct. + +The \type {free} function returns the next field of the freed node, while the +\type {flush_node} alternative returns nothing. + +\subsubsection{\type {node.flush_list}} + +\startfunctioncall +node.flush_list(<node> n) +\stopfunctioncall + +Removes the node list \type {n} and the complete node list following \type {n} +from \TEX's memory. Be careful: no checks are done on whether any of these nodes +is still pointed to from a register or some \type {next} field: it is up to you +to make sure that the internal data structures remain correct. + +\subsubsection{\type {node.copy}} + +\startfunctioncall +<node> m = + node.copy(<node> n) +\stopfunctioncall + +Creates a deep copy of node \type {n}, including all nested lists as in the case +of a hlist or vlist node. Only the \type {next} field is not copied. + +\subsubsection{\type {node.copy_list}} + +\startfunctioncall +<node> m = + node.copy_list(<node> n) +<node> m = + node.copy_list(<node> n, <node> m) +\stopfunctioncall + +Creates a deep copy of the node list that starts at \type {n}. If \type {m} is +also given, the copy stops just before node \type {m}. + +Note that you cannot copy attribute lists this way, specialized functions for +dealing with attribute lists will be provided later but are not there yet. +However, there is normally no need to copy attribute lists as when you do +assignments to the \type {attr} field or make changes to specific attributes, the +needed copying and freeing takes place automatically. + +\subsubsection{\type {node.next}} + +\startfunctioncall +<node> m = + node.next(<node> n) +\stopfunctioncall + +Returns the node following this node, or \type {nil} if there is no such node. + +\subsubsection{\type {node.prev}} + +\startfunctioncall +<node> m = + node.prev(<node> n) +\stopfunctioncall + +Returns the node preceding this node, or \type {nil} if there is no such node. + +\subsubsection{\type {node.current_attr}} + +\startfunctioncall +<node> m = + node.current_attr() +\stopfunctioncall + +Returns the currently active list of attributes, if there is one. + +The intended usage of \type {current_attr} is as follows: + +\starttyping +local x1 = node.new("glyph") +x1.attr = node.current_attr() +local x2 = node.new("glyph") +x2.attr = node.current_attr() +\stoptyping + +or: + +\starttyping +local x1 = node.new("glyph") +local x2 = node.new("glyph") +local ca = node.current_attr() +x1.attr = ca +x2.attr = ca +\stoptyping + +The attribute lists are ref counted and the assignment takes care of incrementing +the refcount. You cannot expect the value \type {ca} to be valid any more when +you assign attributes (using \type {tex.setattribute}) or when control has been +passed back to \TEX. + +Note: this function is somewhat experimental, and it returns the {\it actual} +attribute list, not a copy thereof. Therefore, changing any of the attributes in +the list will change these values for all nodes that have the current attribute +list assigned to them. + +\subsubsection{\type {node.hpack}} + +\startfunctioncall +<node> h, <number> b = + node.hpack(<node> n) +<node> h, <number> b = + node.hpack(<node> n, <number> w, <string> info) +<node> h, <number> b = + node.hpack(<node> n, <number> w, <string> info, <string> dir) +\stopfunctioncall + +This function creates a new hlist by packaging the list that begins at node \type +{n} into a horizontal box. With only a single argument, this box is created using +the natural width of its components. In the three argument form, \type {info} +must be either \type {additional} or \type {exactly}, and \type {w} is the +additional (\type {\hbox spread}) or exact (\type {\hbox to}) width to be used. The +second return value is the badness of the generated box. + +Caveat: at this moment, there can be unexpected side|-|effects to this function, +like updating some of the \type {\marks} and \type {\inserts}. Also note that the +content of \type {h} is the original node list \type {n}: if you call \type +{node.free(h)} you will also free the node list itself, unless you explicitly set +the \type {list} field to \type {nil} beforehand. And in a similar way, calling +\type {node.free(n)} will invalidate \type {h} as well! + +\subsubsection{\type {node.vpack}} + +\startfunctioncall +<node> h, <number> b = + node.vpack(<node> n) +<node> h, <number> b = + node.vpack(<node> n, <number> w, <string> info) +<node> h, <number> b = + node.vpack(<node> n, <number> w, <string> info, <string> dir) +\stopfunctioncall + +This function creates a new vlist by packaging the list that begins at node \type +{n} into a vertical box. With only a single argument, this box is created using +the natural height of its components. In the three argument form, \type {info} +must be either \type {additional} or \type {exactly}, and \type {w} is the +additional (\type {\vbox spread}) or exact (\type {\vbox to}) height to be used. + +The second return value is the badness of the generated box. + +See the description of \type {node.hpack()} for a few memory allocation caveats. + +\subsubsection{\type {node.dimensions}} + +\startfunctioncall +<number> w, <number> h, <number> d = + node.dimensions(<node> n) +<number> w, <number> h, <number> d = + node.dimensions(<node> n, <string> dir) +<number> w, <number> h, <number> d = + node.dimensions(<node> n, <node> t) +<number> w, <number> h, <number> d = + node.dimensions(<node> n, <node> t, <string> dir) +\stopfunctioncall + +This function calculates the natural in|-|line dimensions of the node list starting +at node \type {n} and terminating just before node \type {t} (or the end of the +list, if there is no second argument). The return values are scaled points. An +alternative format that starts with glue parameters as the first three arguments +is also possible: + +\startfunctioncall +<number> w, <number> h, <number> d = + node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order, + <node> n) +<number> w, <number> h, <number> d = + node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order, + <node> n, <string> dir) +<number> w, <number> h, <number> d = + node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order, + <node> n, <node> t) +<number> w, <number> h, <number> d = + node.dimensions(<number> glue_set, <number> glue_sign, <number> glue_order, + <node> n, <node> t, <string> dir) +\stopfunctioncall + +This calling method takes glue settings into account and is especially useful for +finding the actual width of a sublist of nodes that are already boxed, for +example in code like this, which prints the width of the space in between the +\type {a} and \type {b} as it would be if \type {\box0} was used as-is: + +\starttyping +\setbox0 = \hbox to 20pt {a b} + +\directlua{print (node.dimensions( + tex.box[0].glue_set, + tex.box[0].glue_sign, + tex.box[0].glue_order, + tex.box[0].head.next, + node.tail(tex.box[0].head) +)) } +\stoptyping + +You need to keep in mind that this is one of the few places in \TEX\ where floats +are used, which means that you can get small differences in rounding when you +compare the width repported by \type {hpack} with \type {dimensions}. + +\subsubsection{\type {node.mlist_to_hlist}} + +\startfunctioncall +<node> h = + node.mlist_to_hlist(<node> n, <string> display_type, <boolean> penalties) +\stopfunctioncall + +This runs the internal mlist to hlist conversion, converting the math list in +\type {n} into the horizontal list \type {h}. The interface is exactly the same +as for the callback \type {mlist_to_hlist}. + +\subsubsection{\type {node.slide}} + +\startfunctioncall +<node> m = + node.slide(<node> n) +\stopfunctioncall + +Returns the last node of the node list that starts at \type {n}. As a +side|-|effect, it also creates a reverse chain of \type {prev} pointers between +nodes. + +\subsubsection{\type {node.tail}} + +\startfunctioncall +<node> m = + node.tail(<node> n) +\stopfunctioncall + +Returns the last node of the node list that starts at \type {n}. + +\subsubsection{\type {node.length}} + +\startfunctioncall +<number> i = + node.length(<node> n) +<number> i = + node.length(<node> n, <node> m) +\stopfunctioncall + +Returns the number of nodes contained in the node list that starts at \type {n}. +If \type {m} is also supplied it stops at \type {m} instead of at the end of the +list. The node \type {m} is not counted. + +\subsubsection{\type {node.count}} + +\startfunctioncall +<number> i = + node.count(<number> id, <node> n) +<number> i = + node.count(<number> id, <node> n, <node> m) +\stopfunctioncall + +Returns the number of nodes contained in the node list that starts at \type {n} +that have a matching \type {id} field. If \type {m} is also supplied, counting +stops at \type {m} instead of at the end of the list. The node \type {m} is not +counted. + +This function also accept string \type {id}'s. + +\subsubsection{\type {node.traverse}} + +\startfunctioncall +<node> t = + node.traverse(<node> n) +\stopfunctioncall + +This is a \LUA\ iterator that loops over the node list that starts at \type {n}. +Typically code looks like this: + +\starttyping +for n in node.traverse(head) do + ... +end +\stoptyping + +is functionally equivalent to: + +\starttyping +do + local n + local function f (head,var) + local t + if var == nil then + t = head + else + t = var.next + end + return t + end + while true do + n = f (head, n) + if n == nil then break end + ... + end +end +\stoptyping + +It should be clear from the definition of the function \type {f} that even though +it is possible to add or remove nodes from the node list while traversing, you +have to take great care to make sure all the \type {next} (and \type {prev}) +pointers remain valid. + +If the above is unclear to you, see the section \quote {For Statement} in the +\LUA\ Reference Manual. + +\subsubsection{\type {node.traverse_id}} + +\startfunctioncall +<node> t = + node.traverse_id(<number> id, <node> n) +\stopfunctioncall + +This is an iterator that loops over all the nodes in the list that starts at +\type {n} that have a matching \type {id} field. + +See the previous section for details. The change is in the local function \type +{f}, which now does an extra while loop checking against the upvalue \type {id}: + +\starttyping + local function f(head,var) + local t + if var == nil then + t = head + else + t = var.next + end + while not t.id == id do + t = t.next + end + return t + end +\stoptyping + +\subsubsection{\type {node.traverse_char}} + +This iterators loops over the glyph nodes in a list. Only nodes with a subtype +less than 256 are seen. + +\startfunctioncall +<node> n = + node.traverse_char(<node> n) +\stopfunctioncall + +\subsubsection{\type {node.has_glyph}} + +This function returns the first glyph or disc node in the given list: + +\startfunctioncall +<node> n = + node.has_glyph(<node> n) +\stopfunctioncall + +\subsubsection{\type {node.end_of_math}} + +\startfunctioncall +<node> t = + node.end_of_math(<node> start) +\stopfunctioncall + +Looks for and returns the next \type {math_node} following the \type {start}. If +the given node is a math endnode this helper return that node, else it follows +the list and return the next math endnote. If no such node is found nil is +returned. + +\subsubsection{\type {node.remove}} + +\startfunctioncall +<node> head, current = + node.remove(<node> head, <node> current) +\stopfunctioncall + +This function removes the node \type {current} from the list following \type +{head}. It is your responsibility to make sure it is really part of that list. +The return values are the new \type {head} and \type {current} nodes. The +returned \type {current} is the node following the \type {current} in the calling +argument, and is only passed back as a convenience (or \type {nil}, if there is +no such node). The returned \type {head} is more important, because if the +function is called with \type {current} equal to \type {head}, it will be +changed. + +\subsubsection{\type {node.insert_before}} + +\startfunctioncall +<node> head, new = + node.insert_before(<node> head, <node> current, <node> new) +\stopfunctioncall + +This function inserts the node \type {new} before \type {current} into the list +following \type {head}. It is your responsibility to make sure that \type +{current} is really part of that list. The return values are the (potentially +mutated) \type {head} and the node \type {new}, set up to be part of the list +(with correct \type {next} field). If \type {head} is initially \type {nil}, it +will become \type {new}. + +\subsubsection{\type {node.insert_after}} + +\startfunctioncall +<node> head, new = + node.insert_after(<node> head, <node> current, <node> new) +\stopfunctioncall + +This function inserts the node \type {new} after \type {current} into the list +following \type {head}. It is your responsibility to make sure that \type +{current} is really part of that list. The return values are the \type {head} and +the node \type {new}, set up to be part of the list (with correct \type {next} +field). If \type {head} is initially \type {nil}, it will become \type {new}. + +\subsubsection{\type {node.first_glyph}} + +\startfunctioncall +<node> n = + node.first_glyph(<node> n) +<node> n = + node.first_glyph(<node> n, <node> m) +\stopfunctioncall + +Returns the first node in the list starting at \type {n} that is a glyph node +with a subtype indicating it is a glyph, or \type {nil}. If \type {m} is given, +processing stops at (but including) that node, otherwise processing stops at the +end of the list. + +\subsubsection{\type {node.ligaturing}} + +\startfunctioncall +<node> h, <node> t, <boolean> success = + node.ligaturing(<node> n) +<node> h, <node> t, <boolean> success = + node.ligaturing(<node> n, <node> m) +\stopfunctioncall + +Apply \TEX-style ligaturing to the specified nodelist. The tail node \type {m} is +optional. The two returned nodes \type {h} and \type {t} are the new head and +tail (both \type {n} and \type {m} can change into a new ligature). + +\subsubsection{\type {node.kerning}} + +\startfunctioncall +<node> h, <node> t, <boolean> success = + node.kerning(<node> n) +<node> h, <node> t, <boolean> success = + node.kerning(<node> n, <node> m) +\stopfunctioncall + +Apply \TEX|-|style kerning to the specified node list. The tail node \type {m} is +optional. The two returned nodes \type {h} and \type {t} are the head and tail +(either one of these can be an inserted kern node, because special kernings with +word boundaries are possible). + +\subsubsection{\type {node.unprotect_glyphs}} + +\startfunctioncall +node.unprotect_glyphs(<node> n) +\stopfunctioncall + +Subtracts 256 from all glyph node subtypes. This and the next function are +helpers to convert from \type {characters} to \type {glyphs} during node +processing. + +\subsubsection{\type {node.protect_glyphs} and \type {node.protect_glyph}} + +\startfunctioncall +node.protect_glyphs(<node> n) +\stopfunctioncall + +Adds 256 to all glyph node subtypes in the node list starting at \type {n}, +except that if the value is 1, it adds only 255. The special handling of 1 means +that \type {characters} will become \type {glyphs} after subtraction of 256. A +single character can be marked by the singular call. + +\subsubsection{\type {node.last_node}} + +\startfunctioncall +<node> n = + node.last_node() +\stopfunctioncall + +This function pops the last node from \TEX's \quote{current list}. It returns +that node, or \type {nil} if the current list is empty. + +\subsubsection{\type {node.write}} + +\startfunctioncall +node.write(<node> n) +\stopfunctioncall + +This is an experimental function that will append a node list to \TEX's \quote +{current list} The node list is not deep|-|copied! There is no error checking +either! + +\subsubsection{\type {node.protrusion_skippable}} + +\startfunctioncall +<boolean> skippable = + node.protrusion_skippable(<node> n) +\stopfunctioncall + +Returns \type {true} if, for the purpose of line boundary discovery when +character protrusion is active, this node can be skipped. + +\subsection{Glue handling} + +\subsubsection{\type {node.setglue}} + +You can set the properties of a glue in one go. If you pass no values, the glue +will become a zero glue. + +\startfunctioncall +node.setglue(<node> n) +node.setglue(<node> n,width,stretch,shrink,stretch_order,shrink_order) +\stopfunctioncall + +When you pass values, only arguments that are numbers +are assigned so + +\starttyping +node.setglue(n,655360,false,65536) +\stoptyping + +will only adapt the width and shrink. + +\subsubsection{\type {node.getglue}} + +The next call will return 5 values (or northing when no glue is passed). + +\startfunctioncall +<integer> width, <integer> stretch, <integer> shrink, <integer> stretch_order, + <integer> shrink_order = node.getglue(<node> n) +\stopfunctioncall + +\subsubsection{\type {node.is_zero_glue}} + +This function returns \type {true} when the width, stretch and shrink properties +are zero. + +\startfunctioncall +<boolean> isglue = + node.is_zero_glue(<node> n) +\stopfunctioncall + +\subsection{Attribute handling} + +Attributes appear as linked list of userdata objects in the \type {attr} field of +individual nodes. They can be handled individually, but it is much safer and more +efficient to use the dedicated functions associated with them. + +\subsubsection{\type {node.has_attribute}} + +\startfunctioncall +<number> v = + node.has_attribute(<node> n, <number> id) +<number> v = + node.has_attribute(<node> n, <number> id, <number> val) +\stopfunctioncall + +Tests if a node has the attribute with number \type {id} set. If \type {val} is +also supplied, also tests if the value matches \type {val}. It returns the value, +or, if no match is found, \type {nil}. + +\subsubsection{\type {node.get_attribute}} + +\startfunctioncall +<number> v = + node.get_attribute(<node> n, <number> id) +\stopfunctioncall + +Tests if a node has an attribute with number \type {id} set. It returns the +value, or, if no match is found, \type {nil}. + +\subsubsection{\type {node.find_attribute}} + +\startfunctioncall +<number> v, <node> n = + node.find_attribute(<node> n, <number> id) +\stopfunctioncall + +Finds the first node that has attribute with number \type {id} set. It returns +the value and the node if there is a match and otherwise nothing. + +\subsubsection{\type {node.set_attribute}} + +\startfunctioncall +node.set_attribute(<node> n, <number> id, <number> val) +\stopfunctioncall + +Sets the attribute with number \type {id} to the value \type {val}. Duplicate +assignments are ignored. {\em [needs explanation]} + +\subsubsection{\type {node.unset_attribute}} + +\startfunctioncall +<number> v = + node.unset_attribute(<node> n, <number> id) +<number> v = + node.unset_attribute(<node> n, <number> id, <number> val) +\stopfunctioncall + +Unsets the attribute with number \type {id}. If \type {val} is also supplied, it +will only perform this operation if the value matches \type {val}. Missing +attributes or attribute|-|value pairs are ignored. + +If the attribute was actually deleted, returns its old value. Otherwise, returns +\type {nil}. + +\subsubsection{\type {node.slide}} + +This helper makes sure that the node lists is double linked and returns the found +tail node. + +\startfunctioncall +<node> tail = + node.slide(<node> n) +\stopfunctioncall + +\subsubsection{\type {node.check_discretionary} and \type {node.check_discretionaries}} + +When you fool around with disc nodes you need to be aware of the fact that they +have a special internal data structure. As long as you reassign the fields when +you have extended the lists it's ok because then the tail pointers get updated, +but when you add to list without reassigning you might end up in troubles when +the linebreak routien kicks in. You can call this function to check the list for +issues with disc nodes. + +\startfunctioncall +node.check_discretionary(<node> n) +node.check_discretionaries(<node> head) +\stopfunctioncall + +The plural variant runs over all disc nodes in a list, the singular variant +checks one node only (it also checks if the node is a disc node). + +\subsubsection{\type {node.family_font}} + +When you pass it a proper family identifier the next helper will return the font +currently associated with it. You can normally also access the font with the normal +font field or getter because it will resolve the family automatically for noads. + +\startfunctioncall +<integer> id = + node.family_font(<integer> fam) +\stopfunctioncall + +\section{Two access models} + +Deep down in \TEX\ a node has a number which is an numeric entry in a memory +table. In fact, this model, where \TEX\ manages memory is real fast and one of +the reasons why plugging in callbacks that operate on nodes is quite fast too. +Each node gets a number that is in fact an index in the memory table and that +number often gets reported when you print node related information. + +There are two access models, a robust one using a so called user data object that +provides a virtual interface to the internal nodes, and a more direct access which +uses the node numbers directly. The first model provide key based access while +the second always accesses fields via functions: + +\starttyping +nodeobject.char +getfield(nodenumber,"char") +\stoptyping + +If you use the direct model, even if you know that you deal with numbers, you +should not depend on that property but treat it an abstraction just like +traditional nodes. In fact, the fact that we use a simple basic datatype has the +penalty that less checking can be done, but less checking is also the reason why +it's somewhat faster. An important aspect is that one cannot mix both methods, +but you can cast both models. So, multiplying a node number makes no sense. + +So our advice is: use the indexed (table) approach when possible and investigate +the direct one when speed might be an real issue. For that reason we also provide +the \type {get*} and \type {set*} functions in the top level node namespace. +There is a limited set of getters. When implementing this direct approach the +regular index by key variant was also optimized, so direct access only makes +sense when we're accessing nodes millions of times (which happens in some font +processing for instance). + +We're talking mostly of getters because setters are less important. Documents +have not that many content related nodes and setting many thousands of properties +is hardly a burden contrary to millions of consultations. + +Normally you will access nodes like this: + +\starttyping +local next = current.next +if next then + -- do something +end +\stoptyping + +Here \type {next} is not a real field, but a virtual one. Accessing it results in +a metatable method being called. In practice it boils down to looking up the node +type and based on the node type checking for the field name. In a worst case you +have a node type that sits at the end of the lookup list and a field that is last +in the lookup chain. However, in successive versions of \LUATEX\ these lookups +have been optimized and the most frequently accessed nodes and fields have a +higher priority. + +Because in practice the \type {next} accessor results in a function call, there +is some overhead involved. The next code does the same and performs a tiny bit +faster (but not that much because it is still a function call but one that knows +what to look up). + +\starttyping +local next = node.next(current) +if next then + -- do something +end +\stoptyping + +If performance matters you can use an function instead: + +\starttabulate[|T|p|] +\NC getnext \NC parsing nodelist always involves this one \NC \NR +\NC getprev \NC used less but is logical companion to \type {getnext} \NC \NR +\NC getboth \NC returns the next and prev pointer of a node \NC \NR +\NC getid \NC consulted a lot \NC \NR +\NC getsubtype \NC consulted less but also a topper \NC \NR +\NC getfont \NC used a lot in \OPENTYPE\ handling (glyph nodes are consulted a lot) \NC \NR +\NC getchar \NC idem and also in other places \NC \NR +\NC getdisc \NC returns the \type {pre}, \type {post} and \type {replace} fields and + optionally when true is passed also the tail fields. \NC \NR +\NC getlist \NC we often parse nested lists so this is a convenient one too + (only works for hlist and vlist!) \NC \NR +\NC getleader \NC comparable to list, seldom used in \TEX\ (but needs frequent consulting + like lists; leaders could have been made a dedicated node type) \NC \NR +\NC getfield \NC generic getter, sufficient for the rest (other field names are + often shared so a specific getter makes no sense then) \NC \NR +\NC getbox \NC gets the given box (a list node) \NC \NR +\stoptabulate + +The direct variants also have setters, where the discretionary setter takes three +(optional) arguments plus an optional fourth indicating the subtype. An additional +setter is \type {setlink} which will link two nodes. + +It doesn't make sense to add getters for all fields, also because some are not +unique to one node type. Profiling demonstrated that these fields can get +accesses way more times than other fields. Even in complex documents, many node +and fields types never get seen, or seen only a few times. Most functions in the +\type {node} namespace have a companion in \type {node.direct}, but of course not +the ones that don't deal with nodes themselves. The following table summarized +this: + +% \startcolumns[balance=yes] + +\def\yes{$+$} \def\nop{$-$} + +\starttabulate[|T|c|c|] +\HL +\NC \bf function \NC \bf node \NC \bf direct \NC \NR +\HL +\NC \type {check_discretionaries}\NC \yes \NC \yes \NC \NR +\NC \type {copy_list} \NC \yes \NC \yes \NC \NR +\NC \type {copy} \NC \yes \NC \yes \NC \NR +\NC \type {count} \NC \yes \NC \yes \NC \NR +\NC \type {current_attr} \NC \yes \NC \yes \NC \NR +\NC \type {dimensions} \NC \yes \NC \yes \NC \NR +%NC \type {do_ligature_n} \NC \yes \NC \yes \NC \NR % was never documented and experimental +\NC \type {effective_glue} \NC \yes \NC \yes \NC \NR +\NC \type {end_of_math} \NC \yes \NC \yes \NC \NR +\NC \type {family_font} \NC \yes \NC \nop \NC \NR +\NC \type {fields} \NC \yes \NC \nop \NC \NR +\NC \type {find_attribute} \NC \yes \NC \yes \NC \NR +\NC \type {first_glyph} \NC \yes \NC \yes \NC \NR +\NC \type {flush_list} \NC \yes \NC \yes \NC \NR +\NC \type {flush_node} \NC \yes \NC \yes \NC \NR +\NC \type {free} \NC \yes \NC \yes \NC \NR +\NC \type {get_attribute} \NC \yes \NC \yes \NC \NR +\NC \type {getboth} \NC \yes \NC \yes \NC \NR +\NC \type {getbox} \NC \nop \NC \yes \NC \NR +\NC \type {getchar} \NC \yes \NC \yes \NC \NR +\NC \type {getdisc} \NC \yes \NC \yes \NC \NR +\NC \type {getfield} \NC \yes \NC \yes \NC \NR +\NC \type {getfont} \NC \yes \NC \yes \NC \NR +\NC \type {getglue} \NC \yes \NC \yes \NC \NR +\NC \type {getid} \NC \yes \NC \yes \NC \NR +\NC \type {getleader} \NC \yes \NC \yes \NC \NR +\NC \type {getlist} \NC \yes \NC \yes \NC \NR +\NC \type {getnext} \NC \yes \NC \yes \NC \NR +\NC \type {getprev} \NC \yes \NC \yes \NC \NR +\NC \type {getsubtype} \NC \yes \NC \yes \NC \NR +\NC \type {has_attribute} \NC \yes \NC \yes \NC \NR +\NC \type {has_field} \NC \yes \NC \yes \NC \NR +\NC \type {has_glyph} \NC \yes \NC \yes \NC \NR +\NC \type {hpack} \NC \yes \NC \yes \NC \NR +\NC \type {id} \NC \yes \NC \nop \NC \NR +\NC \type {insert_after} \NC \yes \NC \yes \NC \NR +\NC \type {insert_before} \NC \yes \NC \yes \NC \NR +\NC \type {is_char} \NC \yes \NC \yes \NC \NR +\NC \type {is_direct} \NC \nop \NC \yes \NC \NR +\NC \type {is_glue_zero} \NC \yes \NC \yes \NC \NR +\NC \type {is_glyph} \NC \yes \NC \yes \NC \NR +\NC \type {is_node} \NC \yes \NC \yes \NC \NR +\NC \type {kerning} \NC \yes \NC \yes \NC \NR +\NC \type {last_node} \NC \yes \NC \yes \NC \NR +\NC \type {length} \NC \yes \NC \yes \NC \NR +\NC \type {ligaturing} \NC \yes \NC \yes \NC \NR +\NC \type {mlist_to_hlist} \NC \yes \NC \nop \NC \NR +\NC \type {new} \NC \yes \NC \yes \NC \NR +\NC \type {next} \NC \yes \NC \nop \NC \NR +\NC \type {prev} \NC \yes \NC \nop \NC \NR +\NC \type {protect_glyphs} \NC \yes \NC \yes \NC \NR +\NC \type {protect_glyph} \NC \yes \NC \yes \NC \NR +\NC \type {protrusion_skippable} \NC \yes \NC \yes \NC \NR +\NC \type {remove} \NC \yes \NC \yes \NC \NR +\NC \type {set_attribute} \NC \yes \NC \yes \NC \NR +\NC \type {setboth} \NC \yes \NC \yes \NC \NR +\NC \type {setbox} \NC \nop \NC \yes \NC \NR +\NC \type {setbox} \NC \yes \NC \yes \NC \NR +\NC \type {setchar} \NC \yes \NC \yes \NC \NR +\NC \type {setdisc} \NC \yes \NC \yes \NC \NR +\NC \type {setfield} \NC \yes \NC \yes \NC \NR +\NC \type {setglue} \NC \yes \NC \yes \NC \NR +\NC \type {setlink} \NC \yes \NC \yes \NC \NR +\NC \type {setnext} \NC \yes \NC \yes \NC \NR +\NC \type {setprev} \NC \yes \NC \yes \NC \NR +\NC \type {slide} \NC \yes \NC \yes \NC \NR +\NC \type {subtypes} \NC \yes \NC \nop \NC \NR +\NC \type {subtype} \NC \yes \NC \nop \NC \NR +\NC \type {tail} \NC \yes \NC \yes \NC \NR +\NC \type {todirect} \NC \yes \NC \yes \NC \NR +\NC \type {tonode} \NC \yes \NC \yes \NC \NR +\NC \type {tostring} \NC \yes \NC \yes \NC \NR +\NC \type {traverse_char} \NC \yes \NC \yes \NC \NR +\NC \type {traverse_id} \NC \yes \NC \yes \NC \NR +\NC \type {traverse} \NC \yes \NC \yes \NC \NR +\NC \type {types} \NC \yes \NC \nop \NC \NR +\NC \type {type} \NC \yes \NC \nop \NC \NR +\NC \type {unprotect_glyphs} \NC \yes \NC \yes \NC \NR +\NC \type {unset_attribute} \NC \yes \NC \yes \NC \NR +\NC \type {usedlist} \NC \yes \NC \yes \NC \NR +\NC \type {vpack} \NC \yes \NC \yes \NC \NR +\NC \type {whatsitsubtypes} \NC \yes \NC \nop \NC \NR +\NC \type {whatsits} \NC \yes \NC \nop \NC \NR +\NC \type {write} \NC \yes \NC \yes \NC \NR +\stoptabulate + +% \stopcolumns + +The \type {node.next} and \type {node.prev} functions will stay but for +consistency there are variants called \type {getnext} and \type {getprev}. We had +to use \type {get} because \type {node.id} and \type {node.subtype} are already +taken for providing meta information about nodes. Note: The getters do only basic +checking for valid keys. You should just stick to the keys mentioned in the +sections that describe node properties. + +Some nodes have indirect references. For instance a math character refers to a +family instead of a font. In that case we provide a virtual font field as +accessor. So, \type {getfont} and \type {.font} can be used on them. The same is +true for the \type {width}, \type {height} and \type {depth} of glue nodes. These +actually access the spec node properties, and here we can set as well as get the +values. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luatex/luatex-style.tex b/doc/context/sources/general/manuals/luatex/luatex-style.tex new file mode 100644 index 000000000..c07dc3b76 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-style.tex @@ -0,0 +1,362 @@ +\startenvironment luatex-style + +% todo: use \useMPlibrary[lua] + +\usemodule[abr-02] + +\setuplayout + [height=middle, + width=middle, + backspace=2cm, + topspace=10mm, + bottomspace=10mm, + header=10mm, + footer=10mm, + footerdistance=10mm, + headerdistance=10mm] + +\setuppagenumbering + [alternative=doublesided] + +\setuptolerance + [stretch,tolerant] + +\setuptype + [lines=hyphenated] + +\setuptyping + [lines=hyphenated] + +\setupitemize + [each] + [packed] + +\setupwhitespace + [medium] + +\startluacode + local skipped = table.tohash { 'id', 'subtype', 'next', 'prev' } + + function document.functions.showfields(s) + local t = string.split(s,',') + local f = node.fields(t[1],t[2]) + if f then + local d = false + for i=1,#f do + local fi = f[i] + if skipped[fi] then + -- okay + elseif d then + context(', {\tttf %s}', fi) + else + context('{\tttf %s}', fi) + d = true + end + end + end + end + + function document.functions.showid(s) + local t = string.split(s,',') + context('{tttf %s}',node.id(t[1])) + if t[2] then + context(', {tttf %s}',node.subtype(t[2])) + end + end + + function document.functions.showsubtypes(s) + local s = node.subtypes(s) + local d = false + for k, v in table.sortedhash(s) do + if d then + context(', %s = {\\tttf %s}',k,v) + else + context('%s = {\\tttf %s}',k,v) + d = true + end + end + end +\stopluacode + +\unexpanded\def\showfields #1{\ctxlua{document.functions.showfields("#1")}} +\unexpanded\def\showid #1{\ctxlua{document.functions.showid("#1")}} +\unexpanded\def\showsubtypes#1{\ctxlua{document.functions.showsubtypes("#1")}} + +\definecolor[blue] [b=.5] +\definecolor[red] [r=.5] +\definecolor[green] [g=.5] +\definecolor[maincolor] [b=.5] +\definecolor[keptcolor] [b=.5] +\definecolor[othercolor][r=.5,g=.5] + +\setupbodyfont[modern] % we need this in examples so we predefine + +% \doifmodeelse {atpragma} { +% +% % \setupbodyfont +% % [lucidaot,10pt] +% +% \setupbodyfont +% [dejavu,10pt] +% +% \setuphead [chapter] [style=\bfd] +% \setuphead [section] [style=\bfb] +% \setuphead [subsection] [style=\bfa] +% \setuphead [subsubsection][style=\bf] +% +% } { +% +% \definetypeface[mainfacenormal] [ss][sans] [iwona] [default] +% \definetypeface[mainfacenormal] [rm][serif][palatino] [default] +% \definetypeface[mainfacenormal] [tt][mono] [modern] [default][rscale=1.1] +% \definetypeface[mainfacenormal] [mm][math] [iwona] [default] +% +% \definetypeface[mainfacemedium] [ss][sans] [iwona-medium][default] +% \definetypeface[mainfacemedium] [rm][serif][palatino] [default] +% \definetypeface[mainfacemedium] [tt][mono] [modern] [default][rscale=1.1] +% \definetypeface[mainfacemedium] [mm][math] [iwona-medium][default] +% +% \setupbodyfont +% [mainfacenormal,10pt] +% +% \setuphead [chapter] [style=\mainfacemedium\bfd] +% \setuphead [section] [style=\mainfacemedium\bfb] +% \setuphead [subsection] [style=\mainfacemedium\bfa] +% \setuphead [subsubsection][style=\mainfacemedium\bf] +% +% } + +\writestatus{luatex manual}{we assume that dejavu math is available} + +\setupbodyfont % assumes dejavu-math + [dejavu,10pt] + +\setuphead [chapter] [align={flushleft,broad},style=\bfd] +\setuphead [section] [align={flushleft,broad},style=\bfb] +\setuphead [subsection] [align={flushleft,broad},style=\bfa] +\setuphead [subsubsection][align={flushleft,broad},style=\bf] + +\setuphead [chapter] [color=maincolor] +\setuphead [section] [color=maincolor] +\setuphead [subsection] [color=maincolor] +\setuphead [subsubsection][color=maincolor] + +\definehead + [remark] + [subsubsubject] + +\setupheadertexts + [] + +\definemixedcolumns + [twocolumns] + [n=2, + balance=yes, + before=\blank, + after=\blank] + +\definemixedcolumns + [threecolumns] + [twocolumns] + [n=3] + +\definemixedcolumns + [fourcolumns] + [threecolumns] + [n=4] + +% if we do this we also need to do it in table cells +% +% \setuptyping +% [color=maincolor] +% +% \setuptype +% [color=maincolor] + +\definetyping + [functioncall] + +\startMPdefinitions + + color luaplanetcolor ; luaplanetcolor := \MPcolor{maincolor} ; + color luaholecolor ; luaholecolor := white ; + numeric luaextraangle ; luaextraangle := 0 ; + numeric luaorbitfactor ; luaorbitfactor := .25 ; + + vardef lualogo = image ( + + % Graphic design by A. Nakonechnyj. Copyright (c) 1998, All rights reserved. + + save d, r, p ; numeric d, r, p ; + + d := sqrt(2)/4 ; r := 1/4 ; p := r/8 ; + + fill fullcircle scaled 1 + withcolor luaplanetcolor ; + draw fullcircle rotated 40.5 scaled (1+r) + dashed evenly scaled p + withpen pencircle scaled (p/2) + withcolor (luaorbitfactor * luaholecolor) ; + fill fullcircle scaled r shifted (d+1/8,d+1/8) + rotated - luaextraangle + withcolor luaplanetcolor ; + fill fullcircle scaled r shifted (d-1/8,d-1/8) + withcolor luaholecolor ; + luaorbitfactor := .25 ; + ) enddef ; + +\stopMPdefinitions + +\startuseMPgraphic{luapage} + StartPage ; + + fill Page withcolor \MPcolor{othercolor} ; + + luaorbitfactor := 1 ; + picture p ; p := lualogo xsized (3PaperWidth/5) ; + draw p shifted center Page shifted (0,-.5ypart center ulcorner p) ; + + StopPage ; +\stopuseMPgraphic + +% \starttexdefinition luaextraangle +% % we can also just access the last page and so in mp directly +% \ctxlua { +% context(\lastpage == 0 and 0 or \realfolio*360/\lastpage) +% } +% \stoptexdefinition + +\startuseMPgraphic{luanumber} + % luaextraangle := \luaextraangle; + luaextraangle := if (LastPageNumber == 0) : 0 else : (RealPageNumber / LastPageNumber) * 360 fi; + luaorbitfactor := 0.25 ; + picture p ; p := lualogo ; + setbounds p to boundingbox fullcircle ; + draw p ysized 1cm ; +\stopuseMPgraphic + +\definelayer + [page] + [width=\paperwidth, + height=\paperheight] + +\setupbackgrounds + [leftpage] + [background=page] + +\setupbackgrounds + [rightpage] + [background=page] + +\startsetups pagenumber:right + \setlayerframed + [page] + [preset=rightbottom,offset=1cm] + [frame=off,height=1cm,offset=overlay] + {\useMPgraphic{luanumber}} + \setlayerframed + [page] + [preset=rightbottom,offset=1cm,x=1.5cm] + [frame=off,height=1cm,width=1cm,offset=overlay] + {\pagenumber} + \setlayerframed + [page] + [preset=rightbottom,offset=1cm,x=2.5cm] + [frame=off,height=1cm,offset=overlay] + {\getmarking[chapter]} +\stopsetups + +\startsetups pagenumber:left + \setlayerframed + [page] + [preset=leftbottom,offset=1cm,x=2.5cm] + [frame=off,height=1cm,offset=overlay] + {\getmarking[chapter]} + \setlayerframed + [page] + [preset=leftbottom,offset=1cm,x=1.5cm] + [frame=off,height=1cm,width=1cm,offset=overlay] + {\pagenumber} + \setlayerframed + [page] + [preset=leftbottom,offset=1cm] + [frame=off,height=1cm,offset=overlay] + {\useMPgraphic{luanumber}} +\stopsetups + +\unexpanded\def\nonterminal#1>{\mathematics{\langle\hbox{\rm #1}\rangle}} + +% taco's brainwave -) .. todo: create a typing variant so that we can avoid the !crlf + +\newcatcodetable\syntaxcodetable + +\unexpanded\def\makesyntaxcodetable + {\begingroup + \catcode`\<=13 \catcode`\|=12 + \catcode`\!= 0 \catcode`\\=12 + \savecatcodetable\syntaxcodetable + \endgroup} + +\makesyntaxcodetable + +\unexpanded\def\startsyntax {\begingroup\catcodetable\syntaxcodetable \dostartsyntax} +\unexpanded\def\syntax {\begingroup\catcodetable\syntaxcodetable \dosyntax} + \let\stopsyntax \relax + +\unexpanded\def\syntaxenvbody#1% + {\par + \tt + \startnarrower + \maincolor #1 + \stopnarrower + \par} + +\unexpanded\def\syntaxbody#1% + {\begingroup + \maincolor \tt #1% + \endgroup} + +\bgroup \catcodetable\syntaxcodetable + +!gdef!dostartsyntax#1\stopsyntax{!let<!nonterminal!syntaxenvbody{#1}!endgroup} +!gdef!dosyntax #1{!let<!nonterminal!syntaxbody{#1}!endgroup} + +!egroup + +\definetyping + [texsyntax] + [color=maincolor] + +% end of wave + +\setupinteraction + [state=start, + focus=standard, + style=, + color=, + contrastcolor=] + +\placebookmarks + [chapter,section,subsection] + +\setuplist + [chapter,section,subsection,subsubsection] + [interaction=all, + width=3em] + +\setuplist + [chapter] + [style=bold, + color=keptcolor] + +\setuplist + [subsection,subsubsection] + [margin=3em, + width=5em] + +% Hans doesn't like the bookmarks opening by default so we comment this: +% +% \setupinteractionscreen +% [option=bookmark] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex b/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex new file mode 100644 index 000000000..8ab56f85d --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex-titlepage.tex @@ -0,0 +1,70 @@ +\environment luatex-style +\environment luatex-logos + +\startcomponent luatex-titlepage + +\startstandardmakeup + + \switchtobodyfont + [mainfacemedium] + + \definedfont[Bold*default at \the\dimexpr.08\paperheight\relax] \setupinterlinespace + + \setlayer + [page] + {\useMPgraphic{luapage}} + + \setlayerframed + [page] + [preset=middletop, + voffset=.05\paperheight] + [align=middle, + foregroundcolor=blue, + frame=off] + {Lua\TeX\\Reference} + + \definedfont[Bold*default at 18pt] \setupinterlinespace + + \setlayerframed + [page] + [preset=rightbottom, + offset=.01\paperheight] + [align=flushright, + foregroundcolor=blue, + frame=off] + {\doifsomething{\documentvariable{status}}{\documentvariable{status}\par} + \currentdate[month,space,year]\par + Version \documentvariable{version}} + +\stopstandardmakeup + +\startstandardmakeup + + \start + \raggedleft + \definedfont[Bold*default at 48pt] + \setupinterlinespace + \blue Lua\TeX \endgraf Reference \endgraf Manual \endgraf + \stop + + \vfill + + \definedfont[Bold*default at 12pt] + + \starttabulate[|l|l|] + \NC copyright \EQ Lua\TeX\ development team \NC \NR + \NC more info \EQ www.luatex.org \NC \NR + \NC version \EQ \currentdate \doifsomething{\documentvariable{snapshot}}{(snapshot \documentvariable{snapshot})} \NC \NR + \stoptabulate + +\stopstandardmakeup + +\setupbackgrounds + [leftpage] + [setups=pagenumber:left] + +\setupbackgrounds + [rightpage] + [setups=pagenumber:right] + +\stopcomponent diff --git a/doc/context/sources/general/manuals/luatex/luatex.tex b/doc/context/sources/general/manuals/luatex/luatex.tex new file mode 100644 index 000000000..cd67f07f2 --- /dev/null +++ b/doc/context/sources/general/manuals/luatex/luatex.tex @@ -0,0 +1,40 @@ +% macros=mkvi + +% \tex vs \type vs \syntax vs. \luatex +% \em \it \/ + +% "context --nodates --nocompression luatex" can be used for comparison +% runs, not that we do it + +\environment luatex-style +\environment luatex-logos + +\dontcomplain + +\startdocument + [version=0.98.0, + status=Pre-release] + +\component luatex-titlepage + +\startfrontmatter + \component luatex-contents + \component luatex-introduction +\stopfrontmatter + +\startbodymatter + \component luatex-enhancements + \component luatex-modifications + \component luatex-lua + \component luatex-languages + \component luatex-fonts + \component luatex-math + \component luatex-nodes + \component luatex-callbacks + \component luatex-tex + \component luatex-graphics + \component luatex-fontloader + \component luatex-backend +\stopbodymatter + +\stopdocument diff --git a/doc/context/sources/general/manuals/manuals-explaining-contents.tex b/doc/context/sources/general/manuals/manuals-explaining-contents.tex new file mode 100644 index 000000000..3e1fadabc --- /dev/null +++ b/doc/context/sources/general/manuals/manuals-explaining-contents.tex @@ -0,0 +1,11 @@ +% language=uk + +\startcomponent manuals-explaining-contents + + \starttitle[title=Contents][color=darkgray] + + \placelist[chapter][criterium=text] + + \stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/manuals-explaining-cover.tex b/doc/context/sources/general/manuals/manuals-explaining-cover.tex new file mode 100644 index 000000000..8b4f3e891 --- /dev/null +++ b/doc/context/sources/general/manuals/manuals-explaining-cover.tex @@ -0,0 +1,199 @@ +% language=uk + +% Please try to be original and don't just copy this cover page as I don't want +% confusion and be associated with (or responsibility for the look of) similar +% looking documents. + +\startenvironment manuals-explaining-cover + +\startsetups document:abstract + \framed [ + foregroundstyle=bold, + foregroundcolor=white, + width=7.5cm, + align={normal,tolerant}, + frame=off, + strut=no, + ] { + \getbuffer[abstract] + } +\stopsetups + +\startMPinclusions + + def DrawCoverPage (expr what) = + + numeric variant ; variant := 1 ; + + StartCover ; + + save width, height, size, anchor, offset, colors ; + + numeric width, height, size ; pair anchor, offset ; string colors[] ; + + colors[1] := "\documentvariable{cover:color:1}" ; + colors[2] := "\documentvariable{cover:color:2}" ; + colors[3] := "\documentvariable{cover:color:3}" ; + colors[4] := "\documentvariable{cover:color:4}" ; + colors[5] := "\documentvariable{cover:color:5}" ; + + fill CoverPage enlarged PaperBleed withcolor colors[5] ; + + fill Spine bottomenlarged -.5PaperHeight withcolor colors[3] ; + fill Spine topenlarged -.5PaperHeight withcolor colors[2] ; + + width := FrontPageWidth ; + height := FrontPageHeight ; + size := 4 * width / 3 ; + offset := (-1cm,1cm) ; + anchor := .5[lrcorner CoverPage,urcorner CoverPage] ; + + fill anchored.llft(lltriangle scaled size, urcorner FrontPage) withcolor colors[1] ; + fill anchored.urt (urtriangle scaled size, llcorner FrontPage) withcolor colors[2] ; + fill anchored.lrt (lrtriangle scaled size, ulcorner FrontPage) withcolor colors[3] ; + fill anchored.ulft(ultriangle scaled size, lrcorner FrontPage) withcolor colors[4] ; + + fill anchored.lrt (lrtriangle scaled size, ulcorner BackPage) withcolor colors[1] ; + fill anchored.llft(lltriangle scaled size, urcorner BackPage) withcolor colors[3] ; + fill anchored.ulft(ultriangle scaled size, lrcorner BackPage) withcolor colors[2] ; + fill anchored.urt (urtriangle scaled size, llcorner BackPage) withcolor colors[4] ; + + draw thetextext.llft( + textext("\bf \documentvariable{title}\hskip-.1em") + rotated 45 ysized .350height, + anchor shifted (6*offset+offset) + ) withcolor white ; + draw thetextext.llft( + textext("\bf \documentvariable{subtitle}") + rotated 45 ysized .275height, + anchor shifted (5*offset+offset) + ) withcolor white ; + draw thetextext.llft( + textext("\bf \documentvariable{author}") + rotated 45 ysized .200height, + anchor shifted (2*offset+offset) + ) withcolor white ; + draw thetextext.llft( + textext("\bf \documentvariable{affiliation}") + rotated 45 ysized .200height, + anchor shifted (1*offset+offset) + ) withcolor white ; + + % for the moment + + if (what = "back") or (what = "cover") : + + draw + thetextext.top( + textext("\bf \documentvariable{comment}") + xsized 4cm, + lrcorner Page shifted (-3cm,1cm) + ) withcolor white ; + + fi ; + + % till here + + width := BackPageWidth ; + + if (what = "back") or (what = "cover") : + + draw thetextext( + textext("\bf\setups[document:abstract]") + xsized .65width rotated 45, + center BackPage + ) withcolor white ; + + fi ; + + if what = "cover" : + + draw thetextext.bot( + textext("\bf \documentvariable{title}\hskip-.1em") + rotated 90 xsized .8SpineWidth, + .5[ulcorner Spine,urcorner Spine] shifted (0,-1cm) + ) withcolor white ; + + draw thetextext.top( + textext("\bf \documentvariable{author}") + rotated 90 xsized .8SpineWidth, + .5[llcorner Spine,lrcorner Spine] shifted (0,1cm) + ) withcolor white ; + + fi ; + + StopCover ; + + if what = "front" : + clip currentpicture to FrontPage ; + elseif what = "back" : + clip currentpicture to BackPage ; + else : + drawboundary CoverPage ; + fi ; + + enddef ; + +\stopMPinclusions + +\startsetups document:start + + % \startcovermatter[front] + + \setupbackgrounds[page][background=] + + \doifmodeelse {simple} { + + \startMPpage + DrawCoverPage("front") ; + \stopMPpage + + } { + + \startMPpage + DrawCoverPage("cover") ; + \stopMPpage + + } + + \page[dummy] + + \setupbackgrounds[page][background=page] + + \resetuserpagenumber + + % \stopcovermatter + +\stopsetups + +\startsetups document:stop + + \doifmodeelse {simple} { + + % \startcovermatter[back] + + \page + + \setuppagenumbering[page=] + + \setupbackgrounds[page][background=] + + \page[empty,left] + + \setupmakeup[doublesided=no,page=no] + + \startMPpage + DrawCoverPage("back") ; + \stopMPpage + + % \stopcovermatter + + } { + + % not needed as it's part of the cover page + + } + +\stopsetups + +\stopenvironment diff --git a/doc/context/sources/general/manuals/manuals-explaining-environment.tex b/doc/context/sources/general/manuals/manuals-explaining-environment.tex new file mode 100644 index 000000000..f896c219b --- /dev/null +++ b/doc/context/sources/general/manuals/manuals-explaining-environment.tex @@ -0,0 +1,325 @@ +\startenvironment manuals-explaining-environment + +\usemodule[abr-01] +\usemodule[visual] +\usemodule[simulate] +\usemodule[chart] +\usemodule[nodechart] + +% done + +\dontcomplain + +\definepapersize + [book] + [width=18cm, + height=24cm] + +\setuppapersize + [book] + +\startmode[oversized] + + \setuppapersize + [book] + [oversized] + + \setuplayout + [marking=on] + +\stopmode + +\setuplayout + [location=middle, + topspace=1.5cm, + bottomspace=2cm, + backspace=2cm, + cutspace=2cm, + header=0cm, + footer=0cm, + margindistance=.25cm, + margin=1.25cm, + width=middle, + height=middle] + +\setuplayout + [style=\ss] + +\usetypescript + [dejavu-condensed] + +\setupbodyfont + [ipaex,9pt] + +\setupbodyfont + [dejavu,9pt] + +\definetyping + [narrowtyping] + [typing] + [bodyfont=dejavu-condensed] + +% This is way too ugly for a manual: +% +% \setuptyping +% [indentnext=no] +% +% \setupindenting +% [medium,yes] + +\setupwhitespace + [big] + +\defineoverlay + [page] + [\useMPgraphic{page}] + +\setupbackgrounds + [page] + [background=page] + +\setuphead + [chapter,section,subsection] + [color=\namedstructureuservariable{chapter}{color}] + +\setuphead + [chapter] + [style=\bfc] + +\setuphead + [section] + [style=\bfb] + +\setuphead + [subsection] + [style=\bf, + before=\blank, + after=\blank] + +\startsetups document:chapter:inside + \definecolor[maincolor][1.0(\namedheadparameter{chapter}{color})] % this expands the color + \definecolor[halfcolor][0.5(maincolor,white)] +\stopsetups + +\setuphead + [chapter] + [insidesection=\directsetup{document:chapter:inside}] + +\setuppagenumbering + [alternative=doublesided, + location=] + +\setuplist + [aligntitle=yes] + +\setuplist + [chapter] + [pagenumber=no, + style=bold, + before={\blank\startcolor[\structurelistuservariable{color}]}, + after={\placelist[section]\stopcolor}] + +\setuplist + [chapter,section] + [width=3em] + +\startuseMPgraphic{page} + + StartPage ; + + linecap := butt ; + + if OnRightPage : + + path p ; p := ( + urcorner Page shifted (-2cm,0) -- + urcorner Page -- + urcorner Page shifted (0,-2cm) -- cycle + ) shifted (-2.5mm,-2.5mm) ; + + else : + + path p ; p := ( + ulcorner Page shifted (2cm,0) -- + ulcorner Page -- + ulcorner Page shifted (0,-2cm) -- cycle + ) shifted (2.5mm,-2.5mm) ; + + fi ; + + fill p + withpen pencircle scaled 1mm + withcolor "maincolor" ; + + draw thetextext("\bf\userpagenumber", + if OnRightPage : urcorner p shifted (-5mm,-5mm) else : ulcorner p shifted (5mm,-5mm) fi) + withcolor white ; + + if OnRightPage : + + path p ; p := ( + lrcorner Page shifted (-5cm,0) -- + lrcorner Page + ) shifted (-5mm,10mm) + + else : + + path p ; p := ( + llcorner Page shifted (5cm,0) -- + llcorner Page + ) shifted (5mm,10mm) ; + + fi ; + + draw p + withpen pencircle scaled 1mm + withcolor "maincolor" ; + + draw if OnRightPage : + thetextext.lft("\bf\getspecificstructuretitle{chapter}",lrcorner Page shifted (-5mm,5mm)) + else : + thetextext.rt ("\bf\getspecificstructuretitle{chapter}",llcorner Page shifted ( 5mm,5mm)) + fi withcolor "\namedstructureuservariable{chapter}{color}" ; + + StopPage ; +\stopuseMPgraphic + +\definecolor[orange] [r=1,g=.6,b=.1] + +\definecolor[middlegray] [s=.75] +\definecolor[darkgray] [s=.25] +\definecolor[darkred] [r=.5] +\definecolor[darkgreen] [g=.5] +\definecolor[darkblue] [b=.5] + +\definecolor[darkyellow] [.5(red,green)] +\definecolor[darkmagenta][.5(red,blue)] +\definecolor[darkcyan] [.5(green,blue)] + +\definecolor[darkorange] [.5(orange)] + +\definecolor[maincolor] [darkgray] + +\definecolor [mix-1] [r=1,g=.75,b=.25] \definecolor [darkmix-1][.5(mix-1)] +\definecolor [mix-2] [r=1,g=.25,b=.75] \definecolor [darkmix-2][.5(mix-2)] +\definecolor [mix-3] [r=.75,g=1,b=.25] \definecolor [darkmix-3][.5(mix-3)] +\definecolor [mix-4] [r=.75,g=.25,b=1] \definecolor [darkmix-4][.5(mix-4)] +\definecolor [mix-5] [r=.25,g=1,b=.75] \definecolor [darkmix-5][.5(mix-5)] +\definecolor [mix-6] [r=.25,g=.75,b=1] \definecolor [darkmix-6][.5(mix-6)] + +% \blackrule[height=1cm,width=10cm,color=mix-1] \blackrule[height=1cm,width=10cm,color=darkmix-1] +% \blackrule[height=1cm,width=10cm,color=mix-2] \blackrule[height=1cm,width=10cm,color=darkmix-2] +% \blackrule[height=1cm,width=10cm,color=mix-3] \blackrule[height=1cm,width=10cm,color=darkmix-3] +% \blackrule[height=1cm,width=10cm,color=mix-4] \blackrule[height=1cm,width=10cm,color=darkmix-4] +% \blackrule[height=1cm,width=10cm,color=mix-5] \blackrule[height=1cm,width=10cm,color=darkmix-5] +% \blackrule[height=1cm,width=10cm,color=mix-6] \blackrule[height=1cm,width=10cm,color=darkmix-6] + +% modules + +\setupsorting + [logo] + [style=] + +\setupFLOWchart + [width=6em, + height=3em, + offset=-2em, % maybe default : todo: hoffset and voffset + dx=2em, + dy=2em] + +\setupFLOWlines + [color=maincolor] + +\setupFLOWshapes + [rulecolor=maincolor] + +% tables + +\setuptabulate + [rulethickness=.5mm, + rulecolor=maincolor] + +% special commands + +\startuniqueMPgraphic{reference}{color} + fill + .5[llcorner OverlayBox,ulcorner OverlayBox] -- + .5[ulcorner OverlayBox,urcorner OverlayBox] -- + .5[urcorner OverlayBox,lrcorner OverlayBox] -- + .5[lrcorner OverlayBox,llcorner OverlayBox] -- cycle + withcolor \MPvar{color} ; +\stopuniqueMPgraphic + +\startuniqueMPgraphic{reference}{color} + path p ; p := OverlayBox enlarged -1mm ; + filldraw + ulcorner p -- + urcorner p -- + lrcorner p -- + .5[lrcorner p,llcorner p] shifted (0,-1ExHeight) -- + llcorner p -- cycle + withpen pencircle scaled 1mm + withcolor \MPvar{color} ; + setbounds currentpicture to OverlayBox enlarged 1ExHeight ; +\stopuniqueMPgraphic + +\defineoverlay + [reference] + [\uniqueMPgraphic{reference}{color=maincolor,}] + +\definecolor + [maincolor] + [red] + +\definemargindata + [appendixdata] + %[inner] + [outer] + [stack=yes] + +\definemarginframed + [appendixdata] + [width=3.5em, + height=\lineheight, % we know what goes in there + align=middle, + offset=overlay, + foregroundcolor=white, + background=reference] + +% todo: +% +% \appendixdata[reference=bla]{} +% +% whole data + +% interaction + +\setupinteraction + [state=start, + click=no, + color=, + contrastcolor=, + style=] + +% whatever + +\definestartstop + [notabene] + [before=\blank, + after=\blank, + style=\em] + +\setuphyphenation + [method=default] + + +\startbuffer[underconstruction] +\startnotabene + This document is still under construction. The functionality discussed here + will stay and more might show up. Of course there are errors, and they're all + mine. The text is not checked for spelling errors. Feel free to let me know + what should get added. +\stopnotabene +\stopbuffer + +\stopenvironment diff --git a/doc/context/sources/general/manuals/manuals-xml-environment.tex b/doc/context/sources/general/manuals/manuals-xml-environment.tex new file mode 100644 index 000000000..5a5d9a92d --- /dev/null +++ b/doc/context/sources/general/manuals/manuals-xml-environment.tex @@ -0,0 +1,385 @@ +% language=uk +% +% author : Hans Hagen, PRAGMA ADE, NL +% license : Creative Commons, Attribution-NonCommercial-ShareAlike 3.0 Unported + +\usemodule[abr-01] + +\startmode[booklet] + + \setuppapersize [A4][oversized] + +\stopmode + +% \setuppapersize[A4][doubleoversized,landscape] +% \setuparranging[2UP] +% \setuppagenumbering[alternative={singlesided,doublesided}] + +\setuplayout + [location=middle, + marking=on] + +% \logo [EXAMPLE] {eXaMpLe} + +\setuptabulate + [rulethickness=1pt, + rulecolor=darkgreen] + +\setuptables + [rulethickness=1pt, + rulecolor=darkgreen] + +% \usesymbols +% [cc] + +\setuplayout + [width=middle, + topspace=2cm, + top=1cm, + cutspace=1.5cm, % 2.0cm + backspace=3.5cm, + header=1cm, + footer=1.5cm, + bottom=1cm, + leftmargin=2.5cm, + rightmargin=1cm, + margindistance=.5cm, + height=middle] + +\definelayout + [titlepage] + [topspace=2cm, + backspace=1.5cm, + bottomspace=1.5cm] + +\startmode[screen] + + \setuppapersize + [S6][S6] + + \setuplayout + [topspace=1cm, + bottomspace=1.5cm, + top=1cm, + header=0cm, + footer=.5cm, + bottom=1cm] + + \setupinteraction + [state=start, + color=, + contrastcolor=, + style=, + menu=on] + + \setupinteractionmenu + [bottom] + [left=\hfill, + middle=\hskip.25cm, + background=color, + backgroundcolor=darkgray, + color=lightgray, + contrastcolor=lightgray, + style=\bfb\setstrut\strut, + offset=2pt, + height=fit, + frame=off] + + \startinteractionmenu[bottom] + \startbut [PreviousJump] GoBack \stopbut + \startbut [previouspage] Previous \stopbut + \startbut [nextpage] Next \stopbut + \startbut [CloseDocument] Exit \stopbut + \stopinteractionmenu + +\stopmode + +\setupbodyfont[dejavu,11pt] + +\definecolor [cyan] [g=.4,b=.4] +\definecolor [magenta] [r=.4,b=.4] +\definecolor [yellow] [r=.4,g=.4] +\definecolor [red] [r=.4] +\definecolor [green] [g=.4] +\definecolor [blue] [b=.4] +\definecolor [gray] [s=.4] + +\definecolor [lightgray] [s=.8] + +\definecolor [FillColor] [gray] + +\definecolor [NumberColor] [red] +\definecolor [BannerColor] [green] +\definecolor [AspectColor] [blue] + +% *rgb *rgy *rby *gby *rgc *rbc *gbc rgm rbm gbm +% *cmy cmr cyr myr cmg cyr myg cmb cyb myb + +\definepalet[steps] [NumberColor=red, BannerColor=green, AspectColor=blue] +\definepalet[mathml] [NumberColor=cyan, BannerColor=magenta,AspectColor=yellow] +\definepalet[chemml] [NumberColor=red, BannerColor=green, AspectColor=yellow] +\definepalet[physml] [NumberColor=red, BannerColor=blue, AspectColor=yellow] +\definepalet[figures][NumberColor=green,BannerColor=blue, AspectColor=yellow] +\definepalet[charts] [NumberColor=red, BannerColor=green, AspectColor=cyan] +\definepalet[examns] [NumberColor=red, BannerColor=green, AspectColor=cyan] +\definepalet[general][NumberColor=red, BannerColor=blue, AspectColor=cyan] +\definepalet[tables] [NumberColor=green,BannerColor=blue, AspectColor=cyan] + +\setupindenting + [medium] + +\indenting + [yes] + +\defineoverlay + [nextpage] + [\overlaybutton{nextpage}] + +\startusableMPgraphic{cover} + path p, q ; color maincolor[], fillcolor ; numeric r, w, h ; + numeric cellwidth, cellspread, linewidth ; + maincolor[0] := \MPcolor{BannerColor} ; + maincolor[1] := \MPcolor{AspectColor} ; + maincolor[2] := \MPcolor{NumberColor} ; + fillcolor := \MPcolor{FillColor} ; + cellwidth := 75pt ; + cellspread := 50pt ; + linewidth := 1/10pt ; + w := OverlayWidth + cellwidth ; + h := OverlayHeight + cellwidth ; + q := unitsquare xyscaled (OverlayWidth,OverlayHeight) ; + fill unitsquare xyscaled (w,h) withcolor fillcolor ; + set_grid (w,h,cellwidth-cellspread,cellwidth-cellspread) ; + forever : + if new_on_grid(uniformdeviate w, uniformdeviate h) : + draw image ( + p := unitsquare ; + r := floor(uniformdeviate 3) ; + fill p enlarged linewidth withcolor fillcolor ; + fill p withcolor maincolor[r] ; + draw + if r = 0 : + urcorner p -- .5[llcorner p,ulcorner p] -- lrcorner p + elseif r = 1 : + ulcorner p -- .5[lrcorner p,urcorner p] -- llcorner p + else : + urcorner p -- llcorner p + fi + withpen pencircle scaled linewidth withcolor fillcolor ; + ) + scaled (cellwidth randomized cellspread) + shifted (dx,dy) ; + fi ; + exitif grid_full ; + endfor ; + % currentpicture := currentpicture shifted -(cellwidth,cellwidth) ; + % clip currentpicture to q ; +\stopusableMPgraphic + +\defineoverlay + [cover] + [\useMPgraphic{cover}] + +\setupbackgrounds + [page] + [offset=3mm] + +\defineoverlay + [page] + [\reuseMPgraphic{page}] + +\startreusableMPgraphic{page} + StartPage ; + path p ; p := + ulcorner Page -- + llcorner Page -- + llcorner Page shifted (BackSpace-LeftMarginDistance,0) -- + ulcorner Page shifted (BackSpace-LeftMarginDistance,0) -- cycle ; + fill + (p enlarged PageOffset) rightenlarged -PageOffset + withcolor \MPcolor{FillColor} ; + picture t ; t := textext("\bfb \lightgray \ConTeXt\ XML") rotated 90 ; + setbounds t to boundingbox t enlarged ExHeight ; + t := image ( label.llft(t,urcorner Page )) ; + fill boundingbox t topenlarged PageOffset rightenlarged PageOffset withcolor \MPcolor{FillColor} ; + draw t ; + StopPage ; + setbounds currentpicture to boundingbox currentpicture enlarged PageOffset ; +\stopreusableMPgraphic + +\setuphead + [section] + [command=\texdefinition{document:head:section}, + color=lightgray, + style=\bfb, + before={\blank[2*big]}, + after={\blank[2*big]},] + +\starttexdefinition document:head:section #1#2 + \hbox { + \hskip-\marginwidth + \hskip-\margindistance + \framed [ + width=.5\textwidth, + offset=2pt, + frame=off, + background=color, + backgroundcolor=AspectColor + ] { + \hskip.25cm + #2 + \hfill + } + } +\stoptexdefinition + +\setupheadertexts + [] + +\setupbottom + [margin] + [color=lightgray, + style=\bfb] + +\setuptyping + [color=green] + +\setuptype + [color=green] + +\doifmodeelse {booklet} { + + \setupbottomtexts + [margin] + [\setup{document:pagenumber}] [] + [\setup{document:pagenumber}] [] + +} { + + \setupbottomtexts + [margin] + [\setup{document:pagenumber}] [] + +} + +\setvariables + [document] + [title=No Title, + author=No Author] + +\startmode[atpragma] + + \setvariables + [document] + [line:1=Con\TeX t XML, + line:2=Pragma ADE / Hasselt NL, + line:3=MkIV] + +\stopmode + +\startsetups document:pagenumber + \hbox to \marginwidth { + \framed [ + width=.25\textwidth, + offset=2pt, + frame=off, + background=color, + backgroundcolor=NumberColor + ] { + \hskip.25cm + \documentvariable{title} + \hfill + \pagenumber + \hskip.25cm + } + } +\stopsetups + +\startsetups document:start + + \doifsomething {\documentvariable{palet}} { + \setuppalet[\documentvariable{palet}] + } + + \setupbackgrounds + [page] + [background={cover,nextpage}] + + \setuplayout + [titlepage] + + \startstandardmakeup[bottomstate=stop] + \raggedcenter + \lightgray + \start + \definedfont[SansBold at 100pt] + \setupinterlinespace + \WORD{\documentvariable{title}} + \par + \stop + \vfilll + \doifsomething {\documentvariable{line:1}} { + \dontleavehmode\hbox{\definedfont[SansBold at 50pt]\setstrut\strut\documentvariable{line:1}} + } + \doifsomething {\documentvariable{line:2}} { + \vskip25pt + \dontleavehmode\hbox{\definedfont[SansBold at 25pt]\setstrut\strut\documentvariable{line:2}} + } + \doifsomething {\documentvariable{line:3}} { + \vskip25pt + \dontleavehmode\hbox{\definedfont[SansBold at 25pt]\setstrut\strut\documentvariable{line:3}} + } + \stopstandardmakeup + + \setuplayout + + \setupbackgrounds + [page] + [background={page,banner}] + +\stopsetups + +\startsetups document:stop + + \definecolor[AspectColor][green] + + \startsubject[title=Colofon] + + This manual is part of the \CONTEXT\ distribution, and is authored and maintained by \space + \documentvariable{author}. \CONTEXT\ is developed at \PRAGMA, Hasselt, The Netherlands.\space + This manual is produced on \currentdate. + + \stopsubject + +\stopsetups + +% \usemodule[set-11] + +% \setupframedtexts +% [setuptext] +% [rulethickness=1pt, +% framecolor=green, +% background=color, +% backgroundcolor=lightgray] + +% titles: + +% Description +% Structure +% Usage +% XML example +% \TeX\ example +% Configuring +% Documentation + +\continueifinputfile{s-man-10.mkiv} + +\startdocument[title=Title,author=Author,palet=steps] + + \startsection[title=Test] + + \input knuth + + \stopsection + +\stopdocument diff --git a/doc/context/sources/general/manuals/math/math-framing-001.tex b/doc/context/sources/general/manuals/math/math-framing-001.tex new file mode 100644 index 000000000..5081b8ad2 --- /dev/null +++ b/doc/context/sources/general/manuals/math/math-framing-001.tex @@ -0,0 +1,113 @@ +\setuplayout[topspace=5mm,bottomspace=5mm,height=middle,header=1cm,footer=0cm] + +\starttext + +\startbuffer[sample] + \enabletrackers[formulas.framed] \showboxes + \startformula + e = mc^2 + \stopformula + \par + \startformula + e = mc^2 + \stopformula + \startformula + e = mc^2 + \stopformula + \startformula + e \dorecurse{12} { = mc^2 } + \stopformula + \startplaceformula + \startformula + e = mc^2 + \stopformula + \stopplaceformula + \startplaceformula + \startformula + e \dorecurse{12} { = mc^2 } + \stopformula + \stopplaceformula +\stopbuffer + +\startbuffer[setup-b] +\setupformula + [option=frame] +\stopbuffer + +\startbuffer[setup-d] +\setupformulaframed + [frame=on, + %toffset=10pt, + %boffset=10pt, + foregroundcolor=white, + background=color, + backgroundcolor=gray] +\stopbuffer + +\startbuffer[setup-c] +\setupformula + [frame=number] +\stopbuffer + +\startbuffer[all] +\start + \typebuffer[setup-a] + \getbuffer[setup-a] + \getbuffer[sample] + \typebuffer[setup-b] + \typebuffer[setup-d] + \getbuffer[setup-b] + \getbuffer[setup-d] + \getbuffer[sample] + \typebuffer[setup-c] + \getbuffer[setup-c] + \getbuffer[sample] + \page +\stop +\stopbuffer + +\startbuffer + \startbuffer[setup-a] + \setupformula + [align=flushleft] + \stopbuffer + \getbuffer[all] + \startbuffer[setup-a] + \setupformula + [align=flushleft,location=left] + \stopbuffer + \getbuffer[all] + + \startbuffer[setup-a] + \setupformula + [align=middle] + \stopbuffer + \getbuffer[all] + \startbuffer[setup-a] + \setupformula + [align=middle,location=left] + \stopbuffer + \getbuffer[all] + + \startbuffer[setup-a] + \setupformula + [align=flushright] + \stopbuffer + \getbuffer[all] + \startbuffer[setup-a] + \setupformula + [align=flushright,location=left] + \stopbuffer + \getbuffer[all] +\stopbuffer + +\getbuffer + +\startbuffer[setup-b] +\setupformula + [option={tight,frame}] +\stopbuffer + +\getbuffer + +\stoptext diff --git a/doc/context/sources/general/manuals/math/math-mkiv.tex b/doc/context/sources/general/manuals/math/math-mkiv.tex new file mode 100644 index 000000000..c20f12049 --- /dev/null +++ b/doc/context/sources/general/manuals/math/math-mkiv.tex @@ -0,0 +1,58 @@ +% language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. + +\environment math-layout + +\startproduct math-mkiv + +\startdocument + +\component math-titlepage + +\startfrontmatter + \component math-contents + \component math-introduction +\stopfrontmatter + +\startbodymatter + \component math-spacing + \component math-framing + \component math-numbering + \component math-combining +\stopbodymatter + +\stopdocument + +\stopproduct + +% when we compare these tables with the one that the ff loader produces we notice +% some differences: this is because (deduced from source) that ff does some kind +% of interpolation for missing heights for the last kern (for n=2 adding 100 and +% for adding 1 the max height) ... this is probably a side effect if missing specs +% here we don't do that +% \enabledirectives[fontgoodies.mathkerning] + +% \startTEXpage[offset=2mm] +% \startcombination[4*2] +% {\hbox to 50pt{\hss\showboxes\switchtobodyfont [modern]$V_i^i = W_i^i$\hss}} {\infofont modern} +% {\hbox to 50pt{\hss\showboxes\switchtobodyfont [cambria]$V_i^i = W_i^i$\hss}} {\infofont cambria} +% {\hbox to 50pt{\hss\showboxes\switchtobodyfont[lucidaot]$V_i^i = W_i^i$\hss}} {\infofont lucida} +% {\hbox to 50pt{\hss\showboxes\switchtobodyfont [dejavu]$V_i^i = W_i^i$\hss}} {\infofont dejavu} +% {\hbox to 50pt{\hss\showboxes\switchtobodyfont [pagella]$V_i^i = W_i^i$\hss}} {\infofont pagella} +% {\hbox to 50pt{\hss\showboxes\switchtobodyfont [termes]$V_i^i = W_i^i$\hss}} {\infofont termes} +% {\hbox to 50pt{\hss\showboxes\switchtobodyfont [bonum]$V_i^i = W_i^i$\hss}} {\infofont bonum} +% {\hbox to 50pt{\hss\showboxes\switchtobodyfont [schola]$V_i^i = W_i^i$\hss}} {\infofont schola} +% \stopcombination +% \stopTEXpage diff --git a/doc/context/sources/general/manuals/math/math-spacing-001.tex b/doc/context/sources/general/manuals/math/math-spacing-001.tex new file mode 100644 index 000000000..a0ccda449 --- /dev/null +++ b/doc/context/sources/general/manuals/math/math-spacing-001.tex @@ -0,0 +1,73 @@ +\doifmodeelse {with-struts} { + \def\Line{\dontleavehmode{\showstruts\dorecurse{18}{x \strut x }}} +} { + \def\Line{\dontleavehmode{\showstruts\dorecurse{18}{x x }}} +} + +\setuplayout + [width=middle, + height=middle, + backspace=1mm, + topspace=1cm] + +\setupbodyfont + [17.3pt] + +\starttext + +\Line + +\startformula + x +\stopformula + +\Line + +\startformula + y +\stopformula + +\Line + +\startformula + \strut x +\stopformula + +\Line + +\startformula \startalign + \NC c - a = \NC b \NR + \NC d + c - b = \NC a \NR +\stopalign \stopformula + +\Line + +\startformula \startalign + \NC c - a = \NC b \NR + \NC d + c - b = \NC a \NR +\stopalign \stopformula + +\Line + +\startformula +\mframed + [offset=1mm,loffset=3mm,roffset=3mm] { + a + b = c + } +\stopformula + +\Line + +\startformula +\mframed + [offset=1mm,loffset=3mm,roffset=3mm] { + \startalign + \NC c - a = \NC b \NR + \NC d + c - b = \NC a \NR + \stopalign + } +\stopformula + +\Line + +\stoptext diff --git a/doc/context/sources/general/manuals/mcommon.tex b/doc/context/sources/general/manuals/mcommon.tex new file mode 100644 index 000000000..94b5f9bf5 --- /dev/null +++ b/doc/context/sources/general/manuals/mcommon.tex @@ -0,0 +1,210 @@ +% content=tex +% +% copyright=pragma-ade readme=readme.pdf licence=cc-by-nc-sa + +\startenvironment mcommon + +% modules + +\usemodule[abr-02] + +% layout + +% \startmode[screen] +% \setuppapersize[S6][S6] +% \setupinteractionscreen[options=max] +% \stopmode + +\setuplayout + [topspace=15mm, + header=15mm, + headerdistance=0mm, + footer=0cm, + width=middle, + height=middle] + +\setupinteraction + [state=start, + color=, + contrastcolor=, + style=] + +% fonts + +\definetypeface [mainface] [rm] [serif] [pagella] [default] +\definetypeface [mainface] [ss] [sans] [heros] [default] % [rscale=1.1] +\definetypeface [mainface] [tt] [mono] [heros] [default] % [rscale=1.1] +\definetypeface [mainface] [mm] [math] [pagella] [default] + +\setupbodyfont[mainface,12pt] + +\definefont [BigFont] [SansBold*default at 60pt] +\definefont [MedFont] [SansBold*default at 30pt] + +% colors (historically) + +\definecolor [NopColor] [r=.6,g=.4,b=.5] +\definecolor [AltColor] [r=.4,g=.6,b=.5] +\definecolor [TheColor] [r=.4,g=.5,b=.6] +\definecolor [TmpColor] [r=.6,g=.5,b=.4] + +\definecolor [NopColor] [r=.40,g=.20,b=.20] +\definecolor [AltColor] [r=.20,g=.40,b=.20] +\definecolor [TheColor] [r=.20,g=.20,b=.40] +\definecolor [TmpColor] [r=.40,g=.40,b=.20] + +\definecolor [red] [NopColor] +\definecolor [green] [AltColor] +\definecolor [blue] [TheColor] +\definecolor [yellow][TmpColor] + +% spacing + +\setupwhitespace + [big] + +\setuptolerance + [verytolerant,stretch] + +% verbatim + +\setuptype + [color=AltColor] + +\setuptyping + [color=AltColor] + +% structure + +\setupitemize + [each] + [color=TheColor] + +\definedescription + [switch] + [headstyle=type, + headcolor=TheColor, + location=serried, + width=broad] + +\defineenumeration + [topic] + [location=serried, + width=broad, + headstyle=, + headcolor=TheColor, + text=, + left={[}, + right={]}] + +\setuphead + [section] + [style=\bfb, + color=TheColor] + +\setuplist + [section] + [alternative=c, + color=TheColor, + textcolor=black, + pagecolor=black] + +% whatever + +\setupsystem + [random=medium] + +\setupfloats + [ntop=100] + +\setupinteraction + [style=, + color=NopColor, + contrastcolor=NopColor] + +% tables and frames + +\setuptabulate + [rulethickness=.5pt, + rulecolor=AltColor] + +\setuptables + [rulethickness=.5pt, + rulecolor=AltColor] + +\setupframedtexts + [rulethickness=.5pt, + framecolor=TheColor, + width=\textwidth] + +% quick reference things + +\usemodule[set-11] \loadsetups + +\setupframedtexts + [setuptext] + [rulethickness=.5pt, + framecolor=AltColor] + +% titlepage + +\startsetups titlepage + \defineoverlay + [logo] + [\useMPgraphic{titlepage}{width=\overlaywidth,height=\overlayheight}] + \setupbackgrounds + [page] + [background=logo] + \startstandardmakeup + \dontcomplain + \BigFont + \setupinterlinespace + \vfill + \setupalign[left] + \let\\=\par + \dontleavehmode + \rotate + [rotation=90] + {\color + [lightgray] + {\getvariable{document}{title}}} + \par + \stopstandardmakeup + \setupbackgrounds + [page] + [background=] +\stopsetups + +\startsetups colofon + \blank[2*big] + \testpage[3] + \startpacked + \getvariable{document}{author}\par + \getvariable{document}{affiliation}\par + \getvariable{document}{location}\par + \stoppacked +\stopsetups + +\setupdocument + [title=No Title, + before=\setups{titlepage}, + after=\setups{colofon}] + +% urls + +\useurl[gpl-simple] [http://creativecommons.org/licenses/GPL/2.0/] +\useurl[gpl-legal] [http://creativecommons.org/licenses/GPL/2.0/legalcode] +\useurl[bysa-simple][http://creativecommons.org/licenses/by-sa/4.0/] +\useurl[bysa-legal] [http://creativecommons.org/licenses/by-sa/4.0/legalcode] + +\useurl[garden] [http://contextgarden.net] +\useurl[install] [http://wiki.contextgarden.net/ConTeXt_Standalone] +\useurl[texlive] [http://www.tug.org/texlive/] +\useurl[group] [http://group.contextgarden.net] +\useurl[list] [http://www.ntg.nl/mailman/listinfo/ntg-context] +\useurl[development][http://www.ntg.nl/mailman/listinfo/dev-context] +\useurl[announce] [http://www.ntg.nl/mailman/listinfo/ann-context] +\useurl[collector] [http://tracker.luatex.org] +\useurl[pragma] [http://www.pragma-ade.com] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/readme/mreadme.tex b/doc/context/sources/general/manuals/readme/mreadme.tex new file mode 100644 index 000000000..32c1684d9 --- /dev/null +++ b/doc/context/sources/general/manuals/readme/mreadme.tex @@ -0,0 +1,390 @@ +% interface=en engine=luatex language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. + +\environment mcommon + +% copied from cont-log: readme_logo + +\startuseMPgraphic{titlepage}{width,height} + numeric width ; width = \MPvar{width} ; + numeric height ; height = \MPvar{height} ; + numeric delta ; delta := width/10 ; + numeric circle ; circle := 2.5delta ; + color c ; c := (.2,.4,.6) ; + path p, q, r ; + p := unitsquare xscaled width yscaled height ; + z1 = (delta,height-2delta) ; + z2 = (width-delta,height-delta) ; + z3 = (width/2-delta,2delta+circle) ; + z4 = (x3,delta+circle/2) ; + q := z1 { dir -15 } .. z2 & z2 { dir -105 } .. z3 & z3 { dir 135 } .. z1 & cycle ; + r := fullcircle xscaled circle yscaled (.85circle) rotated 15 shifted z4 ; + pickup pencircle scaled (delta/1.5) ; + fill p withcolor .50c ; + fill q withcolor .75c ; + fill r withcolor .75c ; + draw p withcolor c ; + draw q withcolor c ; + pickup pencircle scaled (delta/2) ; + draw r withcolor c ; + setbounds currentpicture to p ; +\stopuseMPgraphic + +\startdocument + [title={Read Me First}, + author={Hans Hagen}, + affiliation={PRAGMA ADE}, + location={Hasselt NL}] + +\startsubject[title={Introduction}] + +What licence suits best for a \TEX\ like system is a matter of taste. Personally +we dislike any licence that needs more than a few pages of dense legal code to +get the message across. A \TEX\ related system like \CONTEXT\ is a hybrid of +programs, scripts and|/|or macro code as well as documentation and sample code, +including graphics. \TEX\ related systems also have a long standing tradition of +providing support structures for users. In order to make support feasible, a +\TEX\ based system like \CONTEXT\ assumes a certain logic and structure in the +way the related files are named and organized in a tree structure. Even a small +change in one of the elements may let such a system behave differently than +manuals suggest. Swap a font, change some style defaults, leave out some pieces, +and users may end up in confusion. A licence does not give a user any guarantees! + +In order to satisfy those responsible for distributing \CONTEXT, we need to +choose a licence that makes them feel comfortable. Unfortunately we don't feel +that comfortable with a licence that does not provide the guarantees that a +system will not be adapted in such ways that the advertised behaviour changes. On +the other hand, it is the responsibility of those distributing and extending the +system to make sure that this does not happen. However, users should not +automatically assume that what they get shipped is the same as the original, +which is why we stress that support (from our side) will only be given on +unaltered systems. + +First of all, what is \CONTEXT ? It's just a bunch of macros, written in \TEX\ +and \METAPOST, meant for typesetting documents. The macros are accompanied by +some scripts, written in \PERL\ (mainly the older scripts) \RUBY\ (also older +ones) and \LUA\ (the current fashion). The \CONTEXT\ distribution comes with a +few fonts, files that help manage resources (e.g.\ map files needed for \MKII), +as well as patterns (based on official ones, so this is a derived work). + +The \CONTEXT\ distribution is packaged in a zip file organized in the \TDS\ +structure. + +\starttabulate[|lT|p|] +\NC \type {cont-tmf.zip} \NC the main distribution that has all relevant files \NC \NR +\NC \type {cont-tst.7z} \NC a bunch of test files that can also serve as examples \NC \NR +\NC \type {cont-mpd.zip} \NC a \METAPOST\ to \PDF\ converter (not needed in \CONTEXT) \NC \NR +\NC \type {cont-ppc.zip} \NC a macro package for typesetting chemistry (not needed in \CONTEXT) \NC \NR +\NC \type {cont-sci.zip} \NC configuration files for using \CONTEXT\ in the \SCITE\ editor \NC \NR +\stoptabulate + +There are two flavours of \CONTEXT: \MKII\ and \MKIV. The first one is frozen and +will not be extended. It runs on top of \PDFTEX\ or \XETEX. The \MKIV\ version is +actively developed and runs on top of \LUATEX\ (an engine that is developed +alongside \CONTEXT\ but that can also be used for other macro packages). + +The documentation can be downloaded from our website or the Wiki. Some manuals +ship with source code. We might ship more source code but only when the source is +stable and clean and can serve as an example. + +That said, what licence does apply? We need to distinguish between things that +resemble a program on the one hand and documentation on the other hand. We +(currently) use a different licence for either of them. + +\stopsubject + +\startsubject[title={The Code}] + +The program code (i.e. anything not under the \type {/doc} subtree) is +distributed under the + +\startnarrower +\goto{Creative Commons GNU GPL}[url(gpl-simple)] +\stopnarrower + +For practical purposes distributers may also choose the \LATEX\ project licence, +which is considered to be a bit more \TEX\ friendly. (BSD alike licences also +apply well for \CONTEXT.) + +In practice, users may forget about the legal part, if only because I haven't +even read (and understood) it completely myself, so let's stick to what Creative +Commons makes of it: + +\startcolor[blue] +The GNU General Public License is a Free Software license. Like any Free Software +license, it grants to you the four following freedoms: + +\startitemize + \startitem + The freedom to run the program for any purpose. + \stopitem + \startitem + The freedom to study how the program works and adapt it to your needs. + \stopitem + \startitem + The freedom to redistribute copies so you can help your neighbour. + \stopitem + \startitem + The freedom to improve the program and release your improvements to the + public, so that the whole community benefits. + \stopitem +\stopitemize + +You may exercise the freedoms specified here provided that you comply with the +express conditions of this license. The principal conditions are: + +You must conspicuously and appropriately publish on each copy distributed an +appropriate copyright notice and disclaimer of warranty and keep intact all the +notices that refer to this License and to the absence of any warranty; and give +any other recipients of the Program a copy of the GNU General Public License +along with the Program. Any translation of the GNU General Public License must be +accompanied by the GNU General Public License. + +If you modify your copy or copies of the program or any portion of it, or develop +a program based upon it, you may distribute the resulting work provided you do so +under the GNU General Public License. Any translation of the GNU General Public +License must be accompanied by the GNU General Public License. + +If you copy or distribute the program, you must accompany it with the complete +corresponding machine-readable source code or with a written offer, valid for at +least three years, to furnish the complete corresponding machine-readable source +code. + +Any of these conditions can be waived if you get permission from the copyright +holder. + +Your fair use and other rights are in no way affected by the above. +\stopcolor + +Many source filed mention the \quotation {\CONTEXT\ Development Team} as +copyright holder. This is because over time users submit patches and whenever +something happens to the main author, those involved in development can take +over without the need to bother about derived work. In the end the \CONTEXT\ +group is the place to get more information. + +\stopsubject + +\startsubject[title={Recommendations}] + +Here are a few recommendations in case you want to distribute, extend of embed +\CONTEXT\ in applications: + +\startitemize + +\startitem + You can best leave the code base untouched. Most of \CONTEXT\ provides hooks + and it's relatively easy to overload code. Leave the lower level system code + untouched: changes may backfire when you update. Asking for more hooks is the + best way to go. +\stopitem + +\startitem + Put your own code in the right subpaths, i.e.\ modules approved by the + development team under \type {.../third}, and styles and whatever else under + \type {.../user}. This way your code will not interfere with existing code + and updating will give less problems. Keep in mind that \TEX\ systems have + their own way and order in locating files, and the load order often matters. +\stopitem + +\startitem + Don't copy styles and change a few lines, but load the base one and + built|/|patch on top of that. In the end you may benefit from improvements to + the base style. +\stopitem + +\startitem + Be original. The whole idea behind \CONTEXT\ is that you can write your own + styles. On the \CONTEXT\ mailing list as well as on the Wiki there are enough + advanced users to help you make a start. +\stopitem + +\startitem + Don't hesitate to submit bugs reports and ask for extensions. It may even be + that what you want is already present but yet undocumented. +\stopitem + +\startitem + If things don't work as expected, check to what extend your system matches + the (more or less) standard. We provide so called minimal \CONTEXT\ trees + that can serve as a reference. Because \CONTEXT\ evolves, make sure your + system is up to date. The \CONTEXT\ garden provides ways to install and + update the standard distribution. +\stopitem + +\startitem + The scripts can best be called using \type {mtxrun}. This lessens dependencies + on the location in the tree and ensures upward compatibility. It also prevents + clashes with similar scripts. +\stopitem + +\startitem + Some scripts depend on each other. Don't mess around with the existing + functionality and names of the scripts and then feed them back into the + standard distributions. +\stopitem + +\stopitemize + +\stopsubject + +\startsubject[title={Documents}] + +The documentation is provided under another Creative Commons licence: + +\startnarrower + \goto{Attribution ShareAlike}[url(bysa-simple)] +\stopnarrower + +The manuals that are distributed with \CONTEXT\ comes with a rather liberal +license. However, we try to adapt these documents to upgrades in the (sub)systems +that they describe and derived work can therefore conflict with existing +functionality and we cannot be held responsible for that. Many of the manuals +contain characteristic graphics and personal notes or examples that make no sense +when used out|-|of|-|context. + +The mentioned license says: + +\startcolor[blue] +You are free: + +\startitemize + \startitem to copy, distribute, display, and perform the work \stopitem + \startitem to make derivative works \stopitem +\stopitemize + +{\sc Attribution:} You must attribute the work in the manner specified by the +author or licensor. + +{\sc Share Alike:} If you alter, transform, or build upon this work, you may +distribute the resulting work only under a license identical to this one. + +\startitemize + \startitem + For any reuse or distribution, you must make clear to others the license + terms of this work. + \stopitem + \startitem + Any of these conditions can be waived if you get permission from the + copyright holder. + \stopitem +\stopitemize + +Your fair use and other rights are in no way affected by the above. +\stopcolor + +If you distribute \CONTEXT\ and related software on electronic media as part of +\TEX\ distributions (either or not for money), you may also distribute the +manuals and their sources in electronic form, preferable as provided by the +maintainers of \CONTEXT. + +Keep in mind that logos and cover designs are not meant to be copied. We provide +the source code for some manuals, but we don't always provide all graphics and +other resources. For instance, in some manuals we use commercial fonts and you +have to buy those yourself. + +We provide the typeset manuals at our website. Those are the official ones. We +appreciate it if you do not to distribute manuals compiled on your own system as +substitutes. The manuals are a showcase for what \CONTEXT\ provides. Help us to +assure the quality. + +\stopsubject + +\startsubject[title={More information}] + +We're not going to fill \mathematics{n}~pages with legal stuff, so if you want to +know more, you have to consult the web for the legalities mentioned. Here are a +few starting points: + +\startlines +\goto{\url[gpl-simple]}[url(gpl-simple)] +\goto{\url[gpl-legal]}[url(gpl-legal)] +\stoplines + +\startlines +\goto{\url[bysa-simple]}[url(bysa-simple)] +\goto{\url[bysa-legal]}[url(bysa-legal)] +\stoplines + +\CONTEXT\ itself can be fetched from the main site or the garden: + +\startlines +\goto{\url[pragma]}[url(pragma)] +\goto{\url[install]}[url(install)] +\stoplines + +These always ship the latest versions. Alternatively you can install the whole +\TEX\ distribution, which is a yearly snapshot: + +\startlines +\goto{\url[texlive]}[url(texlive)] +\stoplines + +A starting point for support can be found at: + +\startlines +\goto{\url[list]}[url(list)] +\goto{\url[garden]}[url(garden)] +\stoplines + +And of course there is the \CONTEXT\ group: + +\startlines +\goto{\url[group]}[url(group)] +\stoplines + +Bugs and feature requests can be registered at the collector: + +\startlines +\goto{\url[collector]}[url(collector)] +\stoplines + +Releases are announced at: + +\startlines +\goto{\url[announce]}[url(announce)] +\stoplines + +The developers can be met at: + +\startlines +\goto{\url[development]}[url(development)] +\stoplines + +\stopsubject + +\startsubject[title={Disclaimer}] + +To play safe we include a disclaimer here, taken from the BSD style licence. For +some reason such a text is always in unreadable capitals, so \unknown + +\start \txx \blue +THIS SOFTWARE IS PROVIDED BY THE AUTHOR \quotation {AS IS} AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +\stop + +\unknown\ and don't bother discussing licence issues and related things with us +for the mere sake of discussing licence stuff. + +\stopsubject + +\stopdocument diff --git a/doc/context/sources/general/manuals/spacing/spacing-contents.tex b/doc/context/sources/general/manuals/spacing/spacing-contents.tex new file mode 100644 index 000000000..d7c709e2e --- /dev/null +++ b/doc/context/sources/general/manuals/spacing/spacing-contents.tex @@ -0,0 +1,9 @@ +\startcomponent spacing-contents + +\starttitle[title=Contents] + +\placelist[chapter,section] + +\stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/spacing/spacing-introduction.tex b/doc/context/sources/general/manuals/spacing/spacing-introduction.tex new file mode 100644 index 000000000..d4d385c5e --- /dev/null +++ b/doc/context/sources/general/manuals/spacing/spacing-introduction.tex @@ -0,0 +1,19 @@ +\environment spacing-style + +\startcomponent spacing-introduction + +\startchapter[title=Introduction] + + In this document I will collext some remarks about spacing (related) commands + but it will happen stepwise. Feel free to contribute. + + \blank + + \startlines + Hans Hagen + Hasselt NL + \stoplines + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex b/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex new file mode 100644 index 000000000..c16afbf0a --- /dev/null +++ b/doc/context/sources/general/manuals/spacing/spacing-linecorrection.tex @@ -0,0 +1,108 @@ +% language=uk + +\environment spacing-style + +\startcomponent spacing-linecorrection + +\startchapter[title=Line correction] + +\startbuffer[linecorrection] +\typebuffer +\blank +\enabletrackers[linecorrection.boxes] +\getbuffer +\disabletrackers[linecorrection.boxes] +\blank +\stopbuffer + +We really do out best to make the spacing look as good as possible +(or at least consistent) but sometimes \TEX\ needs a bit of help. +An example of a helper is the following: + +\startbuffer +\startlinecorrection + \input ward +\stoplinecorrection +\stopbuffer + +\getbuffer[linecorrection] + +When we use the same command with some left and/or right margins set, we get +this: + +\startbuffer +\startnarrower + \startlinecorrection + \input ward + \stoplinecorrection +\stopnarrower +\stopbuffer + +\getbuffer[linecorrection] + +Here we do obey the margins inside the correction box but the box itself is still +as wide as the current width. A typical case where this happens is: + +\startbuffer +\startitemize + \startitem an item: + \startlinecorrection + \input ward + \stoplinecorrection + \stopitem +\stopitemize +\stopbuffer + +\getbuffer[linecorrection] + +Here is a variant: + +\startbuffer +\startitemize + \startitem a local linecorrection: + \startlocallinecorrection + \input ward + \stoplocallinecorrection + \stopitem +\stopitemize +\stopbuffer + +\getbuffer[linecorrection] + +Both types of correction wrap their content in a box and make sure that the +spacing around it is visually as good as possible. The local variant uses a box +fitting the available width taking margins into account and but resetting them +inside the box. The normal variant applies the margins inside the box. Which one +you use depends on the situation and content. + +You can pass an optional argument that indicates the amount of spacing to be +added before and after the correction. + +\startbuffer +\startlinecorrection[3*line] + \input ward +\stoplinecorrection +\stopbuffer + +\getbuffer[linecorrection] + +Normally you don't need this correction. It is mainly used for correcting spacing +around boxed material, like \type {\framed}: + +\startbuffer +before +\startlinecorrection + \framed{something inbetween} +\stoplinecorrection +after +\stopbuffer + +\getbuffer[linecorrection] + +Because in this document we have set the whitespace this also gets added around +the box. So, in case your spacing around some special content looks bad, consider +using these commands. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex b/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex new file mode 100644 index 000000000..4261a3884 --- /dev/null +++ b/doc/context/sources/general/manuals/spacing/spacing-mkiv.tex @@ -0,0 +1,16 @@ +\environment spacing-style + +\startdocument + + \component spacing-titlepage + + \startfrontmatter + \component spacing-contents + \component spacing-introduction + \stopfrontmatter + + \startbodymatter + \component spacing-linecorrection + \stopbodymatter + +\stopdocument diff --git a/doc/context/sources/general/manuals/spacing/spacing-style.tex b/doc/context/sources/general/manuals/spacing/spacing-style.tex new file mode 100644 index 000000000..cf0bae7bf --- /dev/null +++ b/doc/context/sources/general/manuals/spacing/spacing-style.tex @@ -0,0 +1,55 @@ +\startenvironment spacing-style + +\setupbodyfont + [pagella] + +\setuplayout + [width=middle, + height=middle, + topspace=15mm, + header=15mm, + footer=0pt, + bottomspace=20mm] + +\setuppagenumbering + [alternative=doublesided] + +\setupwhitespace + [big] + +\definecolor + [blackcolor] + [r=0,b=0,g=0] + +\definecolor + [whitecolor] + [r=1,b=1,g=1] + +\definecolor + [maincolor] + [.25(blackcolor,green)] + +\definecolor + [extracolor] + [.25(whitecolor,green)] + +% \blackrule[color=maincolor,width=10cm,,height=10cm] +% \blackrule[color=extracolor,width=10cm,,height=10cm] + +\setuptyping + [color=maincolor] + +\setuptype + [color=maincolor] + +\setuphead + [chapter] + [style=\bfd, + color=maincolor] + +\setuphead + [section] + [style=\bfc, + color=maincolor] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/spacing/spacing-titlepage.tex b/doc/context/sources/general/manuals/spacing/spacing-titlepage.tex new file mode 100644 index 000000000..1f21d769a --- /dev/null +++ b/doc/context/sources/general/manuals/spacing/spacing-titlepage.tex @@ -0,0 +1,37 @@ +\environment spacing-style + +\startcomponent spacing-titlepage + +% This titlepage demonstrates once again how well designed the computer modern monospaced +% font is, especially when we look at the consistent grayness. + +\startMPpage + + fill Page enlarged 4mm withcolor \MPcolor{maincolor} ; + + draw image ( + for i=1 upto 20 : + draw bottomboundary Page shifted (0,100*log(i)) ; + endfor ; + ) + xysized (PaperWidth-6mm,PaperHeight-6mm) + shifted (3mm,3mm) + withcolor \MPcolor{extracolor} + withpen pencircle scaled 1mm ; + + numeric a ; a := log(1)*PaperHeight/(log(20)) ; + numeric b ; b := log(2)*PaperHeight/(log(20)) ; + + picture p ; p := textext.lrt("\ttbf Spacing in Con\TeX t") xsized(.9PaperWidth) ; + + draw p + shifted (.05PaperWidth,(b+a)/2 - ypart center p) + withcolor \MPcolor{extracolor} ; + + setbounds currentpicture to Page ; + +\stopMPpage + +\page[right] \setuppagenumber[number=1] + +\stopcomponent diff --git a/doc/context/sources/general/manuals/sql/sql-mkiv.tex b/doc/context/sources/general/manuals/sql/sql-mkiv.tex new file mode 100644 index 000000000..ec2c999aa --- /dev/null +++ b/doc/context/sources/general/manuals/sql/sql-mkiv.tex @@ -0,0 +1,492 @@ +% language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. + +\usemodule[art-01,abr-02] + +\definecolor + [maincolor] + [r=.4] + +\setupbodyfont + [10pt] + +\setuptype + [color=maincolor] + +\setuptyping + [color=maincolor] + +\definefont + [TitlePageFont] + [file:lmmonolt10-bold.otf] + +\setuphead + [color=maincolor] + +\usesymbols + [cc] + +\setupinteraction + [hidden] + +\startdocument + [metadata:author=Hans Hagen, + metadata:title=SQL in ConTeXt, + author=Hans Hagen, + affiliation=PRAGMA ADE, + location=Hasselt NL, + title=SQL in \CONTEXT, + support=www.contextgarden.net, + website=www.pragma-ade.nl] + +\startMPpage + + StartPage ; + + numeric w ; w := bbwidth(Page) ; + numeric h ; h := bbheight(Page) ; + + fill Page withcolor \MPcolor{maincolor} ; + + draw textext.urt("\TitlePageFont Q") xysized (1.1 w,0.9 h) shifted (-.05w,.05h) withcolor .20white ; + draw textext.top("\TitlePageFont SQL") xysized (0.4725w,0.13h) shifted (.675w,.24w) withcolor .60white ; + draw textext.top("\TitlePageFont CONTEXT") xsized (0.6 w) shifted (.675w,.10w) withcolor .60white ; + + StopPage ; + +\stopMPpage + +\startsubject[title=Contents] + +\placelist[section][alternative=a] + +\stopsubject + +\startsection[title=Introduction] + +Although \CONTEXT\ is a likely candidate for typesetting content that comes from +databases it was only in 2011 that I ran into a project where a connection was +needed. After all, much document related typesetting happens on files or +dedicated storage systems. + +Because we run most projects in an infrastructure suitable for \TEX, it made +sense to add some helper scripts to the \CONTEXT\ core distribution that deal +with getting data from (in our case) \MYSQL\ databases. That way we can use the +already stable infrastructure for installing and updating files that comes with +\CONTEXT. + +As \LUA\ support is nicely integrated in \CONTEXT, and as dealing with +information from databases involves some kind of programming anyway, there is (at +least currently) no \TEX\ interface. The examples shown here work in \CONTEXT, +but you need to keep in mind that \LUA\ scripts can also use this interface. + +{\em Although this code is under construction the interfaces are unlikely to +change, if only because we use it on production.} + +\stopsection + +\startsection[title=Presets] + +In order to consult a database you need to provide credentials. You also need +to reach the database server, either by using some client program or via a +library. More about that later. + +Because we don't want to key in all that information again and again, we will +collect it in a table. This also permits us to store it in a file and load it +on demand. For instance: + +\starttyping +local presets = { + database = "test", + username = "root", + password = "none", + host = "localhost", + port = 3306, +} +\stoptyping + +You can put a table in a file \type {presets.lua} like this: + +\starttyping +return { + database = "test", + username = "root", + password = "none", + host = "localhost", + port = 3306, +} +\stoptyping + +and then load it as follows: + +\starttyping +local presets = table.load("presets.lua") +\stoptyping + +If you really want, you can use some library to open a connection, execute a +query, collect results and close the connection, but here we use just one +function that does it all. The presets are used to access the database and the +same presets will be used more often it makes sense to keep a connection open as +long as possible. That way you can execute much more queries per second, +something that makes sense when there are many small ones, as in web related +services. A connection is made persistent when the presets have an \type {id} +key, like + +\starttyping +presets.id = "myproject" +\stoptyping + +\stopsection + +\startsection[title=Templates] + +A query often looks like this: + +\starttyping +SELECT + `artist`, `title` +FROM + `cd` +WHERE + `artist` = 'archive' ; +\stoptyping + +However, often you want to use the same query for multiple lookups, in which case +you can do this: + +\starttyping +SELECT + `artist`, `title` +FROM + `cd` +WHERE + `artist` = '%artist%' ; +\stoptyping + +In the next section we will see how \type {%artist%} can be replaced by a more +meaningful value. You can a percent sign by entering two in a row: \type {%%}. + +As with any programming language that deals with strings natively, you need a +way to escape the characters that fence the string. In \SQL\ a field name is +fenced by \type {``} and a string by \type {''}. Field names can often be +used without \type {``} but you can better play safe. + +\starttyping +`artist` = 'Chilly Gonzales' +\stoptyping + +Escaping of the \type {'} is simple: + +\starttyping +`artist` = 'Jasper van''t Hof' +\stoptyping + +When you use templates you often pass a string as variable and you don't want to +be bothered with escaping them. In the previous example we used: + +\starttyping +`artist` = '%artist%' +\stoptyping + +When you expect embedded quotes you can use this: + +\starttyping +`artist` = '%[artist]%' +\stoptyping + +In this case the variable {artist} will be escaped. When we reuse a template we +store it in a variable: + +\starttyping +local template = [[ + SELECT + `artist`, `title` + FROM + `cd` + WHERE + `artist` = '%artist%' ; +]] +\stoptyping + +\stopsection + +\startsection[title=Queries] + +In order to execute a query you need to pass the previously discussed presets +as well as the query itself. + +\starttyping +local data, keys = utilities.sql.execute { + presets = presets, + template = template, + variables = { + artist = "Dream Theater", + }, +} +\stoptyping + +The variables in the presets table can also be passed at the outer +level. In fact there are three levels of inheritance: settings, presets +and module defaults. + +\starttabulate +\NC presets \NC a table with values \NC \NR +\NC template \NC a query string \NC \NR +\NC templatefile \NC a file containing a template \NC \NR +\NC \em resultfile \NC a (temporary) file to store the result \NC \NR +\NC \em queryfile \NC a (temporary) file to store a query \NC \NR +\NC variables \NC variables that are subsituted in the template \NC \NR +\NC username \NC used to connect to the database \NC \NR +\NC password \NC used to connect to the database \NC \NR +\NC host \NC the \quote {machine} where the database server runs on \NC \NR +\NC port \NC the port where the database server listens to \NC \NR +\NC database \NC the name of the database \NC \NR +\stoptabulate + +The \type {resultfile} and \type {queryfile} parameters are used when a client +approach is used. When a library is used all happens in memory. + +When the query succeeds two tables are returned: \type {data} and \type {keys}. The +first is an indexed table where each entry is a hash. So, if we have only one +match and that match has only one field, you get something like this: + +\starttyping +data = { + { + key = "value" + } +} + +keys = { + "key" +} +\stoptyping + +\stopsection + +\startsection[title=Converters] + +All values in the result are strings. Of course we could have provided some +automatic type conversion but there are more basetypes in \MYSQL\ and some are +not even standard \SQL. Instead the module provides a converter mechanism + +\starttyping +local converter = utilities.sql.makeconverter { + { name = "id", type = "number" }, + { name = "name", type = "string" }, + { name = "enabled", type = "boolean" }, +} +\stoptyping + +You can pass the converter to the execute function: + +\starttyping +local data, keys = utilities.sql.execute { + presets = presets, + template = template, + converter = converter, + variables = { + name = "Hans Hagen", + }, +} +\stoptyping + +In addition to numbers, strings and booleans you can also use a function +or table: + +\starttyping +local remap = { + ["1"] = "info" + ["2"] = "warning" + ["3"] = "debug" + ["4"] = "error" +} + +local converter = utilities.sql.makeconverter { + { name = "id", type = "number" }, + { name = "status", type = remap }, +} +\stoptyping + +I use this module for managing \CONTEXT\ jobs in web services. In that case we +need to store jobtickets and they have some common properties. The definition of +the table looks as follows: \footnote {The tickets manager is part of the +\CONTEXT\ distribution.} + +\starttyping +CREATE TABLE IF NOT EXISTS %basename% ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `token` varchar(50) NOT NULL, + `subtoken` INT(11) NOT NULL, + `created` int(11) NOT NULL, + `accessed` int(11) NOT NULL, + `category` int(11) NOT NULL, + `status` int(11) NOT NULL, + `usertoken` varchar(50) NOT NULL, + `data` longtext NOT NULL, + `comment` longtext NOT NULL, + + PRIMARY KEY (`id`), + UNIQUE INDEX `id_unique_index` (`id` ASC), + KEY `token_unique_key` (`token`) +) +DEFAULT CHARSET = utf8 ; +\stoptyping + +We can register a ticket from (for instance) a web service and use an independent +watchdog to consult the database for tickets that need to be processed. When the +job is finished we register this in the database and the web service can poll for +the status. + +It's easy to imagine more fields, for instance the way \CONTEXT\ is called, what +files to use, what results to expect, what extra data to pass, like style +directives, etc. Instead of putting that kind of information in fields we store +them in a \LUA\ table, serialize that table, and put that in the data field. + +The other way around is that we take this data field and convert it back to \LUA. +For this you can use a helper: + +\starttyping +local results = utilities.sql.execute { ... } + +for i=1,#results do + local result = results[i] + result.data = utilities.sql.deserialize(result.data) +end +\stoptyping + +Much more efficient is to use a converter: + +\starttyping +local converter = utilities.sql.makeconverter { + ... + { name = "data", type = "deserialize" }, + ... +} +\stoptyping + +This way you don't need to loop over the result and deserialize each data +field which not only takes less runtime (often neglectable) but also takes +less (intermediate) memory. Of course in some cases it can make sense to +postpone the deserialization. + +A variant is not to store a serialized data table, but to store a key|-|value +list, like: + +\starttyping +data = [[key_1="value_1" key_2="value_2"]] +\stoptyping + +Such data fields can be converted with: + +\starttyping +local converter = utilities.sql.makeconverter { + ... + { name = "data", type = utilities.parsers.keq_to_hash }, + ... +} +\stoptyping + +You can imagine more converters like this, and if needed you can use them to +preprocess data as well. + +\starttabulate[|Tl|p|] +\NC "boolean" \NC This converts a string into the value \type {true} or \type {false}. + Valid values for \type {true} are: \type {1}, \type {true}, \type + {yes}, \type {on} and \type {t} \NC \NR +\NC "number" \NC This one does a straightforward \type {tonumber} on the value. \NC \NR +\NC function \NC The given function is applied to value. \NC \NR +\NC table \NC The value is resolved via the given table. \NC \NR +\NC "deserialize" \NC The value is deserialized into \LUA\ code. \NC \NR +\NC "key" \NC The value is used as key which makes the result table is now hashed + instead of indexed. \NC \NR +\NC "entry" \NC An entry is added with the given name and optionally with a default + value. \NC \NR +\stoptabulate + +\stopsection + +\startsection[title=Typesetting] + +For good reason a \CONTEXT\ job often involves multiple passes. Although the +database related code is quite efficient it can be considered a waste of time +and bandwidth to fetch the data several times. For this reason there is +another function: + +\starttyping +local data, keys = utilities.sql.prepare { + tag = "table-1", + ... +} + +-- do something useful with the result + +local data, keys = utilities.sql.prepare { + tag = "table-2", + ... +} + +-- do something useful with the result +\stoptyping + +The \type {prepare} alternative stores the result in a file and reuses +it in successive runs. + +\stopsection + +\startsection[title=Methods] + +Currently we have several methods for accessing a database: + +\starttabulate +\NC client \NC use the command line tool, pass arguments and use files \NC \NR +\NC library \NC use the standard library (somewhat tricky in \LUATEX\ as we need to work around bugs) \NC \NR +\NC lmxsql \NC use the library with a \LUA\ based pseudo client (stay in the \LUA\ domain) \NC \NR +\NC swiglib \NC use the (still experimental) library that comes with \LUATEX \NC \NR +\stoptabulate + +All methods use the same interface (\type {execute}) and hide the dirty details +for the user. All return the data and keys tables and all take care of the proper +escaping and parsing. + +\stopsection + +\startsection[title=Helpers] + +There are some helper functions and extra modules that will be described when +they are stable. + +There is an \quote {extra} option to the \type {context} command that can be used +to produce an overview of a database. You can get more information about this +with the command: + +\starttyping +context --extra=sql-tables --help +\stoptyping + +\stopsection + +\startsection[title=Colofon] + +\starttabulate[|B|p|] +\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR +\NC version \NC \currentdate \NC \NR +\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR +\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR +\stoptabulate + +\stopsection + +\stopdocument diff --git a/doc/context/sources/general/manuals/start/cont-en-extra.xml b/doc/context/sources/general/manuals/start/cont-en-extra.xml new file mode 100644 index 000000000..4d41391d0 --- /dev/null +++ b/doc/context/sources/general/manuals/start/cont-en-extra.xml @@ -0,0 +1,749 @@ +<?xml version="1.0"?> + +<cd:interface xmlns:cd="http://www.pragma-ade.com/commands" name="context" language="en" version="2004.11.17"> + +<!-- +Todo: + + -- bycd:section (\setuppagenumbering) + -- cd:sectionnumber (\setuppagenumbering) +--> + +<cd:command name="textbackground" type="environment"> + <cd:sequence> + <cd:string value="textbackground"/> + </cd:sequence> +</cd:command> + +<cd:command name="textbackground"> + <cd:sequence> + <cd:string value="textbackground"/> + </cd:sequence> +</cd:command> + +<cd:command name="setuptextbackground" file="core-pgr.tex"> + <cd:sequence> + <cd:string value="setuptextbackground"/> + </cd:sequence> + <cd:arguments> + <cd:assignments list="yes"> + <cd:parameter name="leftoffset" default="0pt"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="rightoffset" default="0pt"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="topoffset" default="0pt"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="bottomoffset" default="0pt"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="before"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="after"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="state"> + <cd:constant type="start" default="yes"/> + <cd:constant type="stop"/> + </cd:parameter> + <cd:parameter name="location"> + <cd:constant type="text" default="yes"/> + <cd:constant type="paragraph"/> + <cd:constant type="none"/> + </cd:parameter> + <cd:parameter name="alternative"> + <cd:constant type="0" default="yes"/> + <cd:constant type="1"/> + <cd:constant type="2"/> + </cd:parameter> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> +</cd:command> + +<cd:command name="defineinteractionmenu" variant="1" file="core-int.tex"> + <cd:sequence> + <cd:string value="defineinteractionmenu"/> + </cd:sequence> + <cd:arguments> + <cd:keywords interactive="exclusive"> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:keywords interactive="exclusive" list="yes"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="top"/> + <cd:constant type="bottom"/> + <cd:constant type="cd:name"/> + </cd:keywords> + <cd:assignments optional="yes" list="yes"> + <cd:parameter name="before"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="after"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="inbetween"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="left"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="right"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="middle"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="state"> + <cd:constant type="start"/> + <cd:constant type="stop"/> + <cd:constant type="none"/> + <cd:constant type="local"/> + </cd:parameter> + <cd:parameter name="style"> + <cd:resolve name="style"/> + </cd:parameter> + <cd:parameter name="color"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="distance"> + <cd:constant type="overlay"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="samepage"> + <cd:constant type="yes"/> + <cd:constant type="empty"/> + <cd:constant type="no"/> + <cd:constant type="none"/> + </cd:parameter> + <cd:parameter name="unknownreference"> + <cd:constant type="yes"/> + <cd:constant type="empty"/> + <cd:constant type="no"/> + <cd:constant type="none"/> + </cd:parameter> + <cd:parameter name="leftoffset"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="rightoffset"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="topoffset"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="bottomoffset"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="position"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:inherit name="setupframed"/> + </cd:assignments> + </cd:arguments> +</cd:command> + +<cd:command name="setupframed" file="core-rul.tex"> + <!-- new: rulethickness --> + <cd:sequence> + <cd:string value="setupframed"/> + </cd:sequence> + <cd:arguments> + <cd:assignments list="yes"> + <cd:parameter name="height"> + <cd:constant type="fit"/> + <cd:constant type="broad"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="width"> + <cd:constant type="fit"/> + <cd:constant type="broad"/> + <cd:constant type="fixed"/> + <cd:constant type="local"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="autowidth"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + <cd:constant type="force"/> + </cd:parameter> + <cd:parameter name="offset"> + <cd:constant type="none"/> + <cd:constant type="overlay"/> + <cd:constant type="default"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="location"> + <cd:constant type="depth"/> + <cd:constant type="hanging"/> + <cd:constant type="high"/> + <cd:constant type="lohi"/> + <cd:constant type="low"/> + <cd:constant type="top"/> + <cd:constant type="middle"/> + <cd:constant type="bottom"/> + <cd:constant type="keep"/> + </cd:parameter> + <cd:parameter name="option"> + <cd:constant type="none"/> + <cd:constant type="empty"/> + </cd:parameter> + <cd:parameter name="strut"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + <cd:constant type="global"/> + <cd:constant type="local"/> + </cd:parameter> + <cd:parameter name="align"> + <cd:resolve name="align"/> + </cd:parameter> + <cd:parameter name="bottom"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="top"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="frame"> + <cd:constant type="on"/> + <cd:constant type="off"/> + <cd:constant type="none"/> + <cd:constant type="overlay"/> + </cd:parameter> + <cd:parameter name="topframe"> + <cd:constant type="on"/> + <cd:constant type="off"/> + </cd:parameter> + <cd:parameter name="bottomframe"> + <cd:constant type="on"/> + <cd:constant type="off"/> + </cd:parameter> + <cd:parameter name="leftframe"> + <cd:constant type="on"/> + <cd:constant type="off"/> + </cd:parameter> + <cd:parameter name="rightframe"> + <cd:constant type="on"/> + <cd:constant type="off"/> + </cd:parameter> + <cd:parameter name="frameoffset"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="framedepth"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="framecorner"> + <cd:constant type="round"/> + <cd:constant type="rectangular"/> + </cd:parameter> + <cd:parameter name="frameradius"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="framecolor"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="rulethickness"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="background"> + <cd:constant type="screen"/> + <cd:constant type="color"/> + <cd:constant type="none"/> + <cd:constant type="foreground"/> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="backgroundscreen"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="backgroundcolor"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="backgroundoffset"> + <cd:constant type="frame"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="backgrounddepth"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="backgroundcorner"> + <cd:constant type="round"/> + <cd:constant type="rectangular"/> + </cd:parameter> + <cd:parameter name="backgroundradius"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="depth"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="corner"> + <cd:constant type="round"/> + <cd:constant type="rectangular"/> + </cd:parameter> + <cd:parameter name="radius"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="empty"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="foregroundcolor"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="foregroundstyle"> + <cd:resolve name="style"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> +</cd:command> + +<cd:command name="namemakeup" type="environment" generated="yes"> + <cd:sequence> + <cd:variable value="name"/> + <cd:string value="makeup"/> + </cd:sequence> + <cd:arguments> + <cd:assignments optional="yes" list="yes"> + <cd:inherit name="startmakeup"/> + </cd:assignments> + </cd:arguments> +</cd:command> + +<cd:command name="hiding" type="environment"> + <cd:sequence> + <cd:string value="hiding"/> + </cd:sequence> + <cd:arguments> + </cd:arguments> +</cd:command> + +<cd:command name="setupthinrules" file="core-rul.tex"> + <cd:sequence> + <cd:string value="setupthinrules"/> + </cd:sequence> + <cd:arguments> + <cd:assignments> + <cd:parameter name="interlinespace"> + <cd:constant type="small"/> + <cd:constant type="medium"/> + <cd:constant type="big"/> + </cd:parameter> + <cd:parameter name="n"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="before"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="inbetween"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="after"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="color"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="backgroundcolor"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="height"> + <cd:constant type="cd:dimension"/> + <cd:constant type="max"/> + </cd:parameter> + <cd:parameter name="depth"> + <cd:constant type="cd:dimension"/> + <cd:constant type="max"/> + </cd:parameter> + <cd:parameter name="alternative"> + <cd:constant type="a"/> + <!--<cd:constant type="b"/>--> + <cd:constant type="c"/> + <!--<cd:constant type="d"/>--> + </cd:parameter> + <cd:parameter name="rulethickness"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="color"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="background"> + <cd:constant type="color"/> + <cd:constant type="none"/> + </cd:parameter> + <cd:parameter name="backgroundcolor"> + <cd:constant type="cd:name"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> +</cd:command> + +<cd:command name="setupitemize" file="core-itm.tex"> + <cd:sequence> + <cd:string value="setupitemize"/> + </cd:sequence> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="cd:number"/> + <cd:constant type="each"/> + </cd:keywords> + <cd:keywords optional="yes" list="yes"> + <cd:constant type="standard" default="yes"/> + <cd:constant type="broad"/> + <cd:constant type="serried"/> + <cd:constant type="packed"/> + <cd:constant type="unpacked"/> + <cd:constant type="stopper"/> + <cd:constant type="joinedup"/> + <cd:constant type="atmargin"/> + <cd:constant type="inmargin"/> + <cd:constant type="autointro"/> + <cd:constant type="loose"/> + <cd:constant type="repeat"/> + <cd:constant type="cd:section"/> + <cd:constant type="paragraph"/> + <cd:constant type="intext"/> + <cd:constant type="random"/> + </cd:keywords> + <cd:assignments optional="yes" list="yes"> + <cd:parameter name="margin"> + <cd:constant type="no"/> + <cd:constant type="standard"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="leftmargin"> + <cd:constant type="no"/> + <cd:constant type="standard"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="rightmargin"> + <cd:constant type="no"/> + <cd:constant type="standard"/> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="width"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="distance"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="factor"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="items"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="start"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="before"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="inbetween"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="after"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="left"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="right"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="beforehead"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="afterhead"> + <cd:constant type="cd:command"/> + </cd:parameter> + <cd:parameter name="headstyle"> + <cd:resolve name="style"/> + </cd:parameter> + <cd:parameter name="marstyle"> + <cd:resolve name="style"/> + </cd:parameter> + <cd:parameter name="symstyle"> + <cd:resolve name="style"/> + </cd:parameter> + <cd:parameter name="stopper"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="n"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="symbol"> + <cd:constant type="cd:number"/> + </cd:parameter> + <cd:parameter name="align"> + <cd:resolve name="align"/> + </cd:parameter> + <cd:parameter name="indentnext"> + <cd:resolve name="indentnext"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> +</cd:command> + +<cd:command name="itemize" type="environment" generated="yes"> + <cd:sequence> + <cd:variable value="itemize"/> + </cd:sequence> + <cd:arguments> + <cd:keywords optional="yes" list="yes"> + <cd:constant type="a"/> + <cd:constant type="A"/> + <cd:constant type="KA"/> + <cd:constant type="n"/> + <cd:constant type="N"/> + <cd:constant type="m"/> + <cd:constant type="r"/> + <cd:constant type="R"/> + <cd:constant type="KR"/> + <cd:constant type="cd:number"/> + <cd:constant type="continue"/> + <cd:constant type="standard" default="yes"/> + <cd:constant type="broad"/> + <cd:constant type="serried"/> + <cd:constant type="packed"/> + <cd:constant type="stopper"/> + <cd:constant type="joinedup"/> + <cd:constant type="atmargin"/> + <cd:constant type="inmargin"/> + <cd:constant type="intro"/> + <cd:constant type="columns"/> + <cd:constant type="text"/> + <cd:constant type="paragraph"/> + <cd:constant type="repeat"/> + </cd:keywords> + <cd:assignments optional="yes" list="yes"> + <cd:inherit name="setupitemize"/> + </cd:assignments> + </cd:arguments> +</cd:command> + +<cd:command name="framedtext" type="environment" generated="yes"> + <cd:sequence> + <cd:variable value="framedtext"/> + </cd:sequence> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="left"/> + <cd:constant type="right"/> + <cd:constant type="middle"/> + <cd:constant type="none"/> + </cd:keywords> + <cd:assignments optional="yes" list="yes"> + <cd:inherit name="setupframedtexts"/> + </cd:assignments> + <!-- new --> + <cd:content/> + <cd:content/> + </cd:arguments> +</cd:command> + +<cd:command name="tabulate" type="environment" generated="yes"> + <cd:sequence> + <cd:variable value="tabulate"/> + </cd:sequence> + <cd:arguments> + <cd:keywords optional="yes"> + <cd:constant type="cd:text"/> + </cd:keywords> + <!-- change! --> + <cd:keywords> + <cd:constant type="cd:text"/> + </cd:keywords> + </cd:arguments> +</cd:command> + +<cd:command name="setupcolors" file="colo-ini.tex"> + <cd:sequence> + <cd:string value="setupcolors"/> + </cd:sequence> + <cd:arguments> + <cd:assignments list="yes"> + <cd:parameter name="state"> + <cd:constant type="start"/> + <!-- change! --> + <cd:constant type="stop" default="yes"/> + <cd:constant type="global"/> + <cd:constant type="local"/> + </cd:parameter> + <cd:parameter name="conversion"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + <cd:constant type="always"/> + </cd:parameter> + <cd:parameter name="reduction"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="rgb"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="cmyk"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="mpcmyk"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="mpspot"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="textcolor"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="split"> + <cd:constant type="c"/> + <cd:constant type="m"/> + <cd:constant type="y"/> + <cd:constant type="k"/> + <cd:constant type="p"/> + <cd:constant type="s"/> + <cd:constant type="no"/> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="criterium"> + <cd:constant type="all"/> + <cd:constant type="none"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> +</cd:command> + +<cd:command name="setupinteraction" file="core-nav.tex"> + <cd:sequence> + <cd:string value="setupinteraction"/> + </cd:sequence> + <cd:arguments> + <cd:assignments interactive="exclusive" list="yes"> + <cd:parameter name="state"> + <cd:constant type="start"/> + <!-- change! --> + <cd:constant type="stop" default="yes"/> + </cd:parameter> + <cd:parameter name="menu"> + <cd:constant type="on"/> + <cd:constant type="off"/> + </cd:parameter> + <cd:parameter name="page"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="click"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="split"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="display"> + <cd:constant type="new"/> + </cd:parameter> + <cd:parameter name="openaction"> + <cd:constant type="cd:reference"/> + </cd:parameter> + <cd:parameter name="closeaction"> + <cd:constant type="cd:reference"/> + </cd:parameter> + <cd:parameter name="openpageaction"> + <cd:constant type="cd:reference"/> + </cd:parameter> + <cd:parameter name="closepageaction"> + <cd:constant type="cd:reference"/> + </cd:parameter> + <cd:parameter name="calculate"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="strut"> + <cd:constant type="yes"/> + <cd:constant type="no"/> + </cd:parameter> + <cd:parameter name="width"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="height"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="depth"> + <cd:constant type="cd:dimension"/> + </cd:parameter> + <cd:parameter name="style"> + <cd:resolve name="style"/> + </cd:parameter> + <cd:parameter name="color"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="contrastcolor"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="symbolset"> + <cd:constant type="cd:name"/> + </cd:parameter> + <cd:parameter name="title"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="subtitle"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="author"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="date"> + <cd:constant type="cd:text"/> + </cd:parameter> + <cd:parameter name="keyword"> + <cd:constant type="cd:text"/> + </cd:parameter> + <!-- maybe this will move elsewhere --> + <cd:parameter name="fieldlayer"> + <cd:constant type="auto"/> + <cd:constant type="cd:name"/> + </cd:parameter> + </cd:assignments> + </cd:arguments> +</cd:command> + +<cd:define name="regime"> + <cd:constant type="Latin1"/> + <cd:constant type="Latin2"/> + <cd:constant type="Latin7"/> + <cd:constant type="Latin15"/> + <cd:constant type="iso-8859-1"/> + <cd:constant type="iso-8859-2"/> + <cd:constant type="iso-8859-7"/> + <cd:constant type="iso-8859-15"/> + <cd:constant type="cp1250"/> + <cd:constant type="cp1251"/> + <cd:constant type="cp1252"/> + <cd:constant type="cp1253"/> + <cd:constant type="cp1254"/> + <cd:constant type="cp1257"/> + <cd:constant type="viscii"/> + <cd:constant type="cyr"/> + <cd:constant type="grk"/> + <cd:constant type="mac"/> + <cd:constant type="utf8"/> + <cd:constant type="unicode"/> +</cd:define> + +<cd:command name="enableregime" file="regi-ini.tex"> + <cd:sequence> + <cd:string value="enableregime"/> + </cd:sequence> + <cd:arguments> + <cd:keywords> + <cd:resolve name="regime"/> + </cd:keywords> + </cd:arguments> +</cd:command> + +</cd:interface> + diff --git a/doc/context/sources/general/manuals/start/en/hasseltbook.bib b/doc/context/sources/general/manuals/start/en/hasseltbook.bib new file mode 100644 index 000000000..ea7bbfd31 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/hasseltbook.bib @@ -0,0 +1,7 @@ +@INBOOK{book01, + author = "Jonker, J.", + title = "From Hasselt to America", + publisher = "Bookplan Publishers", + year = "2012", + chapter = "1.2", +} diff --git a/doc/context/sources/general/manuals/start/en/hasseltbook.pdf b/doc/context/sources/general/manuals/start/en/hasseltbook.pdf Binary files differnew file mode 100644 index 000000000..03c894ff4 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/hasseltbook.pdf diff --git a/doc/context/sources/general/manuals/start/en/hasseltbook.tex b/doc/context/sources/general/manuals/start/en/hasseltbook.tex new file mode 100644 index 000000000..9c0d319f5 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/hasseltbook.tex @@ -0,0 +1,30 @@ + +\starttext + +\startstandardmakeup + \midaligned{\tfd Festivities in Hasselt} +\stopstandardmakeup + +\completecontent + +\startchapter[title=Introduction] + An introduction. +\stopchapter + +\startchapter[title=Kingsday] + Something about the Kingsday in Hasselt.\index{Kingsday} +\stopchapter + +\startchapter[title=Hassailt] + Something about Hassailt.\index{Hassailt} +\stopchapter + +\startchapter[title=Euifeest,reference=euifeest] + Something about the Euifeest.\index{Euifeest} +\stopchapter + +\completeindex + +\stoptext + +\stoptext diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-alignments.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-alignments.tex new file mode 100644 index 000000000..327bc8a6b --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-alignments.tex @@ -0,0 +1,73 @@ +\startcomponent ma-cb-en-alignments + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Alignment] + +\index{alignment} + +\Command{\tex{setupalign}} +\Command{\tex{setup tolerance}} +\Command{\tex{rightaligned}} +\Command{\tex{leftlines}} +\Command{\tex{midaligned}} + +Horizontal and vertical alignment can be set up with: + +\shortsetup{setupalign} + +Single lines can be aligned with: + +\starttyping +\rightaligned{} +\leftaligned{} +\midaligned{} +\stoptyping + +An example can illustrate the alignment behavior: + +\startbuffer +\leftaligned {Hasselt was built on a sandhill.} +\midaligned {Hasselt was built on the crossing of two rivers.} +\rightaligned {Hasselt's name stems from hazelwood.} +\stopbuffer + +\typebuffer + +After processing this would look like: + +\getbuffer + +Alignment of a paragraph is done with: + +\shortsetup{startalignment} + +\startbuffer +\startalignment[flushright,nothyphenated] + For Hasselt the 15th and 16th century were relatively unstable times. + There were uprises and disputes with neighbouring cities. To be + able to defend themselves the city council ordered a number of + arquebuses (very primitive firearms). Fourteen of these have survived + and now form one of the greatest arquebus collections in Europe. +\stopalignment +\stopbuffer + +\typebuffer + +This will become a rightaligned paragraph without hyphenations: + +\getbuffer + +In case of alignment you can specify a tolerance and the direction (vertical or +horizontal). Normally the tolerance is \type{verystrict}. In colums you could +specify \type{verytolerant}. The tolerance in this manual is: + +\starttyping +\setuptolerance[horizontal,verystrict] +\stoptyping + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-backpage.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-backpage.tex new file mode 100644 index 000000000..bb7ae0250 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-backpage.tex @@ -0,0 +1,40 @@ +\startcomponent ma-cb-en-backpage + +\enablemode[**en-us] + +\project ma-cb + +This manual describes some features of \CONTEXT, a document +production system, based on \TEX. + +\vfil + +\CONTEXT\ offers the user a flexible and high quality +typesetting environment. No in||depth knowledge of \TEX\ +is needed. The parameter driven character of \CONTEXT\ +enables users to define their own layout rather easy. + +\vfil + +\CONTEXT\ is developed and tested in a production +environment and is used for typesetting simple books as +well as complex documents, paper and/or screen based. This +introduction manual describes the functionality needed for +everyday publications, like manuals and educational +materials. + +\vfil + +This manual is also available as an interactive document, be +it in a bit different layout. The macro package \CONTEXT, +some more advanced examples and additional information can +be found at www.pragma-ade.com. + +\vfil + +PRAGMA ADE \break +Ridderstraat 27 \break +8061 GH Hasselt NL \break +www.pragma-ade.com + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-bibliography.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-bibliography.tex new file mode 100644 index 000000000..1b8451934 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-bibliography.tex @@ -0,0 +1,63 @@ +\startcomponent ma-cb-en-bibliography + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Bibliography] + +\index{bibliography} +\index{\BIBTEX} + +\Command{\tex{setuppublications}} +\Command{\tex{placepublications}} +\Command{\tex{setupbibtex}} + +\CONTEXT\ support the \BIBTEX\ way of managing article and book references. The data +is stored in a \type{.bib} file. A data entry in a \BIBTEX\ data file could be: + +\startbuffer +@INBOOK{book01, + author = "Jonker, J.", + title = "From Hasselt to America", + publisher = "Bookplan Publishers", + year = "2012", + chapter = "1.2", +} +\stopbuffer + +\typebuffer + +After loading the database with \type{\setupbibtex[database=hasseltbook]} the following +command is available: + +\setupbibtex[database={hasseltbook},sort=author] +\setuppublications[refcommand=authoryear] + +\startbuffer +Please refer to \cite[book01] for more information on famous people +that were born in Hasselt. +\stopbuffer + +\typebuffer + +Which would produce: + +\getbuffer + +In an appendix you can place the complete book list with: + +\startbuffer +\placepublications[criterium=text] +\stopbuffer + +\typebuffer + +At this moment (2013 -- 2014) the bibliography mechanism is being completely +overhauled, so please visit the \goto {\CONTEXTWIKI} [ url +(http://wiki.contextgarden.net) ] and the \goto {Pragma ADE website} [ url +(http://www.pragma-ade.com/overview.htm) ] regularly for information. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-chemical.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-chemical.tex new file mode 100644 index 000000000..3919ccb01 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-chemical.tex @@ -0,0 +1,77 @@ +\startcomponent ma-cb-en-chemical + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Chemical stuf,reference=chemical] + +\index{chemistry} +\index{chemical equitation} + +\Command{\tex{}chemical} + +Chemical structures may look very impressive. + +\startbuffer +\startchemical[scale=small,width=fit,top=3000,bottom=3000] + \chemical[SIX,SB2356,DB14,Z2346,SR3,RZ3,SR6,-RZ6,+RZ6] + [C,N,C,C,H,H] + \chemical[PB:Z1,ONE,Z0,MOV8,Z0,SB24,DB7,Z27,PE][C,C,CH_3,O] + \chemical[PB:Z5,ONE,Z0,MOV6,Z0,SB24,DB7,Z47,PE][C,C,H_3C,O] + \chemical[SR24,RZ24][CH_3,H_3C] + \bottext{Compound A} +\stopchemical +\stopbuffer + +\placeformula[-] +\startformula + \getbuffer +\stopformula + +\CONTEXT\ relies on \METAPOST\ to draw these kind of chemical structures. +Although these chemical structures are defined with only two or three commands, +it takes some practice to get the right results. This is how the input looks: + +\typebuffer + +Chemical reactions can be typeset within a paragraph or as a display formula with +the \type{\inlinechemical} and \type{\startchemicalformula} commands: + +\startbuffer +\definefloat + [chemicalformula] + [chemicalformulas] + +One of the steps in the Hasselt canal water treatment is the removal of +phosphate by means of a chemical reaction with iron: + +\placechemicalformula[none][]{} + {\startchemicalformula + \chemical{Fe(OH)_3}{iron hydroxide} + \chemical{PLUS} + \chemical{H_3PO_4}{phosphoric acid} + \chemical{GIVES}{\hphantom{whatever}} + \chemical{FePO_4}{iron phosphate} + \chemical{PLUS} + \chemical{H_2O}{water} + \stopchemicalformula} + +The \inlinechemical{FePO_4} is a solid and precipitates in water. It +is filtered and re-used as a furtilizer resource. +\stopbuffer + +\getbuffer + +This is defined by: + +\typebuffer + +The use of the chemical commands is described in the \goto{PPCHTeX Manual}[ url(manual:chemic) ] +and the example manual \goto{Chemical Formulas in \CONTEXT} [ url(manual:chemic-ex) ]. + +\stopchapter + +\stopcomponent + + diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-citations.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-citations.tex new file mode 100644 index 000000000..b0e416ee0 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-citations.tex @@ -0,0 +1,64 @@ +\startcomponent ma-cb-en-citations + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Citations and quotations, reference=quotations] + +\index{citation} +\index{quote} + +\Command{\tex{quote}} + +The consistent use of quote and quotation marks in the running text is invoked by +the use of \type{\quote} or \type{\quotation}. For longer text fragments you can use: + +\shortsetup{startquotation} + +\startbuffer +In the book \quote{Hasselt, beelden van een middeleeuwse stad} it says: +\startquotation +Het stadhuis wordt voor het eerst vermeld in 1431. Oorspronkelijk +is het een houten huis, dat wordt afgebroken om plaats te maken voor +een nieuw stadhuis van steen. Dit wordt echter halverwege de 16e eeuw +ook afgebroken en vervangen door een nog groter pand. Het nieuwe +stadhuis wordt weer in dezelfde fraaie stijl opgebouwd. De bestuurders +laten daarmee zien dat het is gebouwd in een tijd van grote welvaart. +\stopquotation +\stopbuffer + +\typebuffer + +In the example below you can see that quotation is language sensitive: + +\startbuffer +\nl Hij zei tegen me: \quotation{In Hasselt noemen ze dat + \quote{noaberschop} of zoiets.} + +\en He told me: \quotation{In Hasselt they call this + \quote{noaberschop} or something like that.} + +\de Er sagte zu mir: \quotation{In Hasselt nennt man das + \quote{noaberschop} oder so etwas.} + +\fr Il a dit: \quotation{À Hasselt on c'appelle \quote{noaberschop} + ou quelque chose comme ça.} +\stopbuffer + +\typebuffer + +Note the automatic change of the quotation marks in case of a quote within a +quote. + +\startpacked +\getbuffer +\stoppacked + +You can alter the default settings with: + +\shortsetup{setuplanguage} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-color.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-color.tex new file mode 100644 index 000000000..1cfeadf9a --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-color.tex @@ -0,0 +1,71 @@ +\startcomponent ma-cb-en-color + +\project ma-cb + +\startchapter[title=Color] + +\index{color} + +\Command{\tex{setupcolors}} +\Command{\tex{color}} +\Command{\tex{definecolor}} + +Text, frames or backgrounds can be set in color with: + +\shortsetup{color} + +Default the basic colors are available. Basic colors are for example +red, white and blue. A color like orange can be defined with: + +\shortsetup{definecolor} + +You can define orange like this: + +\startbuffer[a] +\definecolor [darkorange] [c=0.0,m=0.60,y=1.00,k=0.0] +\definecolor [middleorange] [.5(darkorange)] +\stopbuffer + +\typebuffer[a] + +\getbuffer[a] + +It is of good practice to check (combinations of) colors on a larger +surface: + +\startbuffer +\blackrule[width=\hsize,height=1cm,color=red,after=] +\blackrule[width=\hsize,height=1cm,color=white,after=] +\blackrule[width=\hsize,height=1cm,color=blue,after=] +\blackrule[width=\hsize,height=1cm,color=darkorange] +\stopbuffer + +\typebuffer + +so you can see if they fit together: + +\blank + +\getbuffer + +A color can be invoked in a number of ways: + +\startbuffer +\startcolor[red] +On {\darkorange Kingsday} {\blue Hasselt} turns into a +\color[darkorange]{colorfull} city. +\stopcolor +\stopbuffer + +\typebuffer + +\getbuffer + +More information on the use of color models, transparency and palets can be found +on the \goto {\CONTEXTWIKI} [ url (http://wiki.contextgarden.net/Color) ] +and in the +\goto {\em Color Separation} [ url (manual:color) ] manual. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-columns.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-columns.tex new file mode 100644 index 000000000..06bb30259 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-columns.tex @@ -0,0 +1,154 @@ +\startcomponent ma-cb-en-columns + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Columns] + +\index{columns} + +\Command{\tex{startcolums}} +\Command{\tex{setupcolumns}} +\Command{\tex{column}} + +Simple sections of text can be typeset in columns. If you preceed a text fragment +by \type{\startcolumns} and close the text fragment by \type{\stopcolumns} +everything in between will be set in columns. + +\shortsetup{startcolumns} + +Let's give an example: + +\startbuffer +\startcolumns[n=3,tolerance=verytolerant] + Hasselt is an old Hanseatic City, situated 12~km north of Zwolle + at the river Zwartewater. + + ... + + Furthermore some events of special interest should be + mentioned. Every year at the end of August Hasselt celebrates + the \quote{Eui Festival} (hay festival). +\stopcolumns +\stopbuffer + +\typebuffer + +\startbuffer +\hyphenation{Ste-pha-nus} +\startcolumns[n=3,tolerance=verytolerant] +Hasselt is an old Hanseatic City, situated 12~km north of Zwolle at +the river Zwartewater. + +The city has a long history since obtaining the city charter around +1252. Part and parcel of this history can be traced back to a large +number of monuments to be admired in the city center. + +There you will find the St. Stephanus church, a late gothic church +dating back to 1479 with a magnificent organ. The former Municipal +Building is situated on The Market Place. Constituted between 1500 +and 1550 it houses a large collection of weapons, amongst which one +of the largest collection of black powder guns (haakhussen) in the +whole world should be mentioned. + +Furthermore there is a corn windmill \quote{The Swallow}, dating back to +1748 as well as the \quote{Stenendijk}, a unique embankment and the last +shell limekiln in Europe still in full operation. + +The city center with the townmoat adorned by lime-trees, the Van +Stolkspark and the hustle and bustle at the docks are ideally suited +for a stroll. + +The area around Hasselt is also worth mentioning. In wintertime +polder Mastenbroek harbours large numbers of geese. In summertime the +hamlets Gen\-ne, Streukel and Celle\-mui\-den form, together with the very +rare lapwing flowers (Lat. Fritillaria meleagris) found on the banks +of the river Zwatewater, the ideal surroundings for walking or +cycling trips. + +Hasselt also is a very important center for watersports. The lakes of +northwest Overijssel, the river IJssel, the Overijsselse Vecht and +the Randmeren are within easy reach from the yacht harbour `De +Molenwaard'. Sailing, fishing, swimming and ca\-noe\-ing can be fully +enjoyed in Hasselt. + +Furthermore some events of special interest should be +mentioned. Every year at the end of August Hasselt celebrates the +\quote{Eui Festival} (hay festival). +\stopcolumns +\stopbuffer + +The result will be a three column text. + +\start +\switchtobodyfont[9pt] +\getbuffer +\stop + +If possible a new column can be enforced with \type{\column}. You can set up +columns with: + +\shortsetup{setupcolumns} + +In most cases you will obtain a better result by type setting the text on +\quote{grid}. This is done by typing \type{grid=yes} in the command \type +{\setuplayout}. + +If you want to use columns within a framed text \type{\start ... \stopframedtext} +there is the simple column mechanism. + +\startbuffer +\startframedtext[background=color,backgroundcolor=gray] +\startsimplecolumns + In Hasselt's local newspaper there was a column on the + local customs during New Years Eve. + ... + \midaligned{\inlinechemical{CaC_2,+,2H_2O,GIVES,C_2H_2(g),+,Ca(OH)_2}} + ... + Nowadays the heavy metal lid of the milk can is replaced by + a football. This does not reduce the sound but it is much + saver. +\stopsimplecolumns +\stopbuffer + +\typebuffer + +\startbuffer +\startframedtext[background=color,backgroundcolor=gray,width=\textwidth] +\startsimplecolumns + In Hasselt's local newspaper there was a column on the + local customs during new years Eve. Next to the more + general custom of eating Dutch doughnuts (oliebollen) + and lighting fireworks there is the carbide shooting. + What you need is an oldfashioned metal milk can, carbide, + a little water and a lighter. + + The carbide and water is mixed in the closed milk can and + will produce \inlinechemical{C_2H_2} gas (acetylene), via: + + \midaligned{\inlinechemical{CaC_2,+,2H_2O,GIVES,C_2H_2 (g),+,Ca(OH)_2}} + + The volatile acetylene gas in the milk can is ignited via a small + opening in the can. The result is a very loud detonation and the lid + flies off. + + It will not surprise you that Hasselts youth has a designated + shooting ground for carbide shooting. Nowadays the heavy + metal lid of the milk can is replaced by a football. This + does not reduce the sound but it is much saver! +\stopsimplecolumns +\stopframedtext +\stopbuffer + +This will result in: + +\getbuffer + +There is an advanced column mechanism available that is described in the +\goto {\em Columns} [ url (manual:columns) +] manual. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-commandlist.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-commandlist.tex new file mode 100644 index 000000000..d14d9d202 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-commandlist.tex @@ -0,0 +1,16 @@ +\startcomponent ma-cb-en-commandlist + +\project ma-cb + +Here we summarize the commands we introduced in the previous chapters. This is +just a selection of the whole repertoire of \CONTEXT\ commands. Those who want to +see them all can take a look at the more extensive manual or the {\em Quick +Reference Manuals} that give a complete overview of all \CONTEXT||commands. + +Arguments that are typeset {\sl slanted} are optional and can be omited. The +number points to the page where the command is explained. Black arrows indicate +that the command is only of use in interactive documents and gray arrows tell us +that additional functionality is provided in interactive mode. Keep in mind that +we only show the commands we described in this manual, there are many more. + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-commands.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-commands.tex new file mode 100644 index 000000000..df0d2a293 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-commands.tex @@ -0,0 +1,94 @@ +\startcomponent ma-cb-en-commands + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Defining commands / macros] + +\CONTEXT\ is a set of macros based on \TEX. \TEX\ is a programming language as +well as a typographical system. This means that you can do the programming +yourself if you need that kind of flexability. + +You can define a new command with: + +\shortsetup{define} + +The next example will explain its meaning. + +You may have a well illustrated document and you are tired of typing: + +\startbuffer +\placefigure + [here,force] + [fig:logical name] + {Caption.} + {\externalfigure[filename][width=5cm]} +\stopbuffer + +\typebuffer + +You could define your own command with a few variables like: + +\startitemize[packed] +\item logical name +\item caption +\item file name +\stopitemize + +Your command definition and call could look something like +this: + +\startbuffer +\define[3]\myputfigure + {\placefigure + [here,force][fig:#1] + {#2}{\externalfigure[#3][width=5cm]}} + +\myputfigure{lion}{The Dutch lion is a sentry.}{ma-cb-13} +\stopbuffer + +\typebuffer + +From then on the \type{\myputfigure} is available. +Between brackets \type{[3]} indicates that you want to use three variables +\type{#1}, \type{#2} and \type{#3}. In the command call \type{\myputfigure} you +have to place these variables between curly braces. The result is shown in +\in{figure}[fig:lion]. + +\getbuffer + +Very sophisticated commands can be programmed, but this is left to your own +inventiveness. + +In addition to defining commands you can also define \type{\start...\stop} +command pairs. + +\shortsetup{definestartstop} + +For example: + +\startbuffer +\definestartstop + [attention] + [before=\blank\startmarginrule, + after=\stopmarginrule\blank] + +\startattention +{\em Hasselter Juffers} are sweet cookies but the name is no +coincidence. On July 21 in 1233 the {\em Zwartewaterklooster} +(Blackwater Monastery) was founded. The monastery was meant +for unmarried girls and women belonging to the nobility of +Hasselt. These girls and women were called {\em juffers}. +\stopattention +\stopbuffer + +\typebuffer + +This will result in: + +\getbuffer + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-composedcharacters.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-composedcharacters.tex new file mode 100644 index 000000000..59c176004 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-composedcharacters.tex @@ -0,0 +1,55 @@ +\startcomponent ma-cb-en-composedcharacters + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Composite characters] + +\index{accents} +\index{foreign characters} + +In \in{chapter}[special chars] you have already seen that you have to type more +than one token to obtain special characters like \# \$ \% \& \_ $\{$ and $\}$. + +Characters with accents for example can be composed or coded with specific +\CONTEXT\ commands in order to display them on paper. In case you have a text +editor that can display utf8 you can type the composed characters directly. + +It is not within the scope of this manual to go into accented characters in math +mode. See the {\TEX Book} by Donald E. Knuth on that subject. + +\in{Table}[tab:composed-characters] shows a few examples and the way you can code +composed characters. + +\placetable + [here,force] + [tab:composed-characters] + {Composed characters.} + {\starttable[|c|l|l|c|] + \HL + \NC \bf Character \NC \bf Composed \NC \bf \CONTEXT\ command \NC \bf UTF8 \NC\SR + \HL + \NC ü \NC \type{\"u} \NC \type{\uacute} \NC \type{ü} \NC\FR + \NC é \NC \type{\'e} \NC \type{\egrave} \NC \type{é} \NC\MR + \NC â \NC \type{\^a} \NC \type{\acircumflex} \NC \type{â} \NC\MR + \NC ä \NC \type{\"a} \NC \type{\aacute} \NC \type{ä} \NC\MR + \NC à \NC \type{\`a} \NC \type{\agrave} \NC \type{à} \NC\MR + \NC å \NC \type{\aa} \NC \type{\aring} \NC \type{å} \NC\MR + \NC ç \NC \type{\c{c}} \NC \type{\ccedilla} \NC \type{ç} \NC\MR + \NC ï \NC \type{\"{\i}} \NC \type{\idiaeresis} \NC \type{ï} \NC\MR + \NC î \NC \type{\^{\i}} \NC \type{\icircumflex} \NC \type{î} \NC\MR + \NC Ä \NC \type{\"A} \NC \type{\Adiaeresis} \NC \type{Ä} \NC\MR + \NC Å \NC \type{\AA} \NC \type{\Aring} \NC \type{Å} \NC\MR + \NC É \NC \type{\'E} \NC \type{\Egrave} \NC \type{É} \NC\MR + \NC æ \NC \type{\ae} \NC \type{\aeligature} \NC \type{æ} \NC\MR + \NC Æ \NC \type{\AE} \NC \type{\AEligature} \NC \type{Æ} \NC\MR + \NC ÿ \NC \type{\"y} \NC \type{\ydiaeresis} \NC \type{ÿ} \NC\LR + \HL + \stoptable} + +The character you want to display should be in the font. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-descriptions.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-descriptions.tex new file mode 100644 index 000000000..01c8fb608 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-descriptions.tex @@ -0,0 +1,94 @@ +\startcomponent ma-cb-en-descriptions + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Definitions] + +\index{definition} + +\Command{\tex{definedescription}} +\Command{\tex{setupdescriptions}} + +If you want to display notions, concepts and ideas in a consistent manner you can +use: + +\shortsetup{definedescription} + +For example: + +\startbuffer +\definedescription + [concept] + [alternative=serried,headstyle=bold,width=broad] + +\concept{Hasselter juffer} A sort of biscuit made of puff pastry and +covered with sugar. It tastes very sweet. \par +\stopbuffer + +\typebuffer + +It would look like this: + +\getbuffer + +But you can also choose other layouts: + +\startbuffer +\definedescription + [concept] + [alternative=top, + inbetween={\blank[none]}, + headstyle=bold, + width=broad, + style=slanted] + +\concept{Hasselter bitter} A very strong alcoholic drink (up to 40\%) +mixed with herbs to give it a special taste. It is sold in a stone +flask and it should be served {\em ijskoud} (as cold as ice). \par + +\definedescription + [concept] + [alternative=inmargin,headstyle=bold,width=broad] + +\concept{Euifeest} A harvest home to celebrate the end of a period of +hard work. The festivities take place in the last week of August. \par +\stopbuffer + +\start +\getbuffer +\stop + +If you want to avoid the \type{\par} or when you have more than one paragraph in +the definition you can use the \type{\start...\stop} construct. + +\startbuffer +\definedescription + [concept] + [alternative=right, + headstyle=bold, + width=broad] + +\startconcept{Euifeest} A harvest home to celebrate the end of a +period of hard work. +This event takes place at the end of August and lasts one week. The +city is completely illuminated and the streets are decorated. This +feast week ends with a {\em Braderie}. +\stopconcept +\stopbuffer + +\typebuffer + +This would become: + +\getbuffer + +Layout is set up within the second bracket pair of +\type{\definedescription[][]}. But you can also use: + +\shortsetup{setupdescriptions} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-document.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-document.tex new file mode 100644 index 000000000..94fdb7ea2 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-document.tex @@ -0,0 +1,117 @@ +\startcomponent ma-cb-en-document + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=How to create a textbook] + +\index{input file} + +Let's assume you want to create a simple textbook. It has some structure and +contains a title page, a few chapters, sections and sub sections. Of course there +is a table of contents. + +\CONTEXT\ can create such a document automatically if you offer the right input +by means of a file. So first you have to create an input file. An input file +consists of a name and an extension. You can choose any name you want but the +extension has to be \type{.tex}. If you create a file with the name +\type{mybook.tex} you will find no difficulties in running \CONTEXT. + +An \pagereference[inputfile] input file could look like this: + +\startbuffer +\starttext + +\startstandardmakeup + \midaligned{From Hasselt to America} + \midaligned{by} + \midaligned{J. Jonker and C. van Marle} +\stopstandardmakeup + +\placecombinedlist[content] + +\chapter{Introduction} + +... ties between Hasselt and America ... + +\chapter[rensselaer]{The Rensselaer family} + +\section{The first born} + +... was born in the year ... + +\section{The early years} + +... in those days Hasselt was ... + +\section{Living and workin in America} + +... life in America was ... + +\chapter[lansing]{The Lansing family} + +... the Lansing family was also ... + +\chapter[cuyler]{The Cuyler family} + +... much later Tydeman Cuyler ... + +\stoptext +\stopbuffer + +{\switchtobodyfont[9pt]\typebuffer} + +\CONTEXT\ expects a plain \ASCII\ input file. Of course you can use any +text|-|editor, as long as you save the file as standard \ASCII\ (also called txt +file) with the extension \type{.tex}. Note that spaces in the filename are +not allowed. + +The input file contains the text you want to typeset and the \CONTEXT\ commands. +A \CONTEXT\ command begins with a backslash~\tex{}. With the command +\type{\starttext} you indicate the beginning of your text. + +A command is sometimes followed by an argument which is enclosed by curly braces +\type{{}}. The command \type{\chapter[cuyler]{The Cuyler family}} that you see in +the example will have its effect on {\em The Cuyler family}. Its actions will +have effect on the design, typography and structure. The actions may be: + +\startitemize[n,packed] +\item start a new page +\item increase chapter number by one +\item place chapter number in front of chapter title +\item reserve some vertical space +\item use a big font +\item put chapter title (and page number) in the table of contents +\stopitemize + +Other actions concerning running heads, number resetting and interactivity are +disregarded at this moment. + +Sometimes you will see two brackets (\type{[]}) directly after the command. These +brackets are used to feed specific options to the command. Further on in this +manual you will get more information on these brackets. + +The commands in your input file can have the following appearance: + +\starttabulate[|||] +\HL +\NC \bf Appearance of command \NC \bf Example \NC\NR +\HL +\NC \type{\startcommand ... \stopcommand} \NC \type{\starttext ... \stoptext} \NC\NR +\NC \type{\startcommand[] ... \stopcommand} \NC \type{\startitemize[packed] ... \stopitemize} \NC\NR +\NC \type{\command} \NC \type{\item} \NC\NR +\NC \type{\command[]} \NC \type{\in[cuyler]} \NC\NR +\NC \type{\command{}[]} \NC \type{\at{page}[cuyler]} \NC\NR +\NC \type{\command{}} \NC \type{\index{America}} \NC\NR +\NC \type{\command[]{}} \NC \type{\chapter[cuyler]{The Cuyler family}} \NC\NR +\HL +\stoptabulate + +If you have \CONTEXT\ process the above example file, you would obtain a very +simple document with a title page, a few numbered chapters and section headers +and a table of content (because of \type{\placecombinedlist[content]}). + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-enumerations.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-enumerations.tex new file mode 100644 index 000000000..6f2fa5f22 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-enumerations.tex @@ -0,0 +1,106 @@ +\startcomponent ma-cb-en-enumerations + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Numbered definitions] + +\index{numbered definition} + +\Command{\tex{defineenumeration}} +\Command{\tex{setupenumerations}} + +With \type{\defineenumeration} you can number text elements like remarks or +questions. If you want to make numbered remarks in your document you use: + +\shortsetup{defineenumeration} + +For example: + +\startbuffer[a] +\defineenumeration + [remark] + [alternative=top, + text=Remark, + inbetween={\blank[none]}, + after=\blank] +\stopbuffer + +\typebuffer[a] + +Now the new commands \type{\remark}, \type{\subremark}, \type{\resetremark} and +\type{\nextremark} are available and you can type remarks like this: + +\startbuffer[b] +\remark In the early medieval times Hasselt was a place of +pilgrimage. The {\em Heilige Stede} (Holy Place) was torn down during +the Reformation. In 1930, after 300 years, the {\em Heilige Stede} was +reopened. + +\subremark Nowadays the {\em Heilige Stede} is closed again but once +a year an open air service is held on the same spot. \par +\stopbuffer + +\typebuffer[b] + +This becomes: + +\start +\getbuffer[a]\getbuffer[b] +\stop + +You can reset numbering with \type{\resetremark} or \type{\resetsubremark} or +increment a number with \type{\nextremark} or \type{\nextsubremark}. This is +normally done automatically per chapter, section or whatever. + +You can set up the layout of \type{\defineenumeration} with: + +\shortsetup{setupenumerations} + +You can also vary the layout of \type{remark} and \type{subremark} in the example +above with: + +\starttyping +\setupenumeration[remark][headstyle=bold] +\setupenumeration[subremark][headstyle=slanted] +\stoptyping + +If a number becomes obsolete you can type: + +\starttyping +\remark[-] +\stoptyping + +If the \type{remark} contains several paragraphs you should use the command +pair \type{\start ... \stopremark} that becomes available after defining +\type{remark} with \type{\defineenumeration[remark]}. + +\startbuffer[c] +\setupenumeration + [remark] + [alternative=hanging, + width=broad] + +\startremark +In the early medieval times Hasselt was a place of pilgrimage. The +{\em Heilige Stede} (Holy Place) was torn down during the +Reformation. + +After 300 years in 1930 the {\em Heilige Stede} was reopened. +Nowadays the {\em Heilige Stede} is closed again but once a year an +open air service is held on the same spot. +\stopremark +\stopbuffer + +\typebuffer[c] + +So the example above would look like this: + +\start +\getbuffer[a]\getbuffer[c] \par +\stop + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-errors.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-errors.tex new file mode 100644 index 000000000..229cb66bc --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-errors.tex @@ -0,0 +1,79 @@ +\startcomponent ma-cb-en-errors + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=trouble,title=Problems during processing] + +\index{errors} +\index{problems} + +If processing is not succesful ---for example because you typed \type{\stptext} +instead of \type{\stoptext}--- \CONTEXT\ produces a \type{ ? } on your screen +and tells you it has just processed an error. It will give you some basic +information on the type of error and the line number where the error becomes +effective. + +At the instant of \type{ ? } you can type: + +\starttabulate[|||] +\NC \type{H} \NC for help information on your error \NC\NR +\NC \type{I} \NC for inserting the correct \CONTEXT\ command \NC\NR +\NC \type{Q} \NC for quiting and entering batch mode \NC\NR +\NC \type{X} \NC for exiting the running mode \NC\NR +\NC \Enter \NC for ignoring the error \NC\NR +\stoptabulate + +Most of the time you will type \Enter\ and processing will continue. Then you can +edit the input file and fix the error. + +Some errors will produce a~\type{ * } on your screen and processing will stop. +This error is due to a fatal error in your input file. You can't ignore this +error and the only option you have is to type \type{\stop} or {\sc Ctrl}~Z. The +program will be halted and you can fix the error in your text editor. + +\startframedtext[width=\hsize] +A well known error is: + +\starttyping +! I can't write on file 'myfile.pdf'. +Please type another filename for output: +\stoptyping + +This error is due to the fact that the file \type{myfile.pdf} is stil open +in \READER. + +\blank + +The best way to proceed is: + +\startitemize[packed] +\item close the file in \READER +\item type \Enter\ at the console +\stopitemize +\stopframedtext + +Sometimes the error messages are very obscure. Finding the location of the error +in an extensive document can then be a tedious job. You could try to isolate +the error: + +\startitemize[packed] +\item open the file in your text editor +\item save a copy of your file (to be on the safe side) +\item isolate the error + \startitemize[n,packed] + \item place a \type{\stoptext} command higher up in your text + \item process the file + \item repeat step 1 and 2 until the file processes correctly + \stopitemize +\item study the content that produces the error +\item fix the error +\item place the \type{\stoptext} command after the corrected error +\item process your file +\item etc. +\stopitemize + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-figures.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-figures.tex new file mode 100644 index 000000000..90f249359 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-figures.tex @@ -0,0 +1,258 @@ +\startcomponent ma-cb-en-figures + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=figures,title=Figures] + +\index{figure} +\seeindex{picture}{figure} +\index{floating blocks} + +\Command{\tex{placefigure}} +\Command{\tex{startfiguretext}} +\Command{\tex{setupfigures}} +\Command{\tex{startcombination}} +\Command{\tex{setupfloats}} +\Command{\tex{setupcaptions}} +\Command{\tex{externalfigure}} + +Images can be placed in your document with the command \type{\externalfigure}. + +\startbuffer +\externalfigure + [cow.pdf] + [width=.1\textwidth, + frame=on, + framecolor=gray, + frameoffset=3pt, + rulethickness=3pt, + framecorner=round] +\stopbuffer + +\typebuffer + +Such an image will be placed on the location where you defined it \space \getbuffer +\space and can have some strange effects on the surrounding white space. By the way, +the cow image is always available for \CONTEXT\ users which is very convenient when +you are testing the figure related commands. + +You can use the command \type{\placefigure} to influence the positioning of +images in your document. + +\startbuffer +\placefigure + [][fig:church] + {Stephanus Church.} + {\externalfigure[ma-cb-24][width=.4\textwidth]} +\stopbuffer + +\typebuffer + +After processing this will come out as \in{figure}[fig:church] at the first +available location. + +\getbuffer + +The command \type{\placefigure} handles numbering and vertical spacing before and +after your figure. Furthermore this command initializes a float mechanism, which +means that \CONTEXT\ looks whether there is enough space for your figure on the +page. If not, the figure will be placed at another location and the text carries +on, while the figure floats in your document until the optimal location is found. +You can influence this mechanism within the first bracket +pair. + +The command \type{\placefigure} is a predefined example of: + +\shortsetup{placefloat} + +A number of basic options is described in \in{table}[tab:placefigure]. + +\placetable + [here] + [tab:placefigure] + {Options in \type{\placefigure}.} +\starttable[|l|l|] +\HL +\NC \bf Option \NC \bf Meaning \NC\SR +\HL +\NC here \NC put figure at this location if possible \NC\FR +\NC force \NC force figure placement here \NC\MR +\NC page \NC put figure on its own page \NC\MR +\NC top \NC put the figure at the top of the page \NC\MR +\NC bottom \NC put the figure at the botom of the page \NC\MR +\NC left \NC place figure at the left margin \NC\MR +\NC right \NC place figure at the right margin \NC\MR +\NC margin \NC place figure in the margin \NC\MR +\NC none \NC set no caption \NC\LR +\HL +\stoptable + +The second bracket pair is used for cross-referencing. You can refer to this +particular figure by typing: + +\starttyping +\in{figure}[fig:church] +\stoptyping + +The first brace pair is used for the caption. You can type any text you want. The +figure labels are set up with \type{\setupcaptions} and the numbering is (re)set +by \type{\setupnumbering} (see \in{paragraph}[floatingblocks]). + +The second brace pair is used for defining the figure and addressing the file +names of external figures. + +In the next example you see how \inframed{Hasselt} is defined within +the last brace pair to show you the function of \type{\placefigure{}{}}. + +\startbuffer +\placefigure + {The boundaries of Hasselt.} + {\framed{\tfd Hasselt}} +\stopbuffer + +\typebuffer + +This will produce: + +\getbuffer + +However, your images are often created using programs like Illustrator and photos +are --- after scanning --- improved in packages like PhotoShop. Then the images +are available as files. \CONTEXT\ supports image file types like \type {JPG}, +\type {PNG} and (pages from) \type {PDF} files as well as \METAPOST\ output +(\type {MPS} files). Users normally can trust \CONTEXT\ to find the best possible +file type. + +In \in{figure}[fig:canals] you see a photo and a graphic combined into one +figure. + +\startbuffer +\placefigure + [here,force] + [fig:canals] + {The Hasselt Canals.} + {\startcombination[2*1] + {\externalfigure[ma-cb-03][width=.4\textwidth]}{a bitmap picture} + {\externalfigure[ma-cb-00][width=.4\textwidth]}{a vector graphic} + \stopcombination} +\stopbuffer + +\getbuffer + +You can produce this figure by typing something like: + +\typebuffer + +In this figure two pictures are combined with: + +\shortsetup{startcombination} + +The \type{\start ...\stopcombination} pair is used for +combining two pictures in one figure. You can type the number of pictures within +the bracket pair. If you want to display one picture below the other you would +have typed \type{[1*2]}. You can imagine what happens when you combine 6~pictures +as \type{[3*2]} (\type{[rows*columns]}). + +The examples shown above are enough for creating illustrated documents. Sometimes +however you want a more integrated layout of the picture and the text. For that +purpose you can use \type{\start ...\stopfiguretext} command pair. + +\startbuffer +\startfiguretext + [left,none] + [fig:citizens] + {} + {\externalfigure[ma-cb-18][width=.5\makeupwidth]} + Hasselt has always had a varying number of citizens due to + economic events. For example the Dedemsvaart was dug around + 1810. This canal runs through Hasselt and therefore trade + flourished. This led to a population growth of almost 40\% + within 10~years. Nowadays the Dedemsvaart has no commercial + value anymore and the canals have become a tourist + attraction. But reminders of these prosperous times can be + found everywhere. +\stopfiguretext +\stopbuffer + +The effect of: + +\typebuffer + +is shown in the figure below. + +\start +\setuptolerance[verytolerant] +\getbuffer +\stop + + +\startbuffer[marginpicture] +\inmargin + {\externalfigure + [ma-cb-23] + [width=.7\marginwidth]} +\stopbuffer + +As you have seen you in the examples above you can summon a figure with the +command: + +\shortsetup{externalfigure} + +The command \type{\externalfigure} has two bracket pairs. The first is used for +the exact file name without extension, the second for file formats and +dimensions. It is not difficult to guess what happens if you +type:\getbuffer[marginpicture] + +\typebuffer[marginpicture] + +You can set up the layout of figures with: + +\shortsetup{setupfloats} + +You can set up the numbering and the labels with: + +\shortsetup{setupcaptions} + +\startbuffer[figuresetups] +\setupfloat + [figure] + [default=right, + spacebefore=none] + +\setupcaptions + [location=bottom, + style=boldslanted] +\stopbuffer + +\startbuffer[figuredefinition] +\placefigure + {A characteristic view on Hasselt.} + {\externalfigure[ma-cb-12][width=6cm]} +\stopbuffer + +\start +\getbuffer[figuresetups] +\getbuffer[figuredefinition] +\stop + +These commands are typed in the set up area of your input file and have a global +effect on all floating blocks. + +\typebuffer[figuresetups,figuredefinition] + +For figure management there are commands like \crlf +\type{\setupexternalfigure}. + +Please refer to the \goto {\CONTEXTWIKI} [ +url(http://wiki.contextgarden.net/Command/defineexternalfigure) ] for practical +applications of these commands. + +If you want to work with a \XML\ based figure database please see the \goto +{Figures} [ url (manual:figures) ] +manual. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-fonts.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-fonts.tex new file mode 100644 index 000000000..029386ec1 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-fonts.tex @@ -0,0 +1,299 @@ +\startcomponent ma-cb-en-fonts + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Fonts and font switches] + +\startsection[title=Introduction] + +\index{Computer Modern Roman} +\index{Lucida Bright} +\index{AMS} + +The default font in \CONTEXT\ is the {\em Computer Modern Roman} (\type{cmr}). +In \CONTEXT\ the following fonts are available. + +\startplacetable[reference=tab:fonts in context,title={Fonts in \CONTEXT.}] +\starttable[|l|l|l|] +\HL +\NC \bf Name \NC \bf Logical name \NC \bf Also known as \NC\MR +\HL +\NC Computer Modern Roman \NC cmr \NC Computer Modern Roman \NC\FR +\NC Termes \NC termes \NC Times New Roman \NC\MR +\NC Adventor \NC adventor \NC Avant Garde \NC\MR +\NC Bonum \NC bonum \NC Bookman \NC\MR +\NC Chorus \NC chorus \NC Zapf Chancery \NC\MR +\NC Cursor \NC cursor \NC Courier \NC\MR +\NC Heros \NC heros \NC Helvetica \NC\MR +\NC Pagella \NC pagella \NC Palatino \NC\MR +\NC Schola \NC schola \NC Century Schoolbook \NC\MR +\NC Dejavu \NC dejavu \NC \NC\MR +\NC Iwona \NC iwona \NC \NC\MR +\NC Gentium \NC gentium \NC \NC\MR +\NC Cambria \NC cambria \NC \NC\MR +\NC Antykwa \NC antykwa \NC \NC\MR +\NC Utopia \NC utopia \NC \NC\MR +\NC LucidaBright \NC lucidanova \NC \NC\LR +\HL +\stoptable +\stopplacetable + +% in map: tex-context\tex\texmf\fonts + +For further reading we refer to the \goto {\em Fonts in \CONTEXT} +[ url (manual:fonts) ] manual where you can find information on how to install +your own font. + +\stopsection + +\startsection[title=Fontstyle and size] + +\index{font+style} +\index{font+size} + +\Command{\tex{setupbodyfont}} +\Command{\tex{switchtobodyfont}} + +You can select the font family, style and size for a document with: + +\shortsetup{setupbodyfont} + +If you typed \type{\setupbodyfont[chorus,9pt]} {\switchtobodyfont[chorus,9pt] in +the setup area of the input file your text would look something like this.} + +For changes in mid-document and on section level you should use: + +\shortsetup{switchtobodyfont} + +\startbuffer +On November 10th (one day before Saint Martinsday) the youth of +Hasselt go from door to door to sing a special song and they +accompany themselves on a {\em foekepot}. They won't leave +before you give them some money or sweets. The song goes like this: + +\startnarrower +\switchtobodyfont[heros,small] +\startlines +Foekepotterij, foekepotterij, +Geef mij een centje dan ga'k voorbij. +Geef mij een alfje dan blijf ik staan, +'k Zal nog liever naar m'n arrenmoeder gaan. +Hier woont zo'n rieke man, die zo vulle gèven kan. +Gèf wat, old wat, gèf die arme stumpers wat, +'k Eb zo lange met de foekepot elopen. +'k Eb gien geld om brood te kopen. +Foekepotterij, foekepotterij, +Geef mij een centje dan ga'k voorbij. +\stoplines +\stopnarrower +\stopbuffer + +\typebuffer + +Notice that \type{\start...\stopnarrower} is also used as a begin and end of the +fontswitch. The function of \type{\start...\stoplines} in this example is +obvious. + +\start +\getbuffer +\stop + +If you want an overview of the available font family you can type: + +\startbuffer +\showbodyfont[pagella] +\stopbuffer + +\typebuffer + +\getbuffer + +\stopsection + +\startsection[title=Style and size switch in commands] + +In a number of commands one of the parameters is \type{style} to indicate the +desired typestyle. For example: + +\startbuffer +\setuphead[chapter][style=\tfd] +\stopbuffer + +\typebuffer + +In this case the character size for chapters is indicated with a command +\type{\tfd}. But instead of a command you could use the predefined options that +are related to the actual typeface: + +\startbuffer +normal bold slanted boldslanted type mediaeval +small smallbold smallslanted smallboldslanted smalltype +capital cap +\stopbuffer + +\typebuffer + +\stopsection + +\startsection[title=Local font style and size] + +\Command{\tex{rm}} +\Command{\tex{ss}} +\Command{\tex{tt}} +\Command{\tex{sl}} +\Command{\tex{bf}} +\Command{\tex{tfa}} +\Command{\tex{tfb}} +\Command{\tex{tfc}} +\Command{\tex{tfd}} + +In the running text (local) you can change the {\em typestyle} into roman, sans +serif and teletype with \type{\rm}, \type{\ss} and \type{\tt}. + +You can change the {\em typeface} like italic and boldface with \type{\sl} and +\type{\bf}. + +The {\em typesize} is changed with \type{\switchtobodyfont}. + +The actual style is indicated with \type{\tf}. If you want to change into a +somewhat greater size you can type \type{\tfa}, \type{\tfb}, \type{\tfc} and +\type{\tfd}. An addition of \type{a}, \type{b}, \type{c} and \type{d} to +\type{\sl}, \type{\it} and \type{\bf} is also allowed. + +\startbuffer +{\tfc Mintage} + +In the period from {\tt 1404} till {\tt 1585} Hasselt had its own +{\sl right of coinage}. This right was challenged by other cities, +but the {\switchtobodyfont[7pt] bishops of Utrecht} did not honour +these {\slb protests}. +\stopbuffer + +\typebuffer + +The curly braces indicate begin and end of style or size switches. + +\getbuffer + +\stopsection + +\startsection[title=Redefining fontsize] + +\index{fontsize} + +\Command{\tex{definebodyfont}} + +For special purposes you can define your own size of the bodyfont. + +\shortsetup{definebodyfont} + +A definition could look like this: + +\startbuffer +\definebodyfont[10pt][rm][tfe=Regular at 36pt] + +{\tfe Hasselt!} +\stopbuffer + +\typebuffer + +Now \type{\tfe} will produce 36pt characters saying: +{\hbox{\getbuffer}} + +\stopsection + +\startsection[title=Small caps] + +\index{small caps} + +\Command{\tex{cap}} + +Abbreviations like \PDF\ (\infull{PDF}) are printed in pseudo small caps. A small +capital is somewhat smaller than the capital of the actual typeface. Pseudo small +caps are produced with: + +\shortsetup{cap} + +If you compare \type{\cap{hasselt}} and \type{\sc hasselt}: \cap{hasselt} and +{\sc hasselt} you can see the difference. The command \type{\sc} shows the real +small caps. The reason for using pseudo small caps instead of real small caps is +just a matter of taste. + +\stopsection + +\startsection[title=Emphasized] + +\index{emphasized} + +\Command{\tex{em}} + +To emphasize words consistently throughout your document +you use: + +\starttyping +\em +\stoptyping + +Empasized words appear in a slanted style. + +\startbuffer +If you walk through Hasselt you should {\bf \em watch out} for +{\em Amsterdammers}. An {\em Amsterdammer} is {\bf \em not} a +person from Amsterdam but a little stone pillar used to separate +sidewalk and road. A pedestrian should be protected by these +{\em Amsterdammers} against cars but more often people get hurt +from tripping over them. +\stopbuffer + +\typebuffer + +This becomes: + +\getbuffer + +{\em An emphasize within an emphasize is {\em normal} again +and a boldface emphasize looks like {\bf this or \em this}}. + +\stopsection + +\startsection[title=Teletype / verbatim] + +\index{type} +\index{verbatim} + +\Command{\tex{starttyping}} +\Command{\tex{type}} +\Command{\tex{setuptyping}} +\Command{\tex{setuptype}} + +If you want to display typed text and want to keep your line breaking exactly as +it is you use: + +\shortsetup{starttyping} + +In the text you can use: + +\shortsetup{type} + +The curly braces enclose the text you want in teletype. You have to be careful +with \type{\type} because the line breaking mechanism does not work anymore. + +You can set up the 'typing' with: + +\shortsetup{setuptyping} +\shortsetup{setuptype} + +\stopsection + +\startsection[title=Encodings] + +In \CONTEXT\ \MKIV\ font ecoding is no issue (anymore). + +\stopsection + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-footnotes.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-footnotes.tex new file mode 100644 index 000000000..5eeade383 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-footnotes.tex @@ -0,0 +1,99 @@ +\startcomponent ma-cb-en-footnotes + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Footnotes] + +\index{footnote} + +\Command{\tex{footnote}} +\Command{\tex{setupfootnotes}} + +If you want to annotate your text you can use \type{\footnote}. The command looks +like this: + +\shortsetup{footnote} + +The bracket pair is optional and contains a logical name. The curly braces +contain the text you want to display at the foot of the page. + +The same footnote number can be called with its logical name. + +\shortsetup{note} + +If you have typed this text: + +\startbuffer +The Hanse was a late medieval commercial alliance of towns in the +regions of the North and the Baltic Sea. The association was formed +for the furtherance and protection of the commerce of its +members.\footnote[war]{This was the source of jealousy and fear among +other towns that caused a number of wars.} In the Hanse period there +was a lively trade in all sorts of articles such as wood, wool, +metal, cloth, salt, wine and beer.\note[war] The prosperous trade +caused an enormous growth of welfare in the Hanseatic +towns.\footnote{Hasselt is one of these towns.} +\stopbuffer + +\typebuffer + +It would look like this: + +\getbuffer + +The footnote numbering is done automatically. The command \type{\setupfootnotes} +enables you to influence the display of footnotes: + +\shortsetup{setupfootnotes} + +Footnotes can be set at the bottom of a page but also at other locations, like +the end of a chapter. This is done with the command: + +\shortsetup{placefootnotes} + +The footnotes will be placed at the end of your document with +\type{\setupfootnotes[location=text]} in combination with \type{\placefootnotes} +at the desired location. + +You can also couple footnotes to a table. In that case we speak of local +footnotes. The commands are: + +\shortsetup{startlocalfootnotes} + +\shortsetup{placelocalfootnotes} + +An example illustrates the use of local footnotes: + +\startbuffer + +\placetable[][productivity] + {Decline of Hasselt's productivity.\footnote{Source: {\em Uit + de geschiedenis van Hasselt.}}} + {\startlocalfootnotes + \starttable[|l|c|c|c|c|] + \HL + \NC + \NC Ovens + \NC Blacksmiths + \NC Breweries + \NC Tile works\footnote{The factories that produced roof tiles.} \NC\SR + \HL + \NC 1682 \NC 15 \NC 9 \NC 3 \NC 2 \NC\FR + \NC 1752 \NC ~6 \NC 4 \NC 0 \NC 0 \NC\LR + \HL + \NC \use5 \JustLeft{\placelocalfootnotes} \NC\FR + \stoptable + \stoplocalfootnotes} +\stopbuffer + +\typebuffer + +This will result in \in{table}[productivity] with a local footnote. The footnote +in the caption will appear at the bottom of the page. +\getbuffer + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-framedtexts.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-framedtexts.tex new file mode 100644 index 000000000..2f422344b --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-framedtexts.tex @@ -0,0 +1,58 @@ +\startcomponent ma-cb-en-framedtexts + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Outlined paragraphs] + +\index{outline+paragraph} + +\Command{\tex{startframedtext}} +\Command{\tex{setupframedtext}} + +Complete paragraphs can be outlined with: + +\shortsetup{startframedtext} + +\startbuffer +\definefloat[intermezzo] +\setupframedtexts + [width=.8\makeupwidth, + background=color, + backgroundcolor=gray, + corner=round, + framecolor=blue, + rulethickness=2pt] + +\placeintermezzo[here][block:bridge]{An intermezzo.} +\startframedtext + It was essential for Hasselt to have a bridge across the Zwarte + Water river. The bishop of Utrecht gave Hasselt his consent in + 1486. + \blank + Other cities in the neighbourhood of Hasselt were afraid of the + toll money to be paid when crossing this bridge so they + prevented the construction for many years. +\stopframedtext +\stopbuffer + +Let's give an example: + +\typebuffer + +This example also illustrates the command \type{\definefloat}. You can find more +information on this command in \in{paragraph}[floatingblocks]. The \type{\blank} +is necessary to enforce a blank line. + +\start +\getbuffer +\stop + +The outlining can be set up with: + +\shortsetup{setupframedtexts} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-frames.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-frames.tex new file mode 100644 index 000000000..bbdb6a61c --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-frames.tex @@ -0,0 +1,144 @@ +\startcomponent ma-cb-en-frames + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Outlined text] + +\index{outline+text} + +\Command{\tex{framed}} +\Command{\tex{setupframed}} +\Command{\tex{inframed}} + +You can \inframed{outline} a text with \type{\framed}. The +command looks like this: + +\shortsetup{framed} + +The bracket pair is optional and contains the set up parameters. The curly braces +enclose the text. To be honest, the outlined text in the first paragraph was done +with \type{\inframed}. This command takes care of the interline spacing. + +Some other examples of \type{\framed} and its set up parameters are shown below. + +\startbuffer[a] +\framed + [height=fit, + width=.5\textwidth] + {Hasselt} +\stopbuffer + +\placefigure[right,none][]{}{\externalfigure[a][type=buffer]} +\typebuffer[a] + +\startbuffer[b] +\framed + [height=3em, + width=.5\textwidth] + {Hasselt now has more space} +\stopbuffer + +\placefigure[right,none][]{}{\externalfigure[b][type=buffer]} +\typebuffer[b] + +\startbuffer[d] +\framed + [height=3em, + width=.5\textwidth, + foregroundcolor=red, + framecolor=blue] + {Hasselt now has some color} +\stopbuffer + +\placefigure[right,none][]{}{\externalfigure[d][type=buffer]} +\typebuffer[d] + +\startbuffer[e] +\framed + [height=3em, + width=.5\textwidth, + foregroundcolor=red, + framecolor=blue, + rulethickness=2pt] + {Hasselt now has more frame} +\stopbuffer + +\placefigure[right,none][]{}{\externalfigure[e][type=buffer]} +\typebuffer[e] + +\startbuffer[f] +\framed + [height=3em, + width=.5\textwidth, + foregroundcolor=red, + framecolor=blue, + rulethickness=2pt, + background=color, + backgroundcolor=green] + {Hasselt now has a colorful background} +\stopbuffer + +\placefigure[right,none][]{}{\externalfigure[f][type=buffer]} +\typebuffer[f] + +\startbuffer[g] +\framed + [height=3em, + width=.5\textwidth, + foregroundcolor=red, + framecolor=blue, + rulethickness=2pt, + background=color, + backgroundcolor=green, + foregroundstyle=bold] + {Hasselt now has another style} +\stopbuffer + +\placefigure[right,none][]{}{\externalfigure[g][type=buffer]} +\typebuffer[g] + +\startbuffer[needed-for-h] +\definecolor[a][black] +\definecolor[b][white] + +\startuniqueMPgraphic{LinearShade} + fill OverlayBox + withshademethod "linear" withcolor \MPcolor{a} shadedinto \MPcolor{b} ; +\stopuniqueMPgraphic + +\defineoverlay + [linear shade] + [\uniqueMPgraphic{LinearShade}] +\stopbuffer + +\getbuffer[needed-for-h] + +\startbuffer[h] +\framed + [height=3em, + width=.5\textwidth, + foregroundcolor=red, + framecolor=blue, + rulethickness=2pt, + background=linear shade, + foregroundstyle=bold] + {Hasselt now has a little shade} +\stopbuffer + +\placefigure[right,none][]{}{\externalfigure[h][type=buffer]} +\typebuffer[h] + +The shady background was defined with: + +\typebuffer[needed-for-h] + +The \type{\framed} command is very sophisticated and is used in many macros. +The command to set up frames is: + +\shortsetup{setupframed} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-gettingstarted.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-gettingstarted.tex new file mode 100644 index 000000000..6314aeec5 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-gettingstarted.tex @@ -0,0 +1,46 @@ +\startcomponent ma-cb-en-gettingstarted + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=How to process a file] + +\index{input file+processing} +\index[pdffile]{\type{pdf}--file} + +In this chapter we assume that you have installed and initiated \CONTEXT\ \MKIV\ +correctly so that you can run it from the commandline in your working directory. +You can find the \CONTEXT\ installation procedure on the \goto {\CONTEXTWIKI} +[ url (http://wiki.contextgarden.net/ConTeXt_Standalone#Windows) ]. + +If you want to process a \CONTEXT\ input file, you should type at the command line +prompt: + +\starttyping +context myfile.tex +\stoptyping + +the extension \type{.tex} is not needed. See \in{appendices}[contextcommand] and +\in[runtimefiles] for more information on the \type{context} command. + +After pressing \Enter\ processing will be started. \CONTEXT\ will show processing +information on your screen. During the processing of your input file \CONTEXT\ +will also inform you of what it is doing with your document. For example it will +show page numbers and information about processing steps. Further more it gives +warnings. These are of a typographical order and tells you when line breaking is +not successful. All information on processing is stored in a \type{log} file that +can be used for reviewing warnings and errors and the respective line numbers +where they occur in your file. + +If processing is succesful the command line prompt will return and \CONTEXT\ will +produce the file \type{myfile.pdf}. The abbreviation \PDF\ stands for Portable +Document Format. This is a platform independent format for printing and viewing +with \READER. + +When you use a configurable text editor you can also run \CONTEXT\ from that editor. +More information on that topic can be found \in{appendix}[texteditor]. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-headers.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-headers.tex new file mode 100644 index 000000000..d51403d5d --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-headers.tex @@ -0,0 +1,53 @@ +\startcomponent ma-cb-en-headers + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Page headers and footers] + +\index{page header} +\index{page footer} + +\Command{\tex{setupfootertexts}} +\Command{\tex{setupheadertexts}} +\Command{\tex{setupheader}} +\Command{\tex{setupfooter}} +\Command{\tex{noheaderandfooterlines}} + +In some cases you want to give your document a page header and footer. The +commands to do this are: + +\shortsetup{setupfootertexts} +\shortsetup{setupheadertexts} + +The first bracket pair is used for the location of the footer or header +(\type{text}, \type{edge} etc). Footer and header are placed within the second +and third bracket pairs. In a double sided document a fourth and fifth bracket +pair is used for footer and header on the left-hand side page and the right-hand +side page. In most cases you can omit these last two bracket pairs. + +\startbuffer +\setupfootertexts[Manual][section] +\stopbuffer + +\typebuffer + +In this case the text {\em Manual} will appear in the left-hand side corner and +the title of the actual section on the right-hand side of the page. This footer +will change with the beginning of a new section. + +You can set up the layout of the header and footer with: + +\shortsetup{setupheader} +\shortsetup{setupfooter} + +If you want to leave out the page header and footer you can type: + +\starttyping +\noheaderandfooterlines +\stoptyping + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-heads.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-heads.tex new file mode 100644 index 000000000..aa7e7b161 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-heads.tex @@ -0,0 +1,135 @@ +\startcomponent ma-cb-en-heads + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=heads,title=Heads] + +\index{headers} + +\Command{\tex{chapter}} +\Command{\tex{paragraph}} +\Command{\tex{subparagraph}} +\Command{\tex{title}} +\Command{\tex{subject}} +\Command{\tex{subsubject}} +\Command{\tex{setuphead}} +\Command{\tex{setupheads}} + +The structure of a document is determined by its chapter and section titles. +These titles are created with the commands shown in \in{table}[tab:headers]: + +\placetable[here][tab:headers]{Headers.} + {\starttable[|l|l|] + \HL + \NC \bf Numbered header \NC \bf Unnumbered header \NC\SR + \HL + \NC \type{\chapter} \NC \type{\title} \NC\FR + \NC \type{\section} \NC \type{\subject} \NC\MR + \NC \type{\subsection} \NC \type{\subsubject} \NC\MR + \NC \type{\subsubsection} \NC \type{\subsubsubject} \NC\MR + \NC \unknown \NC \unknown \NC\LR + \HL + \stoptable} + +\shortsetup{chapter} +\shortsetup{section} +\shortsetup{subsection} +\shortsetup{title} +\shortsetup{subject} +\shortsetup{subsubject} + +These commands will produce a numbered or unnumbered title in a predefined +fontsize and fonttype with some vertical spacing before and after the header. + +The title commands can take several arguments, like in: + +\starttyping +\title[hasselt by night]{Hasselt by night} +\stoptyping + +and + +\starttyping +\title{Hasselt by night} +\stoptyping + +The bracket pair is optional and used for internal references. If you want to +refer to this chapter you type for example \type{\at{page}[hasselt by night]}. + +For a more structured way to define chapters and sections you can use the more +preferred \type{\start ... \stop} construction. + +\placetable[here][tab:headers]{Structured headers.} + {\starttable[|l|l|] + \HL + \NC \bf Numbered header \NC \bf Un-numbered header \NC\SR + \HL + \NC \type{\start ... \stopchapter} \NC \type{\start ... \stoptitle} \NC\FR + \NC \type{\start ... \stopsection} \NC \type{\start ... \stopsubject} \NC\MR + \NC \type{\start ... \stopsubsection} \NC \type{\start ... \stopsubsubject} \NC\MR + \NC \type{\start ... \stopsubsubsection} \NC \type{\start ... \stopsubsubsubject} \NC\MR + \NC \unknown \NC \unknown \NC\LR + \HL + \stoptable} + +In that case the definition looks like this: + +\starttyping +\starttitle[reference="hasselt by night",title="Hasselt by night"} + ... +\stoptitle +\stoptyping + +Of course the chapter and section titles can be set to your own preferences and you can even +define your own sections. This is done with the \type{\setuphead} and +\type{\definehead} command. + +\shortsetup{definehead} + +\shortsetup{setuphead} + +\startbuffer +\definehead + [myhead] + [section] + +\setuphead + [myhead] + [numberstyle=bold, + textstyle=bold, + before=\hairline\blank, + after=\nowhitespace\hairline] + +\myhead[headlines]{Hasselt makes headlines} +\stopbuffer + +\typebuffer + +A new header \type{\myhead} is defined and it inherits the properties of +\type{\section}. It would look something like this: + +\getbuffer + +There is one other command you should know now, and that is \type{\setupheads}. +You can use this command to set up the numbering of the numbered chapters and +sections. If you type: + +\startbuffer +\setupheads + [alternative=inmargin, + separator=--] +\stopbuffer + +\typebuffer + +all numbers will appear in the margin. Section 1.1 would look like 1--1. + +Commands like \type{\setupheads} are typed in the set up area of your input file. + +\shortsetup{setupheads} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-interactivity.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-interactivity.tex new file mode 100644 index 000000000..64beb179d --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-interactivity.tex @@ -0,0 +1,310 @@ +\startcomponent ma-cb-en-interactivity + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Interactive mode in electronic documents,reference=interactivity] + +\startsection[title=Introduction] + +\index[reader]{\READER} + +Documents that are electronically available for consulting and displaying on a +computer screen are called interactive documents. + +Interaction means that you can click on active areas and jump to the indicated +locations. For example if you consult a register you can click on a (active) page +number and you will jump to the corresponding page. + +Interaction relates to: + +\startitemize[packed] +\item active chapter numbers in the table of content +\item active page numbers in registers +\item active page numbers, chapter numbers and figure numbers in internal + references to pages, chapters, figures etc. in the running text +\item active titles, page numbers, and chapter numbers in external references to + other interactive documents +\item active menus as navigation tools +\item references to webpages and programs +\stopitemize + +Interactivity depends on the program you use to view the interactive document. We +assume here that you will use \READER\ for viewing. + +\CONTEXT\ is a very powerful system for producing electronic or interactive \PDF\ +documents. However, only a few standard features are described in this chapter. As +the authors of this manual are planning to make all \CONTEXT\ related manuals +electronically (sources included) available, reverse engineering is one of the +options to become more acquainted with the possibilities of \CONTEXT. + +Good examples of interactive documents are \CONTEXT\ presentations (see \in{chapter}[presentations]). +For more complex interactive \PDF\ documents with forms you should read the +\goto {Widgets} [ url (manual:widget) ] +manual. + +\stopsection + +\startsection[title=Interactive mode] + +\index{interactive mode} + +\Command{\tex{setupinteraction}} + +The interactive mode is activated by: + +\shortsetup{setupinteraction} + +For example: + +\startbuffer +\setupinteraction + [state=start, + color=green, + style=bold] +\stopbuffer + +\typebuffer + +The hyper links are now generated automatically and the active words are +displayed in bold green. + +The interactive document is considerably bigger (in MB's) than its paper cousin +because hyperlinks consume space. You will also notice that processing time +becomes longer. Therefore it is advisable to de-activate the interactive mode as +long as your document is under construction. + +\stopsection + +\startsection[title=Interaction within a document] + +\index{interaction+internal} + +\Command{\tex{in}} +\Command{\tex{at}} +\Command{\tex{goto}} + +Earlier you have seen how to make a reference with \type{\in} and \type{\at}. You +may have wondered why you had to type \type{\in{chapter}[chap:introduction]}. In +the first place {\em chapter} and its corresponding chapter number will not be +separated at line breaking. In the second place the word {\em chapter} and its +number are typeset differently in the interactive mode. This gives the user a +larger clickable area. + +\stopsection + +\startsection[title=Interaction between documents] + +\index{interaction+external} + +\Command{\tex{from}} +\Command{\tex{useexternaldocument}} + +It is possible to link one document to another. First you have to state that you +want to refer to another document. This is done by: + +\shortsetup{useexternaldocument} + +The first bracket pair must contain a logical name of the document, the second +pair the file name of the other document and the third pair is used for the title +of the document. + +For refering to these other documents you can use: + +\shortsetup{from} + +The curly braces contain text and the brackets contain the reference. + +Look at the example below. + +\startbuffer +\useexternaldocument + [hia][hasseltbook][Festivities in Hasselt] + +Most tourist attractions are described in \from[hia].\crlf +A description of the \about[hia::euifeest] is found in \from[hia].\crlf +The eui||feest is described on \at{page}[hia::euifeest] in \from[hia].\crlf +See for more information \in{chapter}[hia::euifeest] in \from[hia]. +\stopbuffer + +\typebuffer + +The \type{\useexternaldocument} is usually typed in the set up area of your input +file. + +After processing your input file and the file \type{hasseltbook.tex}, +you will have two \PDF\ documents. The references come out like this: + +\start +\setupinteraction[state=start] +\getbuffer +\stop + +For more information on cross referencing look at +\goto {\CONTEXT\ Magazine 1103} [ url (thisway:crossrefs)]. + +\stopsection + +\startsection[title=Interaction with the world wide web] + +In interactive mode there is one other command that has little meaning in the +paper version. + +\shortsetup{goto} + +The curly braces contain text, the brackets contain a reference (logical name or a +location). + +\startbuffer +In \goto {Hasselt} [ url(http://www.stadindex.nl/plattegrond/hasselt) ] +all streets are build in a circular way. +\stopbuffer + +\typebuffer + +In the interactive document \goto{Hasselt}[ url(http://www.stadindex.nl/plattegrond/hasselt) ] +will be green and active. When you click the text you will jump to a map of Hasselt. + +For a consistent definition of the urls there is the command: + +\shortsetup{useURL} + +The adress is defined with: + +\startbuffer +\useURL + [loc:cityplan] % id + [http://www.stadindex.nl/plattegrond/hasselt] % adress + [] % document + [] % text +\stopbuffer + +\typebuffer + +The webadress is recalled by its logical name: +\type{\goto {Hasselt} [ url(loc:cityplan) ]}. + +It is of good practice to define and maintain the urls in a separate +file. + +\stopsection + +\startsection[title=Buttons] + +The command to define a button is: + +\shortsetup{button} + +The first bracket pair contains the setup keys, the curly brackets contain the +button text and the last bracket pair the destination. + +\startbuffer +\useexternalsoundtrack + [stranger][wayfaring_stranger.mp3] + +\button{Website Hasselt} [ url(http://www.hasselt.nl) ] +\button{MSWord Document} [ program(hasselt.doc) ] +\button{Sound Clip} [ StartSound{stranger} ] +\stopbuffer + +\typebuffer + +The first example results in a jump to a webpage, the second opens the file +\type{hasselt.doc} in \MSWORD\ and the third plays a tune. Note the use of the +\type{\useexternalsoundtrack} command. + +\stopsection + +\startsection[title=Menus] + +You can define a menu with: + +\shortsetup{startinteractionmenu} + +And set it up with: + +\shortsetup{setupinteractionmenu} + +The first bracket pair is used for its name and the second pair for setting up +the menu. + +A menu can be used in an interactive document. Below you can find a simple +example that you can copy to do some experimenting: + +\startbuffer +\setuppapersize + [S6][S6] + +\setuplayout + [header=0cm, topspace=.5cm, backspace=2cm, + margindistance=.5cm, margin=1cm, rightmargin=0cm, + edgedistance=.5cm, rightedge=2cm, width=fit, + height=13.8cm, footer=1cm, bottom=1cm] + +\setupinteraction + [state=start, menu=on] + +\setupinteractionmenu + [bottom] + [background=color, backgroundcolor=gray, frame=off] + +\startinteractionmenu[bottom] +\hfill +\startbut [content] contents \stopbut \quad +\startbut [index] index \stopbut \quad +\startbut [PreviousJump] last location \stopbut \quad +\startbut [NextPage] next page \stopbut \quad +\startbut [CloseDocument] exit \stopbut \quad +\stopinteractionmenu + +\starttext + +\startstandardmakeup + \midaligned{\tfd Festivities in Hasselt} +\stopstandardmakeup + +\completecontent + +\startchapter[title=Introduction] + An introduction. +\stopchapter + +\startchapter[title=Kingsday] + Something about Kingsday in Hasselt.\index{Kingsday} +\stopchapter + +\startchapter[title=Hassailt] + Something about Hassailt.\index{Hassailt} +\stopchapter + +\startchapter[title=Euifeest,reference=euifeest] + Something about the Euifeest.\index{Euifeest} +\stopchapter + +\completeindex + +\stoptext +\stopbuffer + +\typebuffer + +The definition of the \type{\startinteractionmenu} will produce a menu at the +bottom of every screen. The menu buttons contain the text {\em contents}, {\em +index}, {\em last location}, {\em next page} and {\em exit} with respectively the +following functions: jump to the table of contents, jump to the index, goto the +last location in the document, goto next page and close the document. The labels +to obvious destinations like \type{content} and \type{index} are predefined. +Other predefined destinations are \type{FirstPage}, \type{LastPage}, +\type{NextPage} and \type{PreviousPage}. + +An action like \type{CloseDocument} is necessary to make an electronic document +self containing. Other predefined actions you can use are \type{PrintDocument}, +\type{SearchDocument} and \type{PreviousJump}. The meaning of these actions is +obvious. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-introduction.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-introduction.tex new file mode 100644 index 000000000..11acf8f9c --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-introduction.tex @@ -0,0 +1,33 @@ +\startcomponent ma-cb-en-introduction + +\project ma-cb + +\startchapter[title=Introduction] + +\CONTEXT\ is a document engineering system based on \TEX, a typesetting +system and programming language to typeset and produce documents. Ths system is +easy to use and enables you to make complex paper and electronic documents. + +This manual describes the capabilities of \CONTEXT\ \MKIV, the available commands +and their functionality.\footnote {All paper and electronic products around +\CONTEXT\ are produced with \CONTEXT. All sources of these products are or will +be made available electronically to give you insight in the way these products +are made up.} + +This system is developed for practical applications: the typesetting and +production of documents ranging from simple straight forward books up to very +complex and advanced technical manuals and textbooks in a paper or an electronic +version. This introductory manual describes the functionality necessary to apply +standard text elements in a manual or textbook. \CONTEXT, however, is capable of +much more and for users who want more there are other manuals and sources +available. + +\CONTEXT\ has a multi lingual interface to enable users to work with the system +in their own language. This manual is available in Dutch and English. + +If you want to install \CONTEXT\ on your computer you can follow the installation +description on the \goto {\CONTEXTWIKI} [url(install)]. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-itemizations.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-itemizations.tex new file mode 100644 index 000000000..ac711be63 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-itemizations.tex @@ -0,0 +1,297 @@ +\startcomponent ma-cb-en-itemizations + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=itemize,title=Itemize] + +\index{itemize} +\index{columns in itemize} + +\Command{\tex{startitemize}} +\Command{\tex{setupitemize}} +\Command{\tex{definesymbol}} +\Command{\tex{item}} +\Command{\tex{head}} + +One way of structuring your information is by way of enumeration or summing up +items. The itemize command looks like this: + +\shortsetup{startitemize} + +For example: + +\startbuffer +\startitemize[R,packed,broad] +\item Hasselt was founded in the 14th century. +\item Hasselt is known as a so called Hanze town. +\item Hasselt's name stems from a tree. +\stopitemize +\stopbuffer + +\typebuffer + +Within the \type{\start ... \stopitemize} pair you start a new item with +\type{\item}. The space after \type{\item} is required. In the example above +\type{R} specifies Roman numbering and \type{packed} keeps line spacing to a +minimum. The parameter \type{broad} takes care of the spacing between item +separator and item. The example would produce: + +\getbuffer + +Items can be defined in a more structured way: + +\startbuffer +\startitemize[R,packed,broad] +\startitem Hasselt was founded in the 14th century. \stopitem +\startitem Hasselt is known as a so called Hanze town. \stopitem +\startitem Hasselt's name stems from a tree. \stopitem +\stopitemize +\stopbuffer + +\typebuffer + +The bracket pair contains information on item separators and local set up +variables. + +\placetable + [here] + [tab:itemsetup] + {Item separators in itemize.} + {\starttable[|l|l|] + \HL + \NC \bf Argument \NC \bf Item separator symbol \NC\SR + \HL + \NC 1 \NC $\bullet$ \NC\FR + \NC 2 \NC $-$ \NC\MR + \NC 3 \NC $\star$ \NC\MR + \NC $\vdots$ \NC $\vdots$ \NC\MR + \NC n \NC 1 2 3 4 $\cdots$ \NC\MR + \NC a \NC a b c d $\cdots$ \NC\MR + \NC A \NC A B C D $\cdots$ \NC\MR + \NC r \NC i ii iii iv $\cdots$ \NC\MR + \NC R \NC I II III IV $\cdots$ \NC\LR + \HL + \stoptable} + +You can also define your own item separator by means of \type{\definesymbol}. For +example if you try this: + +\startbuffer +\definesymbol[5][$\clubsuit$] + +\startitemize[5,packed] +\item Hasselt was built on a riverdune. +\item Hasselt lies at the crossing of two rivers. +\stopitemize +\stopbuffer + +\typebuffer + +You will get: + +\getbuffer + +If you want to have a sort of head within an enumeration you should use +\type{\head} instead of \type{\item}. + +\startbuffer +Hasselt lies in the province of Overijssel and there are a number +of customs that are typical of this province. + +\startitemize + +\head kraamschudden \hfill (child welcoming) + + When a child is born the neighbours come to visit the new + parents. The women come to admire the baby and the men come to + judge the baby (if it is a boy) on other aspects. + The neighbours will bring a {\em krentenwegge} along. A + krentenwegge is a loaf of currant bread of about 1 \unit{Meter} + long. Of course the birth is celebrated with {\em jenever}. + +\head nabuurschap (naberschop) \hfill (neighbourship) + + Smaller communities used to be very dependent on the + cooperation among the members for their well being. Members of + the {\em nabuurschap} helped each other in difficult times + during harvest times, funerals or any hardship that fell upon + the community. + +\head Abraham \& Sarah \hfill (identical) + + When people turn 50 in Hasselt it is said that they see Abraham + or Sarah. The custom is to give these people a {\em speculaas} + Abraham or a Sarah. Speculaas is a kind of hard spiced biscuit. + +\stopitemize +\stopbuffer + +\typebuffer + +The \type{\head} can be set up with \type{\setupitemize}. In case of a page +breaking a \type{\head} will appear on a new page. (The \type {\unit{Meter}} +command is explained in \in {chapter} [units].) + +The example of old customs will look like this: + +\getbuffer + +The set up parameters of itemize are described in \in {table} [tab:itemizesetup]. + +\placetable + [here,force] + [tab:itemizesetup] + {Set up parameters in itemize.} + {\starttable[|l|l|] + \HL + \NC \bf Set up \NC \bf Meaning \NC\SR + \HL + \NC standard \NC standard (global) set up \NC\FR + \NC packed \NC no vertical spacing between items \NC\MR + \NC serried \NC no horizontal spacing between separator and text \NC\MR + \NC joinedup \NC no vertical spacing before and after itemize \NC\MR + \NC broad \NC horizontal spacing between separator and text \NC\MR + \NC inmargin \NC place separator in margin \NC\MR + \NC atmargin \NC place separator on margin \NC\MR + \NC stopper \NC place full stop after separator \NC\MR + \NC columns \NC put items in columns \NC\MR + \NC intro \NC prevent page breaking after introduction line \NC\MR + \NC continue \NC continue numbering or lettering \NC\LR + \HL + \stoptable} + +You can use the set up parameters in \type{\startitemize}, but for reasons of +consistency you can make them valid for the complete document with +\type{\setupitemize}. + +The parameter \type{columns} is used in conjunction with +a (written) number. If you type this: + +\startbuffer +\startitemize[n,columns,four] +\item Achter 't Werk +. +. +. +\item Justitiebastion +\stopitemize +\stopbuffer + +\typebuffer + +\page[bigpreference] + +You will get: + +\startbuffer +\startitemize[n,packed,columns,four,broad] +\item Achter 't Werk +\item Baangracht +\item Brouwersgracht +\item Eikenlaan +\item Eiland +\item Gasthuisstraat +\item Heerengracht +\item Hofstraat +\item Hoogstraat +\item Julianakade +\item Justitiebastion +\item Kaai +\item Kalverstraat +\item Kastanjelaan +\item Keppelstraat +\stopitemize +\stopbuffer + +\bgroup +\getbuffer +\egroup + +Sometimes you want to continue the enumeration after a short intermezzo. Then you +type for example \type{\startitemize[continue]} and numbering +will continue and all other preferences are kept. + +\startbuffer +\startitemize[continue] +\item Markt +\item Meestersteeg +\item Prinsengracht +\item Raamstraat +\item Ridderstraat +\item Rosmolenstraat +\item Royenplein +\item Van Nahuijsweg +\item Vicariehof +\item Vissteeg +\item Watersteeg +\item Wilhelminalaan +\item Ziekenhuisstraat +\stopitemize +\stopbuffer + +\getbuffer + +The parameter \type{broad} enlarges the horizontal space between item separator +and itemtext. + +\shortsetup{setupitemize} + +An itemize within an itemize is automatically typeset in a correct way. For +example if you type: + +\startbuffer +In the Netherlands the cities can determine the height of a number of +taxes. So the cost of living can differ from town to town. There are +differences of up to 50\% in taxes such as: + +\setupitemize[2][width=5em] +\startitemize[n] + +\item[estate tax] real estate tax + + The real estate tax is divided into two components: + + \startitemize[a,packed] + \item the ownership tax + \item the tenant tax + \stopitemize + + If the real estate has no tenant the owner pays both components. + +\item dog licence fee + + The owner of one or more dogs pays a fee. When a dog has died + or been sold the owner has to inform city hall. + +\stopitemize +\stopbuffer + +\typebuffer + +then the horizontal space between item separator and text at the second level of +itemizing is set with \type{\setupitemize[2][width=5em]}. + +The example will look like this: + +\start +\getbuffer +\stop + +You can refer to an item if you give it a label (see \type{\item[estate tax]}). +If you then type: + +\startbuffer +\in{In item}[estate tax] we discussed one of the income sources of Hasselt. +\stopbuffer + +\typebuffer + +You'll get a reference to that item: + +\getbuffer + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-layout.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-layout.tex new file mode 100644 index 000000000..243f96b15 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-layout.tex @@ -0,0 +1,241 @@ +\startcomponent ma-cb-en-layout + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Page layout] + +\index{layout} +\index{page design} + +\Command{\tex{setuplayout}} +\Command{\tex{adaptlayout}} +\Command{\tex{showlayout}} +\Command{\tex{showframe}} % VZ 2006-11-15 +\Command{\tex{showsetups}} +\Command{\tex{showmakeup}} +\Command{\tex{startlocal}} + +\startsection[title=Introduction] + +The {\em Layouts in \CONTEXT} manual by Willy Egger contains the necessary +background information on page layout and design. Below you will find only the +basic information necessary for defining rather simple layouts for paper and +screen documents. + +For more information (examples and usage) on the \type{\setuplayout} command +please refer to the +\goto {\CONTEXTWIKI} [ url(http://wiki.contextgarden.net/Layout) ]. + +\stopsection + +\startsection[title=Designing the pagelayout] + +To be able to design a page layout you have to familiarize yourself with the +pagemodel of \CONTEXT. \in{Figure}[fig:pageareas] shows the areas on a page +that you can use in your design. + +\placefigure + [here] + [fig:pageareas] + {The page areas.} + {\externalfigure[fig-page-areas-en.pdf][width=.75\hsize]} + +The orange bodytext area contains the running text. The top, bottom, and edge +area are useful for buttons in screen documents. + +Please keep in mind that in \CONTEXT\ you are defining|/|designing a +right-hand page. Only after you have setup +\type{\setuppagenumbering[alternative=doublesided]} the left page +is available (mirrored right page). + +\starthiding + % AFO: this is the file minibook-en.tex in graphics map + \setuppapersize[A10][A10] + \setuplayout[cutspace=2mm,backspace=6mm,width=15mm] + \setupbodyfont[6pt] + \setuppagenumbering[state=stop] + \setupbackgrounds[text][text][background=color,backgroundcolor=orange] + \setupbackgrounds[header,text,footer][leftmargin][background=color,backgroundcolor=lightgreen] + \setupbackgrounds[header,text,footer][leftmargin,text,rightmargin][frame=on] + \setupfootertexts[margin][\midaligned{l}][\midaligned{r}][\midaligned{r}][\midaligned{l}] + \starttext + \midaligned{design page} \page + \setuppagenumbering[alternative={singlesided}] + \inmargin{\midaligned{m}}\midaligned{left page} \page + \inmargin{\midaligned{m}}\midaligned{right page} \page + \setuppagenumbering[alternative={singlesided,doublesided}] + \inmargin{\midaligned{m}}\midaligned{left page} \page + \inmargin{\midaligned{m}}\midaligned{right page} \page + \setuppagenumbering[alternative={doublesided}] + \inmargin{\midaligned{m}}\midaligned{left page} \page + \inmargin{\midaligned{m}}\midaligned{right page} + \stoptext +\stophiding + +\placefigure + [here] + [fig:sidedness] + {Page alternatives.} + {\startcombination[3*1] + {\externalfigure[minibook-en.pdf][type=pdf,page=2,width=2.4cm]\externalfigure[minibook-en.pdf][type=pdf,page=3,width=2.4cm]}{singlesided} + {\externalfigure[minibook-en.pdf][type=pdf,page=4,width=2.4cm]\externalfigure[minibook-en.pdf][type=pdf,page=5,width=2.4cm]}{single-double} + {\externalfigure[minibook-en.pdf][type=pdf,page=6,width=2.4cm]\externalfigure[minibook-en.pdf][type=pdf,page=7,width=2.4cm]}{doublesided} + \stopcombination} + +Note in \in{figure}[fig:sidedness] that: + +\startitemize[packed] +\item the margintext (\type{\inmargin{m}}) is always in the left margin +\item the footertext in the margin (\type{\setupfootertexts[margin][l][r][r][l]}) adapts automatically +\item the page is completely mirrored when \type{alternative=doublesided} +\stopitemize + +When designing a page ask yourself a few questions: + +\startitemize[packed] +\item do I want margin texts or margin figures +\item will I use the margin for the section numbering +\item do I have footer and/or header texts +\item do I want a double sided layout (right--left page mirrored) +\item do I use ornaments (like tabs) on the page +\item do I have navigational buttons (screen documents) +\stopitemize + +\stopsection + +\startsection[title=Defining the papersize / screensize] + +Before you can set up your page layout you have to have an idea about the paper +dimensions. The cutmarks connected by the dashed lines in \in{figure}[fig:pageareas] +indicate the papersize. In \CONTEXT\ you set up your papersize with: + +\shortsetup{\tex{setuppapersize}} + +Most common predefined papersizes in \CONTEXT\ are A0..A10 and B1..B10 for paper +and S3..S8 for screen documents. + +Mostly you will use the default setup: + +\startbuffer +\setuppapersize + [A4][A4] +\stopbuffer + +\typebuffer + +But you can also define your own paper size for specific products: + +\startbuffer +\definelayout + [postcard] + [width=15cm, + height=10cm] +\stopbuffer + +\typebuffer + +\stopsection + +\startsection[title=Defining the page layout] + +The page layout is defined by: + +\shortsetup{setuplayout} + +This command is typed in the set up area of your input file. + +\placefigure + [here] + [fig:pageparameters] + {The page parameters.} + {\externalfigure[fig-page-parameters-en.pdf][width=.8\hsize]} + +The layout of this manual was set with: + +\startbuffer +\setuplayout + [backspace=3cm, + margin=2cm, + margindistance=.5cm, + width=15cm, + topspace=2cm, + header=2cm, + footer=2cm, + height=25.7cm] +\stopbuffer + +\typebuffer + +If you want to look at your page layout you can type the command +\type{\showframe} and process one page or the whole file. The areas are shown in +a number of frames. + +The command \type{\showsetups} shows the values of the parameters. A combination +of both commands is \type{\showlayout}. + +The values of the layout parameters are available as commands. This enables you +to work more accurately when defining measures of columns, figures and tables. A +few of these parameters are explained in \in{table}[tab:fewparameters]. + +\placetable + [here,force] + [tab:fewparameters] + {A few parameters as commands.} +\starttable[|l|l|] +\HL +\NC \bf Commands \NC \bf Meaning \NC\SR +\HL +\NC \type{\makeupwidth} \NC width of the typing area \NC\FR +\NC \type{\makeupheight} \NC height of the typing area \NC\MR +\NC \type{\textwidth} \NC width of the text area \NC\MR +\NC \type{\textheight} \NC height of the text area \NC\LR +\HL +\stoptable + +If you want to define the width of a column or the height of a figure you can do +it relative to the \type{\makeupwidth} or \type{\makeupheight}. Changes in this +width or height will alter columns and figures proportionally. + +\startbuffer +\placefigure + [here] + [fig:stepgable] + {A stepgable.} + {\externalfigure[ma-cb-19][width=.6\textwidth]} +\stopbuffer + +\typebuffer + +After processing this would become: + +\getbuffer + +The other available values are (shown with \type{\showsetups}): + +\startcolumns +\switchtobodyfont[8pt] +\showsetups +\stopcolumns + +The parameter values have a global effect and are default throughout the +document. Nevertheless you might want to make slight changes in the page design +for a number of pages. + +\startbuffer +\adaptlayout[21,38][height=+.5cm] +\stopbuffer + +\typebuffer + +In this case page 21 and 38 have a height of .5~cm + \type{textheight}. + +It is advisable not to use these local changes too often. It is always better to +alter the text than to change the page layout. + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-margintexts.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-margintexts.tex new file mode 100644 index 000000000..54ed6db6a --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-margintexts.tex @@ -0,0 +1,100 @@ +\startcomponent ma-cb-en-margintexts + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Margin texts] + +\index{margin text} + +\Command{\tex{margintext}} +\Command{\tex{inmargin}} +\Command{\tex{inleft}} +\Command{\tex{inright}} +\Command{\tex{margintitle}} + +It is very easy to put text in the margin. You just use \type{\inmargin}. + +\shortsetup{inmargin} + +You may remember one of the earlier examples: + +\startbuffer[marginpicture] +\inmargin + {\externalfigure + [ma-cb-23] + [width=.6\marginwidth]} +\stopbuffer + +\typebuffer[marginpicture] + +This would result in a figure in the \pagereference [marginpicture] +margin. You can imagine that it looks quite nice in some +documents. But be careful. The margin is rather small so the figure could become +very marginal. + +A few other examples are shown in the text below.\getbuffer +[marginpicture] + +\startbuffer +The Ridderstraat (Street of knights) \inmargin{Street of\\Knights} +is an obvious name. In the 14th and 15th centuries, nobility and +prominent citizens lived in this street. Some of their big houses +were later turned into poorhouses \inright{poorhouse}and old +peoples homes. + +Up until \inleft[low]{\tfc 1940}1940 there was a synagog in the +Ridderstraat. Some 40 Jews gathered there to celebrate their +sabbath. During the war all Jews were deported to Westerbork and +then to the extermination camps in Germany and Poland. None of +the Jewish families returned. The synagog was knocked down in +1958. +\stopbuffer + +\typebuffer + +The commands \type{\inmargin}, \type{\inleft} and \type{\inright} all have the +same function. In a two sided document \type{\inmargin} puts the margin text in +the correct margin. The \type{\\} is used for line breaking. The example above +would look like this: + +\getbuffer + +You can set up the margin text with: + +\shortsetup{setupinmargin} + +Other commands that you can use for forcing text into the margin +are listed in \in{table}[tab:margincommands]. + +\placetable + [here] + [tab:margincommands] + {Overview of margin commands.} + {\starttable[|l|l|] + \HL + \NC \bf Command \NC \bf Meaning \NC\SR + \HL + \NC \type{\ininner} \NC text in inner margin \NC\FR + \NC \type{\inouter} \NC text in outer margin \NC\MR + \NC \type{\inright} \NC text in right margin \NC\MR + \NC \type{\inleft} \NC text in left margin \NC\MR + \NC \type{\inmargin} \NC text in the margin \NC\MR + \NC \type{\inothermargin} \NC text in other margin \NC\MR + \NC \type{\margintext} \NC text in the margin \NC\LR + \HL + \stoptable} + +If you want to place more extensive text blocks in the margin there is the +command: + +\shortsetup{marginblock} + +and the accompanying command: + +\shortsetup{setupmarginblocks} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-math.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-math.tex new file mode 100644 index 000000000..c1430603f --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-math.tex @@ -0,0 +1,524 @@ +\startcomponent ma-cb-en-math + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=formulas,title=Typesetting math] + +\startsection[title=Introduction] + +\index {math} + +\TEX\ is {\em the} typesetting program for math. However, this is not the +extensive chapter on typesetting math you might expect. We advise you to do some +further reading on typesetting formulas in \TEX. See for example: \footnote{In +this introduction on typesetting math we relied on the booklet {\em \TEX niques} +by Arthur Samuel.} + +\startitemize[packed] +\item {\em The \TeX Book} by D.E. Knuth +\item {\em The Beginners Book of \TeX} by S. Levy and R. Seroul +\stopitemize + +\startsection[title=Typesetting math] + +\index {math mode} +\index {display mode} +\index {text mode} + +Normally different conventions are applied for typesetting normal text and math +text. These conventions are \quote{known} by \TEX\ and applied accordingly when +generating a document. We can rely on \TEX\ for delivering high quality math +output. + +A number of conventions for math are: + +\startitemize[n,packed] + +\item Characters are typeset in $math\ italic$ (don't confuse this with the + normal {\it italic characters} in a font). + +\item Symbols like Greek characters ($\alpha$, $\chi$) and math symbols ($\leq$, + $\geq$, $\in$) are used. + +\item Spacing will differ from normal spacing. + +\item Math expressions have a different alignment than that of the running text. + +\item The sub and superscripts are downsized automatically, like in $a^{b}_{c}$. + +\item Certain symbols have different appearances in the inline and display mode. + +\stopitemize + +When typesetting math you have to work in the so called math mode in which math +expressions can be defined by means of plain \TEX||commands. + +Math mode has two alternatives: text mode and display mode. Math in text +mode is activated by \type{$} and \type{$}, while display mode is activated by +\type{$$} and \type{$$}. In \CONTEXT\ however, display mode is activated with +the \type{\start ... \stopformula} command pair to have more grip on vertical +spacing around the formula. + +\startbuffer +The municipality of Hasselt covers an area of 42,05 \unit{Square Kilo +Meter}. Now, if you consider a circular area of this size with the +market place of Hasselt as the center point $M$ you can calculate its +diameter with ${{1}\over{4}} \pi r^2$. +\stopbuffer + +\typebuffer + +This will become: + +\getbuffer + +The many \type{{}} (grouping) in ${{1}\over{4}} \pi r^2$ are essential for +separating operations in the expression. If you omit the outer curly braces like +this: \type{${1}\over{4} \pi r^2$}, you would get a non desired result: +${1}\over{4} \pi r^2$. + +The letters and numbers are typeset in three different sizes: text size $a+b$, +script size $\scriptstyle a+b$ and scriptscript size $\scriptscriptstyle a+b$. +These can be influenced by the commands \type{\scriptstyle} and +\type{\scriptscriptstyle}. + +Symbols like $\int$ and $\sum$ will have a different form in text and display +mode. If we type \type {$\sum_{n=1}^{m}$} or \type {$\int_{-\infty}^{+\infty}$} +we will get {$\sum_{n=1}^{m}$} and {$\int_{-\infty}^{+\infty}$}. But when you +type: + +\startbuffer +\startformula + \sum_{n=1}^{m} \quad {\rm and} \quad \int_{-\infty}^{+\infty} +\stopformula +\stopbuffer + +\typebuffer + +to get displaymode you get: + +\getbuffer + +With the commands \type {\nolimits} and \type{\limits} you can influence the +appearances of \type{\sum} and \type{\int}: + +\startbuffer +\startformula + \sum_{n=1}^{m}\nolimits + \quad {\rm and} \quad + \int_{-\infty}^{+\infty}\limits +\stopformula +\stopbuffer + +\typebuffer + +which will result in: + +\getbuffer + +For typesetting fractions there is the command \type {\over}. In \CONTEXT\ you +can use the alternative \type {\frac}. For ${\frac{a}{1+b}}+c$ we type for +instance \type {${\frac{a}{1+b}}+c$}. + +Other commands to put one thing above the other, are: + +\startbuffer[atop] +${a} \atop {b}$ +\stopbuffer +\startbuffer[choose] +${n+1} \choose {k}$ +\stopbuffer +\startbuffer[brack] +${m} \brack {n}$ +\stopbuffer +\startbuffer[brace] +${m} \brace {n-1}$ +\stopbuffer + +\starttabulate[|l|l|l|l|] +\NC \type {\atop} +\NC \typebuffer[atop] +\NC \mathstrut\getbuffer[atop] +\NC +\NC\NR +\NC \type {\choose} +\NC \typebuffer[choose] +\NC +\NC \mathstrut\getbuffer[choose] +\NC\NR +\NC \type {\brack} +\NC \typebuffer[brack] +\NC \mathstrut\getbuffer[brack] +\NC +\NC\NR +\NC \type {\brace} +\NC \typebuffer[brace] +\NC +\NC \mathstrut\getbuffer[brace] +\NC\NR +\stoptabulate + +\TEX\ can enlarge delimiters like (~) and $\{~\}$ automatically if the left and +right delimiter is preceeded by the commands \type {\left} and \type {\right} +respectively. If you type: + +\startbuffer +\startformula + 1+\left(\frac{1}{1-x^{x-2}}\right)^3 +\stopformula +\stopbuffer + +\typebuffer + +you will get: + +\getbuffer + +Sub and superscripts are invoked by \quote {\type{_}} and \quote {\type{^}}. They +have effect on the next first character so grouping with $\{$~$\}$ is necessary +in case of multi character sub and superscripts. + +In certain situations the delimiters can be preceeded by \type{\bigl}, +\type{\Bigl}, \type{\biggl} and \type{\Biggl} and their right counterparts. Even +bigger delimiters can be produced by placing \type{\left} and \type{\right} in a +\type{\vbox} construction. When we type a senseless expression like: + +\startbuffer +\startformula + \left(\vbox to 16pt{}x^{2^{2^{2^{2}}}}\right) +\stopformula +\stopbuffer + +\typebuffer + +we get: + +\getbuffer + +In display mode the following delimiters will work in the automatic enlargement +mechanism: + +\starttabulate[|l|l|l|l|l|l|l|l|] +\NC \type{\lfloor} \NC $\lfloor$ +\NC \type{\langle} \NC $\langle$ +\NC \type{\vert} \NC $\vert$ +\NC \type{\downarrow} \NC $\downarrow$ +\NC\NR +\NC \type{\rfloor} \NC $\rfloor$ +\NC \type{\rangle} \NC $\rangle$ +\NC \type{\Vert} \NC $\Vert$ +\NC \type{\Downarrow} \NC $\Downarrow$ +\NC\NR +\NC \type{\lceil} \NC $\lceil$ +\NC \type{/} \NC $/$ +\NC \type{\uparrow} \NC $\uparrow$ +\NC \type{\updownarrow} \NC $\updownarrow$ +\NC\NR +\NC \type{\rceil} \NC $\rceil$ +\NC \type{\backslash} \NC $\backslash$ +\NC \type{\Uparrow} \NC $\Uparrow$ +\NC \type{\Updownarrow} \NC $\Updownarrow$ +\NC\NR +\stoptabulate + +In display mode we should typeset only one fraction and otherwise switch to the +\type{a/b} notation. To get: + +\startformula + a_0 + {\frac{a}{a_1 + \frac{1}{a_2}}} +\stopformula + +we will not type: + +\startbuffer +\startformula + a_0+{\frac{a}{a_1+\frac{1}{a_2}}} +\stopformula +\stopbuffer + +\typebuffer + +but prefer: + +\startbuffer +\startformula + a_0 + {\frac{a}{a_1 + 1/a_2}} +\stopformula +\stopbuffer + +\typebuffer + +to obtain: + +\getbuffer + +In addition we could also use the command \type{\displaystyle}. If we would type: + +\startbuffer +\startformula + a_0 + {\frac{a}{a_1 + \frac{1}{\strut \displaystyle a_2}}} +\stopformula +\stopbuffer + +\getbuffer + +we will get: + +\getbuffer + +Below we demonstrate the commands \type{\matrix}, \type{\pmatrix}, \type{\ldots}, +\type{\cdots} and \type{\cases} without any further explanation. + +\startbuffer[a] +\startformula +\stopbuffer + +\startbuffer[c] +\stopformula +\stopbuffer + +\startbuffer[b] + A=\left(\matrix{x-\lambda & 1 & 0 \cr + 0 & x-\lambda & 1 \cr + 0 & 0 & x-\lambda \cr}\right) +\stopbuffer + +\typebuffer[a,b,c] \startformula\getbuffer[b]\stopformula + +\startbuffer[b] + A=\left|\matrix{x-\mu& 1 & 0 \cr + 0 & x-\mu & 1 \cr + 0 & 0 & x-\mu \cr}\right| +\stopbuffer + +\typebuffer[a,b,c] \startformula\getbuffer[b]\stopformula + +\startbuffer[b] + A=\pmatrix{a_{11} & a_{12} & \ldots & a_{1n} \cr + a_{21} & a_{22} & \ldots & a_{2n} \cr + \vdots & \vdots & \ddots & \vdots \cr + a_{m1} & a_{m2} & \ldots & a_{mn} \cr} +\stopbuffer + +\typebuffer[a,b,c] \startformula\getbuffer[b]\stopformula + +\startbuffer[b] + A=\pmatrix{a_{11} & a_{12} & \ldots & a_{1n} \cr + a_{21} & a_{22} & \ldots & a_{2n} \cr + \vdots & \vdots & \ddots & \vdots \cr + a_{m1} & a_{m2} & \ldots & a_{mn} \cr} +\stopbuffer + +\typebuffer[a,b,c] \startformula\getbuffer[b]\stopformula + +\startbuffer[b] + |x|=\cases{ x, & if $x\geq0$; \cr + -x, & otherwise \cr} +\stopbuffer + +\typebuffer[a,b,c] \startformula\getbuffer[b]\stopformula + +To typeset normal text in a math expression we have to consider the following. +First a space is not typeset in math mode so we have to enforce one with +\type{ \ } (backslash). Second we have to indicate a font switch, because the text should +not appear in $math\ italic$ but in the actual font. So in \CONTEXT\ we have to +type: + +\startbuffer +\startformula + x^3+{\tf lower\ order\ terms} +\stopformula +\stopbuffer + +\typebuffer + +to get: + +\getbuffer + +The math functions like $\sin$ and $\tan$ that have to be typeset in the actual +font are predefined functions in \TEX: + +\starttabulate[|l|l|l|l|l|l|l|l|] +\NC \type{\arccos} \NC \type{\cos} \NC \type{\csc} \NC \type{\exp} \NC \type{\ker} \NC \type{\limsup} \NC \type{\min} \NC \type{\sinh} \NC\NR +\NC \type{\arcsin} \NC \type{\cosh} \NC \type{\deg} \NC \type{\gcd} \NC \type{\lg} \NC \type{\ln} \NC \type{\Pr} \NC \type{\sup} \NC\NR +\NC \type{\arctan} \NC \type{\cot} \NC \type{\det} \NC \type{\hom} \NC \type{\lim} \NC \type{\log} \NC \type{\sec} \NC \type{\tan} \NC\NR +\NC \type{\arg} \NC \type{\coth} \NC \type{\dim} \NC \type{\inf} \NC \type{\liminf} \NC \type{\max} \NC \type{\sin} \NC \type{\tanh} \NC\NR +\stoptabulate + +If we type the sinus or limit function: + +\startbuffer +\startformula + \sin 2\theta=2\sin\theta\cos\theta + \quad {\tf or} \quad + \lim_{x\to0}{\frac{\sin x}{x}}=1 +\stopformula +\stopbuffer + +\typebuffer + +we get: + +\getbuffer + +Alignment in math expressions may need special attention. In multi line +expressions we sometimes need alignment at the \quote {$=$} sign. This is done by +the command \type{\eqalign}. If we type: + +\startbuffer +\startformula + \eqalign{ + ax^2+bx+c &= 0 \cr + x &= \frac{-b \pm \sqrt{b^2-4ac}}{2a} \cr} +\stopformula +\stopbuffer + +\typebuffer + +we get: + +\getbuffer + +Sometimes alignment at more than one location is wanted. Watch the second line in +the next example and see how it is defined: + +\startbuffer +\startformula + \eqalign{ + ax+bx+\cdots+yx+zx & = x(a +b+ \cdots \cr + &\phantom{= x(a~}+y+z) \cr + & = y \cr} +\stopformula +\stopbuffer + +\typebuffer + +This results in: + +\getbuffer + +Next to the command \type{\phantom} there are \type{\hphantom} without height and +depth and \type{\vphantom} without width. + +You can rely on \TEX\ for spacing within a math expression. In some situations, +however you may want to influence spacing. This is done by: + +\starttabulate[|l|r|] +\NC \type{\!} \NC $-\frac{1}{6}$\type{\quad} \NC\NR +\NC \type{\,} \NC $\frac{1}{6}$\type{\quad} \NC\NR +\NC \type{\>} \NC $\frac{2}{9}$\type{\quad} \NC\NR +\NC \type{\;} \NC $\frac{5}{18}$\type{\quad} \NC\NR +\stoptabulate + +These \quote {spaces} are related to \type {\quad} that stands for the width of +the capital \quote{M}. + +The use of the command \type{\prime} speaks for itself. For example if would want +$y_1^\prime+y_2^{\prime\prime}$ you should type +\type{$y_1^\prime+y_2^{\prime\prime}$}. + +An expression like $\root 3 \of {x^2+y^2}$ is obtained by \type{$\root 3 \of +{x^2+y^2}$}. + +At the end of this section we point to the command \type{\mathstrut} which we can +use to enforce consistency, for example within the root symbol. With +\type{$\sqrt{\mathstrut a}+\sqrt{\mathstrut d}+\sqrt{\mathstrut y}$} we will get +$\sqrt{\mathstrut a}+\sqrt{\mathstrut d}+\sqrt{\mathstrut y}$ in stead of +$\sqrt{a}+\sqrt{d}+\sqrt{y}$. + +See \in{appendix}[overviews] for a complete overview of math commands. + +\stopsection + +\startsection[title=Placing formulas] + +\index{formula} + +\Command{\tex{placeformula}} +\Command{\tex{startformula}} +\Command{\tex{setupformulas}} + +You can typeset numbered formulas with: + +\shortsetup{placeformula} +\shortsetup{startformula} + +Two examples: + +\startbuffer +\placeformula[formula:aformula] + \startformula + y=x^2 + \stopformula + +\placeformula + \startformula + \int_0^1 x^2 dx + \stopformula +\stopbuffer + +\typebuffer + +\getbuffer + +The command \type{\placeformula} handles spacing around the formulas and the +numbering. The bracket pair is optional and is used for referencing and to switch +numbering on and off. + +\startbuffer +\placeformula[first one] +\startformula + y=x^2 +\stopformula + +\placeformula[middle one] +\startformula + y=x^3 +\stopformula + +\placeformula[last one] +\startformula + y=x^4 +\stopformula +\stopbuffer + +\getbuffer + +\in{Formula}[middle one] was typed like this: + +\startbuffer +\placeformula[middle one] + \startformula + y=x^3 + \stopformula +\stopbuffer + +\typebuffer + +The lable \type{[middle one]} is used for refering to this formula. Such a +reference is made with \type{\in{formula}[middle one]}. + +If no numbering is required you type: + +\type{\placeformula[-]} + +Numbering of formulas is set up with \type{\setupnumbering}. In this manual +numbering is set up with \type{\setupnumbering[way=bychapter]}. This means that +the chapter number preceeds the formula number and numbering is reset with each +new chapter. For reasons of consistency the tables, figures, intermezzi etc. are +numbered in the same way. Therefore you use \type{\setupnumbering} in the set up +area of your input file. + +Formulas can be set up with: + +\shortsetup{setupformulae} + +\stopsection + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-mathcharacters.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-mathcharacters.tex new file mode 100644 index 000000000..d7f09e89a --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-mathcharacters.tex @@ -0,0 +1,330 @@ +\startcomponent ma-cb-en-mathcharacters + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=overviews,title=Commands in math mode] + +\index{symbols in math mode} + +\startsection[title=Greek characters] + +\starttabulate[|l|l|l|l|l|l|l|l|l|] +\NC \NC $\alpha$ \NC \type{\alpha} +\NC \NC $\iota$ \NC \type{\iota} +\NC \NC $\varrho$ \NC \type{\varrho} \NC\NR +\NC \NC $\beta$ \NC \type{\beta} +\NC \NC $\kappa$ \NC \type{\kappa} +\NC $\Sigma$ \NC $\sigma$ \NC \type{\sigma} \NC\NR +\NC $\Gamma$ \NC $\gamma$ \NC \type{\gamma} +\NC $\Lambda$ \NC $\lambda$ \NC \type{\lambda} +\NC \NC $\varsigma$ \NC \type{\varsigma} \NC\NR +\NC $\Delta$ \NC $\delta$ \NC \type{\delta} +\NC \NC $\mu$ \NC \type{\mu} +\NC \NC $\tau$ \NC \type{\tau} \NC\NR +\NC \NC $\epsilon$ \NC \type{\epsilon} +\NC \NC $\nu$ \NC \type{\nu} +\NC \NC $\upsilon$ \NC \type{\upsilon} \NC\NR +\NC \NC $\varepsilon$ \NC \type{\varepsilon} +\NC $\Xi$ \NC $\xi$ \NC \type{\xi} +\NC $\Phi$ \NC $\phi$ \NC \type{\phi} \NC\NR +\NC \NC $\zeta$ \NC \type{\zeta} +\NC \NC $o$ \NC \type{o} +\NC \NC $\varphi$ \NC \type{\varphi} \NC\NR +\NC \NC $\eta$ \NC \type{\eta} +\NC $\Pi$ \NC $\pi$ \NC \type{\pi} +\NC \NC $\chi$ \NC \type{\chi} \NC\NR +\NC $\Theta$ \NC $\theta$ \NC \type{\theta} +\NC \NC $\varpi$ \NC \type{\varpi} +\NC $\Psi$ \NC $\psi$ \NC \type{\psi} \NC\NR +\NC \NC $\vartheta$ \NC \type{\vartheta} +\NC \NC $\rho$ \NC \type{\rho} +\NC $\Omega$ \NC $\omega$ \NC \type{\omega} \NC\NR +\stoptabulate + +\stopsection + +\startsection[title=Special symbols] + +\starttabulate[|l|l|l|l|l|l|] +\NC $\aleph$ \NC \type{\aleph} +\NC $\prime$ \NC \type{\prime} +\NC $\forall$ \NC \type{\forall} +\NC\NR +\NC $\hbar$ \NC \type{\hbar} +\NC $\emptyset$ \NC \type{\emptyset} +\NC $\exists$ \NC \type{\exists} +\NC\NR +\NC $\imath$ \NC \type{\imath} +\NC $\nabla$ \NC \type{\nabla} +\NC $\neg$ \NC \type{\neg} +\NC\NR +\NC $\jmath$ \NC \type{\jmath} +\NC $\surd$ \NC \type{\surd} +\NC $\flat$ \NC \type{\flat} +\NC\NR +\NC $\ell$ \NC \type{\ell} +\NC $\top$ \NC \type{\top} +\NC $\natural$ \NC \type{\natural} +\NC\NR +\NC $\wp$ \NC \type{\wp} +\NC $\bot$ \NC \type{\bot} +\NC $\sharp$ \NC \type{\sharp} +\NC\NR +\NC $\Re$ \NC \type{\Re} +\NC $\Vert$ \NC \type{\Vert} +\NC $\clubsuit$ \NC \type{\clubsuit} +\NC\NR +\NC $\Im$ \NC \type{\Im} +\NC $\angle$ \NC \type{\angle} +\NC $\diamondsuit$ \NC \type{\diamondsuit} +\NC\NR +\NC $\partial$ \NC \type{\partial} +\NC $\triangle$ \NC \type{\triangle} +\NC $\heartsuit$ \NC \type{\heartsuit} +\NC\NR +\NC $\infty$ \NC \type{\infty} +\NC $\backslash$ \NC \type{\backslash} +\NC $\spadesuit$ \NC \type{\spadesuit} +\NC\NR +\stoptabulate + +\stopsection + +\startsection[title=Operators in addition to $+$, $-$ and $*$] + +\starttabulate[|l|l|l|l|l|l|] +\NC $\pm$ \NC \type{\pm} +\NC $\cap$ \NC \type{\cap} +\NC $\vee$ \NC \type{\vee} +\NC\NR +\NC $\mp$ \NC \type{\mp} +\NC $\cup$ \NC \type{\cup} +\NC $\wedge$ \NC \type{\wedge} +\NC\NR +\NC $\setminus$ \NC \type{\setminus} +\NC $\uplus$ \NC \type{\uplus} +\NC $\oplus$ \NC \type{\oplus} +\NC\NR +\NC $\cdot$ \NC \type{\cdot} +\NC $\sqcap$ \NC \type{\sqcap} +\NC $\ominus$ \NC \type{\ominus} +\NC\NR +\NC $\times$ \NC \type{\times} +\NC $\sqcup$ \NC \type{\sqcup} +\NC $\otimes$ \NC \type{\otimes} +\NC\NR +\NC $\ast$ \NC \type{\ast} +\NC $\triangleleft$ \NC \type{\triangleleft} +\NC $\oslash$ \NC \type{\oslash} +\NC\NR +\NC $\star$ \NC \type{\star} +\NC $\triangleright$ \NC \type{\triangleright} +\NC $\odot$ \NC \type{\odot} +\NC\NR +\NC $\diamond$ \NC \type{\diamond} +\NC $\wr$ \NC \type{\wr} +\NC $\dagger$ \NC \type{\dagger} +\NC\NR +\NC $\circ$ \NC \type{\circ} +\NC $\bigcirc$ \NC \type{\bigcirc} +\NC $\ddagger$ \NC \type{\ddagger} +\NC\NR +\NC $\bullet$ \NC \type{\bullet} +\NC $\bigtriangleup$ \NC \type{\bigtriangleup} +\NC $\amalg$ \NC \type{\amalg} +\NC\NR +\NC $\div$ \NC \type{\div} +\NC $\bigtriangledown$ \NC \type{\bigtriangledown} +\NC ~ \NC ~ +\NC\NR +\stoptabulate + +\stopsection + +\startsection[title=Operators] + +\starttabulate[|l|l|l|l|l|l|] +\NC $\sum$ \NC \type{\sum} +\NC $\prod$ \NC \type{\prod} +\NC $\coprod$ \NC \type{\coprod} +\NC\NR +\NC $\int$ \NC \type{\int} +\NC $\oint$ \NC \type{\oint} +\NC $\bigcap$ \NC \type{\bigcap} +\NC\NR +\NC $\bigcup$ \NC \type{\bigcup} +\NC $\bigsqcup$ \NC \type{\bigsqcup} +\NC $\bigvee$ \NC \type{\bigvee} +\NC\NR +\NC $\bigwedge$ \NC \type{\bigwedge} +\NC $\bigodot$ \NC \type{\bigodot} +\NC $\bigotimes$ \NC \type{\bigotimes} +\NC\NR +\NC $\bigoplus$ \NC \type{\bigoplus} +\NC $\biguplus$ \NC \type{\biguplus} +\NC \NC +\NC\NR +\stoptabulate + +\stopsection + +\startsection[title=Relation in addition to $>$, $<$ and $=$] + +\starttabulate[|l|l|l|l|l|l|] +\NC $\leq$ \NC \type{\leq} +\NC $\geq$ \NC \type{\geq} +\NC $\equiv$ \NC \type{\equiv} +\NC\NR +\NC $\prec$ \NC \type{\prec} +\NC $\succ$ \NC \type{\succ} +\NC $\sim$ \NC \type{\sim} +\NC\NR +\NC $\preceq$ \NC \type{\preceq} +\NC $\succeq$ \NC \type{\succeq} +\NC $\simeq$ \NC \type{\simeq} +\NC\NR +\NC $\ll$ \NC \type{\ll} +\NC $\gg$ \NC \type{\gg} +\NC $\asymp$ \NC \type{\asymp} +\NC\NR +\NC $\subset$ \NC \type{\subset} +\NC $\supset$ \NC \type{\supset} +\NC $\approx$ \NC \type{\approx} +\NC\NR +\NC $\subseteq$ \NC \type{\subseteq} +\NC $\supseteq$ \NC \type{\supseteq} +\NC $\cong$ \NC \type{\cong} +\NC\NR +\NC $\sqsubseteq$ \NC \type{\sqsubseteq} +\NC $\sqsupseteq$ \NC \type{\sqsupseteq} +\NC $\bowtie$ \NC \type{\bowtie} +\NC\NR +\NC $\in$ \NC \type{\in} +\NC $\ni$ \NC \type{\ni} +\NC $\propto$ \NC \type{\propto} +\NC\NR +\NC $\vdash$ \NC \type{\vdash} +\NC $\dashv$ \NC \type{\dashv} +\NC $\models$ \NC \type{\models} +\NC\NR +\NC $\smile$ \NC \type{\smile} +\NC $\mid$ \NC \type{\mid} +\NC $\doteq$ \NC \type{\doteq} +\NC\NR +\NC $\frown$ \NC \type{\frown} +\NC $\parallel$ \NC \type{\parallel} +\NC $\perp$ \NC \type{\perp} +\NC\NR +\stoptabulate + +\stopsection + +\startsection[title=Negated relations] + +\starttabulate[|l|l|l|l|l|l|] +\NC $\not<$ \NC \type{\not}\type{<} +\NC $\not>$ \NC \type{\not}\type{>} +\NC $\not=$ \NC \type{\not}\type{=} +\NC\NR +\NC $\not\leq$ \NC \type{\not}\type{\leq} +\NC $\not\geq$ \NC \type{\not}\type{\geq} +\NC $\not\equiv$ \NC \type{\not}\type{\equiv} +\NC\NR +\NC $\not\prec$ \NC \type{\not}\type{\prec} +\NC $\not\succ$ \NC \type{\not}\type{\succ} +\NC $\not\sim$ \NC \type{\not}\type{\sim} +\NC\NR +\NC $\not\preceq$ \NC \type{\not}\type{\preceq} +\NC $\not\succeq$ \NC \type{\not}\type{\succeq} +\NC $\not\simeq$ \NC \type{\not}\type{\simeq} +\NC\NR +\NC $\not\subset$ \NC \type{\not}\type{\subset} +\NC $\not\supset$ \NC \type{\not}\type{\supset} +\NC $\not\approx$ \NC \type{\not}\type{\approx} +\NC\NR +\NC $\not\subseteq$ \NC \type{\not}\type{\subseteq} +\NC $\not\supseteq$ \NC \type{\not}\type{\supseteq} +\NC $\not\cong$ \NC \type{\not}\type{\cong} +\NC\NR +\NC $\not\sqsubseteq$ \NC \type{\not}\type{\sqsubseteq} +\NC $\not\sqsupseteq$ \NC \type{\not}\type{\sqsupseteq} +\NC $\not\asymp$ \NC \type{\not}\type{\asymp} +\NC\NR +\stoptabulate + +\stopsection + +\startsection[title=Some arrows] + +\starttabulate[|l|l|l|l|l|l|] +\NC $\leftarrow$ \NC \type{\leftarrow} +\NC $\longleftarrow$ \NC \type{\longleftarrow} +\NC $\uparrow$ \NC \type{\uparrow} +\NC\NR +\NC $\Leftarrow$ \NC \type{\Leftarrow} +\NC $\Longleftarrow$ \NC \type{\Longleftarrow} +\NC $\Uparrow$ \NC \type{\Uparrow} +\NC\NR +\NC $\rightarrow$ \NC \type{\rightarrow} +\NC $\longrightarrow$ \NC \type{\Rightarrow} +\NC $\downarrow$ \NC \type{\downarrow} +\NC\NR +\NC $\Rightarrow$ \NC \type{\Rightarrow} +\NC $\Longrightarrow$ \NC \type{\Longrightarrow} +\NC $\Downarrow$ \NC \type{\Downarrow} +\NC\NR +\NC $\leftrightarrow$ \NC \type{\leftrightarrow} +\NC $\longleftrightarrow$ \NC \type{\longleftrightarrow} +\NC $\updownarrow$ \NC \type{\updownarrow} +\NC\NR +\NC $\Leftrightarrow$ \NC \type{\Leftrightarrow} +\NC $\Longleftrightarrow$ \NC \type{\Longleftrightarrow} +\NC $\Updownarrow$ \NC \type{\Updownarrow} +\NC\NR +\NC $\mapsto$ \NC \type{\mapsto} +\NC $\longmapsto$ \NC \type{\longmapsto} +\NC $\nearrow$ \NC \type{\nearrow} +\NC\NR +\NC $\searrow$ \NC \type{\searrow} +\NC $\swarrow$ \NC \type{\swarrow} +\NC $\nwarrow$ \NC \type{\nwarrow} +\NC\NR +\NC $\hookleftarrow$ \NC \type{\hookleftarrow} +\NC $\hookrightarrow$ \NC \type{\hookrightarrow} +\NC ~ \NC ~ +\NC\NR +\stoptabulate + +\stopsection + +\startsection[title=Alternative commands] + +\starttabulate[|l|l|l|l|l|l|l|l|l|l|] +\NC $\ne$ \NC \type{\ne} +\NC $\{$ \NC {\tttf\leftargument} +\NC $\land$ \NC \type{\land} +\NC $\to$ \NC \type{\to} +\NC $\vert$ \NC \type{\vert} +\NC\NR +\NC $\le$ \NC \type{\le} +\NC $\}$ \NC {\tttf\rightargument} +\NC $\lor$ \NC \type{\lor} +\NC $\gets$ \NC \type{\gets} +\NC $\Vert$ \NC \type{\Vert} +\NC\NR +\NC $\ge$ \NC \type{\ge} +\NC $\owns$ \NC \type{\owns} +\NC $\lnot$ \NC \type{\lnot} +\NC \NC +\NC \NC +\NC\NR +\stoptabulate + +\stopsection + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-metapost.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-metapost.tex new file mode 100644 index 000000000..e50bed036 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-metapost.tex @@ -0,0 +1,75 @@ +\startcomponent ma-cb-en-metapost + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Graphical extension / \METAPOST] + +\index[metapost]{\METAPOST} +\index{graphical features} + +The graphical possibilities of \TEX||related macro packages are rather limited. +However, by using the graphical package \METAPOST\ of John Hobby a complete range +of graphical features has become available that may improve the look of your +documents. + +In \CONTEXT\ there is a direct link to \METAPOST\ so users can apply the features +of \METAPOST\ directly into their documents. The chapter headers and page numbers +of this manual are extended by some graphical elements that are generated by +\METAPOST. + +If you look carefully at these \METAPOST\ extensions you will notice a lot of +contextual adaptation (width and height dependend) and randomization. So you can do +things in your document that are not possible in other typesetting applications. + +A more practical example (for a mathematician at least) is drawn in \in {figure} +[fig:metapostexample]: + +\startbuffer +\startreusableMPgraphic{origin} + path pb; pb:=(5.5cm,0cm)..(10.5cm,0cm); + path qb; qb:=(8cm,-1cm)..(8cm,2.5cm); + pickup pencircle scaled 0.5mm; + drawarrow pb; + drawarrow qb; + draw thelabel.rt(btex $x$ etex,(10.6cm,0cm)); + draw thelabel.top(btex $y$ etex,(8cm,2.6cm)); + path l; l:=(5.5cm,-0.5cm)..(10.5cm,2cm); + pickup pencircle scaled 0.3mm; + draw l withcolor blue ; + pair A; A:=(6cm,-0.25cm); + pair B; B:=(9.3cm,1.4cm); + pair C; C:=(9.3cm,-0.25cm); + pickup pencircle scaled 0.15cm; + drawdot A; drawdot B; drawdot C; + draw thelabel.lrt(btex $\scriptstyle P_1(x_1,y_1)$ etex ,A); + draw thelabel.lrt(btex $\scriptstyle P_2(x_2,y_2)$ etex ,B); + draw thelabel.bot(btex $\scriptstyle P(x_2,y_1)$ etex ,C); + path s; s:=A..(9.3cm,-0.25cm); + draw s dashed (evenly scaled 1mm) withpen pencircle scaled 0.3mm; + path t; t:=B..(9.3cm,-0.25cm); + draw t dashed (evenly scaled 1mm) withpen pencircle scaled 0.3mm; +\stopreusableMPgraphic +\stopbuffer + +\getbuffer + +\placefigure + [here] + [fig:metapostexample] + {\METAPOST\ example.} + {\reuseMPgraphic{origin}} + +This example is taken from the mathematical text book {\em Algetrigulus} by +Philip Brown. All graphics in his book are made by means of \METAPOST. This +one is defined by: + +\typebuffer + +The usage and features of \METAPOST\ within \CONTEXT\ are described in the +extensive \goto {\METAFUN\ manual} [ url (manual:metafun) ]. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-modules.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-modules.tex new file mode 100644 index 000000000..4f92e8e47 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-modules.tex @@ -0,0 +1,45 @@ +\startcomponent ma-cb-en-modules + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Using modules] + +%% VZ: many new modules was added (see ma-cb-cz-modules.tex) + +\index{module} + +\Command{\tex{usemodule}} + +For reasons of efficiency \CONTEXT\ comes with a number of modules that contain +specific functionality. Loading a module is done in the set up area of your input +file by means of: + +\shortsetup{usemodule} + +When you load a module \CONTEXT\ looks for a file with the following (prefix-)name: + +\startitemize[packed] +\item m-modulename (core module) +\item p-modulename (private module) +\item s-modulename (\CONTEXT\ style file) +\item x-modulename (XML module) +\item t-modulename (third party module) +\item modulename +\stopitemize + +A few example core modules are: + +\startitemize[packed] +\item m-fields (\type{m-fields.mkiv}): for PDF forms +\item m-morse (\type{m-morse.mkvi}): for morse +\item m-spreadsheet (\type{m-spreadsheet.mkiv}): for spreadsheets +\item m-visual (\type{m-visual.mkiv}): for visual debugging +\item m-zint (\type{m-zint.mkiv}): for generating bar codes +\item s-pre-** (\type{s-pre-**}): for presentations +\stopitemize + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-pagebackgrounds.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-pagebackgrounds.tex new file mode 100644 index 000000000..ff7bf0b4d --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-pagebackgrounds.tex @@ -0,0 +1,93 @@ +\startcomponent ma-cb-en-pagebackgrounds + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Backgrounds in page areas] + +\index{page areas} +\index{background+page areas} + +\Command{\tex{setupbackgrounds}} + +The page background can be set, with: + +\shortsetup{setupbackgrounds} + +The first two bracket pairs are used to define the page areas. The last bracket +pair is used for set up. + +\startbuffer +\hbox + {\framed[width=1.5cm,frame=off] {} + \framed[width=2cm,frame=off] {left} + \framed[width=2.5cm,frame=off] {left} + \framed[width=3cm,frame=off] {text} + \framed[width=2.5cm,frame=off] {right} + \framed[width=2cm,frame=off] {right}} +\hbox + {\framed[width=1.5cm,frame=off] {} + \framed[width=2cm,frame=off] {edge} + \framed[width=2.5cm,frame=off] {margin} + \framed[width=3cm,frame=off] {} + \framed[width=2.5cm,frame=off] {margin} + \framed[width=2cm,frame=off] {edge}} +\hbox + {\framed[width=1.5cm,frame=off] {top} + \framed[width=2cm] {} + \framed[width=2.5cm] {} + \framed[width=3cm] {} + \framed[width=2.5cm] {} + \framed[width=2cm] {}} +\hbox + {\framed[width=1.5cm,frame=off] {header} + \framed[width=2cm] {} + \framed[width=2.5cm,background=screen] {} + \framed[width=3cm,background=screen] {} + \framed[width=2.5cm,background=screen] {} + \framed[width=2cm] {}} +\hbox + {\framed[width=1.5cm,frame=off,height=3cm] {text} + \framed[width=2cm,height=3cm] {} + \framed[width=2.5cm,height=3cm,background=screen]{} + \framed[width=3cm,height=3cm,background=screen] {} + \framed[width=2.5cm,height=3cm,background=screen]{} + \framed[width=2cm,height=3cm] {}} +\hbox + {\framed[width=1.5cm,frame=off] {footer} + \framed[width=2cm] {} + \framed[width=2.5cm,background=screen] {} + \framed[width=3cm,background=screen] {} + \framed[width=2.5cm,background=screen] {} + \framed[width=2cm] {}} +\hbox + {\framed[width=1.5cm,frame=off] {bottom} + \framed[width=2cm] {} + \framed[width=2.5cm] {} + \framed[width=3cm] {} + \framed[width=2.5cm] {} + \framed[width=2cm] {}} +\stopbuffer + +\placefigure + [here] + [fig:pageareas] + {The page areas defined in \type{\setupbackgrounds}.} + {\tt\getbuffer} + +If you want to have backgrounds in the gray areas of the page layout of +\in{figure}[fig:pageareas] you type: + +\startbuffer +\setupbackgrounds + [header,text,footer] + [leftmargin,text,rightmargin] + [background=screen] +\stopbuffer + +\typebuffer + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-pages.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-pages.tex new file mode 100644 index 000000000..61e2d6ce9 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-pages.tex @@ -0,0 +1,208 @@ +\startcomponent ma-cb-en-pages + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Page breaking and page numbering] + +\index{page breaking} +\index{page numbering} + +\Command{\tex{page}} +\Command{\tex{setuppagenumbering}} +\Command{\tex{setupuserpagenumber}} + +\startsection[title=Page break] + +A page can be enforced or blocked by: + +\shortsetup{page} + +The options can be stated within the brackets. The options and their meaning are +presented in \in{table}[tab:page options]. + +\placetable + [] + [tab:page options] + {Page options.} +\starttable[|l|l|] +\HL +\NC \bf Option \NC \bf Meaning \NC\SR +\HL +\NC \type{yes} \NC enforce a page \NC\FR +\NC \type{makeup} \NC enforce a page without filling \NC\MR +\NC \type{no} \NC no page \NC\MR +\NC \type{preference} \NC prefer a new page here \NC\MR +\NC \type{bigpreference} \NC great preference for a new page here \NC\MR +\NC \type{left} \NC next page is a left handside page \NC\MR +\NC \type{right} \NC next page is a right handside page \NC\MR +\NC \type{disable} \NC following commands have no effect \NC\MR +\NC \type{last} \NC add pages till even number is reached \NC\MR +\NC \type{quadruple} \NC add pages till a multiple of four is reached \NC\MR +\NC \type{even} \NC next page is even \NC\MR +\NC \type{odd} \NC next page in odd \NC\MR +\NC \type{blank} \NC no page number \NC\MR +\NC \type{empty} \NC insert an empty page \NC\MR +\NC \type{reset} \NC following commands do have effect \NC\MR +\NC \type{start} \NC from now on page commands have effect \NC\MR +\NC \type{stop} \NC from now on page commands have no effect \NC\LR +\HL +\stoptable + +\stopsection + +\startsection[title=Page numbering] + +Numbering pages is done automatically by \CONTEXT. However, numbering the pages +the way you want it may take some effort. + +A rather simple \type{\start ... \stoptext} document will be numbered from +$1 .. n$ (where $n$ is the last page). If you want your document to number +its pages alphabetical you can type: + +\startbuffer +\setupuserpagenumber + [numberconversion=character] +\stopbuffer + +\typebuffer + +in the setup area of your file. + +You can enforce a page number with: + +\starttyping +\setupuserpagenumber[number=25] +\stoptyping + +\shortsetup{setupuserpagenumber} + +The options of the \type{\setupuserpagenumber} command are given in +\in{table}[tab:user page number options]. + +\placetable + [] + [tab:user page number options] + {Page numbering: numbering options.} +\starttable[|l|l|] +\HL +\NC \bf Option \NC \bf Meaning \NC\SR +\HL +\NC \type{way} \NC how to number the document \NC\FR +\NC \type{prefix} \NC use pagenumber prefix \NC\MR +\NC \type{prefixset} \NC use defined prefixset \NC\MR +\NC \type{prefixseparatorset} \NC use defined separator \NC\MR +\NC \type{state} \NC start -- stop page numbering \NC\MR +\NC \type{number} \NC define page number \NC\MR +\NC \type{numberconversion} \NC convert page number \NC\MR +\NC \type{numberconversionset} \NC used defined conversion set \NC\LR +\HL +\stoptable + +The \type{prefixset}, \type{prefixseparatorset} and the \type{numberconversionset} +options are defined with the \type{\defineprefixset}, \type{\defineseparatorset} +and \type{\defineconversionset} respectively. + +This manual uses the \CONTEXT\ standard document section blocks: frontpart, +bodymatter and appendices. These section blocks are numbered with roman +characters, numeral digits and characters respectively. + +\startbuffer +\defineconversionset + [frontpart:pagenumber][][romannumerals] + +\defineconversionset + [bodypart:pagenumber] [][numbers] + +\defineconversionset + [appendix:pagenumber] [][Characters] +\stopbuffer + +\typebuffer + +At the start of each section block the number is reset to i, 1 and A respectively. + +The same effect would have been obntained with: + +\startbuffer +\startsectionblockenvironment[frontpart] + \setupuserpagenumber[numberconversion=romannumerals] +\stopsectionblockenvironment +\stopbuffer + +\typebuffer + +Page numbering and the location of the page numbers can be set up with: + +\shortsetup{setuppagenumbering} + +The options of this command are shown in \in{table}[tab:page numbering options]: + +\placetable + [] + [tab:page numbering options] + {Page numbering: layout options.} +\starttable[|l|l|] +\HL +\NC \bf Option \NC \bf Meaning \NC\SR +\HL +\NC \type{alternative} \NC page layout: single or double sided \NC\MR +\NC \type{location} \NC location of page number on page \NC\MR +\NC \type{width} \NC width of pagen umber \NC\MR +\NC \type{left} \NC text left of page number \NC\MR +\NC \type{right} \NC text right of page number \NC\MR +\NC \type{page} \NC \unknown \NC\MR +\NC \type{state} \NC start -- stop page numbering \NC\MR +\NC \type{command} \NC invoke command \NC\MR +\NC \type{style} \NC set character style \NC\MR +\NC \type{color} \NC set color \NC\LR +\HL +\stoptable + +Note that this is also the command that indicates that your document is single or +double sided which has an effect on the left-right page layout. + +\startbuffer +\setuppagenumbering + [alternative=doublesided] +\stopbuffer + +\typebuffer + +In this manual page numbering is set up with: + +\starttyping +\setuppagenumbering + [location={footer,middle}, + command=\NummerCommando] +\stoptyping + +The \type{\NummerCommando} uses \METAPOST\ to draw a unique random image around +each page number. + +You can recal a page number with \type{\userpagenumber}. If you set up your headertext +with: + +\startbuffer + \setupheadertexts + [Page \userpagenumber\ of \lastuserpagenumber] +\stopbuffer + +\typebuffer + +You would get a header with the actual page number and the total of pages (in that +section block). + +The actual page number and the real page number may differ since there may be pages +or sections that in your document that are not numbered. If you feel the need to +display the real page number there is the command \type{\realpagenumber}. + +Please refer to the \goto {\CONTEXTWIKI} [ +url(http://wiki.contextgarden.net/Command/setupuserpagenumber) ] for more +details. + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-paragraphs.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-paragraphs.tex new file mode 100644 index 000000000..668b6ab01 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-paragraphs.tex @@ -0,0 +1,280 @@ +\startcomponent ma-cb-en-paragraphs + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Paragraph spacing] + +\startsection[title=Introduction] + +\index{paragraph} + +\Command{\tex{par}} +\Command{\tex{paragraph}} + +In \TEX\ and \CONTEXT\ the most important unit of text is the paragraph. You can +start a new paragraph by: + +\startitemize[packed] +\item an empty line +\item the \TEX\ command \type{\par} +\stopitemize + +In your \ASCII\ input file you should use empty lines as paragraph separators. +This will lead to a readable, clearly structured and well organized file and will +prevent mistakes. + +In situations where a command has to be closed explicitly you should use +\type{\par}. + +\startbuffer +During one of the wars Hasselt lay under siege. After some +time the city was famine stricken, everything edible was +eaten. Except for one cow. The cow was kept alive and +treated very well. \par +Once a day the citizens of Hasselt took the cow for a walk +on the ramparts. The besiegers saw the well fed cow and +became very discouraged. They broke up their camps and +Hasselt was saved. \par +In the Hoogstraat in Hasselt there is a stone tablet with a +representation of the cow that commemorates the siege and +the shrewdness of the citizens of Hasselt. +\stopbuffer + +\typebuffer + +This could also be typed without \type{\par}s and a few empty lines. + +\startbuffer +During one of the wars Hasselt lay under siege. After some +time the city was famine stricken, everything edible was +eaten. Except for one cow. The cow was kept alive and +treated very well. + +Once a day the citizens of Hasselt took the cow for a walk +on the ramparts. The besiegers saw the well fed cow and +became very discouraged. They broke up their camps and +Hasselt was saved. + +In the Hoogstraat in Hasselt there is a stone tablet with a +representation of the cow that commemorates the siege and +the wisdom of the citizens of Hasselt. +\stopbuffer + +\typebuffer + +\stopsection + +\startsection[title=Inter paragraph spacing] + +\index{inter paragraph spacing} + +\Command{\tex{setupwhitespace}} +\Command{\tex{nowhitespace}} +\Command{\tex{whitespace}} +\Command{\tex{startlinecorrection}} % VZ 2006-11-15 setup->start +\Command{\tex{blank}} +\Command{\tex{setupblank}} +\Command{\tex{startpacked}} +\Command{\tex{startunpacked}} + +The vertical spacing between paragraphs can be specified by: + +\shortsetup{setupwhitespace} + +This document is produced with \type{\setupwhitespace[medium]}. + +When inter paragraph spacing is specified there are two commands available that +are seldom needed: + +\starttyping +\nowhitespace +\whitespace +\stoptyping + +When a paragraph consists of a horizontal line or a framed text like this: + +\startbuffer +\framed{Ridderstraat 27, 8061GH Hasselt} +\stopbuffer + +\getbuffer + +Sometimes spacing is suboptimal. For that purpose you could carry out a +correction with: + +\shortsetup{startlinecorrection} + +So if you would type: + +\startbuffer +\startlinecorrection +\framed{Ridderstraat 27, 8061GH Hasselt} +\stoplinecorrection +\stopbuffer + +\typebuffer + +you will get a better output. Only use these commands if really needed! + +\getbuffer + +Another command to deal with vertical spacing is: + +\shortsetup{blank} + +The bracket pair is optional and within the bracket pair you can type the amount +of spacing. Keywords like \type{small}, \type{medium} and \type{big} are related +to the fontsize. + +\startbuffer +In official writings Hasselt always has the affix Ov. This is an +abbrevation for the province of {\em Overijssel}. +\blank[2*big] +The funny thing is that there is no other Hasselt in the Netherlands. +So it is redundant. +\blank +The affix is a leftover from the times that the Netherlands and +Belgium were one country under the reign of King Philip II of Spain. +\blank[2*big] +Hasselt in Belgium lies in the province of Limburg. One wonders if +the Belgian people write Hasselt (Li) on their letters. +\stopbuffer + +\typebuffer + +The command \type{\blank} without the bracket pair is the default space. + +The example would become: + +\getbuffer + +The default spacing can be set up with: + +\shortsetup{setupblank} + +If you want to surpress vertical spacing you can use: + +\shortsetup{startpacked} + +In this manual the whitespace is set at \type{medium}. In the next situation this +set up is ignored and the lines are packed. + +\startbuffer +\startpacked +Hasselt (Ov) lies in Overijssel. + +Hasselt (Li) lies in Limburg. + +Watch out: we talk about Limburg in Belgium. There is +also a Dutch Limburg. +\stoppacked +\stopbuffer + +\typebuffer + +This will become: + +\getbuffer + +It is not hard to imagine why there is also: + +\shortsetup{startunpacked} + +You can force vertical space with \type{\godown}. The distance is specified +within the brackets. + +\shortsetup{godown} + +Try not to use this command. It is always better use the \type{\setup...} commands +to setup your spacing model. + +\stopsection + +\startsection[title=Whitespace before and after text components] + +Most text components that are coded with \CONTEXT\ have a \type{\setup...} command +with which you can define the whitespace before and after that component. + +\starttyping +\setupitemize + [before=,after=] + +\setuphead + [chapter] + [before=,after=] + +\setupframedtexts + [before=,after=] +\stoptyping + +The use of the \type{\setup...} commands prevents you from having to code +whitespaces throughout your \TEX\ document. This would lead to unreadable sources +and inconsistent use of whitepaces. + +\stopsection + +\startsection[title=Skipping space] + +\Command{\tex{hskip}} +\Command{\tex{vskip}} + +You can introduce horizontal and vertical space with \type{\hskip} and +\type{\vskip} commands. + +Try to avoid these commands in your text. It will probably lead to inconsistent +spacing. + +\stopsection + +\startsection[title=Indentation] + +\index{indentation} +\index{paragraph+indentation} + +\Command{\tex{indenting}} +\Command{\tex{noindenting}} +\Command{\tex{setupindenting}} + +You can set up the amount of the indentation with: + +\shortsetup{setupindenting} + +A reasonable indentation is achieved by: + +\starttyping +\setupindenting[yes,] +\stoptyping + +This will lead to indented paragraphs. By default, indentation after white space +(as issued by \type {\blank}) is suppressed. + +You can locally influence the indentation state by using: + +\shortsetup{indenting} + +When for instance you say \type {never}, from that moment on indentation will be +surpressed. Saying \type {none}, only influences the next paragraph. + +If you choose to use indentations, and at a certain place you explicitly {\em do +not} want to indent, you can also say: + +\starttyping +\noindenting +\stoptyping + +In some \type{\setup...} commands you can set the parameter \type{indent=yes}. This means +that the paragraph that follows the textcomponent will indent: + +\startbuffer +\setupitemize[indentnext=yes] +\stopbuffer + +\typebuffer + +\stopsection + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-presentations.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-presentations.tex new file mode 100644 index 000000000..623ba9490 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-presentations.tex @@ -0,0 +1,38 @@ +\startcomponent ma-cb-en-presentations + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Presentations,reference=presentations] + +\index{presentation} + +You can use \CONTEXT\ for making your own presentations. A \CONTEXT\ presentation +is an interactive PDF document with a screen layout. Often presentations are good +examples of the cooperation between \CONTEXT\ and \METAPOST. + +\CONTEXT\ comes with a number ready-to-use presentations. A presentation is a +module with the prefix \type{s-} and that you can load with the \type{\usemodule} +command. + +If you want to use an already existing presentation the best way to proceed is: + +\startitemize[packed] +\item goto \type{../your-contextdir/tex/texmf-context/tex/context/base} in your text editor +\item open a presentation: for example \type{s-pre-05.tex} +\item goto the end of the file and study the commands between + the \type{\start...\stoptext} pair +\item copy the commands into your own presentation file +\item invoke the presentation with \type{\usemodule[s][pre-05]} in de setup + area of your presentation file +\item process the file to view the result +\item edit the content of your presentation +\stopitemize + +A stepwise setup of a presentation is given at the +\goto{\CONTEXTWIKI}[ url (http://wiki.contextgarden.net/Presentations) ]. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-processingfiles.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-processingfiles.tex new file mode 100644 index 000000000..1ceabfeb1 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-processingfiles.tex @@ -0,0 +1,44 @@ +\startcomponent ma-cb-en-processingfiles + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=The \type{context} command,reference=contextcommand] + +\index{\type{context} (command)} +\index{\type{mtxrun} (command)} +\index{processing TeX file} + +You can process a \TEX\ file or run \CONTEXT\ with the command \type{context} +that you can type at your console: + +\starttyping +context myfile +\stoptyping + +\CONTEXT\ will make multiple runs to get the layout, references, lists and +pagenumbering straight. You can see those runs echoed on your screen and listed +in the \type{myfile.log} file. + +You can add parameters to give the command \type{context} additional +tasks while processing the file. If you want start up \READER\ automatically +you can type: + +\starttyping +context --autopdf myfile +\stoptyping + +A full overview of the parameters is given when you type: + +\starttyping +context --help +\stoptyping + +Please refer to the manual \goto{luatools, mtxrun, context}[ url (manual:tools) ] +for more information on running \CONTEXT. + +\stopchapter + + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-references.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-references.tex new file mode 100644 index 000000000..bc758e521 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-references.tex @@ -0,0 +1,148 @@ +\startcomponent ma-cb-en-references + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Refering to text elements] + +\index{refering} +\index{label} + +\Command{\tex{in}} +\Command{\tex{at}} +\Command{\tex{pagereference}} + +To disclose your document for your readers you can use the table of contents and +the register. However, it is not uncommon to refer to specific text elements like +formulas, tables, images and sections to enhance readability. + +For refering from one location in a document to another you can use the command: + +\shortsetup{in} + +The curly braces contain text and the brackets contain a logical label. If you have +written a chapter header like this: + +\starttyping +\startchapter[title=Hotels in Hasselt,reference=hotel] + ... +\stopchapter +\stoptyping + +then you can refer to this chapter with: + +\starttyping +\in{chapter}[hotel] +\stoptyping + +After processing the chapter number is available and the reference could look +something like: {\em chapter 23}. You can use \type{\in} for any references to +text elements like chapters, sections, figures, tables, formulas etc. + +Another example: + +\startbuffer +There are a number of things you can do in Hasselt: + +\startitemize[n,packed] +\item swimming +\item sailing +\item[hiking] hiking +\item biking +\stopitemize + +An activity like \in{activity}[hiking] described on \at{page}[hiking] +is very tiring. +\stopbuffer + +\typebuffer + +This would look like this: + +\getbuffer + +As you can see, it is also possible to refer to pages. This is done with: + +\shortsetup{at} + +For example with: + +\starttyping +\at{page}[hiking] +\stoptyping + +This command can be used in combination with: + +\shortsetup{pagereference} + +and + +\shortsetup{textreference} + +If you want to refer to the chapter {\em Hotels in Hasselt} you could type: + +\startbuffer +Look in \in{chapter}[hotel] on \at{page}[hotel] for a complete +overview of accomodations in \pagereference[accomodation]Hasselt. +\stopbuffer + +\typebuffer + +A chapter number and a page number will be generated when processing the input +file. On another spot in the document you can refer to \type{accomodation} with +\type{\at{page}[accomodation]}. + +You can also define a set of labels separated by commas. + +\startbuffer +\placefigure + [here] + [fig:canals,fig:boats] + {A characteristic picture of Hasselt.} + {\externalfigure[ma-cb-08][width=10cm]} + +There are many canals in Hasselt (see \in{figure}[fig:canals]). +. +. +. +Boats can be moored in the canals of Hasselt (see +\in{figure}[fig:boats]). +\stopbuffer + +\typebuffer + +This might look like this: + +\getbuffer + +You can also refer to a title of a chapter or section or even a caption of an +image. This is done with: + +\shortsetup{about} + +This: + +\startbuffer +The caption of \in{figure}[fig:canals] is {\em \about[fig:canals]}. +\stopbuffer + +\typebuffer + +Becomes: + +\getbuffer + +With the command: + +\starttyping +\setupinteraction[state=start] +\stoptyping + +all references become active links. See \in{chapter}[interactivity] for more +information on this subject. + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-registers.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-registers.tex new file mode 100644 index 000000000..315e2bfa4 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-registers.tex @@ -0,0 +1,83 @@ +\startcomponent ma-cb-en-registers + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Registers] + +\index{register} + +\Command{\tex{index}} +\Command{\tex{placeindex}} +\Command{\tex{completeindex}} +\Command{\tex{defineregister}} +\Command{\tex{placeregister}} +\Command{\tex{completeregister}} +\Command{\tex{setupregister}} + +It is possible to generate one or more registers. By default the command +\type{\index} is available. If you want to add a word to the index you type: + +\starttyping +\index{town hall} +\stoptyping + +The word {\em town hall} will appear as an index entry in the sorted register. +Sometimes the index word does not appear in normal alphabetic order. For example, +entries such as symbols have to provide extra sorting information in order to +produce a correct alphabetical list: + +\starttyping +\index[minus]{$-$} +\stoptyping + +Sometimes you have sub- or sub sub entries. These can be defined as follows: + +\starttyping +\index{town hall+location} +\index{town hall+architecture} +\stoptyping + +You can generate your register with the command: + +\starttyping +\placeindex +\stoptyping + +or + +\starttyping +\completeindex +\stoptyping + +The command \type{\index} is a predefined \CONTEXT\ command, but of course you +can also define your own registers. + +\shortsetup{defineregister} + +For example if you want to make a new register based on the streets in Hasselt +you could type: + +\starttyping +\defineregister[street] +\stoptyping + +Now a new register command \type{\street} is available. Now +\type{\street{Ridderstraat}} is a new index entry. To produce a list of entries +you could now use: + +\starttyping +\placeregister[street] +\placestreet +\completestreet +\stoptyping + +You can alter the layout of the registers with: + +\shortsetup{setupregister} + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-runtimefiles.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-runtimefiles.tex new file mode 100644 index 000000000..d72b536a5 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-runtimefiles.tex @@ -0,0 +1,41 @@ +\startcomponent ma-cb-en-runtimefiles + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Auxilliary files,reference=runtimefiles] + +\index[tuc]{{\tt tuc}--file} +\index{auxilliary files} + +\CONTEXT\ will produce a number of auxilliary files during processing. If your +input file is called \type{myfile.tex} the following files may appear on your +working directory. + +\index[tuc]{{\tt tuc}--file} +\index{auxilliary files} + +\starttabulate[|l|l|l|] +\HL +\NC \darkgray \bf \CONTEXT\ MkII \NC \bf \CONTEXT\ MkIV \NC \bf Meaning \NC\NR +\HL +\NC \darkgray \tt myfile.tex \NC \tt myfile.tex \NC your text file \NC\NR +\HL +\NC \darkgray \tt myfile.log \NC \tt myfile.log \NC log information \NC\NR +\NC \darkgray \tt myfile.tuo \NC \tt myfile.tuc \NC output information \NC\NR +\NC \darkgray \tt myfile.tui \NC \NC \darkgray input information \NC\NR +\NC \darkgray \tt myfile.tmp \NC \NC \darkgray temporary information \NC\NR +\NC \darkgray \tt mpgraph.mp \NC \NC \darkgray \METAPOST\ information \NC\NR +\HL +\NC \darkgray \tt myfile.pdf \NC \tt myfile.pdf \NC result file \NC\NR +\HL +\stoptabulate + +The \type{myfile.tuc} file contains information about registers, lists and +references which will be used when necessary. The \type{myfile.log} +can be viewed in case there are problems during processing. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-setupcommands.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-setupcommands.tex new file mode 100644 index 000000000..2f087ea8d --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-setupcommands.tex @@ -0,0 +1,54 @@ +\startcomponent ma-cb-en-setupcommands + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Setup commands] + +\index{set up} +\index{layout} + +Global commands are placed in the setup area of your input file, before +\type{\starttext}. In \in{appendix}[commandsetups] there is a complete overview of the +available commands and their parameters. + +The set up commands all have the same structure. They look something like: + +\shortsetup{setupparagraphs} + +A set up command consists of a more or less logical name and a number of bracket +pairs. Bracket pairs may be optional and in that case the \type{[]} are typeset +slanted {\tt \sl []}. In the definition the bracket pairs may contain: + +\starttyping +\setupacommand[.1.][.2.][..,..=..,..] +\stoptyping + +The commas indicate that a list of parameters can be enclosed. In the options +list following the definition, the \type{.1.} and \type{.2.} show the possible +options that can be set in the first and second bracket pair respectively. The +parameters and their possible values are placed in the third bracket pair. + +The default options and parameter values are underlined. + +Furthermore you will notice that some values are typeset in a slanted way: {\sl +section}, {\sl name}, {\sl dimension}, {\sl number}, {\sl command} and {\sl +text}. This indicates that you can set the value yourself. + +\starttabulate[|S||] +\NC section \NC a section name like chapter, section, subsection etc. \NC\NR +\NC name \NC an identifier (logical name) \NC\NR +\NC dimension \NC a dimension with a unit in \type{cm}, \type{pt}, + \type{em}, \type{ex}, \type{sp} or \type{in} \NC\NR +\NC number \NC an integer \NC\NR +\NC command \NC a command \NC\NR +\NC text \NC text \NC\NR +\stoptabulate + +In the \goto {Quick Reference} [ url (manual:qr-en) ] +manual you can find a complete overview of the commands and their parameters. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-sortedlists.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-sortedlists.tex new file mode 100644 index 000000000..c3b47ea27 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-sortedlists.tex @@ -0,0 +1,71 @@ +\startcomponent ma-cb-en-sortedlists + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=synonyms,title=Sorted lists] + +\index{sorted lists} + +\Command{\tex{definesorting}} +\Command{\tex{setupsorting}} +\Command{\tex{sort}} +\Command{\tex{placelistofsorts}} +\Command{\tex{completelistofsorts}} + +If you want to create a sorted list you can use: + +\shortsetup{definesorting} + +For example: + +\startbuffer +\define[1]\street{#1\Street{#1}} +\definesorting[Street][Streets] +\setupsorting[Street][criterium=all] + +When you walk in the \street{Eikenlaan} you will cross the +\street{Vechtlaan} and \street{Gasthuisstraat}. Go left into the +\street{Gasthuisstraat} and take another left on the +\street{Heerengracht}. You walk along the canal to the +\street{Ridderstraat}, there you turn right. Cross the canal and +turn left to the \street{Julianakade}. There you can enjoy the +view over the Zwartewater. + +So the streets you visited are: + +\placelistofStreets +\stopbuffer + +\typebuffer + +This will become: + +\getbuffer + +Note that the Gasthuisstraat appears only once in the list. + +The predefined \type{\logo} command is used for the consistent use of text logos. + +When you define: +\startbuffer +\logo [HSTEX] {Hassel\TeX} +\stopbuffer + +\getbuffer\typebuffer + +You can use that logo througout your text. + +\startbuffer +How would you call a \TEX\ based macropackage when you work +in Hasselt? \HSTEX? +\stopbuffer + +\typebuffer + +\getbuffer + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-specialcharacters.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-specialcharacters.tex new file mode 100644 index 000000000..619ccf3a6 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-specialcharacters.tex @@ -0,0 +1,60 @@ +\startcomponent ma-cb-en-specialcharacters + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=special chars,title=Special characters] + +\index{special characters} + +You have seen that \CONTEXT\ commands are preceded by a \tex{} (backslash). This +means that \tex{} has a special meaning to \CONTEXT. Aside from \tex{} there are +other characters that need special attention when you want them to appear in +verbatim mode or in text mode. \in{Table}[tab:specchars] gives an overview of +these special characters and what you have to type to produce them. + +\placetable[here,force][tab:specchars] + {Special characters (1).} + {\starttable[|c|l|c|c|c|c|] + \HL + \NC \use2 \JustCenter{\bf Special character} \NC \use2 \bf Verbatim \NC \use2 \bf Text \NC\FR + \NC \bf Character \NC \bf Name \NC \bf Type \NC \bf Generates \NC \bf Type\NC \bf Generates \NC\LR + \HL + \NC \type{#} \NC hashtag \NC \type{\type{#}} \NC \type{#} \VL \type{\#} \NC \# \NC\FR + \NC \type{$} \NC dollar \NC \type{\type{$}} \NC \type{$} \VL \type{\$} \NC \$ \NC\MR + \NC \type{&} \NC ampersand \NC \type{\type{&}} \NC \type{&} \VL \type{\&} \NC \& \NC\MR + \NC \type{%} \NC percent \NC \type{\type{%}} \NC \type{%} \VL \type{\%} \NC \% \NC\MR + \NC \type{\} \NC backslash \NC \type{\type{\}} \NC \type{\} \VL \type{\backslash} \NC \backslash \NC\MR + \NC \type+{+ \NC right curly brace \NC \type-\type+{+- \NC \type+{+ \VL \type+\{+ \NC \{ \NC\MR + \NC \type+}+ \NC left curly brace \NC \type-\type+}+- \NC \type+}+ \VL \type+\}+ \NC \} \NC\MR + \NC \type{|} \NC vertical bar \NC \type{\type{|}} \NC \type{|} \VL \type{\|} \NC \| \NC\MR + \NC \type{_} \NC underscore \NC \type{\type{_}} \NC \type{_} \VL \type{\_} \NC \_ \NC\MR + \NC \type{~} \NC tilde \NC \type{\type{~}} \NC \type{~} \VL \type{\lettertilde} \NC \lettertilde \NC\MR + \NC \type{^} \NC caret \NC \type{\type{^}} \NC \type{^} \VL \type{\letterhat} \NC \letterhat \NC\LR + \HL + \stoptable} + +Other special characters have a meaning in typesetting mathematical expressions +and some can be used in math mode only (see \in{chapter}[formulas]). + +\placetable + [here,force] + [tab:special chars] + {Special characters (2).} + {\starttable[|c|c|c|c|c|] + \HL + \NC \bf \LOW{Special character} \NC \use2 \bf Verbatim \NC \use2 \bf Text \NC\FR + \NC \NC \bf Type \NC \bf Generates \NC \bf Type \NC \bf Generates \NC\LR + \HL + \NC \type{+} \NC \type{\type{+}} \NC \type{+} \VL \type{$+$} \NC $+$ \NC\FR + \NC \type{-} \NC \type{\type{-}} \NC \type{-} \VL \type{$-$} \NC $-$ \NC\MR + \NC \type{=} \NC \type{\type{=}} \NC \type{=} \VL \type{$=$} \NC $=$ \NC\MR + \NC \type{<} \NC \type{\type{<}} \NC \type{<} \VL \type{$<$} \NC $<$ \NC\MR + \NC \type{>} \NC \type{\type{>}} \NC \type{>} \VL \type{$>$} \NC $>$ \NC\LR + \HL + \stoptable} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-structure.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-structure.tex new file mode 100644 index 000000000..4001a6831 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-structure.tex @@ -0,0 +1,133 @@ +\startcomponent ma-cb-en-structure + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Defining a document] + +Every document is started with \type{\starttext} and closed with +\type{\stoptext}. All textual input is placed between these two commands and +\CONTEXT\ will only process that information. + +Setup information is placed in the set up area just before \type{\starttext}. + +\setuptyping + [escape=yes] + +\definestartstop + [comment][style={\rm}] + +\starttyping + +\setupbodyfont[12pt] /BTEX \comment{setuparea of document} /ETEX + +\starttext +This is a one line document. /BTEX \comment{your text} /ETEX +\stoptext +\stoptyping + +The definition of a (very simple) book could look something like this: + +\startbuffer +\starttext + +\startstandardmakeup + \midaligned{From Hasselt to America} + \midaligned{by} + \midaligned{J. Jonker and C. van Marle} +\stopstandardmakeup + +\title{Foreword} + +\chapter{Introduction} + +\chapter{The Rensselaer family} + +\chapter{The Lansing family} + +\chapter{The Cuyler family} + +\chapter{Appendix: Photos} + +\stoptext +\stopbuffer + +\typebuffer + +\CONTEXT\ comes with a predefined overall structure in which the document is +divided into four main document divisions:\footnote{Here we try to avoid the +word {\em section}.} + +\startitemize[n,packed] +\item front matter +\item body matter +\item appendices +\item back matter +\stopitemize + +The document divisions are defined with: + +\starttyping +\startfrontmatter ... \stopfrontmatter +\startbodymatter ... \stopbodymatter +\startappendices ... \stopappendices +\startbackmatter ... \stopbackmatter +\stoptyping + +The chapters in your book can be divided over these divisions. + +\startbuffer +\starttext + +\startstandardmakeup + \midaligned{From Hasselt to America} + \midaligned{by} + \midaligned{J. Jonker and C. van Marle} +\stopstandardmakeup + +\startfrontmatter + + \title{Preface} + + \chapter{Introduction} + +\stopfrontmatter + +\startbodymatter + + \chapter{The Rensselaer family} + + \chapter{The Lansing family} + + \chapter{The Cuyler family} + +\stopbodymatter + +\startappendices + + \chapter{Photos} + +\stopappendices + +\stoptext +\stopbuffer + +\typebuffer + +In the front matter as well as back matter the command \type{\chapter} +produces an un-numbered header in the table of contents. The front matter is mostly +used for the table of contents, the list of figures and tables, the preface, the +acknowledgements etc. It often comes with a roman page numbering. + +The appendices division is used for (indeed) appendices. Headers may be typeset in +a different way; for example, \type{\chapter} may be numbered alphabetically. + +The style of each document division can be set up with: + +\shortsetup{setupsectionblock} + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-support.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-support.tex new file mode 100644 index 000000000..cc6b5819f --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-support.tex @@ -0,0 +1,17 @@ +\startcomponent ma-cb-en-support + +\project ma-cb + +% only text + +For your Questions and Answers you can subscribe to the \goto {\CONTEXT\ mailing +list} [ url(list:context) ]. + +Visit the \goto {Pragma ADE website} [ url +(http://www.pragma-ade.com/overview.htm) ] for extensive information about +\CONTEXT. + +Goto the \goto {ConTeXt Garden} [ url (http://wiki.contextgarden.net) ] to find +all kinds of practical information on how to use \CONTEXT. + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-synonyms.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-synonyms.tex new file mode 100644 index 000000000..8d921d5b0 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-synonyms.tex @@ -0,0 +1,89 @@ +\startcomponent ma-cb-en-synonyms + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=synonyms,title=Synonyms] + +\index{synonyms} + +\Command{\tex{definesynonyms}} +\Command{\tex{setupsynonyms}} +\Command{\tex{abbreviation}} +\Command{\tex{infull}} +\Command{\tex{loadabbreviations}} +\Command{\tex{placelistofabbreviations}} +\Command{\tex{completelistofabbreviations}} + +In many documents people want to use specific words consistently throughout the +document. To enforce consistency the command below is available. + +\shortsetup{definesynonyms} + +The first bracket pair contains the singular form of the synonym, and the second +contains the plural form. The third bracket pair contains a command. + +For example the command \type{\abbreviation} is defined by: + +\starttyping +\definesynonyms[abbreviation][abbreviations][\infull] +\setupsynonyms[style=cap] +\stoptyping + +Now the command \type{\abbreviation} is available and can be used to state your +abbreviations: + +\starttyping +\abbreviation{ANWB}{Dutch Automobile Association} +\abbreviation{VVV}{Bureau of Tourist Information} +\abbreviation{NS}{Dutch Railways} +\stoptyping + +\abbreviation{VVV}{Bureau of Tourist Information} + +If you would type: + +\startbuffer +The Dutch \VVV\ (\infull{VVV}) can provide you with the tourist +information on Hasselt. +\stopbuffer + +\typebuffer + +You would obtain something like this: + +\getbuffer + +The list of synonyms or abbreviations is best defined in the set up area of your +input file for maintenance purposes. You can also store this kind of information +in an external file, and load the file (e.g. \type{abbrev.tex}) with: + +\starttyping +\input abbrev.tex +\stoptyping + +If you want to put a list of the abbreviations used in your document you can +type: + +\starttyping +\placelistofabbreviations +\stoptyping + +or + +\starttyping +\completelistofabbreviations +\stoptyping + +A complete and sorted list with used abbreviations and their meaning is produced. + +The typesetting of synonynms can be influenced with: + +\starttyping +\setupsynonyms +\stoptyping + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-tables.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-tables.tex new file mode 100644 index 000000000..39ce0cb4a --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-tables.tex @@ -0,0 +1,385 @@ +\startcomponent ma-cb-en-tables + +% AFO: the \start ... \stoplinetable mechanism is not stable enough + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=tables,title=Tables] + +\index{tables} +\index{natural tables} +\index{extreme tables} +\index{floating blocks} + +\Command{\tex{placetable}} +\Command{\tex{setuptables}} +\Command{\tex{starttable}} +\Command{\tex{startcombination}} +\Command{\tex{setupfloats}} +\Command{\tex{setupcaptions}} +\Command{\tex{NR}} +\Command{\tex{FR}} +\Command{\tex{LR}} +\Command{\tex{MR}} +\Command{\tex{SR}} +\Command{\tex{VL}} +\Command{\tex{NC}} +\Command{\tex{HL}} +\Command{\tex{DL}} +\Command{\tex{DC}} +\Command{\tex{DR}} +\Command{\tex{LOW}} +\Command{\tex{TWO}} +\Command{\tex{THREE}} +\Command{\tex{bTABLE}} +\Command{\tex{eTABLE}} +\Command{\tex{bTR}} +\Command{\tex{eTR}} +\Command{\tex{bTD}} +\Command{\tex{eTD}} +\Command{\tex{setupTABLE}} +\Command{\tex{startxtable}} +\Command{\tex{stopxtable}} +\Command{\tex{startxcell}} +\Command{\tex{startxrow}} +\Command{\tex{setupxtable}} + +There are a number of ways to define a table: + +\startitemize[packed] +\item the \type{\start ... \stoptable} mechanism, based on the work of M. Wichura +\item the \type{\bTABLE ... \eTABLE} mechanism (natural tables) +\item the \type{\start ... \stopxtable} mechanism (extreme tables) +\stopitemize + +In the next sections we describe the principles of the three table mechanisms. + +\startsection[title=Simple tables] + +For defining the table you use: + +\shortsetup{starttable} + +The definition of a table could look something like this: + +\startbuffer +\placetable + [here] + [tab:ships] + {Ships that moored at Hasselt.} + {\starttable[|c|c|] + \HL + \NC \bf Year \NC \bf Number of ships \NC\SR + \HL + \NC 1645 \NC 450 \NC\FR + \NC 1671 \NC 480 \NC\MR + \NC 1676 \NC 500 \NC\MR + \NC 1695 \NC 930 \NC\LR + \HL + \stoptable} +\stopbuffer + +\typebuffer + +This table is typeset as \in{table}[tab:ships]. + +\getbuffer + +Although this table mechanism is still available and supported in \CONTEXT\ +it is better to use one of the other mechanisms. + +\stopsection + +\startsection[title=Natural tables] + +The natural table mechanism (\type{\bTABLE ... \eTABLE}) is developed for more +complex tables and has features of the general interface of \CONTEXT. + +\startbuffer +\placetable + [here,force] + [tab:votedivision] + {Division of votes over political parties.} + {\bTABLE[align=middle,offset=4pt] + \bTABLEhead + \bTR[width=6cm] \bTD [nc=5] Elections City Council \eTD \eTR + \eTABLEhead + \bTABLEbody + \bTR \bTD[nr=2,align={right,lohi}] Party \eTD + \bTD[nc=3,foregroundstyle=bold] Districts \eTD + \bTD[nr=2,align={middle,lohi}] Total \eTD \eTR + \bTR \bTD 1 \eTD \bTD 2 \eTD \bTD 3 \eTD \eTR + \bTR \bTD[align=right] PvdA \eTD + \bTD 351 \eTD \bTD 433 \eTD \bTD 459 \eTD \bTD 1243 \eTD \eTR + \bTR \bTD[align=right] CDA \eTD + \bTD 346 \eTD \bTD 350 \eTD \bTD 285 \eTD \bTD ~981 \eTD \eTR + \bTR \bTD[align=right] VVD \eTD + \bTD 140 \eTD + \bTD[offset=2pt,background=color, + backgroundcolor=red,foregroundcolor=white, + foregroundstyle=bold,framecolor=blue, + rulethickness=2pt] 113 \eTD + \bTD 132 \eTD \bTD ~385 \eTD \eTR + \bTR \bTD[align=right] SGP \eTD + \bTD 348 \eTD \bTD 261 \eTD \bTD 158 \eTD \bTD ~767 \eTD \eTR + \bTR \bTD[align=right] GPV \eTD + \bTD 117 \eTD \bTD 192 \eTD \bTD 291 \eTD \bTD ~600 \eTD \eTR + \eTABLEbody + \eTABLE} +\stopbuffer + +\start +\switchtobodyfont[8pt] +\typebuffer +\stop + +In the last column a \type{~} is used to simulate a four digit number. The +\type{~} has the width of a digit. + +\start +\getbuffer +\stop + +The setup of the table is placed between the square brackets \type{[ ]}. To keep +the data in the table more readable you can set up the table with the \type +{\setupTABLE} command. + +\shortsetup{bTABLE} + +\startbuffer +\setupTABLE[row][align=middle,offset=4pt] +\setupTABLE[1][1][width=6cm] +\setupTABLE[1][2][align={right,lohi}] +\setupTABLE[5][2][align={right,lohi}] +\setupTABLE[2][2][foregroundstyle=bold] +\setupTABLE[1][4,5,6,7,8][align=right] +\setupTABLE[3][6][offset=2pt,background=color, + backgroundcolor=red,foregroundcolor=white, + foregroundstyle=bold,framecolor=blue, + rulethickness=2pt] + +\bTABLE + \bTABLEhead + \bTR \bTD[nc=5] Elections City Council \eTD \eTR + \bTR \bTD[nr=2] Party \eTD \bTD[nc=3] Districts \eTD \bTD[nr=2] Total \eTD \eTR + \bTR \bTD 1 \eTD \bTD 2 \eTD \bTD 3 \eTD \eTR + \eTABLEhead + \bTABLEbody + \bTR \bTD PvdA \eTD \bTD 351 \eTD \bTD 433 \eTD \bTD 459 \eTD \bTD 1243 \eTD \eTR + \bTR \bTD CDA \eTD \bTD 346 \eTD \bTD 350 \eTD \bTD 285 \eTD \bTD ~981 \eTD \eTR + \bTR \bTD VVD \eTD \bTD 140 \eTD \bTD 113 \eTD \bTD 132 \eTD \bTD ~385 \eTD \eTR + \bTR \bTD SGP \eTD \bTD 348 \eTD \bTD 261 \eTD \bTD 158 \eTD \bTD ~767 \eTD \eTR + \bTR \bTD GPV \eTD \bTD 117 \eTD \bTD 192 \eTD \bTD 291 \eTD \bTD ~600 \eTD \eTR + \eTABLEbody +\eTABLE +\stopbuffer + +\start +\switchtobodyfont[8pt] +\typebuffer +\stop + +The meaning of the \CONTEXT\ commands are indicated in \in {table} +[tab:tablecommands02]. + +\placetable + [] + [tab:tablecommands02] + {Commands to define natural tables.} + {\starttable[|l|l|] + \HL + \NC \bf Command \NC \bf Meaning \NC\SR + \HL + \NC \type{\bTABLE ... \eTABLE} \NC begin end table \NC\FR + \NC \type{\bTR ... \eTR} \NC begin end row \NC\MR + \NC \type{\bTD ... \eTD} \NC begin end column \NC\MR + \NC \type{\bTABLEhead ... \eTABLEhead} \NC begin end tablehead \NC\MR + \NC \type{\bTABLEbody ... \eTABLEbody} \NC begin end tablebody \NC\MR + \NC \type{\bTABLEfoot ...\eTABLEfoot} \NC begin end tablefoot \NC\MR + \NC \type{\setupTABLE} \NC table setup \NC\LR + \HL + \stoptable} + +You can find more information on this table mechanism on the \CONTEXTWIKI\ and +examples in the \goto {\em Natural Tables} [ url (manual:nattab) ] manual. + +\stopsection + +\startsection[title=Extreme tables] + +For large tables that extend over a number of pages and where you want the +table head repeated after each pagebreak \CONTEXT\ has the {\em extreme table} +mechanism. + +\shortsetup{startxtable} + +\startbuffer +\setupxtable[split=yes,header=repeat] +\setupxtable[offset=4pt] + +\placetable + [] + [tab:wealthdecline] + {Decline of wealth through the ages.} + {\startxtable + \startxtablehead[align=middle,foregroundstyle=bold] + \startxrow + \startxcell[nx=6] + Decline of wealth in Dutch florine (Dfl) + \stopxcell + \stopxrow + \startxrow[foregroundstyle=bold] + \startxcell[width=1.2cm] Year \stopxcell + \startxcell 1.000--2.000 \stopxcell + \startxcell 2.000--3.000 \stopxcell + \startxcell 3.000--5.000 \stopxcell + \startxcell 5.000--10.000 \stopxcell + \startxcell over 10.000 \stopxcell + \stopxrow + \stopxtablehead + \startxtablenext + \startxrow + \startxcell[nx=6,align=middle,foregroundstyle=bold] + Decline of wealth in Dutch florine (Dfl) / Continued + \stopxcell + \stopxrow + \startxrow[foregroundstyle=bold] + \startxcell Year \stopxcell + \startxcell 1.000--2.000 \stopxcell + \startxcell 2.000--3.000 \stopxcell + \startxcell 3.000--5.000 \stopxcell + \startxcell 5.000--10.000 \stopxcell + \startxcell over 10.000 \stopxcell + \stopxrow + \stopxtablenext + \startxtablebody[align=middle] + \startxrow + \startxcell 1675 \stopxcell + \startxcell 22 \stopxcell + \startxcell ~7 \stopxcell + \startxcell ~5 \stopxcell + \startxcell ~4 \stopxcell + \startxcell ~5 \stopxcell + \stopxrow + \startxrow + \startxcell 1724 \stopxcell + \startxcell ~4 \stopxcell + \startxcell ~4 \stopxcell + \startxcell -- \stopxcell + \startxcell ~4 \stopxcell + \startxcell ~3 \stopxcell + \stopxrow + \startxrow + \startxcell 1750 \stopxcell + \startxcell 12 \stopxcell + \startxcell ~3 \stopxcell + \startxcell ~2 \stopxcell + \startxcell ~2 \stopxcell + \startxcell -- \stopxcell + \stopxrow + \startxrow + \startxcell 1808 \stopxcell + \startxcell ~9 \stopxcell + \startxcell ~2 \stopxcell + \startxcell -- \stopxcell + \startxcell -- \stopxcell + \startxcell -- \stopxcell + \stopxrow + \stopxtablebody + \stopxtable} +\stopbuffer + +\start +\switchtobodyfont[8pt] +\typebuffer +\stop + +With the \type{\setupxtable} it is indicated that the table is allowed to split +at a pagebreak and that the head should contain the content of the \type {\start +... \stopxtablenext}. + +The result of this definition is shown in \in {table} [tab:wealthdecline]. + +\getbuffer + +The meaning of the commands are explained \in {table} [tab:tablecommands03]. + +\placetable + [] + [tab:tablecommands03] + {Commands to define extreme tables.} + {\starttable[|l|l|] + \HL + \NC \bf Command \NC \bf Meaning \NC\SR + \HL + \NC \type{\startxtable ... \stopxtable} \NC begin end table \NC\FR + \NC \type{\startxrow ... \stopxrow} \NC begin end row \NC\MR + \NC \type{\startxcell ... \stopxcell} \NC begin end column \NC\MR + \NC \type{\startxtablehead ... \stopxtablehead} \NC begin end tablehead \NC\MR + \NC \type{\startxtablebody ... \stopxtablebody} \NC begin end tablebody \NC\MR + \NC \type{\startxtablefoot ... \stopxtablefoot} \NC begin end tablefoot \NC\MR + \NC \type{\setupxtable} \NC table setup \NC\LR + \HL + \stoptable} + +More information and examples can be found in the \goto {\em Extreme Tables} [ +url (manual:extab) ] manual. + +\stopsection + +\startsection[title=Placing tables] + +In all examples you see the command \type{\placetable}. This command has +the same function as \type{placefigure}. It takes care of the vertical +spacing and numbering. The float mechanism is invoked and the table will +end up on the most optimal location in your document. + +\shortsetup{placefloat} + +You can also set up the layout of tables with: + +\shortsetup{setupfloats} + +You can set up the numbering and the labels with: + +\shortsetup{setupcaptions} + +These commands are typed in the set up area of your input file and have a global +effect on all floating blocks. + +\startbuffer +\setupfloats[location=left] +\setupcaptions[style=boldslanted,location={right,middle}] + +\placetable[here][tab:opening hours]{Library opening hours.} + {\bTABLE[offset=4pt] + \bTR \bTD \bf Day \eTD \bTD[nx=2,align=middle] \bf Opening hours \eTD \eTR + \bTR \bTD Monday \eTD \bTD 14.00 -- 17.30 \eTD \bTD 18.30 -- 20.30 \eTD \eTR + \bTR \bTD Tuesday \eTD \bTD \eTD \bTD \eTD \eTR + \bTR \bTD Wednesday \eTD \bTD 10.00 -- 12.00 \eTD \bTD 14.00 -- 17.30 \eTD \eTR + \bTR \bTD Thursday \eTD \bTD 14.00 -- 17.30 \eTD \bTD 18.30 -- 20.30 \eTD \eTR + \bTR \bTD Friday \eTD \bTD 14.00 -- 17.30 \eTD \bTD \eTD \eTR + \bTR \bTD Saturday \eTD \bTD 10.00 -- 12.30 \eTD \bTD \eTD \eTR + \eTABLE} +\stopbuffer + +\start +\switchtobodyfont[8pt] +\typebuffer +\stop + +The result is displayed in \in{table}[tab:opening hours]. + +\start +\getbuffer +\stop + +\stopsection + +% AFO: the \start ... \stoplinetable mechanism is not stable enough + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-tablesofcontent.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-tablesofcontent.tex new file mode 100644 index 000000000..0bc81014e --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-tablesofcontent.tex @@ -0,0 +1,174 @@ +\startcomponent ma-cb-en-tablesofcontent + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Table of contents (lists)] + +\index{table of contents} +\index{list} + +\Command{\tex{completecontent}} +\Command{\tex{placecontent}} +\Command{\tex{definelist}} +\Command{\tex{setuplist}} +\Command{\tex{writetolist}} +\Command{\tex{writebetweenlist}} +\Command{\tex{definecombinedlist}} +\Command{\tex{setupcombinedlist}} + +A table of contents contains chapter numbers, chapter titles and page numbers and +can be extended with sections, sub sections, etc. A table of contents is +generated automatically by typing: + +\starttyping +\placecontent +\stoptyping + +Which table of contents is produced depends on the location of this command in +your document. At the start of the document it will generate a list of chapters, +sections etc. But at the top of a chapter: + +\startbuffer +\chapter{Hasselt in Summer} + +\placecontent + +\section{Hasselt in July} + +\section{Hasselt in August} + +\stopbuffer + +\typebuffer + +it will only produce a list of (sub) section titles with the corresponding +section numbers and page numbers. + +The predefined command \type{\placecontent} is available because it was defined +with: + +\shortsetup{definecombinedlist} + +This command and \type{\definelist} allows you to define your own lists necessary +for accessing your documents. + +The use of this command and its related commands is illustrated for the default available +table of contents. + +\startbuffer +\definelist[chapter] +\setuplist + [chapter] + [before=\blank, + after=\blank, + style=bold] + +\definelist[section] +\setuplist + [section] + [alternative=d] +\stopbuffer + +\typebuffer + +Now there are two lists of chapters and sections and these will be combined in a +table of contents with the command \type{\definecombinedlist}. + +\startbuffer +\definecombinedlist + [content] + [chapter,section] + [level=subsection] +\stopbuffer + +\typebuffer + +Now two commands are available: \type{\placecontent} and \type{\completecontent}. +With the second command the title of the table of contents will be added to the +table of contents. + +The layout of lists can be varied with the parameter \type{alternative}. + +\placetable + [here,force] + [tab:alternatives] + {Alternatives for displaying lists.} + {\starttable[|c|l|] + \HL + \NC \bf Alternative \NC \bf Display \NC\SR + \HL + \NC \type{a} \NC number -- title -- page number \NC\FR + \NC \type{b} \NC number -- title -- spaces -- page number \NC\MR + \NC \type{c} \NC number -- title -- dots -- page number \NC\MR + \NC \type{d} \NC number -- title -- page number (continuing) \NC\MR + \NC \type{e} \NC reserved for interactive purposes \NC\MR + \NC \type{f} \NC reserved for interactive purposes \NC\MR + \NC \type{g} \NC reserved for interactive purposes \NC\LR + \HL + \stoptable} + +Lists are set up with: + +\shortsetup{setuplist} +\shortsetup{setupcombinedlist} + +If you want to change the layout of the generated table of contents you'll have +to remember that it is a (combined) list and that we can set the partial lists +separately. + +\startbuffer +\setuplist + [section] + [textstyle=bold, + pagestyle=bold, + numberstyle=bold] +\stopbuffer + +\typebuffer + +This will result in a bold page number, section title and section number. + +Lists are generated and placed with: + +\shortsetup{placelist} + +So if you want a list of sections at the beginning of a new chapter, you type: + +\starttyping +\placelist[section] +\stoptyping + +only the sections will be displayed. + +A long list or a long table of contents will use up more than one page. To be +able to force page breaking you can type: + +\starttyping +\placecontent[extras={8.2=page}] +\stoptyping + +A page break will then occur after section 8.2. + +In some cases you want to be able to write your own text in an automatically +generated list. This is done with: + +\shortsetup{writetolist} +\shortsetup{writebetweenlist} + +For example if you want to make a remark in your table of contents after a +section titled {\em Hotels in Hasselt} you can type: + +\startbuffer +\section{Hotels in Hasselt} +\writebetweenlist[section]{\blank} +\writetolist[section][location=here]{}{Section under construction} +\writebetweenlist[section]{\blank} +\stopbuffer + +\typebuffer + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-tabulations.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-tabulations.tex new file mode 100644 index 000000000..5ed877c76 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-tabulations.tex @@ -0,0 +1,163 @@ +\startcomponent ma-cb-en-tabulations + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=tabulation,title=Tabulation / Paragraph formatting] + +\index{tabulation} +\index{tables+running text} +\index{columns} +\Command{\tex{starttabulate}} +\Command{\tex{definetabulate}} +\Command{\tex{setuptabulate}} +\Command{\tex{NR}} +\Command{\tex{NC}} + +Sometimes you want to typeset paragraphs in a specific formatted way. This is +done with: + +\shortsetup{starttabulate} + +The tabulation mechanism is closely related to the table mechanism. You can use +the tabulation mechanism in cases you want to typeset complete paragraphs within +a cell. The tabulation mechanism also works fine at a page break. + +\startbuffer +\starttabulate[|w(1.5cm)B|p(6.0cm)|p|] +\NC 1252 + \NC Hasselt obtains its city charter from bishop Hendrik + van Vianden. + \NC Hendrik van Vianden was pressed by other towns not + to agree with the charter. It took Hasselt a long + period of time to convince the Bishop. After + supporting the Bishop in a small war against the + Drents, the charter was released. \NC\NR +\NC 1350 + \NC Hasselt joins the Hanzepact to protect their + international trade. + \NC The Hanzepact was of great importance for merchants + in Hasselt. In those days trading goods were taxed + at every city, highway or rivercrossing. After + joining the Hanzepact duty free routes all over + Europe became available to Hasselt. However + important the Hanzepact was, Hasselt always stayed a + minor member of the pact. \NC\NR +\stoptabulate +\stopbuffer + +A tabulate definition could look like this: + +\typebuffer + +In this case the first column is \unit{1.5 centi meter} wide and is typeset bold +(\type{B}). The second column has a width of \unit{6 centi meter} and is typeset +like a paragraph. The remaining horizontal space is used up by the last +paragraph. + +The example is typeset like this: + +\getbuffer + +The tabulation entries are placed between the \type{\start ... \stoptabulate} +pair. Between the bracket pair your can specify the tabulate format with the +column separators \type{|} and the format keys (see \in {table} +[tab:tabularformattingkeys]). + +\placetable[][tab:tabularformattingkeys] + {Formatting keys for tabulate.} + {\starttable[|lT|l|lT|l|] + \HL + \NC \rm \bf Key \NC \rm \bf Meaning + \NC \rm \bf Key \NC \rm \bf Meaning + \NC \SR + \HL + \NC l \NC left align + \NC I \NC \it italic + \NC \FR + \NC c \NC center + \NC R \NC \sl roman + \NC \MR + \NC r \NC right align + \NC S \NC \sl slanted + \NC \MR + \NC i\sl n \NC spacing left + \NC T \NC \tt teletype + \NC \MR + \NC j\sl n \NC spacing right + \NC m \NC in||line math + \NC \MR + \NC k\sl n \NC spacing around + \NC M \NC display math + \NC \MR + \NC w({\sl d}) \NC 1 line, fixed width + \NC f\tex{command} \NC font specification + \NC \MR + \NC p({\sl d}) \NC paragraph, fixed width + \NC b\arg{..} \NC place \type{..} before the entry + \NC \MR + \NC p \NC paragraph, maximum width + \NC a\arg{..} \NC place \type{..} after the entry + \NC \MR + \NC B \NC \bf boldface + \NC h\tex{command} \NC apply \tex{command} on the entry + \NC \LR + \HL + \stoptable} + +In \in {table} [tab:tabulatestructurecommands] you find an overview +of the tabulate structuring commands. + +\placetable + [] + [tab:tabulatestructurecommands] + {Commands to define tabulate.} + {\starttable[|l|l|l|] + \HL + \NC \bf Command \NC \NC \bf Meaning \NC\SR + \HL + \NC \type{\start ... \stoptabulate} \NC \NC begin end tabulate \NC\FR + \NC \type{\NC} \NC next column \NC next column \NC\MR + \NC \type{\NR} \NC next row \NC next row \NC\MR + \NC \type{\HL} \NC horizontal line \NC horizontal line \NC\MR + \NC \type{\TB} \NC table blank \NC empty line \NC\MR + \NC \type{\definetabulate} \NC \NC define own tabulate \NC\MR + \NC \type{\setuptabulate} \NC \NC tabulate setup \NC\LR + \HL + \stoptable} + +Another example of paragraph formatting could look like this. + +\startbuffer +\definetabulate[ChemPar][|l|p|l|] + +\startChemPar +\NC Limekilns + \NC Hasselt has its own limekilns. These were build in 1504 + and produced quick lime up to 1956. Nowadays they are a + tourist attraction. + \NC \inlinechemical{CaCO_3,GIVES,CaO,+,CO_2} \NC\NR +\stopChemPar +\stopbuffer + +\typebuffer + +And it would come out like this: + +\getbuffer + +In \in{chapter}[chemical] your can find some more information on chemistry +and \CONTEXT. + +Here we also introduced the command to define our own paragraph layout. + +\shortsetup{definetabulate} + +and we also have: + +\shortsetup{setuptabulate} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-textbackgrounds.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-textbackgrounds.tex new file mode 100644 index 000000000..0f4689f3f --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-textbackgrounds.tex @@ -0,0 +1,55 @@ +\startcomponent ma-cb-en-textbackgrounds + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Background in paragraphs] + +\index{background+text} + +\Command{\tex{setuptextbackground}} +\Command{\tex{definetextbackground}} +\Command{\tex{starttextbackground}} + +To emphasize a paragraph you can use backgrounds. A background is set with the +command pair: + +\shortsetup{starttextbackground} + +An example can illustrate the use: + +\startbuffer +\setuptextbackground + [corner=round,frame=on, + location=paragraph, + leftoffset=.5\bodyfontsize, + rightoffset=.5\bodyfontsize, + bottomoffset=5pt] + +\starttextbackground +Hasselt has produced a number of well known people. Only recently +it turned out that Kilian van Rensselaer played a prominent role +in the foundation of the State of New York. +\stoptextbackground +\stopbuffer + +\typebuffer + +This would be displayed as: + +\getbuffer + +Backgrounds can span multiple pages. + +You can vary the display of the backgrounds with: + +\shortsetup{setuptextbackground} + +You can even define your own text backgrounds with: + +\shortsetup{definetextbackground} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-texteditor.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-texteditor.tex new file mode 100644 index 000000000..bed8017d5 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-texteditor.tex @@ -0,0 +1,32 @@ +\startcomponent ma-cb-en-texteditor + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=texteditor,title=The \SCITE\ text editor] + +The developers of \CONTEXT\ have always been able to proces their \TEX\ files +from a text editor. In that way \CONTEXT\ became an effective authoring tool. + +At this moment the text editors \SCITE\ and \TEXWORKS\ are more or less part of +the \CONTEXT\ distribution. + +Please refer to the \goto {\CONTEXTWIKI} [ url (http://wiki.contextgarden.net/Windows_Installation:_ConTeXt_Suite_with_SciTe) ] +and learn how to install \SCITE. + +\SCITE\ supports the: + +\startitemize[packed] +\item processing \TEX\ of files +\item colored display of commands (lexing) +\item syntax checking of \TEX, \XML\ and \LUA\ files +\item spell checking of your text +\stopitemize + +The \CONTEXT\ specific support of \SCITE\ is described in the manual \goto +{\SCITE\ in \CONTEXT} [ url (manual:scite) ]. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-units.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-units.tex new file mode 100644 index 000000000..ce596c0b5 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-units.tex @@ -0,0 +1,101 @@ +\startcomponent ma-cb-en-units + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[reference=units,title=Units] + +\index{units} +\index[siunit]{SI--unit} + +\Command{\tex{unit}} + +To force yourself to use dimensions and units consistently throughout your +document you can use the \type{\unit} command. Let's give a few examples: + +\startbuffer +\unit{meter per square meter} +\unit{cubic meter per sec} +\unit{square milli meter per inch} +\unit{centi liter per sec} +\unit{meter inverse sec} +\unit{newton per square inch} +\unit{newton times meter per square sec} +\stopbuffer + +\typebuffer + +It looks like a lot of typing but it does guarantee a consistent use of units. +The command \type{\unit} also prevents linebreaking between number and unit. +The examples above come out as: + +\startnarrower +\startlines +\getbuffer +\stoplines +\stopnarrower + +You can add your own units with: + +\shortsetup{registerunit} + +and set them up with: + +\shortsetup{setupunit} + +\startbuffer +\registerunit[unit][inhab=inhabitants] \setupunittext[inhabitants=inh] +\registerunit[unit][north=north] \setupunittext[north= N] +\registerunit[unit][east=east] \setupunittext[east= E] + +Hasselt is part of the municipality of Zwartewaterland +(coordinates \unit {52 degrees 35 arcminute north}, +\unit {6 degrees 5 arcminute east}). Its area is about +\unit {88 square kilometer} (land \unit {83 square kilom} +and water \unit{5 square km}). As of 1st Augustus 2013 the +population is 22.201 that is \unit {268 inhab per square kilo +meter}). +\stopbuffer + +In the example below you can see some new units and the non-consistent +use of \unit{kilo meter}. + +\typebuffer + +This results in: + +\getbuffer + +The \type{\unit} command also allows you to align rows of units in a column. + +\startbuffer +\bTABLE +\bTR \bTD \bf Street \eTD \bTD \bf Length \eTD \eTR +\bTR \bTD Ridderstraat \eTD \bTD \unit{_,160 meter} \eTD \eTR +\bTR \bTD Prinsengracht \eTD \bTD \unit{_,240 meter} \eTD \eTR +\bTR \bTD Kalverstraat \eTD \bTD \unit{_,_60 meter} \eTD \eTR +\bTR \bTD H.A.W. van de Vechtlaan \eTD \bTD \unit{1,250 meter} \eTD \eTR +\bTR \bTD Meestersteeg \eTD \bTD \unit{_,_45 meter} \eTD \eTR +\eTABLE +\stopbuffer + +When you type: + +\typebuffer + +It will generate a well aligned second column: + +\bgroup +\setupTABLE[frame=off,offset=0pt] +\setupTABLE[c][1][width=4.5cm] + +\getbuffer +\egroup + +Please refer to the manual \goto {\em Units} [ url(manual:units) ] for more +information and details. + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-usersetups.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-usersetups.tex new file mode 100644 index 000000000..2d89e937a --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-usersetups.tex @@ -0,0 +1,68 @@ +\startcomponent ma-cb-en-usersetups + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=User specifications] + +\index{preamble} +\index{input file} + +The setup area of your document is the area before +the \type{\starttext} command. For example: + +\setuptyping + [escape=yes] + +\definestartstop + [comment][style={\rm}] + +\starttyping + /BTEX \comment{first line of your file} /ETEX +\setuplayout[width=25cm] /BTEX \comment{set the width of your text} /ETEX + /BTEX \comment{empty line for readability} /ETEX +\starttext /BTEX \comment{starts your text} /ETEX +Hello Hasselt. /BTEX \comment{your text} /ETEX +\stoptext /BTEX \comment{ends your text} /ETEX +\stoptyping + +Note that the first line of this file is empty. However, this first line +is a preamble and can be used for specific user specifications. For example: + +\starttyping +% engine=luatex /BTEX \comment{use the \type{luatex} engine} /ETEX + /BTEX \comment{empty line for readability} /ETEX +\setuplayout[width=25cm] /BTEX \comment{set the width of your text} /ETEX + /BTEX \comment{empty line for readability} /ETEX +\starttext /BTEX \comment{starts your text} /ETEX +Hello Hasselt. /BTEX \comment{your text} /ETEX +\stoptext /BTEX \comment{ends your text} /ETEX +\stoptyping + +Note that \CONTEXT\ sees the text after the \type{ % } +sign in this first line not as a comment. + +The preamble can have a meaning for both \CONTEXT\ and \SCITE: + +\starttyping +% engine=pdftex interface=en modes=screen language=uk + +\starttext +Hello Hasselt. +\stoptext +\stoptyping + +This will be interpreted as: + +\starttabulate[|T||p|] +\NC engine=pdftex \NC \CONTEXT \EQ run as \PDFTEX \NC\NR +\NC interface=en \NC \CONTEXT \EQ expect english \CONTEXT\ commands (lexing) \NC\NR +\NC \NC \SCITE \EQ use english lexing \NC\NR +\NC modes=screen \NC \CONTEXT \EQ invoke mode \type{screen} that is set in the text \NC\NR +\NC language=uk \NC \SCITE \EQ use the english spell checker \NC\NR +\stoptabulate + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en-whatever.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en-whatever.tex new file mode 100644 index 000000000..aa61bb0cb --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en-whatever.tex @@ -0,0 +1,1079 @@ +\startcomponent ma-cb-en-whatever + +\enablemode[**en-us] + +\project ma-cb + +\startchapter[title=Miscellaneous] + +\startsection[title=A titlepage] + +\index{titlepage} + +\Command{\tex{startstandardmakeup}} +\Command{\tex{definemakeup}} +\Command{\tex{setupmakeup}} + +In the first example of this manual on \at{page}[inputfile] we used the command: + +\shortsetup{startnamemakeup} +%\shortsetup{start<<name>>makeup} % does not work + +This command can be used to define titlepages. Such a command is needed since +title pages often have a different layout than that of the bodytext. With the +command pair \type{\start ... \stopstandardmakeup} you can make up a page within +the default page dimensions. + +A simple titlepage may look like this: + +\startbuffer +\startstandardmakeup +\blank +\rightaligned{\tfd Hasselt in the 21st century} +\blank +\rightaligned{\tfb The future} +\vfill +\rightaligned{\tfa C. van Marle} +\rightaligned{Hasselt, 2013} +\stopstandardmakeup +\stopbuffer + +\typebuffer + +In a doublesided document you have to go through some additional actions to +typeset the back of the titlepage. + +\startbuffer +\startstandardmakeup[doublesided=no] +\blank +\rightaligned{\tfd Hasselt in the 21st century} +\blank +\rightaligned{\tfb The future} +\vfill +\rightaligned{\tfa C. van Marle} +\rightaligned{Hasselt, \currentdate[year]} +\stopstandardmakeup +\startstandardmakeup[page=no] +\vfill +\copyright \currentdate[year] + +This book is dedicated to the people living in Hasselt. We +want to thank photographer J. Jonker for manipulating the +photos in this book in such a way that readers can get a +clear picture of Hasselt's future look. +\stopstandardmakeup +\stopbuffer + +\typebuffer + +Your own make ups can be made and set up with: + +\shortsetup{definemakeup} + +and + +\shortsetup{setupmakeup} + +Please refer to the \goto {\CONTEXTWIKI} [ url (http://wiki.contextgarden.net/Command/setupmakeup) ] +for more information on the \type{\start...\stopmakeup} command. + +\stopsection + +\startsection[reference=overlays,title=Overlays] + +\index{overlay} + +The overlay mechanism gives you the opportunity to add a specific layout +to a text component. When there is a background option in a \CONTEXT\ command +you can use overlays. + +\startbuffer +\defineoverlay + [verticalbar] + [{\blackrule[height=2cm,width=.5cm,color=red]}] + +\defineoverlay + [horizontalbar] + [{\blackrule[height=.5cm,width=12cm,color=red]}] + +\framed + [width=12cm, + height=6cm, + background={color,foreground,verticalbar,horizontalbar}, + offset=overlay, + backgroundcolor=blue, + frame=off] + {\blackrule[width=12cm,height=2cm,color=white]} +\stopbuffer + +The flag of Hasselt could be defined with framed and a number of overlays: + +\typebuffer + +This will become: + +\startlinecorrection +\getbuffer +\stoplinecorrection + +The pagenumber in this manual has a background with an overlay where the +\type{\MPclipFive} command takes care of drawing the image with \METAPOST. + +\startbuffer +\defineoverlay + [NumberBackground] + [\MPclipFive{\overlaywidth}{\overlayheight}{30pt}{5pt}] + +\setuppagenumbering + [\location={footer,middle}, + \command=\NummerCommand] + +\def\NummerCommand#1% + {\framed + [\background=NumberBackground, + \frame=off, + \offset=6pt] + {\lower.5\dp\strutbox\hbox spread 60pt{\hss#1\hss}}} +\stopbuffer + +\typebuffer + +\stopsection + +\startsection[reference=setups,title=Setups] + +\index{setups} + +\Command{\tex{setup}} + +While defining the layout of a document you can define setups +with \type{\start...\stopsetups}. Setups are placed in the setup area of +input file and mostly used to combine a number of commands. + +\startbuffer +\startsetups colorize + \blue +\stopsetups + +\startsetups decolorize + \black +\stopsetups + +\setupitemize + [before=\setups{colorize}, + after=\setups{decolorize}] + +Some data on the church are: + +\startitemize[packed,3*broad] +\sym{997} mentioned for the first time +\sym{1380} destroyed by fire +\sym{1466} rebuild +\sym{1657} restored after shelling by enemy troops +\sym{1725} struck by lightning +\stopitemize + +\stopbuffer + +\typebuffer + +Which would result in: + +\start % AFO: to keep color and distance local +\getbuffer +\stop + +Another way of invoking the setups is by the \type{setups} option +that comes with some \CONTEXT\ commands: + +\startbuffer +\definestartstop[remark] + +\setupstartstop[remark] + [before=\startframed, + after=\stopframed] + +\startsetups important + \inleftmargin + [scope=local, + hoffset=1em]{\bf\color[blue]{→}} +\stopsetups + +\setupframed + [align=normal, + setups=important, + frame=on, + framecolor=blue, + offset=5pt] + +\startremark + The Stephanus Church was built in 997. After an enormous + fire in 1380 it was rebuilt and that's why it has Gothic + features. The rebuilding was finished in 1466.\endgraf +\stopremark +\stopbuffer + +\typebuffer + +This becomes: + +\blank + +\start +\getbuffer +\stop + +\stopsection + +\startsection[reference=variables,title=Variables] + +\index{variables} + +\Command{\tex{getvariable}} +\Command{\tex{setvariables}} + +There is a mechanism in \CONTEXT\ that enables you to compact information in a +list of variables that you can recall throughout the document. + +\shortsetup{setvariables} + +The example below shows how to use variables in defining a coverpage. + +\startbuffer +\setvariables + [cover] + [set=\setups{coverpage}, + student=no, + teacher=yes, + title=From Hasselt to America, + subtitle=An Odyssey, + authors=\setup{allauthors}, + edition=2012, + isbn=0123456789] +\stopbuffer + +\typebuffer + +The moment you need the title on your cover page (or somewhere else in your document) you can +summon it by: + +\startbuffer +\getvariable{cover}{title} +\stopbuffer + +\typebuffer + +\stopsection + +\startsection[reference=floatingblocks,title=Floating blocks] + +\index{floating blocks} +\index{postponing a block} + +\Command{\tex{definefloat}} +\Command{\tex{setupfloat}} +\Command{\tex{setupfloats}} +\Command{\tex{setupcaptions}} +\Command{\tex{placeintermezzo}} + +A block in \CONTEXT\ is a text element, for example a table or a figure that you +can process in a special way. You have already seen the use of +\type{\placefigure} and \type{\placetable}. These are both examples of floating +blocks. The floating mechanism is described in \in{chapter}[figures] and +\in[tables]. + +You can define these kind of blocks yourself with: + +\shortsetup{definefloat} + +The bracket pairs are used for the name in singular and +plural form. For example: + +\starttyping +\definefloat[intermezzo][intermezzi] +\stoptyping + +Now the following commands are available: + +\starttyping +\placeintermezzo[][]{}{} +\startintermezzotext ... \stopintermezzotext +\placelistofintermezzi +\completelistofintermezzi +\stoptyping + +The newly defined floating block can be set up with: + +\shortsetup{setupfloat} + +You can set up the layout of floating blocks with: + +\shortsetup{setupfloats} + +You can set up the numbering and the labels with: + +\shortsetup{setupcaption} + +These commands are typed in the set up area of your input file and will have a +global effect on all floating blocks. + +\setupframedtexts + [width=.8\makeupwidth, + background=color, + backgroundcolor=gray, + corner=round, + framecolor=blue, + rulethickness=2pt] + +\startbuffer +\setupfloat[intermezzo][location=middle] +\setupcaption[location=bottom,headstyle=boldslanted] + +\placeintermezzo{An intermezzo.} +\startframedtext +At the beginning of this century there was a tram line from +Zwolle to Blokzijl via Hasselt. Other means of transport became +more important and just before the second world war the tram line +was stopped. Nowadays such a tram line would have been very +profitable. +\stopframedtext +\stopbuffer + +\typebuffer + +\start +\getbuffer +\stop + +The framed texts inherits its layout from the example \at{page}[block:bridge]. + +Tables or figures may take up a lot of space. The placing of these text elements +can be postponed till the next page break. This is done with: +\type{\start ... \stoppostponing}: + +\startbuffer +\startpostponing +\placefigure + {A postponed figure.} + {\externalfigure[ma-cb-16][width=\textwidth]} +\stoppostponing +\stopbuffer + +\typebuffer + +The figure will be placed at the top of the next page and will cause minimal +disruption of the running text. + +\getbuffer + +\stopsection + +% \startsection[reference=textblocks,title=Text blocks] % AFO 2013: weggehaald, wordt toch nooit gebruikt + +% \index{text blocks} + +% \Command{\tex{defineblock}} +% \Command{\tex{useblocks}} +% \Command{\tex{hideblocks}} +% \Command{\tex{setupblock}} + +% \stopsection + +\startsection[title=Storing text for later use] + +\index{storing text} + +\Command{\tex{startbuffer}} +\Command{\tex{getbuffer}} +\Command{\tex{typebuffer}} +\Command{\tex{savebuffer}} +\Command{\tex{setupbuffer}} + +You can store information temporarily for future use in your document with: + +\shortsetup{startbuffer} + +For example: + +\starttyping +\startbuffer[visit] +If you want to see what Hasselt has in store you should come and +visit it some time. If you take this manual with you, you will +recognise some locations. +\stopbuffer + +\getbuffer[visit] +\stoptyping + +With \type{\getbuffer[visit]} you recall the stored text. The logical name is +optional. With \type{\typebuffer[visit]} you get back the typeset version of the +content of the buffer. + +Buffers are set up with: + +\shortsetup{setupbuffer} + +You can also save a buffer to an external file with: + +\shortsetup{savebuffer} + +If you want to save the buffer \type{visit} in an external file called +\type{myfile-sightseeing.tmp} you type: + +\starttyping +\savebuffer[visit][sightseeing] +\stoptyping + +\stopsection + +\startsection[title=Lines] + +\index{lines} + +\Command{\tex{hairline}} +\Command{\tex{starttextrule}} +\Command{\tex{thinrule}} +\Command{\tex{thinrules}} +\Command{\tex{setupthinrules}} +\Command{\tex{underbar}} +\Command{\tex{overstrikes}} +\Command{\tex{periods}} + +There are many comands to draw lines. For a single line you type: + +\shortsetup{hairline} + +or: + +\shortsetup{thinrule} + +For more lines you type: + +\shortsetup{thinrules} + +Text in combination with lines is also possible: + +\startbuffer +\starttextrule{Hasselt -- Amsterdam} +If you draw a straight line from Hasselt to Amsterdam you would have +to cover a distance of almost 145 \unit{Kilo Meter}. +\stoptextrule + +If you draw two straight lines from Hasselt to Amsterdam you would +have to cover a distance of almost 290 \unit{Kilo Meter}. + +Amsterdam \thinrules[n=3] Hasselt +\stopbuffer + +\getbuffer + +The code of this example is: + +\typebuffer + +You always have to be careful in drawing lines. Empty lines around +\type{\thinrules} must not be forgotten and the vertical spacing is always a +point of concern. + +You can set up line spacing with: + +\shortsetup{setupthinrules} + +There are a few complementary commands that might be very +useful. + +\shortsetup{setupfillinrules} + +These commands are introduced in the examples below: + +\startbuffer +\setupfillinrules[width=2cm] +\setupfillinlines[width=3cm] + +\fillinrules[n=1]{\bf name} +\fillinrules[n=3]{\bf adress} + +\fillinline{Can you please state the \underbar{number} of houses + in Hasselt.} \par + +Strike out \overstrikes{Hasselt in this text}\periods[18] +\stopbuffer + +\typebuffer + +This will become: + +\getbuffer + +These commands are used in questionaires. Text that is +struck out or underlined will not be hyphenated. + +In \in{section}[overlays] you have already seen the use of the +\type{\blackrule} command that can be set up with: + +\shortsetup{setupblackrules} + +\startbuffer +\blank +\blackrule[width=\textwidth,height=1cm,color=blue] +\stopbuffer + +\typebuffer + +This will result in a rather fat line: + +\getbuffer + + +\stopsection + +\startsection[title=Super- and subscript in text] + +\index{subscript} +\index{superscript} + +\Command{\tex{low}} +\Command{\tex{high}} +\Command{\tex{lohi}} + +\startbuffer +Hasselt's economy has known its \high{ups} and \low{downs}. +Since the nineties of the last century its economy is +\lohi{so}{so}. +\stopbuffer + +\getbuffer + +This ugly text was made with \type{\low{}}, \type{\high{}} and \type{\lohi{}{}}. +The text was placed between the curly braces. + +\stopsection + +\startsection[title=Date] + +\index{date} + +\Command{\tex{currentdate}} + +You can invoke the system date in your text with: + +\shortsetup{currentdate} + +With \type{\currentdate[day]}, \type{\currentdate[month]} and \type{\currentdate[year]} you can +invoke day, month and year separately. + +\stopsection + +\startsection[title=Rotating text, figures and tables] + +\index{rotating} + +\Command{\tex{rotate}} + +Sometimes you may want to rotate text or images. You can rotate +text and other objects with: + +\shortsetup{rotate} + +The first bracket pair is optional. Within that bracket pair +you specify the rotation: \type{rotation=90}. The curly +braces contain the text or object you want to rotate. + +\startbuffer +Hasselt got its municipal rights in 1252. From that time on it had +the \rotate[rotation=90]{right} to use its own seal on official +documents. This seal showed Holy Stephanus known as one of the first +Christian martyrs, and was the \rotate[rotation=270]{patron} of +Hasselt. After the Reformation the seal was redesigned and Stephanus +lost his \quote{holiness} and was from that time on depicted without +his aureole. +\stopbuffer + +\typebuffer + +This results in a very ugly paragraph: + +\getbuffer + +You can rotate an image just as easily: + +% \placetable[rotate][]{}{} + +\startbuffer +\placefigure + [][fig:rotation] + {The 180 \unit{Degrees} rotated fishing port (de Vispoort).} + {\rotate[rotation=180]{\externalfigure[ma-cb-15][width=10cm]}} +\stopbuffer + +\typebuffer + +You can see in \in{figure}[fig:rotation] that it is not always clear what you get +when you rotate. + +\getbuffer + +We can set up rotating with: + +\shortsetup{setuprotate} + +In the example above you could also rotate image and caption by: + +\startbuffer +\placefigure + [180][fig:rotation] + {The 180 \unit{Degrees} rotated fishing port (de Vispoort).} + {\externalfigure[ma-cb-15][width=10cm]} +\stopbuffer + +\typebuffer + +\stopsection + +\startsection[title=Scaling text] + +\index{scaling} + +\Command{\tex{scale}} +\Command{\tex{setupscale}} + +For some obscure reasons you may want to scale text. You can scale text and other +objects with: + +\shortsetup{scale} + +\startbuffer +After 1810 the Dedemsvaart brought some prosperity to Hasselt. All +ships went through the canals of Hasselt and the \scale[factor=10]{shops} on both +sides of the canals \scale[factor=10]{prospered}. +\stopbuffer + +\typebuffer + +Which will result in: + +\getbuffer + +\stopsection + +\startsection[title=Space] + +\index{space} +\index{tilde} +\index{non-breakable space} + +\Command{\tex{space}} +\Command{\tex{fixedspaces}} + +The command \type{\space} will produce a space. In \CONTEXT\ the +\type{~} (tilde) is a non-breakable space. + +\startbuffer +The Ridderstraat in Hasselt is about 160~m long and 5 to 6~m wide +with houses on both sides of the street. +\stopbuffer + +\typebuffer + +Tildes can also be used to align numbers in a row. The command +\type{\fixedspaces} will give the tilde the fixed width of a number. + +\startbuffer +\fixedspaces + +\bTABLE[frame=off] +\bTR \bTD Ridderstraat \eTD \bTD 160 m \eTD \eTR +\bTR \bTD Prinsengracht \eTD \bTD 240 m \eTD \eTR +\bTR \bTD Kalverstraat \eTD \bTD ~60 m \eTD \eTR +\bTR \bTD Meestersteeg \eTD \bTD ~45 m \eTD \eTR +\eTABLE +\stopbuffer + +\typebuffer + +\stopsection + +\startsection[title=Carriage return] + +\index{carriage return} + +\Command{\tex{crlf}} +\Command{\tex{startlines}} + +A new line can be enforced with: + +\shortsetup{crlf} + +As a \CONTEXT\ user you should use this command only as a last resort. + +When a number of lines should be followed by a {\em carriage return and line feed} +you can use: + +\shortsetup{startlines} + +\starttyping +\startlines +. +. +. +\stoplines +\stoptyping + +\startbuffer +On a wooden panel in the town hall of Hasselt you can read: + +\startlines +Heimelijcken haet +eigen baet +jongen raet +Door diese drie wilt verstaen +is het Roomsche Rijck vergaen. +\stoplines + +This little rhyme contains a warning for the magistrates of +Hasselt: don't allow personal benefits or feelings to +influence your wisdom in decision making. +\stopbuffer + +\typebuffer + +This will become: + +\getbuffer + +In a few commands new lines are generated by \type{\\}. For example if you type +\type{\inmargin{in the\\margin}} then the text will be divided over two lines. + +\stopsection + +\startsection[title=Hyphenation] + +\index{hyphenation} +\index{language} + +\Command{\tex{mainlanguage}} +\Command{\tex{language}} +\Command{\tex{nl}} +\Command{\tex{en}} + +When writing multi-lingual texts you have to be aware of the fact that +hyphenation may differ from one language to another. + +To activate a language you type: + +\shortsetup{mainlanguage} + +Between the brackets you fill in +\type{af}, +\type{ca}, +\type{cs}, +\type{cs}, +\type{da}, +\type{de}, +\type{en}, +\type{fi}, +\type{fr}, +\type{it}, +\type{la}, +\type{nl}, +\type{nb}, +\type{nn}, +\type{pl}, +\type{pt}, +\type{es}, +\type{sv} and +\type{tr} for +afrikaans, +catalan, +czech, +slovak, +danish, +german, +english, +finnish, +french, +italian, +latin, +dutch, +bokmal, +nnynorsk, +polish, +portuguese, +spanish, +swedish and +turkish respectively. + +To change from one language to another you can use: + +\starttyping +\language[nl] \language[en] \language[de] \language[fr] \language[sp] ... +\stoptyping + +or the shorthand versions: + +\starttyping +\nl \en \de \fr \sp ... +\stoptyping + +An example: + +\startbuffer +If you want to know more about Hasselt, the best book to read is +probably \quote{\nl Uit de geschiedenis van Hasselt} by +F.~Peereboom. +\stopbuffer + +\typebuffer + +\getbuffer + +If a word is wrongly hyphenated you can define the hyphenation points yourself. +This is done in the set up area of your input file: + +\startbuffer +\hyphenation{his-to-ry} +\stopbuffer + +\typebuffer + +Note that the language setting is also responsible for the way quotes are placed +around quotes and quotations (see \in{section}[quotations]). + +In some languages (like Dutch) compound words are used that are connected with a +hyphen. The separate words have to be hyphenated correctly. In order to do that +you can use \type{||}. + +\startbuffer +If your looking for an English||speaking person in Hasselt you should +go to the Tourist Information Office. There you may expect to find +full|| and part||time employees who are fluent in German, English, +French and of course Dutch. +\stopbuffer + +\typebuffer + +This will become: + +\getbuffer + +The double \type{||} takes care of the hyphen and the correct hyphenation of the +separate words. Also note the suspended compounds. + +\stopsection + +\startsection[title=Charts] + +\index{chart} + +\Command{\tex{FLOWchart}} + +To enable you to draw flow diagrams \CONTEXT\ contains the core module +\type{chart}. A simple organogram may look like this: + +\startbuffer +\setupFLOWcharts + [width=9\bodyfontsize, + height=2\bodyfontsize, + dx=1\bodyfontsize, + dy=1\bodyfontsize] + +\setupFLOWlines + [arrow=no] + +\startFLOWchart[organogram] + \startFLOWcell + \shape {action} + \name {01} + \location {2,1} + \text {Zwartewaterland} + \connect [bt]{02} + \connect [bt]{03} + \connect [bt]{04} + \stopFLOWcell + \startFLOWcell + \shape {action} + \name {02} + \location {1,2} + \text {Hasselt} + \stopFLOWcell + \startFLOWcell + \shape {action} + \name {03} + \location {2,2} + \text {Zwartsluis} + \stopFLOWcell + \startFLOWcell + \shape {action} + \name {04} + \location {3,2} + \text {Genemuiden} + \stopFLOWcell +\stopFLOWchart +\stopbuffer + +\midaligned{\getbuffer\FLOWchart[organogram]} + +This diagram is defined with the commands below: + +\typebuffer + +It is of good practice to define your setups and flow diagrams in separate +definition files (environments). + +\startbuffer +\FLOWchart[organogram] +\stopbuffer + +The flowchart can then be invoked by: + +\typebuffer + +\stopsection + +\startsection[title=Comment in input file] + +\index{comment} +\index[percent]{\% in input file} + +All text between \type{\start...\stoptext} will be processed while running +\CONTEXT. Sometimes however you may have text fragments you don't want to be +processed or you want to comment on your \CONTEXT\ commands. + +If you preceed your text with the percentage sign \type{%} +it will not be processed. + +\startbuffer +% In very big documents you can use the command \input for +% different files. +% +% For example: +% +% \input hass01.tex % chapter 1 on Hasselt +% \input hass02.tex % chapter 2 on Hasselt +% \input hass03.tex % chapter 3 on Hasselt +\stopbuffer + +\typebuffer + +When you delete the \type{%} before \type{\input} the three files will be +processed. The comment describing the contents of the files will not be +processed. + +\stopsection + +\startsection[title=Notes] + +\index{note} + +\Command{\tex{startcomment}} + +If you want your comment in the input file visible as a 'note' in the PDF file +you can use: + +\shortsetup{startcomment} + +\startbuffer +\startcomment + The image of the Vispoort should be in color. +\stopcomment +\stopbuffer + +\typebuffer + +The command will produce a sticky note in the PDF. + +The note is only visible when interactivity is set with \type{\setupinteraction} +and the comment with \type{\setupcomment}. + +\stopsection + +\startsection[title=Hiding text] + +\index{hiding text} + +\Command{\tex{starthiding}} + +Text can be hidden with: + +\shortsetup{starthiding} + +The text between \type{\start ... \stophiding} will not be processed. + +\stopsection + +\startsection[title=Input of another {\tt tex} file] + +\index{input other \TEX--files} + +\Command{\tex{input}} + +In a number of situations you may want to insert other \TEX\ files in your input +file. For example, sometimes it is more efficient to specify \CONTEXT\ sources in +more than one file in order to be able to partially process your files. + +Another file (with the name \type{another.tex}) can be inserted by: + +\starttyping +\input another.tex +\stoptyping + +The extension is optional so this will work too: + +\starttyping +\input another +\stoptyping + +The command \type{\input} is a \TEX\ command. + +For a more systematic approach in maintaining your documents \CONTEXT\ supports a +project structure with commands like \type{\start...\stopenvironment} and +\type{\start...\stopproduct}. Please refer to the magazine +\goto {\em Project structure} [ url(thisway:proj-struc) ] +for more information. + +\stopsection + +\startsection[title=XML (eXtended Markup Language)] + +\index{xml} +\index{mathml} +\index{openmath} + +Normally you code your document with \CONTEXT\ commands so you can tell \CONTEXT\ +what to do with the coded text elements. + +A more rigid way to code your content is \XML\ (eXtended Markup Language) which enables +you to have more control over your content (scripting, xslt, validation). A simple +\XML\ coded document could look like this: + +\startbuffer +<?xml version='1.0' standalone='yes?> + +<document> + <section> + <title>Hasselt in winter</title> + <content> + <p>In winter scating is a very popular sport in Hasselt. + All over Hasselt the frozen canals offer children a great + play ground.</p> + <p>...</p> + </content> + </section> +</document> +\stopbuffer + +\typebuffer + +\CONTEXT\ is able to deal with \XML\ directly without underlying XML2TEX +conversions. Please refer to the manual \goto {Dealing with XML} [ url +(manual:xml) ] for more information on how to process \XML\ documents. + +\CONTEXT\ also supports \MATHML\ (presentational and content markup) and +\OPENMATH\ with which math expressions can be coded in \XML\ documents. + +\stopsection + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en.pdf b/doc/context/sources/general/manuals/start/en/ma-cb-en.pdf Binary files differnew file mode 100644 index 000000000..6ad164eb0 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en.pdf diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-en.tex b/doc/context/sources/general/manuals/start/en/ma-cb-en.tex new file mode 100644 index 000000000..2e0b283af --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-en.tex @@ -0,0 +1,86 @@ +% interface=english language=uk modes=screen,bound + +% \showframe + +\startproduct ma-cb-en + +\project ma-cb + +% \disabledirectives[otf.kernruns] +% \disabledirectives[otf.discruns] +% \disabledirectives[otf.compruns] + +\startdocument + [title={\ConTeXt\ Mark IV\crlf an excursion}, + subtitle={English\crlf version}, + author={Ton Otten\crlf PRAGMA ADE}] + +\startfrontmatter + + \component ma-cb-en-introduction + +\stopfrontmatter + +\startbodymatter + + \component ma-cb-en-document + \component ma-cb-en-gettingstarted + \component ma-cb-en-specialcharacters + \component ma-cb-en-structure + \component ma-cb-en-setupcommands + \component ma-cb-en-heads + \component ma-cb-en-itemizations + \component ma-cb-en-math + \component ma-cb-en-chemical + \component ma-cb-en-units + \component ma-cb-en-bibliography + \component ma-cb-en-figures + \component ma-cb-en-tables + \component ma-cb-en-tabulations + \component ma-cb-en-columns + \component ma-cb-en-footnotes % Hans: zie lokale voetnoot tabel + \component ma-cb-en-citations + \component ma-cb-en-descriptions + \component ma-cb-en-enumerations + \component ma-cb-en-frames % Hans 2015: "background=linear shape" werkt niet en zorgt ervoor dat de background van de shortsetup niet meer werken + \component ma-cb-en-framedtexts + \component ma-cb-en-margintexts + \component ma-cb-en-pages + \component ma-cb-en-headers + \component ma-cb-en-tablesofcontent + \component ma-cb-en-registers + \component ma-cb-en-synonyms + \component ma-cb-en-sortedlists + \component ma-cb-en-references + \component ma-cb-en-color + \component ma-cb-en-alignments + \component ma-cb-en-interactivity % Hans: de soundtrack werkt niet en crossref met hasseltbook.tex werkt niet + \component ma-cb-en-fonts + \component ma-cb-en-composedcharacters + \component ma-cb-en-layout + \component ma-cb-en-pagebackgrounds + \component ma-cb-en-textbackgrounds + \component ma-cb-en-paragraphs + \component ma-cb-en-commands + \component ma-cb-en-whatever + \component ma-cb-en-modules + \component ma-cb-en-presentations + \component ma-cb-en-metapost + \component ma-cb-en-usersetups + +\stopbodymatter + +\startappendices + + \component ma-cb-en-mathcharacters + \component ma-cb-en-errors + \component ma-cb-en-texteditor + \component ma-cb-en-processingfiles + \component ma-cb-en-runtimefiles + +\stopappendices + +\stopdocument + +\stopproduct + diff --git a/doc/context/sources/general/manuals/start/en/ma-cb-language.tex b/doc/context/sources/general/manuals/start/en/ma-cb-language.tex new file mode 100644 index 000000000..5c6d91d07 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/ma-cb-language.tex @@ -0,0 +1,21 @@ +\startenvironment ma-cb-language + +\mainlanguage[en] + +\setuplabeltext + [en] + [ document:author=Main author, + document:design=Design and style, + document:contributions=Contributions, + document:translations=Translations, + document:illustrations=Illustrations, + document:commanddefinitions=Command definitions, + document:commandindex=Command index, + document:subjectindex=Subject index, + document:contents=Contents, + document:manuals=Manuals, + document:magazines=Magazines, + document:supportandreading=Support and further reading, + document:furtherreading=Further reading] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/start/en/sounds-001.tex b/doc/context/sources/general/manuals/start/en/sounds-001.tex new file mode 100644 index 000000000..7d1428113 --- /dev/null +++ b/doc/context/sources/general/manuals/start/en/sounds-001.tex @@ -0,0 +1,34 @@ +\definerenderingwindow + [example] + [width=0pt,height=0pt,frame=off] + +\setupinteraction[state=start] + +\useexternalrendering + [mysound] + [audio/mpeg] % audio/x-mp3 + [akkerman.mp3] + [] + +\definereference [StartSoundTrack] [StartRendering{mysound}] +\definereference [StopSoundTrack] [StopRendering{mysound}] + +\definelayer[resources][width=\paperwidth,height=\paperheight] + +\setupbackgrounds[page][background=resources] + +\starttext + + \setlayer[resources]{\placerenderingwindow[example][mysound]} % once + + \startTEXpage + \button{start}[StartSoundTrack] + \button{stop}[StopSoundTrack] + \stopTEXpage + + \startTEXpage + \button{start}[StartSoundTrack] + \button{stop}[StopSoundTrack] + \stopTEXpage + +\stoptext diff --git a/doc/context/sources/general/manuals/start/graphics/cow.pdf b/doc/context/sources/general/manuals/start/graphics/cow.pdf Binary files differnew file mode 100644 index 000000000..2441faf74 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/cow.pdf diff --git a/doc/context/sources/general/manuals/start/graphics/fig-page-areas-en.md b/doc/context/sources/general/manuals/start/graphics/fig-page-areas-en.md new file mode 100644 index 000000000..b7c0ab5a6 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/fig-page-areas-en.md @@ -0,0 +1,830 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Mayura Draw, Version 4.3 +%%Title: fig-page-areas-en.md +%%CreationDate: Fri Jan 10 14:38:13 2014 +%%BoundingBox: 8 140 580 700 +%%DocumentFonts: ArialMT +%%+ Arial-BoldMT +%%Orientation: Portrait +%%EndComments +%%BeginProlog +%%BeginResource: procset MayuraDraw_ops +%%Version: 4.3 +%%Copyright: (c) 1993-2003 Mayura Software +/PDXDict 100 dict def +PDXDict begin +% width height matrix proc key cache +% definepattern -\> font +/definepattern { %def + 7 dict begin + /FontDict 9 dict def + FontDict begin + /cache exch def + /key exch def + /proc exch cvx def + /mtx exch matrix invertmatrix def + /height exch def + /width exch def + /ctm matrix currentmatrix def + /ptm matrix identmatrix def + /str + (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) + def + end + /FontBBox [ %def + 0 0 FontDict /width get + FontDict /height get + ] def + /FontMatrix FontDict /mtx get def + /Encoding StandardEncoding def + /FontType 3 def + /BuildChar { %def + pop begin + FontDict begin + width 0 cache { %ifelse + 0 0 width height setcachedevice + }{ %else + setcharwidth + } ifelse + 0 0 moveto width 0 lineto + width height lineto 0 height lineto + closepath clip newpath + gsave proc grestore + end end + } def + FontDict /key get currentdict definefont + end +} bind def + +% dict patternpath - +% dict matrix patternpath - +/patternpath { %def + dup type /dicttype eq { %ifelse + begin FontDict /ctm get setmatrix + }{ %else + exch begin FontDict /ctm get setmatrix + concat + } ifelse + currentdict setfont + FontDict begin + FontMatrix concat + width 0 dtransform + round width div exch round width div exch + 0 height dtransform + round height div exch + round height div exch + 0 0 transform round exch round exch + ptm astore setmatrix + + pathbbox + height div ceiling height mul 4 1 roll + width div ceiling width mul 4 1 roll + height div floor height mul 4 1 roll + width div floor width mul 4 1 roll + + 2 index sub height div ceiling cvi exch + 3 index sub width div ceiling cvi exch + 4 2 roll moveto + + FontMatrix ptm invertmatrix pop + { %repeat + gsave + ptm concat + dup str length idiv { %repeat + str show + } repeat + dup str length mod str exch + 0 exch getinterval show + grestore + 0 height rmoveto + } repeat + pop + end end +} bind def + +% dict patternfill - +% dict matrix patternfill - +/patternfill { %def + gsave + eoclip patternpath + grestore + newpath +} bind def + +/img { %def + gsave + /imgh exch def + /imgw exch def + concat + imgw imgh 8 + [imgw 0 0 imgh neg 0 imgh] + /colorstr 768 string def + /colorimage where { + pop + { currentfile colorstr readhexstring pop } + false 3 colorimage + }{ + /graystr 256 string def + { + currentfile colorstr readhexstring pop + length 3 idiv + dup 1 sub 0 1 3 -1 roll + { + graystr exch + colorstr 1 index 3 mul get 30 mul + colorstr 2 index 3 mul 1 add get 59 mul + colorstr 3 index 3 mul 2 add get 11 mul + add add 100 idiv + put + } for + graystr 0 3 -1 roll getinterval + } image + } ifelse + grestore +} bind def + +/arrowhead { + gsave + [] 0 setdash + strokeC strokeM strokeY strokeK setcmykcolor + 2 copy moveto + 4 2 roll exch 4 -1 roll exch + sub 3 1 roll sub + exch atan rotate dup scale + arrowtype + dup 0 eq { + -1 2 rlineto 7 -2 rlineto -7 -2 rlineto + closepath fill + } if + dup 1 eq { + 0 3 rlineto 9 -3 rlineto -9 -3 rlineto + closepath fill + } if + dup 2 eq { + -6 -6 rmoveto 6 6 rlineto -6 6 rlineto + -1.4142 -1.4142 rlineto 4.5858 -4.5858 rlineto + -4.5858 -4.5858 rlineto closepath fill + } if + dup 3 eq { + -6 0 rmoveto -1 2 rlineto 7 -2 rlineto -7 -2 rlineto + closepath fill + } if + dup 4 eq { + -9 0 rmoveto 0 3 rlineto 9 -3 rlineto -9 -3 rlineto + closepath fill + } if + dup 5 eq { + currentpoint newpath 3 0 360 arc + closepath fill + } if + dup 6 eq { + 2.5 2.5 rmoveto 0 -5 rlineto -5 0 rlineto 0 5 rlineto + closepath fill + } if + pop + grestore +} bind def + +/setcmykcolor where { %ifelse + pop +}{ %else + /setcmykcolor { + /black exch def /yellow exch def + /magenta exch def /cyan exch def + cyan black add dup 1 gt { pop 1 } if 1 exch sub + magenta black add dup 1 gt { pop 1 } if 1 exch sub + yellow black add dup 1 gt { pop 1 } if 1 exch sub + setrgbcolor + } bind def +} ifelse + +/RE { %def + findfont begin + currentdict dup length dict begin + { %forall + 1 index /FID ne { def } { pop pop } ifelse + } forall + /FontName exch def dup length 0 ne { %if + /Encoding Encoding 256 array copy def + 0 exch { %forall + dup type /nametype eq { %ifelse + Encoding 2 index 2 index put + pop 1 add + }{ %else + exch pop + } ifelse + } forall + } if pop + currentdict dup end end + /FontName get exch definefont pop +} bind def + +/spacecount { %def + 0 exch + ( ) { %loop + search { %ifelse + pop 3 -1 roll 1 add 3 1 roll + }{ pop exit } ifelse + } loop +} bind def + +/WinAnsiEncoding [ + 39/quotesingle 96/grave 130/quotesinglbase/florin/quotedblbase + /ellipsis/dagger/daggerdbl/circumflex/perthousand + /Scaron/guilsinglleft/OE 145/quoteleft/quoteright + /quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/dotlessi + 159/Ydieresis 164/currency 166/brokenbar 168/dieresis/copyright + /ordfeminine 172/logicalnot 174/registered/macron/ring + 177/plusminus/twosuperior/threesuperior/acute/mu + 183/periodcentered/cedilla/onesuperior/ordmasculine + 188/onequarter/onehalf/threequarters 192/Agrave/Aacute + /Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute + /Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute + /Ocircumflex/Otilde/Odieresis/multiply/Oslash + /Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn + /germandbls/agrave/aacute/acircumflex/atilde/adieresis + /aring/ae/ccedilla/egrave/eacute/ecircumflex + /edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde + /odieresis/divide/oslash/ugrave/uacute/ucircumflex + /udieresis/yacute/thorn/ydieresis +] def + +/SymbolEncoding [ + 32/space/exclam/universal/numbersign/existential/percent + /ampersand/suchthat/parenleft/parenright/asteriskmath/plus + /comma/minus/period/slash/zero/one/two/three/four/five/six + /seven/eight/nine/colon/semicolon/less/equal/greater/question + /congruent/Alpha/Beta/Chi/Delta/Epsilon/Phi/Gamma/Eta/Iota + /theta1/Kappa/Lambda/Mu/Nu/Omicron/Pi/Theta/Rho/Sigma/Tau + /Upsilon/sigma1/Omega/Xi/Psi/Zeta/bracketleft/therefore + /bracketright/perpendicular/underscore/radicalex/alpha + /beta/chi/delta/epsilon/phi/gamma/eta/iota/phi1/kappa/lambda + /mu/nu/omicron/pi/theta/rho/sigma/tau/upsilon/omega1/omega + /xi/psi/zeta/braceleft/bar/braceright/similar + 161/Upsilon1/minute/lessequal/fraction/infinity/florin/club + /diamond/heart/spade/arrowboth/arrowleft/arrowup/arrowright + /arrowdown/degree/plusminus/second/greaterequal/multiply + /proportional/partialdiff/bullet/divide/notequal/equivalence + /approxequal/ellipsis/arrowvertex/arrowhorizex/carriagereturn + /aleph/Ifraktur/Rfraktur/weierstrass/circlemultiply + /circleplus/emptyset/intersection/union/propersuperset + /reflexsuperset/notsubset/propersubset/reflexsubset/element + /notelement/angle/gradient/registerserif/copyrightserif + /trademarkserif/product/radical/dotmath/logicalnot/logicaland + /logicalor/arrowdblboth/arrowdblleft/arrowdblup/arrowdblright + /arrowdbldown/lozenge/angleleft/registersans/copyrightsans + /trademarksans/summation/parenlefttp/parenleftex/parenleftbt + /bracketlefttp/bracketleftex/bracketleftbt/bracelefttp + /braceleftmid/braceleftbt/braceex + 241/angleright/integral/integraltp/integralex/integralbt + /parenrighttp/parenrightex/parenrightbt/bracketrighttp + /bracketrightex/bracketrightbt/bracerighttp/bracerightmid + /bracerightbt +] def + +/patarray [ +/leftdiagonal /rightdiagonal /crossdiagonal /horizontal +/vertical /crosshatch /fishscale /wave /brick +] def +/arrowtype 0 def +/fillC 0 def /fillM 0 def /fillY 0 def /fillK 0 def +/strokeC 0 def /strokeM 0 def /strokeY 0 def /strokeK 1 def +/pattern -1 def +/mat matrix def +/mat2 matrix def +/nesting 0 def +/deferred /N def +/c /curveto load def +/c2 { pop pop c } bind def +/C /curveto load def +/C2 { pop pop C } bind def +/e { gsave concat 0 0 moveto } bind def +/F { + nesting 0 eq { %ifelse + pattern -1 eq { %ifelse + fillC fillM fillY fillK setcmykcolor eofill + }{ %else + gsave fillC fillM fillY fillK setcmykcolor eofill grestore + 0 0 0 1 setcmykcolor + patarray pattern get findfont patternfill + } ifelse + }{ %else + /deferred /F def + } ifelse +} bind def +/f { closepath F } bind def +/K { /strokeK exch def /strokeY exch def + /strokeM exch def /strokeC exch def } bind def +/k { /fillK exch def /fillY exch def + /fillM exch def /fillC exch def } bind def +/opc { pop } bind def +/Opc { pop } bind def +/L /lineto load def +/L2 { pop pop L } bind def +/m /moveto load def +/m2 { pop pop m } bind def +/n /newpath load def +/N { + nesting 0 eq { %ifelse + newpath + }{ %else + /deferred /N def + } ifelse +} def +/S { + nesting 0 eq { %ifelse + strokeC strokeM strokeY strokeK setcmykcolor stroke + }{ %else + /deferred /S def + } ifelse +} bind def +/s { closepath S } bind def +/Tx { fillC fillM fillY fillK setcmykcolor show + 0 leading neg translate 0 0 moveto } bind def +/T { grestore } bind def +/TX { pop } bind def +/Ts { pop } bind def +/tal { pop } bind def +/tld { pop } bind def +/tbx { pop exch pop sub /jwidth exch def } def +/tpt { %def + fillC fillM fillY fillK setcmykcolor + moveto show +} bind def +/tpj { %def + fillC fillM fillY fillK setcmykcolor + moveto + dup stringwidth pop + 3 -1 roll + exch sub + 1 index spacecount + dup 0 eq { %ifelse + pop pop show + }{ %else + div 0 8#040 4 -1 roll widthshow + } ifelse +} bind def +/u {} def +/U {} def +/*u { /nesting nesting 1 add def } def +/*U { + /nesting nesting 1 sub def + nesting 0 eq { + deferred cvx exec + } if +} def +/w /setlinewidth load def +/d /setdash load def +/B { + nesting 0 eq { %ifelse + gsave F grestore S + }{ %else + /deferred /B def + } ifelse +} bind def +/b { closepath B } bind def +/z { /align exch def pop /leading exch def exch findfont + exch scalefont setfont } bind def +/tfn { exch findfont + exch scalefont setfont } bind def +/Pat { /pattern exch def } bind def +/cm { 6 array astore concat } bind def +/q { mat2 currentmatrix pop } bind def +/Q { mat2 setmatrix } bind def +/Ah { + pop /arrowtype exch def + currentlinewidth 5 1 roll arrowhead +} bind def +/Arc { + mat currentmatrix pop + translate scale 0 0 1 5 -2 roll arc + mat setmatrix +} bind def +/Arc2 { pop pop Arc } bind def +/Bx { + mat currentmatrix pop + concat /y1 exch def /x1 exch def /y2 exch def /x2 exch def + x1 y1 moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto + mat setmatrix +} bind def +/Rr { + mat currentmatrix pop + concat /yrad exch def /xrad exch def + 2 copy gt { exch } if /x2 exch def /x1 exch def + 2 copy gt { exch } if /y2 exch def /y1 exch def + x1 xrad add y2 moveto + matrix currentmatrix x1 xrad add y2 yrad sub translate xrad yrad scale + 0 0 1 90 -180 arc setmatrix + matrix currentmatrix x1 xrad add y1 yrad add translate xrad yrad scale + 0 0 1 180 270 arc setmatrix + matrix currentmatrix x2 xrad sub y1 yrad add translate xrad yrad scale + 0 0 1 270 0 arc setmatrix + matrix currentmatrix x2 xrad sub y2 yrad sub translate xrad yrad scale + 0 0 1 0 90 arc setmatrix + closepath + mat setmatrix +} bind def +/Ov { + mat currentmatrix pop + concat translate scale 1 0 moveto 0 0 1 0 360 arc closepath + mat setmatrix +} bind def +end +%%EndResource +%%EndProlog +%%BeginSetup +%PDX g 3 3 1 1 +%%IncludeFont: ArialMT +%%IncludeFont: Arial-BoldMT +PDXDict begin +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +/_PDX_savepage save def + +15 15 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 7.5 0 moveto 15 7.5 lineto + 0 7.5 moveto 7.5 15 lineto + 2 setlinewidth stroke +} bind +/rightdiagonal true definepattern pop + +15 15 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 7.5 0 moveto 0 7.5 lineto + 15 7.5 moveto 7.5 15 lineto + 2 setlinewidth stroke +} bind +/leftdiagonal true definepattern pop + +15 15 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 0 7.5 moveto 15 7.5 lineto + 2 setlinewidth stroke +} bind +/horizontal true definepattern pop + +15 15 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 7.5 0 moveto 7.5 15 lineto + 2 setlinewidth stroke +} bind +/vertical true definepattern pop + +15 15 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 0 7.5 moveto 15 7.5 lineto + 7.5 0 moveto 7.5 15 lineto + 2 setlinewidth stroke +} bind +/crosshatch true definepattern pop + +30 30 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 0 7.5 moveto 30 7.5 lineto + 0 22.5 moveto 30 22.5 lineto + 7.5 0 moveto 7.5 7.5 lineto + 7.5 22.5 moveto 7.5 30 lineto + 22.5 7.5 moveto 22.5 22.5 lineto + 1 setlinewidth stroke +} bind +/brick true definepattern pop + +30 30 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 2 scale + 2 setlinecap + 7.5 0 moveto 15 7.5 lineto + 0 7.5 moveto 7.5 15 lineto + 7.5 0 moveto 0 7.5 lineto + 15 7.5 moveto 7.5 15 lineto + 0.5 setlinewidth stroke +} bind +/crossdiagonal true definepattern pop + +30 30 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 2 scale + 1 setlinecap + 0 7.5 moveto 0 15 7.5 270 360 arc + 7.5 15 moveto 15 15 7.5 180 270 arc + 0 7.5 moveto 7.5 7.5 7.5 180 360 arc + 0.5 setlinewidth stroke +} bind +/fishscale true definepattern pop + +30 30 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 1 setlinecap 0.5 setlinewidth + 7.5 0 10.6 135 45 arcn + 22.5 15 10.6 225 315 arc + stroke + 7.5 15 10.6 135 45 arcn + 22.5 30 10.6 225 315 arc + stroke +} bind +/wave true definepattern pop + +WinAnsiEncoding /_ArialMT /ArialMT RE +WinAnsiEncoding /_Arial-BoldMT /Arial-BoldMT RE + +newpath 2 setlinecap 0 setlinejoin 2 setmiterlimit +[] 0 setdash +8 140 moveto 8 700 lineto 580 700 lineto 580 140 lineto closepath clip +newpath +%%EndPageSetup +0.862745 0.956863 -1.42109e-016 0 K +2 w +543 249 -9 789 [1 0 0 1 27.09 -98.91] Bx +s +0.133333 0.133333 0.133333 0 k +0.133333 0.133333 0.133333 0 K +0.5 w +150 480 90 510 [1 0 0 1 -14.91 90.09] Bx +b +150 480 90 510 [1 0 0 1 60.42 90.09] Bx +b +150 480 90 510 [1 0 0 1 299.9 90.09] Bx +b +240 480 90 510 [1 0 0 1 135.1 90.09] Bx +b +150 480 90 510 [1 0 0 1 375.4 90.09] Bx +b +[1 0 0 1 15.14 -89.21] e +33 681 33 681 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(top) 33 670.14 tpt +T +0.133333 0.133333 0.133333 0 k +150 480 90 510 [1 0 0 1 -14.91 45.09] Bx +b +150 480 90 510 [1 0 0 1 60.09 45.09] Bx +b +150 480 90 510 [1 0 0 1 300.1 45.09] Bx +b +240 480 90 510 [1 0 0 1 135.1 45.09] Bx +b +150 480 90 510 [1 0 0 1 375.1 45.09] Bx +b +[1 0 0 1 -5.536 -83.21] e +33 630 33 630 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(header) 33 619.14 tpt +T +0.133333 0.133333 0.133333 0 k +150 480 90 510 [1 0 0 1 -14.91 -180.6] Bx +b +150 480 90 510 [1 0 0 1 60.09 -180.6] Bx +b +150 480 90 510 [1 0 0 1 300.1 -180.6] Bx +b +240 480 90 510 [1 0 0 1 135.1 -180.6] Bx +b +150 480 90 510 [1 0 0 1 375.1 -180.6] Bx +b +[1 0 0 1 1.136 -80.91] e +33 402 33 402 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(footer) 33 391.14 tpt +T +0.133333 0.133333 0.133333 0 k +150 480 90 510 [1 0 0 1 -14.91 -224.9] Bx +b +150 480 90 510 [1 0 0 1 60.09 -224.9] Bx +b +150 480 90 510 [1 0 0 1 300.1 -224.9] Bx +b +240 480 90 510 [1 0 0 1 135.1 -224.9] Bx +b +150 480 90 510 [1 0 0 1 375.1 -224.9] Bx +b +[1 0 0 1 -7.866 -86.21] e +36 363 36 363 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(bottom) 36 352.14 tpt +T +0.133333 0.133333 0.133333 0 k +150 345 90 510 [1 0 0 1 -14.91 0.09051] Bx +b +150 345 90 510 [1 0 0 1 60.09 0.09051] Bx +b +150 345 90 510 [1 0 0 1 300.1 0.09051] Bx +b +-1.42109e-016 0.4 0.8 0 k +240 345 90 510 [1 0 0 1 135 0.09051] Bx +b +0.133333 0.133333 0.133333 0 k +150 345 90 510 [1 0 0 1 375.1 0.09051] Bx +b +[1 0 0 1 21.47 -72.71] e +24 507 24 507 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(text) 24 496.14 tpt +T +[1 0 0 1 -10.93 -38.72] e +93 705 93 705 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(left edge) 93 694.14 tpt +T +[1 0 0 1 -4.409 -41.72] e +159 708 159 708 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(left margin) 159 697.14 tpt +T +[1 0 0 1 17.42 -38.72] e +273 705 273 705 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(text) 273 694.14 tpt +T +[1 0 0 1 -13.78 -35.72] e +402 702 402 702 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(right margin) 402 691.14 tpt +T +[1 0 0 1 -11.25 -38.72] e +480 705 480 705 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(right edge) 480 694.14 tpt +T +[1 0 0 1 -13.55 -89.21] e +75 352.596 39 366 tbx +0 tal +13 tld +/_ArialMT 12 tfn +() 39 355.14 tpt +T +[1 0 0 1 0.09051 -89.91] e +402 460.596 333 474 tbx +0 tal +13 tld +/_ArialMT 12 tfn +() 333 463.14 tpt +T +u +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +1 1 1 0 K +1 w +q +1 0 0 1 -14.91 -89.91 cm +60 285 m +90 285 L +Q +S +q +1 0 0 1 0.09051 -89.91 cm +75 285 m +75 255 L +Q +S +U +u +q +-1 0 0 1 615.1 -89.91 cm +60 285 m +90 285 L +Q +S +q +-1 0 0 1 600.1 -89.91 cm +75 285 m +75 255 L +Q +S +U +u +q +0 -1 -1 0 810.1 735.1 cm +60 285 m +90 285 L +Q +S +q +0 -1 -1 0 810.1 720.1 cm +75 285 m +75 255 L +Q +S +U +u +q +0 -1 1 0 -209.9 735.1 cm +60 285 m +90 285 L +Q +S +q +0 -1 1 0 -209.9 720.1 cm +75 285 m +75 255 L +Q +S +U +0.5 w +[3 3] 0 d +525 735 75 285 [1 0 0 1 0.09051 -89.91] Bx +s +1 w +[] 0 d +q +1 0 0 1 -45 -524.9 cm +128 705 120 705 m2 +562.094 705 570.094 705 L2 +Q +S +q +1 0 0 1 -45 -524.9 cm +570.094 705 120 705 4 1 Ah +120 705 570.094 705 4 2 Ah +Q +[1 0 0 1 0.09051 -89.91] e +271.57 246.83 246 258 tbx +0 tal +11 tld +0.862745 0.956863 -1.42109e-016 0 k +/_ArialMT 10 tfn +() 246 248.95 tpt +T +[1 0 0 1 0.09051 -89.91] e +261 255 261 255 tbx +0 tal +11 tld +1 1 1 0 k +/_ArialMT 10 tfn +() 261 245.95 tpt +T +[1 0 0 1 9.698 -77.82] e +261 255 261 255 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(paperwidth) 261 244.14 tpt +T +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +q +0 1 -1 0 1244 74.39 cm +128 705 120 705 m2 +562.094 705 570.094 705 L2 +Q +S +q +0 1 -1 0 1244 74.39 cm +570.094 705 120 705 4 1 Ah +120 705 570.094 705 4 2 Ah +Q +[0 1 -1 0 797.3 129.1] e +261 255 261 255 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(paperheight) 261 244.14 tpt +T +[1 0 0 1 -10.41 8.644] e +273 429 273 429 tbx +0 tal +19 tld +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +/_Arial-BoldMT 18 tfn +(bodytext) 273 412.71 tpt +T +%%PageTrailer +_PDX_savepage restore +%%Trailer +end +showpage +%%EOF diff --git a/doc/context/sources/general/manuals/start/graphics/fig-page-areas-en.pdf b/doc/context/sources/general/manuals/start/graphics/fig-page-areas-en.pdf new file mode 100644 index 000000000..88350bf2a --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/fig-page-areas-en.pdf @@ -0,0 +1,527 @@ +%PDF-1.0
+1 0 obj
+<<
+/Creator (Mayura Draw 4.3)
+>>
+endobj
+2 0 obj
+<<
+/Type /Catalog
+/Pages 4 0 R
+/Outlines 3 0 R
+>>
+endobj
+3 0 obj
+<<
+/Type /Outlines
+/Count 0
+>>
+endobj
+4 0 obj
+<<
+/Type /Pages
+/Count 1
+/Kids [ 5 0 R ]
+>>
+endobj
+5 0 obj
+<<
+/Type /Page
+/Parent 4 0 R
+/MediaBox [ 8 140 580 700 ]
+/Resources <<
+/ProcSet 6 0 R
+/XObject 9 0 R
+/Font 10 0 R
+>>
+/Contents 7 0 R
+>>
+endobj
+6 0 obj
+[ /PDF /Text ]
+endobj
+7 0 obj
+<< /Length 8 0 R >>
+stream
+1 1 1 rg
+0.137255 0.0431373 1 RG
+2 w
+18.0905 690.091 m
+18.0905 150.091 l
+570.091 150.091 l
+570.091 690.091 l
+18.0905 690.091 l
+s
+0.866667 0.866667 0.866667 rg
+0.866667 0.866667 0.866667 RG
+0.5 w
+75.0905 600.091 m
+75.0905 570.091 l
+135.091 570.091 l
+135.091 600.091 l
+75.0905 600.091 l
+b*
+150.421 600.091 m
+150.421 570.091 l
+210.421 570.091 l
+210.421 600.091 l
+150.421 600.091 l
+b*
+389.89 600.091 m
+389.89 570.091 l
+449.89 570.091 l
+449.89 600.091 l
+389.89 600.091 l
+b*
+225.091 600.091 m
+225.091 570.091 l
+375.091 570.091 l
+375.091 600.091 l
+225.091 600.091 l
+b*
+465.39 600.091 m
+465.39 570.091 l
+525.39 570.091 l
+525.39 600.091 l
+465.39 600.091 l
+b*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 48.14 580.9 Tm
+0 Tw
+(top) Tj
+ET
+0.866667 0.866667 0.866667 rg
+75.0905 555.091 m
+75.0905 525.091 l
+135.091 525.091 l
+135.091 555.091 l
+75.0905 555.091 l
+b*
+150.091 555.091 m
+150.091 525.091 l
+210.091 525.091 l
+210.091 555.091 l
+150.091 555.091 l
+b*
+390.09 555.091 m
+390.09 525.091 l
+450.09 525.091 l
+450.09 555.091 l
+390.09 555.091 l
+b*
+225.091 555.091 m
+225.091 525.091 l
+375.091 525.091 l
+375.091 555.091 l
+225.091 555.091 l
+b*
+465.09 555.091 m
+465.09 525.091 l
+525.09 525.091 l
+525.09 555.091 l
+465.09 555.091 l
+b*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 27.46 535.9 Tm
+0 Tw
+(header) Tj
+ET
+0.866667 0.866667 0.866667 rg
+75.0905 329.391 m
+75.0905 299.391 l
+135.091 299.391 l
+135.091 329.391 l
+75.0905 329.391 l
+b*
+150.091 329.391 m
+150.091 299.391 l
+210.091 299.391 l
+210.091 329.391 l
+150.091 329.391 l
+b*
+390.09 329.391 m
+390.09 299.391 l
+450.09 299.391 l
+450.09 329.391 l
+390.09 329.391 l
+b*
+225.091 329.391 m
+225.091 299.391 l
+375.091 299.391 l
+375.091 329.391 l
+225.091 329.391 l
+b*
+465.09 329.391 m
+465.09 299.391 l
+525.09 299.391 l
+525.09 329.391 l
+465.09 329.391 l
+b*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 34.14 310.2 Tm
+0 Tw
+(footer) Tj
+ET
+0.866667 0.866667 0.866667 rg
+75.0905 285.091 m
+75.0905 255.091 l
+135.091 255.091 l
+135.091 285.091 l
+75.0905 285.091 l
+b*
+150.091 285.091 m
+150.091 255.091 l
+210.091 255.091 l
+210.091 285.091 l
+150.091 285.091 l
+b*
+390.09 285.091 m
+390.09 255.091 l
+450.09 255.091 l
+450.09 285.091 l
+390.09 285.091 l
+b*
+225.091 285.091 m
+225.091 255.091 l
+375.091 255.091 l
+375.091 285.091 l
+225.091 285.091 l
+b*
+465.09 285.091 m
+465.09 255.091 l
+525.09 255.091 l
+525.09 285.091 l
+465.09 285.091 l
+b*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 28.13 265.9 Tm
+0 Tw
+(bottom) Tj
+ET
+0.866667 0.866667 0.866667 rg
+75.0905 510.091 m
+75.0905 345.091 l
+135.091 345.091 l
+135.091 510.091 l
+75.0905 510.091 l
+b*
+150.091 510.091 m
+150.091 345.091 l
+210.091 345.091 l
+210.091 510.091 l
+150.091 510.091 l
+b*
+390.09 510.091 m
+390.09 345.091 l
+450.09 345.091 l
+450.09 510.091 l
+390.09 510.091 l
+b*
+1 0.6 0.2 rg
+225 510.091 m
+225 345.091 l
+375 345.091 l
+375 510.091 l
+225 510.091 l
+b*
+0.866667 0.866667 0.866667 rg
+465.09 510.091 m
+465.09 345.091 l
+525.09 345.091 l
+525.09 510.091 l
+465.09 510.091 l
+b*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 45.47 423.4 Tm
+0 Tw
+(text) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 82.07 655.4 Tm
+0 Tw
+(left edge) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 154.6 655.4 Tm
+0 Tw
+(left margin) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 290.4 655.4 Tm
+0 Tw
+(text) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 388.2 655.4 Tm
+0 Tw
+(right margin) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 468.8 655.4 Tm
+0 Tw
+(right edge) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 25.45 265.9 Tm
+0 Tw
+() Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 333.1 373.2 Tm
+0 Tw
+() Tj
+ET
+1 1 1 rg
+0 0 0 RG
+1 w
+45.0905 195.091 m
+75.0905 195.091 l
+S
+75.0905 195.091 m
+75.0905 165.091 l
+S
+555.091 195.091 m
+525.091 195.091 l
+S
+525.091 195.091 m
+525.091 165.091 l
+S
+525.091 675.091 m
+525.091 645.091 l
+S
+525.091 645.091 m
+555.091 645.091 l
+S
+75.0905 675.091 m
+75.0905 645.091 l
+S
+75.0905 645.091 m
+45.0905 645.091 l
+S
+0.5 w
+[3 3] 0 d
+75.0905 195.091 m
+75.0905 645.091 l
+525.091 645.091 l
+525.091 195.091 l
+75.0905 195.091 l
+s
+1 w
+[] 0 d
+83.0005 180.091 m
+517.094 180.091 l
+S
+0 0 0 rg
+0 w
+75.0005 180.091 m
+84.0005 180.091 l
+84.0005 177.091 l
+75.0005 180.091 l
+84.0005 183.091 l
+84.0005 180.091 l
+75.0005 180.091 l
+f*
+525.094 180.091 m
+516.094 180.091 l
+516.094 183.091 l
+525.094 180.091 l
+516.094 177.091 l
+516.094 180.091 l
+525.094 180.091 l
+f*
+0.137255 0.0431373 1 rg
+BT
+/F1 10 Tf
+1 0 0 1 246.1 159 Tm
+0 Tw
+() Tj
+ET
+0 0 0 rg
+BT
+/F1 10 Tf
+1 0 0 1 261.1 156 Tm
+0 Tw
+() Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 270.7 166.3 Tm
+0 Tw
+(paperwidth) Tj
+ET
+1 1 1 rg
+1 w
+539.09 202.391 m
+539.09 636.484 l
+S
+0 0 0 rg
+0 w
+539.09 194.391 m
+539.09 203.391 l
+542.09 203.391 l
+539.09 194.391 l
+536.09 203.391 l
+539.09 203.391 l
+539.09 194.391 l
+f*
+539.09 644.484 m
+539.09 635.484 l
+536.09 635.484 l
+539.09 644.484 l
+542.09 635.484 l
+539.09 635.484 l
+539.09 644.484 l
+f*
+BT
+/F1 12 Tf
+0 1 -1 0 553.2 390.1 Tm
+0 Tw
+(paperheight) Tj
+ET
+1 1 1 rg
+BT
+/F2 18 Tf
+1 0 0 1 262.6 421.4 Tm
+0 Tw
+(bodytext) Tj
+ET
+endstream
+endobj
+8 0 obj
+5066
+endobj
+10 0 obj
+<<
+/F1 11 0 R
+/F2 12 0 R
+>>
+endobj
+11 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F1
+/BaseFont /Arial
+/Encoding /WinAnsiEncoding
+/FirstChar 30
+/LastChar 255
+/Widths [ 750 750 278 278 355 556 556 889 667 191 333 333 389 584 278 333
+ 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584
+ 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833
+ 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278
+ 469 556 333 556 556 500 556 556 278 556 556 222 222 500 222 833
+ 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334
+ 584 750 556 750 222 556 333 1000 556 556 333 1000 667 333 1000 750
+ 611 750 750 222 222 333 333 350 556 1000 333 1000 500 333 944 750
+ 500 667 278 333 556 556 556 556 260 556 333 737 370 556 584 333
+ 737 552 400 549 333 333 333 576 537 278 333 333 365 556 834 834
+ 834 611 667 667 667 667 667 667 1000 722 667 667 667 667 278 278
+ 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667
+ 667 611 556 556 556 556 556 556 889 500 556 556 556 556 278 278
+ 278 278 556 556 556 556 556 556 556 549 611 556 556 556 556 500
+ 556 500]
+/FontDescriptor 13 0 R
+>>
+endobj
+12 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F2
+/BaseFont /Arial,Bold
+/Encoding /WinAnsiEncoding
+/FirstChar 30
+/LastChar 255
+/Widths [ 750 750 278 333 474 556 556 889 722 238 333 333 389 584 278 333
+ 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584
+ 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833
+ 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333
+ 584 556 333 556 611 556 611 556 333 611 611 278 278 556 278 889
+ 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389
+ 584 750 556 750 278 556 500 1000 556 556 333 1000 667 333 1000 750
+ 611 750 750 278 278 500 500 350 556 1000 333 1000 556 333 944 750
+ 500 667 278 333 556 556 556 556 280 556 333 737 370 556 584 333
+ 737 552 400 549 333 333 333 576 556 278 333 333 365 556 834 834
+ 834 611 722 722 722 722 722 722 1000 722 667 667 667 667 278 278
+ 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667
+ 667 611 556 556 556 556 556 556 889 556 556 556 556 556 278 278
+ 278 278 611 611 611 611 611 611 611 549 611 611 611 611 611 556
+ 611 556]
+/FontDescriptor 14 0 R
+>>
+endobj
+13 0 obj
+<<
+/Type /FontDescriptor
+/FontName /Arial
+/FontBBox [ -665 -325 2000 1006 ]
+/Ascent 905
+/Descent -212
+/CapHeight 905
+/XHeight 724
+/ItalicAngle 0
+/Flags 32
+/StemV 70
+>>
+endobj
+14 0 obj
+<<
+/Type /FontDescriptor
+/FontName /Arial,Bold
+/FontBBox [ -628 -376 2000 1010 ]
+/Ascent 905
+/Descent -212
+/CapHeight 905
+/XHeight 724
+/ItalicAngle 0
+/Flags 32
+/StemV 120
+>>
+endobj
+9 0 obj
+<<
+>>
+endobj
+xref
+0 15
+0000000000 65535 f
+0000000010 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000187 00000 n
+0000000253 00000 n
+0000000417 00000 n
+0000000450 00000 n
+0000005573 00000 n
+0000008294 00000 n
+0000005596 00000 n
+0000005646 00000 n
+0000006767 00000 n
+0000007892 00000 n
+0000008090 00000 n
+trailer
+<<
+/Size 15
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+8319
+%%EOF
diff --git a/doc/context/sources/general/manuals/start/graphics/fig-page-parameters-en.md b/doc/context/sources/general/manuals/start/graphics/fig-page-parameters-en.md new file mode 100644 index 000000000..35c04b445 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/fig-page-parameters-en.md @@ -0,0 +1,1371 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Mayura Draw, Version 4.3 +%%Title: fig-page-parameters-en.md +%%CreationDate: Fri Jan 10 17:04:54 2014 +%%BoundingBox: 8 230 580 790 +%%DocumentFonts: ArialMT +%%Orientation: Portrait +%%EndComments +%%BeginProlog +%%BeginResource: procset MayuraDraw_ops +%%Version: 4.3 +%%Copyright: (c) 1993-2003 Mayura Software +/PDXDict 100 dict def +PDXDict begin +% width height matrix proc key cache +% definepattern -\> font +/definepattern { %def + 7 dict begin + /FontDict 9 dict def + FontDict begin + /cache exch def + /key exch def + /proc exch cvx def + /mtx exch matrix invertmatrix def + /height exch def + /width exch def + /ctm matrix currentmatrix def + /ptm matrix identmatrix def + /str + (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) + def + end + /FontBBox [ %def + 0 0 FontDict /width get + FontDict /height get + ] def + /FontMatrix FontDict /mtx get def + /Encoding StandardEncoding def + /FontType 3 def + /BuildChar { %def + pop begin + FontDict begin + width 0 cache { %ifelse + 0 0 width height setcachedevice + }{ %else + setcharwidth + } ifelse + 0 0 moveto width 0 lineto + width height lineto 0 height lineto + closepath clip newpath + gsave proc grestore + end end + } def + FontDict /key get currentdict definefont + end +} bind def + +% dict patternpath - +% dict matrix patternpath - +/patternpath { %def + dup type /dicttype eq { %ifelse + begin FontDict /ctm get setmatrix + }{ %else + exch begin FontDict /ctm get setmatrix + concat + } ifelse + currentdict setfont + FontDict begin + FontMatrix concat + width 0 dtransform + round width div exch round width div exch + 0 height dtransform + round height div exch + round height div exch + 0 0 transform round exch round exch + ptm astore setmatrix + + pathbbox + height div ceiling height mul 4 1 roll + width div ceiling width mul 4 1 roll + height div floor height mul 4 1 roll + width div floor width mul 4 1 roll + + 2 index sub height div ceiling cvi exch + 3 index sub width div ceiling cvi exch + 4 2 roll moveto + + FontMatrix ptm invertmatrix pop + { %repeat + gsave + ptm concat + dup str length idiv { %repeat + str show + } repeat + dup str length mod str exch + 0 exch getinterval show + grestore + 0 height rmoveto + } repeat + pop + end end +} bind def + +% dict patternfill - +% dict matrix patternfill - +/patternfill { %def + gsave + eoclip patternpath + grestore + newpath +} bind def + +/img { %def + gsave + /imgh exch def + /imgw exch def + concat + imgw imgh 8 + [imgw 0 0 imgh neg 0 imgh] + /colorstr 768 string def + /colorimage where { + pop + { currentfile colorstr readhexstring pop } + false 3 colorimage + }{ + /graystr 256 string def + { + currentfile colorstr readhexstring pop + length 3 idiv + dup 1 sub 0 1 3 -1 roll + { + graystr exch + colorstr 1 index 3 mul get 30 mul + colorstr 2 index 3 mul 1 add get 59 mul + colorstr 3 index 3 mul 2 add get 11 mul + add add 100 idiv + put + } for + graystr 0 3 -1 roll getinterval + } image + } ifelse + grestore +} bind def + +/arrowhead { + gsave + [] 0 setdash + strokeC strokeM strokeY strokeK setcmykcolor + 2 copy moveto + 4 2 roll exch 4 -1 roll exch + sub 3 1 roll sub + exch atan rotate dup scale + arrowtype + dup 0 eq { + -1 2 rlineto 7 -2 rlineto -7 -2 rlineto + closepath fill + } if + dup 1 eq { + 0 3 rlineto 9 -3 rlineto -9 -3 rlineto + closepath fill + } if + dup 2 eq { + -6 -6 rmoveto 6 6 rlineto -6 6 rlineto + -1.4142 -1.4142 rlineto 4.5858 -4.5858 rlineto + -4.5858 -4.5858 rlineto closepath fill + } if + dup 3 eq { + -6 0 rmoveto -1 2 rlineto 7 -2 rlineto -7 -2 rlineto + closepath fill + } if + dup 4 eq { + -9 0 rmoveto 0 3 rlineto 9 -3 rlineto -9 -3 rlineto + closepath fill + } if + dup 5 eq { + currentpoint newpath 3 0 360 arc + closepath fill + } if + dup 6 eq { + 2.5 2.5 rmoveto 0 -5 rlineto -5 0 rlineto 0 5 rlineto + closepath fill + } if + pop + grestore +} bind def + +/setcmykcolor where { %ifelse + pop +}{ %else + /setcmykcolor { + /black exch def /yellow exch def + /magenta exch def /cyan exch def + cyan black add dup 1 gt { pop 1 } if 1 exch sub + magenta black add dup 1 gt { pop 1 } if 1 exch sub + yellow black add dup 1 gt { pop 1 } if 1 exch sub + setrgbcolor + } bind def +} ifelse + +/RE { %def + findfont begin + currentdict dup length dict begin + { %forall + 1 index /FID ne { def } { pop pop } ifelse + } forall + /FontName exch def dup length 0 ne { %if + /Encoding Encoding 256 array copy def + 0 exch { %forall + dup type /nametype eq { %ifelse + Encoding 2 index 2 index put + pop 1 add + }{ %else + exch pop + } ifelse + } forall + } if pop + currentdict dup end end + /FontName get exch definefont pop +} bind def + +/spacecount { %def + 0 exch + ( ) { %loop + search { %ifelse + pop 3 -1 roll 1 add 3 1 roll + }{ pop exit } ifelse + } loop +} bind def + +/WinAnsiEncoding [ + 39/quotesingle 96/grave 130/quotesinglbase/florin/quotedblbase + /ellipsis/dagger/daggerdbl/circumflex/perthousand + /Scaron/guilsinglleft/OE 145/quoteleft/quoteright + /quotedblleft/quotedblright/bullet/endash/emdash + /tilde/trademark/scaron/guilsinglright/oe/dotlessi + 159/Ydieresis 164/currency 166/brokenbar 168/dieresis/copyright + /ordfeminine 172/logicalnot 174/registered/macron/ring + 177/plusminus/twosuperior/threesuperior/acute/mu + 183/periodcentered/cedilla/onesuperior/ordmasculine + 188/onequarter/onehalf/threequarters 192/Agrave/Aacute + /Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla + /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute + /Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute + /Ocircumflex/Otilde/Odieresis/multiply/Oslash + /Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn + /germandbls/agrave/aacute/acircumflex/atilde/adieresis + /aring/ae/ccedilla/egrave/eacute/ecircumflex + /edieresis/igrave/iacute/icircumflex/idieresis + /eth/ntilde/ograve/oacute/ocircumflex/otilde + /odieresis/divide/oslash/ugrave/uacute/ucircumflex + /udieresis/yacute/thorn/ydieresis +] def + +/SymbolEncoding [ + 32/space/exclam/universal/numbersign/existential/percent + /ampersand/suchthat/parenleft/parenright/asteriskmath/plus + /comma/minus/period/slash/zero/one/two/three/four/five/six + /seven/eight/nine/colon/semicolon/less/equal/greater/question + /congruent/Alpha/Beta/Chi/Delta/Epsilon/Phi/Gamma/Eta/Iota + /theta1/Kappa/Lambda/Mu/Nu/Omicron/Pi/Theta/Rho/Sigma/Tau + /Upsilon/sigma1/Omega/Xi/Psi/Zeta/bracketleft/therefore + /bracketright/perpendicular/underscore/radicalex/alpha + /beta/chi/delta/epsilon/phi/gamma/eta/iota/phi1/kappa/lambda + /mu/nu/omicron/pi/theta/rho/sigma/tau/upsilon/omega1/omega + /xi/psi/zeta/braceleft/bar/braceright/similar + 161/Upsilon1/minute/lessequal/fraction/infinity/florin/club + /diamond/heart/spade/arrowboth/arrowleft/arrowup/arrowright + /arrowdown/degree/plusminus/second/greaterequal/multiply + /proportional/partialdiff/bullet/divide/notequal/equivalence + /approxequal/ellipsis/arrowvertex/arrowhorizex/carriagereturn + /aleph/Ifraktur/Rfraktur/weierstrass/circlemultiply + /circleplus/emptyset/intersection/union/propersuperset + /reflexsuperset/notsubset/propersubset/reflexsubset/element + /notelement/angle/gradient/registerserif/copyrightserif + /trademarkserif/product/radical/dotmath/logicalnot/logicaland + /logicalor/arrowdblboth/arrowdblleft/arrowdblup/arrowdblright + /arrowdbldown/lozenge/angleleft/registersans/copyrightsans + /trademarksans/summation/parenlefttp/parenleftex/parenleftbt + /bracketlefttp/bracketleftex/bracketleftbt/bracelefttp + /braceleftmid/braceleftbt/braceex + 241/angleright/integral/integraltp/integralex/integralbt + /parenrighttp/parenrightex/parenrightbt/bracketrighttp + /bracketrightex/bracketrightbt/bracerighttp/bracerightmid + /bracerightbt +] def + +/patarray [ +/leftdiagonal /rightdiagonal /crossdiagonal /horizontal +/vertical /crosshatch /fishscale /wave /brick +] def +/arrowtype 0 def +/fillC 0 def /fillM 0 def /fillY 0 def /fillK 0 def +/strokeC 0 def /strokeM 0 def /strokeY 0 def /strokeK 1 def +/pattern -1 def +/mat matrix def +/mat2 matrix def +/nesting 0 def +/deferred /N def +/c /curveto load def +/c2 { pop pop c } bind def +/C /curveto load def +/C2 { pop pop C } bind def +/e { gsave concat 0 0 moveto } bind def +/F { + nesting 0 eq { %ifelse + pattern -1 eq { %ifelse + fillC fillM fillY fillK setcmykcolor eofill + }{ %else + gsave fillC fillM fillY fillK setcmykcolor eofill grestore + 0 0 0 1 setcmykcolor + patarray pattern get findfont patternfill + } ifelse + }{ %else + /deferred /F def + } ifelse +} bind def +/f { closepath F } bind def +/K { /strokeK exch def /strokeY exch def + /strokeM exch def /strokeC exch def } bind def +/k { /fillK exch def /fillY exch def + /fillM exch def /fillC exch def } bind def +/opc { pop } bind def +/Opc { pop } bind def +/L /lineto load def +/L2 { pop pop L } bind def +/m /moveto load def +/m2 { pop pop m } bind def +/n /newpath load def +/N { + nesting 0 eq { %ifelse + newpath + }{ %else + /deferred /N def + } ifelse +} def +/S { + nesting 0 eq { %ifelse + strokeC strokeM strokeY strokeK setcmykcolor stroke + }{ %else + /deferred /S def + } ifelse +} bind def +/s { closepath S } bind def +/Tx { fillC fillM fillY fillK setcmykcolor show + 0 leading neg translate 0 0 moveto } bind def +/T { grestore } bind def +/TX { pop } bind def +/Ts { pop } bind def +/tal { pop } bind def +/tld { pop } bind def +/tbx { pop exch pop sub /jwidth exch def } def +/tpt { %def + fillC fillM fillY fillK setcmykcolor + moveto show +} bind def +/tpj { %def + fillC fillM fillY fillK setcmykcolor + moveto + dup stringwidth pop + 3 -1 roll + exch sub + 1 index spacecount + dup 0 eq { %ifelse + pop pop show + }{ %else + div 0 8#040 4 -1 roll widthshow + } ifelse +} bind def +/u {} def +/U {} def +/*u { /nesting nesting 1 add def } def +/*U { + /nesting nesting 1 sub def + nesting 0 eq { + deferred cvx exec + } if +} def +/w /setlinewidth load def +/d /setdash load def +/B { + nesting 0 eq { %ifelse + gsave F grestore S + }{ %else + /deferred /B def + } ifelse +} bind def +/b { closepath B } bind def +/z { /align exch def pop /leading exch def exch findfont + exch scalefont setfont } bind def +/tfn { exch findfont + exch scalefont setfont } bind def +/Pat { /pattern exch def } bind def +/cm { 6 array astore concat } bind def +/q { mat2 currentmatrix pop } bind def +/Q { mat2 setmatrix } bind def +/Ah { + pop /arrowtype exch def + currentlinewidth 5 1 roll arrowhead +} bind def +/Arc { + mat currentmatrix pop + translate scale 0 0 1 5 -2 roll arc + mat setmatrix +} bind def +/Arc2 { pop pop Arc } bind def +/Bx { + mat currentmatrix pop + concat /y1 exch def /x1 exch def /y2 exch def /x2 exch def + x1 y1 moveto x1 y2 lineto x2 y2 lineto x2 y1 lineto + mat setmatrix +} bind def +/Rr { + mat currentmatrix pop + concat /yrad exch def /xrad exch def + 2 copy gt { exch } if /x2 exch def /x1 exch def + 2 copy gt { exch } if /y2 exch def /y1 exch def + x1 xrad add y2 moveto + matrix currentmatrix x1 xrad add y2 yrad sub translate xrad yrad scale + 0 0 1 90 -180 arc setmatrix + matrix currentmatrix x1 xrad add y1 yrad add translate xrad yrad scale + 0 0 1 180 270 arc setmatrix + matrix currentmatrix x2 xrad sub y1 yrad add translate xrad yrad scale + 0 0 1 270 0 arc setmatrix + matrix currentmatrix x2 xrad sub y2 yrad sub translate xrad yrad scale + 0 0 1 0 90 arc setmatrix + closepath + mat setmatrix +} bind def +/Ov { + mat currentmatrix pop + concat translate scale 1 0 moveto 0 0 1 0 360 arc closepath + mat setmatrix +} bind def +end +%%EndResource +%%EndProlog +%%BeginSetup +%PDX g 3 3 1 1 +%%IncludeFont: ArialMT +PDXDict begin +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +/_PDX_savepage save def + +15 15 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 7.5 0 moveto 15 7.5 lineto + 0 7.5 moveto 7.5 15 lineto + 2 setlinewidth stroke +} bind +/rightdiagonal true definepattern pop + +15 15 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 7.5 0 moveto 0 7.5 lineto + 15 7.5 moveto 7.5 15 lineto + 2 setlinewidth stroke +} bind +/leftdiagonal true definepattern pop + +15 15 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 0 7.5 moveto 15 7.5 lineto + 2 setlinewidth stroke +} bind +/horizontal true definepattern pop + +15 15 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 7.5 0 moveto 7.5 15 lineto + 2 setlinewidth stroke +} bind +/vertical true definepattern pop + +15 15 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 0 7.5 moveto 15 7.5 lineto + 7.5 0 moveto 7.5 15 lineto + 2 setlinewidth stroke +} bind +/crosshatch true definepattern pop + +30 30 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 setlinecap + 0 7.5 moveto 30 7.5 lineto + 0 22.5 moveto 30 22.5 lineto + 7.5 0 moveto 7.5 7.5 lineto + 7.5 22.5 moveto 7.5 30 lineto + 22.5 7.5 moveto 22.5 22.5 lineto + 1 setlinewidth stroke +} bind +/brick true definepattern pop + +30 30 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 2 scale + 2 setlinecap + 7.5 0 moveto 15 7.5 lineto + 0 7.5 moveto 7.5 15 lineto + 7.5 0 moveto 0 7.5 lineto + 15 7.5 moveto 7.5 15 lineto + 0.5 setlinewidth stroke +} bind +/crossdiagonal true definepattern pop + +30 30 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 2 2 scale + 1 setlinecap + 0 7.5 moveto 0 15 7.5 270 360 arc + 7.5 15 moveto 15 15 7.5 180 270 arc + 0 7.5 moveto 7.5 7.5 7.5 180 360 arc + 0.5 setlinewidth stroke +} bind +/fishscale true definepattern pop + +30 30 [300 72 div 0 0 300 72 div 0 0] +{ %definepattern + 1 setlinecap 0.5 setlinewidth + 7.5 0 10.6 135 45 arcn + 22.5 15 10.6 225 315 arc + stroke + 7.5 15 10.6 135 45 arcn + 22.5 30 10.6 225 315 arc + stroke +} bind +/wave true definepattern pop + +WinAnsiEncoding /_ArialMT /ArialMT RE + +newpath 2 setlinecap 0 setlinejoin 2 setmiterlimit +[] 0 setdash +8 230 moveto 8 790 lineto 580 790 lineto 580 230 lineto closepath clip +newpath +%%EndPageSetup +0.862745 0.956863 -1.42109e-016 0 K +2 w +543 249 -9 789 [1 0 0 1 27 -9] Bx +s +0.133333 0.133333 0.133333 0 k +0.133333 0.133333 0.133333 0 K +0.5 w +150 480 90 510 [1 0 0 1 -15 180] Bx +b +150 480 90 510 [1 0 0 1 60.33 180] Bx +b +150 480 90 510 [1 0 0 1 299.8 180] Bx +b +240 480 90 510 [1 0 0 1 135 180] Bx +b +150 480 90 510 [1 0 0 1 375.3 180] Bx +b +[1 0 0 1 15.05 0.702] e +33 681 33 681 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(top) 33 670.14 tpt +T +0.133333 0.133333 0.133333 0 k +150 480 90 510 [1 0 0 1 -15 135] Bx +b +150 480 90 510 [1 0 0 1 60 135] Bx +b +150 480 90 510 [1 0 0 1 300 135] Bx +b +240 480 90 510 [1 0 0 1 135 135] Bx +b +150 480 90 510 [1 0 0 1 375 135] Bx +b +[1 0 0 1 -5.627 6.702] e +33 630 33 630 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(header) 33 619.14 tpt +T +0.133333 0.133333 0.133333 0 k +150 480 90 510 [1 0 0 1 -15 -90.7] Bx +b +150 480 90 510 [1 0 0 1 60 -90.7] Bx +b +150 480 90 510 [1 0 0 1 300 -90.7] Bx +b +240 480 90 510 [1 0 0 1 135 -90.7] Bx +b +150 480 90 510 [1 0 0 1 375 -90.7] Bx +b +[1 0 0 1 1.045 9] e +33 402 33 402 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(footer) 33 391.14 tpt +T +0.133333 0.133333 0.133333 0 k +150 480 90 510 [1 0 0 1 -15 -135] Bx +b +150 480 90 510 [1 0 0 1 60 -135] Bx +b +150 480 90 510 [1 0 0 1 300 -135] Bx +b +240 480 90 510 [1 0 0 1 135 -135] Bx +b +150 480 90 510 [1 0 0 1 375 -135] Bx +b +[1 0 0 1 -7.957 3.702] e +36 363 36 363 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(bottom) 36 352.14 tpt +T +0.133333 0.133333 0.133333 0 k +150 345 90 510 [1 0 0 1 -15 90] Bx +b +150 345 90 510 [1 0 0 1 60 90] Bx +b +150 345 90 510 [1 0 0 1 300 90] Bx +b +-1.42109e-016 0.4 0.8 0 k +240 345 90 510 [1 0 0 1 135 90] Bx +b +0.133333 0.133333 0.133333 0 k +150 345 90 510 [1 0 0 1 375 90] Bx +b +[1 0 0 1 21.38 17.2] e +24 507 24 507 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(text) 24 496.14 tpt +T +[1 0 0 1 -11.02 51.19] e +93 705 93 705 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(left edge) 93 694.14 tpt +T +[1 0 0 1 -4.5 48.19] e +159 708 159 708 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(left margin) 159 697.14 tpt +T +[1 0 0 1 17.33 51.19] e +273 705 273 705 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(text) 273 694.14 tpt +T +[1 0 0 1 -13.87 54.19] e +402 702 402 702 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(right margin) 402 691.14 tpt +T +[1 0 0 1 -11.34 51.19] e +480 705 480 705 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(right edge) 480 694.14 tpt +T +[1 0 0 1 -13.64 0.702] e +75 352.596 39 366 tbx +0 tal +13 tld +/_ArialMT 12 tfn +() 39 355.14 tpt +T +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +1 1 1 0 K +1 w +q +1 0 0 1 91.45 14.02 cm +150 712 150 720 m2 +150 638 150 630 L2 +Q +S +q +1 0 0 1 91.45 14.02 cm +150 630 150 720 4 1 Ah +150 720 150 630 4 2 Ah +Q +q +1 0 0 1 165 -30 cm +150 712 150 720 m2 +150 698 150 690 L2 +Q +S +q +1 0 0 1 165 -30 cm +150 690 150 720 4 1 Ah +150 720 150 690 4 2 Ah +Q +q +1 0 0 1 -47.91 0 cm +130.909 705 122.909 705 m2 +265 705 273 705 L2 +Q +S +q +1 0 0 1 -47.91 0 cm +273 705 122.909 705 4 1 Ah +122.909 705 273 705 4 2 Ah +Q +q +1 0 0 1 -45 -150 cm +128 705 120 705 m2 +172 705 180 705 L2 +Q +S +q +1 0 0 1 -45 -150 cm +180 705 120 705 4 1 Ah +120 705 180 705 4 2 Ah +Q +0.25 w +q +1 0 0 1 0.09051 53.27 cm +225 660 m +225 645 L +Q +S +q +1 0 0 1 6.094 0 cm +228 645 m +243 645 L +Q +S +[1 0 0 1 -2.909 66] e +126 654 126 654 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(backspace) 126 643.14 tpt +T +[1 0 0 1 -9 30] e +255 690 255 690 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(topspace) 255 679.14 tpt +T +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +1 w +q +1 0 0 1 29.91 -210 cm +128 705 120 705 m2 +172 705 180 705 L2 +Q +S +q +1 0 0 1 29.91 -210 cm +180 705 120 705 4 1 Ah +120 705 180 705 4 2 Ah +Q +q +1 0 0 1 270 -210 cm +128 705 120 705 m2 +172 705 180 705 L2 +Q +S +q +1 0 0 1 270 -210 cm +180 705 120 705 4 1 Ah +120 705 180 705 4 2 Ah +Q +q +1 0 0 1 345 -150 cm +128 705 120 705 m2 +172 705 180 705 L2 +Q +S +q +1 0 0 1 345 -150 cm +180 705 120 705 4 1 Ah +120 705 180 705 4 2 Ah +Q +q +1 0 0 1 165 -75 cm +150 712 150 720 m2 +150 698 150 690 L2 +Q +S +q +1 0 0 1 165 -75 cm +150 690 150 720 4 1 Ah +150 720 150 690 4 2 Ah +Q +q +1 0 0 1 165 -300 cm +150 712 150 720 m2 +150 698 150 690 L2 +Q +S +q +1 0 0 1 165 -300 cm +150 690 150 720 4 1 Ah +150 720 150 690 4 2 Ah +Q +q +1 0 0 1 165 -345 cm +150 712 150 720 m2 +150 698 150 690 L2 +Q +S +q +1 0 0 1 165 -345 cm +150 690 150 720 4 1 Ah +150 720 150 690 4 2 Ah +Q +0.862745 0.956863 -1.42109e-016 0 K +2 w +q +1 0 0 1 104.9 -150 cm +136 705 120 705 m2 +254.094 705 270.094 705 L2 +Q +S +q +1 0 0 1 104.9 -150 cm +270.094 705 120 705 4 1 Ah +120 705 270.094 705 4 2 Ah +Q +q +1 0 0 1 105 -118.5 cm +150 747.547 150 763.547 m2 +150 524.547 150 508.547 L2 +Q +S +q +1 0 0 1 105 -118.5 cm +150 508.547 150 763.547 4 1 Ah +150 763.547 150 508.547 4 2 Ah +Q +[1 0 0 1 -3 6.702] e +324 675 324 675 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(top) 324 664.14 tpt +T +[1 0 0 1 -3 3.702] e +324 633 324 633 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(header) 324 622.14 tpt +T +[1 0 0 1 0 0] e +261 498 261 498 tbx +0 tal +13 tld +0.862745 0.956863 -1.42109e-016 0 k +/_ArialMT 12 tfn +(height) 261 487.14 tpt +T +[1 0 0 1 -14.05 7.406] e +291 564 291 564 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(width) 291 553.14 tpt +T +[1 0 0 1 0 9.702] e +321 402 321 402 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(footer) 321 391.14 tpt +T +[1 0 0 1 0 9.702] e +321 357 321 357 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(bottom) 321 346.14 tpt +T +[1 0 0 1 -0.348 7.5] e +84 564 84 564 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(leftedge) 84 553.14 tpt +T +[1 0 0 1 -13.08 4.359] e +168 507 168 507 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(leftmargin) 168 496.14 tpt +T +[1 0 0 1 -17.44 7.359] e +408 504 408 504 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(rightmargin) 408 493.14 tpt +T +[1 0 0 1 -13.01 7.5] e +483 564 483 564 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(rightedge) 483 553.14 tpt +T +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +1 1 1 0 K +1 w +q +1 0 0 1 165 -120 cm +150 712 150 720 m2 +150 563 150 555 L2 +Q +S +q +1 0 0 1 165 -120 cm +150 555 150 720 4 1 Ah +150 720 150 555 4 2 Ah +Q +[1 0 0 1 0 0] e +402 460.596 333 474 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +() 333 463.14 tpt +T +[1 0 0 1 -33 15.64] e +354 468 354 468 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(textheight) 354 457.14 tpt +T +u +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +0.5 w +q +1 0 0 1 255 -60 cm +150 716 150 720 m2 +150 709 150 705 L2 +Q +S +q +1 0 0 1 255 -60 cm +150 705 150 720 4 1 Ah +150 720 150 705 4 2 Ah +Q +[1 0 0 1 -2.33 7.659] e +411 651 411 651 tbx +0 tal +11 tld +1 1 1 0 k +/_ArialMT 10 tfn +(topdistance) 411 641.95 tpt +T +U +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +q +1 0 0 1 255 -105 cm +150 716 150 720 m2 +150 709 150 705 L2 +Q +S +q +1 0 0 1 255 -105 cm +150 705 150 720 4 1 Ah +150 720 150 705 4 2 Ah +Q +[1 0 0 1 -2.33 -37.34] e +411 651 411 651 tbx +0 tal +11 tld +1 1 1 0 k +/_ArialMT 10 tfn +(headerdistance) 411 641.95 tpt +T +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +q +1 0 0 1 255 -285 cm +150 716 150 720 m2 +150 709 150 705 L2 +Q +S +q +1 0 0 1 255 -285 cm +150 705 150 720 4 1 Ah +150 720 150 705 4 2 Ah +Q +[1 0 0 1 -2.33 -217.3] e +411 651 411 651 tbx +0 tal +11 tld +1 1 1 0 k +/_ArialMT 10 tfn +(footerdistance) 411 641.95 tpt +T +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +q +1 0 0 1 255 -330 cm +150 716 150 720 m2 +150 709 150 705 L2 +Q +S +q +1 0 0 1 255 -330 cm +150 705 150 720 4 1 Ah +150 720 150 705 4 2 Ah +Q +[1 0 0 1 -2.33 -262.3] e +411 651 411 651 tbx +0 tal +11 tld +1 1 1 0 k +/_ArialMT 10 tfn +(bottomdistance) 411 641.95 tpt +T +u +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +q +1 0 0 1 45 0 cm +109 330 105 330 m2 +120 330 L +Q +S +q +1 0 0 1 45 0 cm +120 330 105 330 4 1 Ah +Q +q +1 0 0 1 30 0 cm +101 330 105 330 m2 +90 330 L +Q +S +q +1 0 0 1 30 0 cm +90 330 105 330 4 1 Ah +Q +U +u +q +1 0 0 1 120 -15 cm +109 330 105 330 m2 +120 330 L +Q +S +q +1 0 0 1 120 -15 cm +120 330 105 330 4 1 Ah +Q +q +1 0 0 1 105 -15 cm +101 330 105 330 m2 +90 330 L +Q +S +q +1 0 0 1 105 -15 cm +90 330 105 330 4 1 Ah +Q +U +u +q +1 0 0 1 285 -15 cm +109 330 105 330 m2 +120 330 L +Q +S +q +1 0 0 1 285 -15 cm +120 330 105 330 4 1 Ah +Q +q +1 0 0 1 270 -15 cm +101 330 105 330 m2 +90 330 L +Q +S +q +1 0 0 1 270 -15 cm +90 330 105 330 4 1 Ah +Q +U +u +q +1 0 0 1 360 0 cm +109 330 105 330 m2 +120 330 L +Q +S +q +1 0 0 1 360 0 cm +120 330 105 330 4 1 Ah +Q +q +1 0 0 1 345 0 cm +101 330 105 330 m2 +90 330 L +Q +S +q +1 0 0 1 345 0 cm +90 330 105 330 4 1 Ah +Q +U +[1 0 0 1 -15 5.998] e +123 321 123 321 tbx +0 tal +11 tld +1 1 1 0 k +/_ArialMT 10 tfn +(leftedgedistance) 123 311.95 tpt +T +[1 0 0 1 -36 9.633] e +300.14 291.83 219 303 tbx +0 tal +11 tld +/_ArialMT 10 tfn +(leftmargindistance) 219 293.95 tpt +T +[1 0 0 1 120.2 8.906] e +306.25 291.83 219 303 tbx +0 tal +11 tld +/_ArialMT 10 tfn +(rightmargindistance) 219 293.95 tpt +T +[1 0 0 1 -27 8.998] e +450 318 450 318 tbx +0 tal +11 tld +/_ArialMT 10 tfn +(rightedgedistance) 450 308.95 tpt +T +[1 0 0 1 -6 58.55] e +183 246.83 120 258 tbx +0 tal +11 tld +/_ArialMT 10 tfn +(edgedistance) 120 248.95 tpt +T +[1 0 0 1 18 53.27] e +171 249 171 249 tbx +0 tal +11 tld +/_ArialMT 10 tfn +(margindistance) 171 239.95 tpt +T +[1 0 0 1 180 53.27] e +171 249 171 249 tbx +0 tal +11 tld +/_ArialMT 10 tfn +(margindistance) 171 239.95 tpt +T +[1 0 0 1 312 58.55] e +183 246.83 120 258 tbx +0 tal +11 tld +/_ArialMT 10 tfn +(edgedistance) 120 248.95 tpt +T +u +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +1 w +q +1 0 0 1 -15 0 cm +60 285 m +90 285 L +Q +S +q +1 0 0 1 0 0 cm +75 285 m +75 255 L +Q +S +U +u +q +-1 0 0 1 615 0 cm +60 285 m +90 285 L +Q +S +q +-1 0 0 1 600 0 cm +75 285 m +75 255 L +Q +S +U +u +q +0 -1 -1 0 810 825 cm +60 285 m +90 285 L +Q +S +q +0 -1 -1 0 810 810 cm +75 285 m +75 255 L +Q +S +U +u +q +0 -1 1 0 -210 825 cm +60 285 m +90 285 L +Q +S +q +0 -1 1 0 -210 810 cm +75 285 m +75 255 L +Q +S +U +0.5 w +[3 3] 0 d +525 735 75 285 [1 0 0 1 0 0] Bx +s +1 w +[] 0 d +q +1 0 0 1 -45.09 -435 cm +128 705 120 705 m2 +562.094 705 570.094 705 L2 +Q +S +q +1 0 0 1 -45.09 -435 cm +570.094 705 120 705 4 1 Ah +120 705 570.094 705 4 2 Ah +Q +[1 0 0 1 0 0] e +271.57 246.83 246 258 tbx +0 tal +11 tld +0.862745 0.956863 -1.42109e-016 0 k +/_ArialMT 10 tfn +() 246 248.95 tpt +T +[1 0 0 1 0 0] e +261 255 261 255 tbx +0 tal +11 tld +1 1 1 0 k +/_ArialMT 10 tfn +() 261 245.95 tpt +T +[1 0 0 1 9.607 12.09] e +261 255 261 255 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(paperwidth) 261 244.14 tpt +T +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +q +0 1 -1 0 1244 164.3 cm +128 705 120 705 m2 +562.094 705 570.094 705 L2 +Q +S +q +0 1 -1 0 1244 164.3 cm +570.094 705 120 705 4 1 Ah +120 705 570.094 705 4 2 Ah +Q +[0 1 -1 0 797.2 219] e +261 255 261 255 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(paperheight) 261 244.14 tpt +T +[1 0 0 1 -12 12] e +285 540 285 540 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(textwidth) 285 529.14 tpt +T +[1 0 0 1 0 12] e +90 540 90 540 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(edge) 90 529.14 tpt +T +[1 0 0 1 0 9] e +162 483 162 483 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(margin) 162 472.14 tpt +T +[1 0 0 1 -6.336 12] e +408 480 408 480 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(margin) 408 469.14 tpt +T +[1 0 0 1 -6 18] e +489 534 489 534 tbx +0 tal +13 tld +/_ArialMT 12 tfn +(edge) 489 523.14 tpt +T +-1.42109e-016 -1.42109e-016 -1.42109e-016 0 k +q +1 0 0 1 252.1 0 cm +130.909 705 122.909 705 m2 +265 705 273 705 L2 +Q +S +q +1 0 0 1 252.1 0 cm +273 705 122.909 705 4 1 Ah +122.909 705 273 705 4 2 Ah +Q +0.25 w +q +1 0 0 1 150.1 52.55 cm +225 660 m +225 645 L +Q +S +[1 0 0 1 297.1 66] e +126 654 126 654 tbx +0 tal +13 tld +1 1 1 0 k +/_ArialMT 12 tfn +(cutspace) 126 643.14 tpt +T +%%PageTrailer +_PDX_savepage restore +%%Trailer +end +showpage +%%EOF diff --git a/doc/context/sources/general/manuals/start/graphics/fig-page-parameters-en.pdf b/doc/context/sources/general/manuals/start/graphics/fig-page-parameters-en.pdf new file mode 100644 index 000000000..1dd1f75b1 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/fig-page-parameters-en.pdf @@ -0,0 +1,1216 @@ +%PDF-1.0
+1 0 obj
+<<
+/Creator (Mayura Draw 4.3)
+>>
+endobj
+2 0 obj
+<<
+/Type /Catalog
+/Pages 4 0 R
+/Outlines 3 0 R
+>>
+endobj
+3 0 obj
+<<
+/Type /Outlines
+/Count 0
+>>
+endobj
+4 0 obj
+<<
+/Type /Pages
+/Count 1
+/Kids [ 5 0 R ]
+>>
+endobj
+5 0 obj
+<<
+/Type /Page
+/Parent 4 0 R
+/MediaBox [ 8 230 580 790 ]
+/Resources <<
+/ProcSet 6 0 R
+/XObject 9 0 R
+/Font 10 0 R
+>>
+/Contents 7 0 R
+>>
+endobj
+6 0 obj
+[ /PDF /Text ]
+endobj
+7 0 obj
+<< /Length 8 0 R >>
+stream
+1 1 1 rg
+0.137255 0.0431373 1 RG
+2 w
+18 780 m
+18 240 l
+570 240 l
+570 780 l
+18 780 l
+s
+0.866667 0.866667 0.866667 rg
+0.866667 0.866667 0.866667 RG
+0.5 w
+75 690 m
+75 660 l
+135 660 l
+135 690 l
+75 690 l
+b*
+150.33 690 m
+150.33 660 l
+210.33 660 l
+210.33 690 l
+150.33 690 l
+b*
+389.8 690 m
+389.8 660 l
+449.8 660 l
+449.8 690 l
+389.8 690 l
+b*
+225 690 m
+225 660 l
+375 660 l
+375 690 l
+225 690 l
+b*
+465.3 690 m
+465.3 660 l
+525.3 660 l
+525.3 690 l
+465.3 690 l
+b*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 48.05 670.8 Tm
+0 Tw
+(top) Tj
+ET
+0.866667 0.866667 0.866667 rg
+75 645 m
+75 615 l
+135 615 l
+135 645 l
+75 645 l
+b*
+150 645 m
+150 615 l
+210 615 l
+210 645 l
+150 645 l
+b*
+390 645 m
+390 615 l
+450 615 l
+450 645 l
+390 645 l
+b*
+225 645 m
+225 615 l
+375 615 l
+375 645 l
+225 645 l
+b*
+465 645 m
+465 615 l
+525 615 l
+525 645 l
+465 645 l
+b*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 27.37 625.8 Tm
+0 Tw
+(header) Tj
+ET
+0.866667 0.866667 0.866667 rg
+75 419.3 m
+75 389.3 l
+135 389.3 l
+135 419.3 l
+75 419.3 l
+b*
+150 419.3 m
+150 389.3 l
+210 389.3 l
+210 419.3 l
+150 419.3 l
+b*
+390 419.3 m
+390 389.3 l
+450 389.3 l
+450 419.3 l
+390 419.3 l
+b*
+225 419.3 m
+225 389.3 l
+375 389.3 l
+375 419.3 l
+225 419.3 l
+b*
+465 419.3 m
+465 389.3 l
+525 389.3 l
+525 419.3 l
+465 419.3 l
+b*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 34.04 400.1 Tm
+0 Tw
+(footer) Tj
+ET
+0.866667 0.866667 0.866667 rg
+75 375 m
+75 345 l
+135 345 l
+135 375 l
+75 375 l
+b*
+150 375 m
+150 345 l
+210 345 l
+210 375 l
+150 375 l
+b*
+390 375 m
+390 345 l
+450 345 l
+450 375 l
+390 375 l
+b*
+225 375 m
+225 345 l
+375 345 l
+375 375 l
+225 375 l
+b*
+465 375 m
+465 345 l
+525 345 l
+525 375 l
+465 375 l
+b*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 28.04 355.8 Tm
+0 Tw
+(bottom) Tj
+ET
+0.866667 0.866667 0.866667 rg
+75 600 m
+75 435 l
+135 435 l
+135 600 l
+75 600 l
+b*
+150 600 m
+150 435 l
+210 435 l
+210 600 l
+150 600 l
+b*
+390 600 m
+390 435 l
+450 435 l
+450 600 l
+390 600 l
+b*
+1 0.6 0.2 rg
+225 600 m
+225 435 l
+375 435 l
+375 600 l
+225 600 l
+b*
+0.866667 0.866667 0.866667 rg
+465 600 m
+465 435 l
+525 435 l
+525 600 l
+465 600 l
+b*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 45.38 513.3 Tm
+0 Tw
+(text) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 81.98 745.3 Tm
+0 Tw
+(left edge) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 154.5 745.3 Tm
+0 Tw
+(left margin) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 290.3 745.3 Tm
+0 Tw
+(text) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 388.1 745.3 Tm
+0 Tw
+(right margin) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 468.7 745.3 Tm
+0 Tw
+(right edge) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 25.36 355.8 Tm
+0 Tw
+() Tj
+ET
+1 1 1 rg
+0 0 0 RG
+1 w
+241.45 726.02 m
+241.45 652.02 l
+S
+0 0 0 rg
+0 w
+241.45 734.02 m
+241.45 725.02 l
+238.45 725.02 l
+241.45 734.02 l
+244.45 725.02 l
+241.45 725.02 l
+241.45 734.02 l
+f*
+241.45 644.02 m
+241.45 653.02 l
+244.45 653.02 l
+241.45 644.02 l
+238.45 653.02 l
+241.45 653.02 l
+241.45 644.02 l
+f*
+1 1 1 rg
+1 w
+315 682 m
+315 668 l
+S
+0 0 0 rg
+0 w
+315 690 m
+315 681 l
+312 681 l
+315 690 l
+318 681 l
+315 681 l
+315 690 l
+f*
+315 660 m
+315 669 l
+318 669 l
+315 660 l
+312 669 l
+315 669 l
+315 660 l
+f*
+1 1 1 rg
+1 w
+83 705 m
+217.091 705 l
+S
+0 0 0 rg
+0 w
+75 705 m
+84 705 l
+84 702 l
+75 705 l
+84 708 l
+84 705 l
+75 705 l
+f*
+225.091 705 m
+216.091 705 l
+216.091 708 l
+225.091 705 l
+216.091 702 l
+216.091 705 l
+225.091 705 l
+f*
+1 1 1 rg
+1 w
+83 555 m
+127 555 l
+S
+0 0 0 rg
+0 w
+75 555 m
+84 555 l
+84 552 l
+75 555 l
+84 558 l
+84 555 l
+75 555 l
+f*
+135 555 m
+126 555 l
+126 558 l
+135 555 l
+126 552 l
+126 555 l
+135 555 l
+f*
+1 1 1 rg
+0.25 w
+225.091 713.273 m
+225.091 698.273 l
+S
+234.094 645 m
+249.094 645 l
+S
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 123.1 709.1 Tm
+0 Tw
+(backspace) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 246 709.1 Tm
+0 Tw
+(topspace) Tj
+ET
+1 1 1 rg
+1 w
+157.91 495 m
+201.91 495 l
+S
+0 0 0 rg
+0 w
+149.91 495 m
+158.91 495 l
+158.91 492 l
+149.91 495 l
+158.91 498 l
+158.91 495 l
+149.91 495 l
+f*
+209.91 495 m
+200.91 495 l
+200.91 498 l
+209.91 495 l
+200.91 492 l
+200.91 495 l
+209.91 495 l
+f*
+1 1 1 rg
+1 w
+398 495 m
+442 495 l
+S
+0 0 0 rg
+0 w
+390 495 m
+399 495 l
+399 492 l
+390 495 l
+399 498 l
+399 495 l
+390 495 l
+f*
+450 495 m
+441 495 l
+441 498 l
+450 495 l
+441 492 l
+441 495 l
+450 495 l
+f*
+1 1 1 rg
+1 w
+473 555 m
+517 555 l
+S
+0 0 0 rg
+0 w
+465 555 m
+474 555 l
+474 552 l
+465 555 l
+474 558 l
+474 555 l
+465 555 l
+f*
+525 555 m
+516 555 l
+516 558 l
+525 555 l
+516 552 l
+516 555 l
+525 555 l
+f*
+1 1 1 rg
+1 w
+315 637 m
+315 623 l
+S
+0 0 0 rg
+0 w
+315 645 m
+315 636 l
+312 636 l
+315 645 l
+318 636 l
+315 636 l
+315 645 l
+f*
+315 615 m
+315 624 l
+318 624 l
+315 615 l
+312 624 l
+315 624 l
+315 615 l
+f*
+1 1 1 rg
+1 w
+315 412 m
+315 398 l
+S
+0 0 0 rg
+0 w
+315 420 m
+315 411 l
+312 411 l
+315 420 l
+318 411 l
+315 411 l
+315 420 l
+f*
+315 390 m
+315 399 l
+318 399 l
+315 390 l
+312 399 l
+315 399 l
+315 390 l
+f*
+1 1 1 rg
+1 w
+315 367 m
+315 353 l
+S
+0 0 0 rg
+0 w
+315 375 m
+315 366 l
+312 366 l
+315 375 l
+318 366 l
+315 366 l
+315 375 l
+f*
+315 345 m
+315 354 l
+318 354 l
+315 345 l
+312 354 l
+315 354 l
+315 345 l
+f*
+1 1 1 rg
+0.137255 0.0431373 1 RG
+2 w
+240.9 555 m
+358.994 555 l
+S
+0.137255 0.0431373 1 rg
+0 w
+224.9 555 m
+242.9 555 l
+242.9 549 l
+224.9 555 l
+242.9 561 l
+242.9 555 l
+224.9 555 l
+f*
+374.994 555 m
+356.994 555 l
+356.994 561 l
+374.994 555 l
+356.994 549 l
+356.994 555 l
+374.994 555 l
+f*
+1 1 1 rg
+2 w
+255 629.047 m
+255 406.047 l
+S
+0.137255 0.0431373 1 rg
+0 w
+255 645.047 m
+255 627.047 l
+249 627.047 l
+255 645.047 l
+261 627.047 l
+255 627.047 l
+255 645.047 l
+f*
+255 390.047 m
+255 408.047 l
+261 408.047 l
+255 390.047 l
+249 408.047 l
+255 408.047 l
+255 390.047 l
+f*
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 321 670.8 Tm
+0 Tw
+(top) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 321 625.8 Tm
+0 Tw
+(header) Tj
+ET
+0.137255 0.0431373 1 rg
+BT
+/F1 12 Tf
+1 0 0 1 261 487.1 Tm
+0 Tw
+(height) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 277 560.5 Tm
+0 Tw
+(width) Tj
+ET
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 321 400.8 Tm
+0 Tw
+(footer) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 321 355.8 Tm
+0 Tw
+(bottom) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 83.65 560.6 Tm
+0 Tw
+(leftedge) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 154.9 500.5 Tm
+0 Tw
+(leftmargin) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 390.6 500.5 Tm
+0 Tw
+(rightmargin) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 470 560.6 Tm
+0 Tw
+(rightedge) Tj
+ET
+1 1 1 rg
+0 0 0 RG
+1 w
+315 592 m
+315 443 l
+S
+0 0 0 rg
+0 w
+315 600 m
+315 591 l
+312 591 l
+315 600 l
+318 591 l
+315 591 l
+315 600 l
+f*
+315 435 m
+315 444 l
+318 444 l
+315 435 l
+312 444 l
+315 444 l
+315 435 l
+f*
+BT
+/F1 12 Tf
+1 0 0 1 333 463.1 Tm
+0 Tw
+() Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 321 472.8 Tm
+0 Tw
+(textheight) Tj
+ET
+1 1 1 rg
+0.5 w
+405 656 m
+405 649 l
+S
+0 0 0 rg
+0 w
+405 660 m
+405 655.5 l
+403.5 655.5 l
+405 660 l
+406.5 655.5 l
+405 655.5 l
+405 660 l
+f*
+405 645 m
+405 649.5 l
+406.5 649.5 l
+405 645 l
+403.5 649.5 l
+405 649.5 l
+405 645 l
+f*
+BT
+/F1 10 Tf
+1 0 0 1 408.7 649.6 Tm
+0 Tw
+(topdistance) Tj
+ET
+1 1 1 rg
+0.5 w
+405 611 m
+405 604 l
+S
+0 0 0 rg
+0 w
+405 615 m
+405 610.5 l
+403.5 610.5 l
+405 615 l
+406.5 610.5 l
+405 610.5 l
+405 615 l
+f*
+405 600 m
+405 604.5 l
+406.5 604.5 l
+405 600 l
+403.5 604.5 l
+405 604.5 l
+405 600 l
+f*
+BT
+/F1 10 Tf
+1 0 0 1 408.7 604.6 Tm
+0 Tw
+(headerdistance) Tj
+ET
+1 1 1 rg
+0.5 w
+405 431 m
+405 424 l
+S
+0 0 0 rg
+0 w
+405 435 m
+405 430.5 l
+403.5 430.5 l
+405 435 l
+406.5 430.5 l
+405 430.5 l
+405 435 l
+f*
+405 420 m
+405 424.5 l
+406.5 424.5 l
+405 420 l
+403.5 424.5 l
+405 424.5 l
+405 420 l
+f*
+BT
+/F1 10 Tf
+1 0 0 1 408.7 424.7 Tm
+0 Tw
+(footerdistance) Tj
+ET
+1 1 1 rg
+0.5 w
+405 386 m
+405 379 l
+S
+0 0 0 rg
+0 w
+405 390 m
+405 385.5 l
+403.5 385.5 l
+405 390 l
+406.5 385.5 l
+405 385.5 l
+405 390 l
+f*
+405 375 m
+405 379.5 l
+406.5 379.5 l
+405 375 l
+403.5 379.5 l
+405 379.5 l
+405 375 l
+f*
+BT
+/F1 10 Tf
+1 0 0 1 408.7 379.7 Tm
+0 Tw
+(bottomdistance) Tj
+ET
+1 1 1 rg
+0.5 w
+154 330 m
+165 330 l
+S
+0 0 0 rg
+0 w
+150 330 m
+154.5 330 l
+154.5 328.5 l
+150 330 l
+154.5 331.5 l
+154.5 330 l
+150 330 l
+f*
+1 1 1 rg
+0.5 w
+131 330 m
+120 330 l
+S
+0 0 0 rg
+0 w
+135 330 m
+130.5 330 l
+130.5 331.5 l
+135 330 l
+130.5 328.5 l
+130.5 330 l
+135 330 l
+f*
+1 1 1 rg
+0.5 w
+229 315 m
+240 315 l
+S
+0 0 0 rg
+0 w
+225 315 m
+229.5 315 l
+229.5 313.5 l
+225 315 l
+229.5 316.5 l
+229.5 315 l
+225 315 l
+f*
+1 1 1 rg
+0.5 w
+206 315 m
+195 315 l
+S
+0 0 0 rg
+0 w
+210 315 m
+205.5 315 l
+205.5 316.5 l
+210 315 l
+205.5 313.5 l
+205.5 315 l
+210 315 l
+f*
+1 1 1 rg
+0.5 w
+394 315 m
+405 315 l
+S
+0 0 0 rg
+0 w
+390 315 m
+394.5 315 l
+394.5 313.5 l
+390 315 l
+394.5 316.5 l
+394.5 315 l
+390 315 l
+f*
+1 1 1 rg
+0.5 w
+371 315 m
+360 315 l
+S
+0 0 0 rg
+0 w
+375 315 m
+370.5 315 l
+370.5 316.5 l
+375 315 l
+370.5 313.5 l
+370.5 315 l
+375 315 l
+f*
+1 1 1 rg
+0.5 w
+469 330 m
+480 330 l
+S
+0 0 0 rg
+0 w
+465 330 m
+469.5 330 l
+469.5 328.5 l
+465 330 l
+469.5 331.5 l
+469.5 330 l
+465 330 l
+f*
+1 1 1 rg
+0.5 w
+446 330 m
+435 330 l
+S
+0 0 0 rg
+0 w
+450 330 m
+445.5 330 l
+445.5 331.5 l
+450 330 l
+445.5 328.5 l
+445.5 330 l
+450 330 l
+f*
+BT
+/F1 10 Tf
+1 0 0 1 108 317.9 Tm
+0 Tw
+(leftedgedistance) Tj
+ET
+BT
+/F1 10 Tf
+1 0 0 1 183 303.6 Tm
+0 Tw
+(leftmargindistance) Tj
+ET
+BT
+/F1 10 Tf
+1 0 0 1 339.2 302.9 Tm
+0 Tw
+(rightmargindistance) Tj
+ET
+BT
+/F1 10 Tf
+1 0 0 1 423 317.9 Tm
+0 Tw
+(rightedgedistance) Tj
+ET
+BT
+/F1 10 Tf
+1 0 0 1 114 307.5 Tm
+0 Tw
+(edgedistance) Tj
+ET
+BT
+/F1 10 Tf
+1 0 0 1 189 293.2 Tm
+0 Tw
+(margindistance) Tj
+ET
+BT
+/F1 10 Tf
+1 0 0 1 351 293.2 Tm
+0 Tw
+(margindistance) Tj
+ET
+BT
+/F1 10 Tf
+1 0 0 1 432 307.5 Tm
+0 Tw
+(edgedistance) Tj
+ET
+1 1 1 rg
+1 w
+45 285 m
+75 285 l
+S
+75 285 m
+75 255 l
+S
+555 285 m
+525 285 l
+S
+525 285 m
+525 255 l
+S
+525 765 m
+525 735 l
+S
+525 735 m
+555 735 l
+S
+75 765 m
+75 735 l
+S
+75 735 m
+45 735 l
+S
+0.5 w
+[3 3] 0 d
+75 285 m
+75 735 l
+525 735 l
+525 285 l
+75 285 l
+s
+1 w
+[] 0 d
+82.91 270 m
+517.004 270 l
+S
+0 0 0 rg
+0 w
+74.91 270 m
+83.91 270 l
+83.91 267 l
+74.91 270 l
+83.91 273 l
+83.91 270 l
+74.91 270 l
+f*
+525.004 270 m
+516.004 270 l
+516.004 273 l
+525.004 270 l
+516.004 267 l
+516.004 270 l
+525.004 270 l
+f*
+0.137255 0.0431373 1 rg
+BT
+/F1 10 Tf
+1 0 0 1 246 248.9 Tm
+0 Tw
+() Tj
+ET
+0 0 0 rg
+BT
+/F1 10 Tf
+1 0 0 1 261 245.9 Tm
+0 Tw
+() Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 270.6 256.2 Tm
+0 Tw
+(paperwidth) Tj
+ET
+1 1 1 rg
+1 w
+539 292.3 m
+539 726.394 l
+S
+0 0 0 rg
+0 w
+539 284.3 m
+539 293.3 l
+542 293.3 l
+539 284.3 l
+536 293.3 l
+539 293.3 l
+539 284.3 l
+f*
+539 734.394 m
+539 725.394 l
+536 725.394 l
+539 734.394 l
+542 725.394 l
+539 725.394 l
+539 734.394 l
+f*
+BT
+/F1 12 Tf
+0 1 -1 0 553.1 480 Tm
+0 Tw
+(paperheight) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 273 541.1 Tm
+0 Tw
+(textwidth) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 90 541.1 Tm
+0 Tw
+(edge) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 162 481.1 Tm
+0 Tw
+(margin) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 401.7 481.1 Tm
+0 Tw
+(margin) Tj
+ET
+BT
+/F1 12 Tf
+1 0 0 1 483 541.1 Tm
+0 Tw
+(edge) Tj
+ET
+1 1 1 rg
+1 w
+383 705 m
+517.091 705 l
+S
+0 0 0 rg
+0 w
+375 705 m
+384 705 l
+384 702 l
+375 705 l
+384 708 l
+384 705 l
+375 705 l
+f*
+525.091 705 m
+516.091 705 l
+516.091 708 l
+525.091 705 l
+516.091 702 l
+516.091 705 l
+525.091 705 l
+f*
+1 1 1 rg
+0.25 w
+375.091 712.545 m
+375.091 697.545 l
+S
+0 0 0 rg
+BT
+/F1 12 Tf
+1 0 0 1 423.1 709.1 Tm
+0 Tw
+(cutspace) Tj
+ET
+endstream
+endobj
+8 0 obj
+11561
+endobj
+10 0 obj
+<<
+/F1 11 0 R
+>>
+endobj
+11 0 obj
+<<
+/Type /Font
+/Subtype /TrueType
+/Name /F1
+/BaseFont /Arial
+/Encoding /WinAnsiEncoding
+/FirstChar 30
+/LastChar 255
+/Widths [ 750 750 278 278 355 556 556 889 667 191 333 333 389 584 278 333
+ 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584
+ 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833
+ 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278
+ 469 556 333 556 556 500 556 556 278 556 556 222 222 500 222 833
+ 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334
+ 584 750 556 750 222 556 333 1000 556 556 333 1000 667 333 1000 750
+ 611 750 750 222 222 333 333 350 556 1000 333 1000 500 333 944 750
+ 500 667 278 333 556 556 556 556 260 556 333 737 370 556 584 333
+ 737 552 400 549 333 333 333 576 537 278 333 333 365 556 834 834
+ 834 611 667 667 667 667 667 667 1000 722 667 667 667 667 278 278
+ 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667
+ 667 611 556 556 556 556 556 556 889 500 556 556 556 556 278 278
+ 278 278 556 556 556 556 556 556 556 549 611 556 556 556 556 500
+ 556 500]
+/FontDescriptor 12 0 R
+>>
+endobj
+12 0 obj
+<<
+/Type /FontDescriptor
+/FontName /Arial
+/FontBBox [ -665 -325 2000 1006 ]
+/Ascent 905
+/Descent -212
+/CapHeight 905
+/XHeight 724
+/ItalicAngle 0
+/Flags 32
+/StemV 70
+>>
+endobj
+9 0 obj
+<<
+>>
+endobj
+xref
+0 13
+0000000000 65535 f
+0000000010 00000 n
+0000000063 00000 n
+0000000135 00000 n
+0000000187 00000 n
+0000000253 00000 n
+0000000417 00000 n
+0000000450 00000 n
+0000012068 00000 n
+0000013449 00000 n
+0000012092 00000 n
+0000012130 00000 n
+0000013251 00000 n
+trailer
+<<
+/Size 13
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+13474
+%%EOF
diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-00.eps b/doc/context/sources/general/manuals/start/graphics/ma-cb-00.eps new file mode 100644 index 000000000..dece521c5 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-00.eps @@ -0,0 +1,2799 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%BoundingBox: 154 313 441 529 +%%Creator: CorelDRAW! +%%Title: GRACHT.EPS +%%CreationDate: Wed Aug 13 17:01:56 1997 + +%%DocumentFonts: +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%EndComments +%%BeginProlog +/AutoFlatness false def +% -------------- POSTSCRIPT PROLOG FOR CORELDRAW 3.X ------ +% Copyright 1992 Corel Corporation. All rights reserved. +/wCorelDict 300 dict def wCorelDict begin/bd{bind def}bind def +/ld{load def}bd/xd{exch def}bd/_ null def +/$c 0 def/$m 0 def/$y 0 def/$k 0 def/$t 1 def +/$n _ def/$o 0 def/$fil 0 def/$bkg false def +/$C 0 def/$M 0 def/$Y 0 def/$K 0 def/$T 1 def +/$N _ def/$O 0 def/$PF false def/$ctm matrix currentmatrix def +/$ptm matrix def/$ttm matrix def/$stm matrix def +/$fst 128 def/$pad 0 def/$rox 0 def/$roy 0 def +currentscreen/@dsp xd/$dsp/@dsp def/$dsa xd +/$dsf xd/$sdf false def/$SDF false def/$Scra 0.0 def +/$sv 0 def/@cp/closepath ld/@gs/gsave ld/@gr/grestore ld +/@np/newpath ld/@sv{/$sv save def}bd/@rs{$sv restore}bd +/@ss{exch $Scra add exch load setscreen}bd +AutoFlatness{/$cpx ([Error: PathTooComplex; OffendingCommand: AnyPaintingOperator]\n) def +/@err1{$cpx print flush newpath}bd/@ifl{dup currentflat exch sub 10 gt +{@err1 exit}{currentflat 2 add setflat}ifelse}bd +/@fill/fill ld/fill{currentflat{{@fill}stopped{@ifl}{exit}ifelse +}bind loop setflat}bd/@eofill/eofill ld/eofill{currentflat{{@eofill} +stopped{@ifl}{exit}ifelse}bind loop setflat}bd +/@clip/clip ld/clip{currentflat{{@clip}stopped{initclip @ifl}{exit +}ifelse}bind loop setflat}bd/@eoclip/eoclip ld +/eoclip{currentflat{{@eoclip}stopped{initclip @ifl}{exit}ifelse +}bind loop setflat}bd/@stroke/stroke ld/stroke{currentflat{{@stroke} +stopped{@ifl}{exit}ifelse}bind loop setflat}bd}if +/InRange{3 -1 roll 2 copy le{pop}{exch pop}ifelse +2 copy ge{pop}{exch pop}ifelse}bd/wDstChck{2 1 roll dup 3 -1 roll +eq{1 add}if}bd/@dot{dup mul exch dup mul add 1 exch sub 2 div}bd +/@lin{exch pop abs 1 exch sub}bd/@MN{2 copy le{pop}{exch pop}ifelse}bd +/setcmykcolor where{pop}{/setcmykcolor{4 1 roll +3{3 index add 1 @MN 1 exch sub 3 1 roll}repeat +setrgbcolor pop}bd}ifelse/setoverprint{/$op xd}bd +/currentoverprint{$op}bd/setsepcolor{1 exch sub setgray}bd +/checksepcolor{1 exch sub dup setgray 1 eq exch 1 eq and not}bd +/setprocesscolor{ColorSeparationMode 0 eq{setcmykcolor}{ +0 4 $ink sub index exch pop 5 1 roll 4{pop}repeat +setsepcolor}ifelse}bd/findcmykcustomcolor{5 array astore}bd +/setcustomcolor where{pop}{/setcustomcolor{ColorSeparationMode 0 eq{ +exch aload pop pop 4{4 index mul 4 1 roll}repeat +5 -1 roll pop setcmykcolor}{exch aload pop +CurrentInkName eq{4 index}{0}ifelse 6 1 roll +5{pop}repeat setsepcolor}ifelse}bd}ifelse/colorimage where{pop}{ +/colorimage{pop pop pop pop pop{currentfile $dat readhexstring pop pop} +repeat pop}bd}ifelse/@tc{dup 1 ge{pop}{4{dup +6 -1 roll mul exch}repeat pop}ifelse}bd/@scc{1 eq setoverprint +dup _ eq{pop setprocesscolor pop}{findcmykcustomcolor +exch setcustomcolor}ifelse ColorSeparationMode 0 eq{true}{ +currentgray 1 eq currentoverprint and not}ifelse}bd +/@sft{/$tx $tllx $pxf add dup $tllx gt{$pwid sub}if def +/$ty $tury $pyf sub dup $tury lt{$phei add}if def}bd +/@stb{pathbbox/$ury xd/$urx xd/$lly xd/$llx xd}bd +/@ep{{cvx exec}forall}bd/@tp{@sv/$in true def +2 copy dup $lly le{/$in false def}if $phei sub $ury ge{/$in false def}if +dup $urx ge{/$in false def}if $pwid add $llx le{/$in false def}if +$in{@np 2 copy m $pwid 0 rl 0 $phei neg rl $pwid neg 0 rl +0 $phei rl clip @np $pn cvlit load aload pop +7 -1 roll 5 index sub 7 -1 roll 3 index sub translate +/$ctm matrix currentmatrix def @ep pop pop pop pop}{pop pop}ifelse +@rs}bd/@th{@sft 0 1 $tly 1 sub{dup $psx mul $tx add{ +dup $llx gt{$pwid sub}{exit}ifelse}loop exch $phei mul $ty exch sub +0 1 $tlx 1 sub{$pwid mul 3 copy 3 -1 roll add exch +@tp pop}for pop pop}for}bd/@tv{@sft 0 1 $tlx 1 sub{dup $pwid mul $tx add +exch $psy mul $ty exch sub{dup $ury lt{$phei add}{exit}ifelse}loop +0 1 $tly 1 sub{$phei mul 3 copy sub @tp pop}for +pop pop}for}bd/@pf{@gs $ctm setmatrix $pm concat +@stb eoclip Bburx Bbury $pm itransform/$tury xd/$turx xd +Bbllx Bblly $pm itransform/$tlly xd/$tllx xd +/$wid $turx $tllx sub def/$hei $tury $tlly sub def +@gs $vectpat{1 0 0 0 0 _ $o @scc{eofill}if}{$t $c $m $y $k $n $o @scc{ +$tllx $tlly translate $wid $hei scale <00> 8 1 false [ 8 0 0 1 0 0 ]{}imagemask +/$bkg true def}if}ifelse @gr $wid 0 gt $hei 0 gt and{ +$pn cvlit load aload pop/$pd xd 3 -1 roll sub/$phei xd +exch sub/$pwid xd/$tlx $wid $pwid div ceiling 1 add def +/$tly $hei $phei div ceiling 1 add def $psx 0 eq{@tv}{@th}ifelse}if +@gr @np/$bkg false def}bd/@dlt{ColorSeparationMode 0 eq{ +/$dc $toc $tot mul $frc $frt mul dup/$c xd sub $fst 1 sub div def +/$dm $tom $tot mul $frm $frt mul dup/$m xd sub $fst 1 sub div def +/$dy $toy $tot mul $fry $frt mul dup/$y xd sub $fst 1 sub div def +/$dk $tok $tot mul $frk $frt mul dup/$k xd sub $fst 1 sub div def +true}{$frt $frc $frm $fry $frk $frn $o @scc +dup{/$frk 1 currentgray sub def}{/$frk 0 def}ifelse +$tot $toc $tom $toy $tok $ton $o @scc dup{/$tok 1 currentgray sub def}{ +/$tok 0 def}ifelse or dup{/$c 0 def/$m 0 def/$y 0 def/$k $frk def +/$dc 0 def/$dm 0 def/$dy 0 def/$dk $tok $frk sub $fst 1 sub div def}if +}ifelse}bd/@ftl{1 index 4 index sub dup $pad mul dup/$pdw xd +2 mul sub $fst div/$wid xd 2 index sub/$hei xd +pop translate $c $m $y $k 4 copy ColorSeparationMode 0 ne +{1 exch sub setgray pop pop pop}{setcmykcolor}ifelse +0 0 moveto 0 $hei lineto $pdw $hei lineto $pdw 0 lineto 0 0 lineto fill +$pdw 0 translate $fst{4 copy ColorSeparationMode 0 ne +{1 exch sub setgray pop pop pop}{setcmykcolor}ifelse +0 0 moveto 0 $hei lineto $wid $hei lineto $wid 0 lineto 0 0 lineto fill +$wid 0 translate $dk add 4 1 roll $dy add 4 1 roll +$dm add 4 1 roll $dc add 4 1 roll}repeat $dk sub 4 1 roll +$dy sub 4 1 roll $dm sub 4 1 roll $dc sub 4 1 roll +ColorSeparationMode 0 ne{1 exch sub setgray pop pop pop} +{setcmykcolor}ifelse 0 0 moveto 0 $hei lineto $pdw $hei lineto $pdw 0 lineto 0 0 lineto fill +}bd/@ftr{1 index 4 index sub dup $rox mul/$row xd +2 div 1 index 4 index sub dup $roy mul/$roh xd +2 div 2 copy dup mul exch dup mul add sqrt +$row dup mul $roh dup mul add sqrt add dup/$hei xd $fst div/$wid xd +4 index add $roh add exch 5 index add $row add +exch translate pop pop pop pop currentflat dup 5 mul setflat +$c $m $y $k 4 copy ColorSeparationMode 0 ne +{1 exch sub setgray pop pop pop}{setcmykcolor}ifelse +$wid 0 moveto 0 0 $hei 0 360 arc fill 1.0 $pad 2 mul sub dup scale +$fst{4 copy ColorSeparationMode 0 ne{1 exch sub setgray pop pop pop} +{setcmykcolor}ifelse $wid 0 moveto 0 0 $hei 0 360 arc fill +/$hei $hei $wid sub def $dk add 4 1 roll $dy add 4 1 roll +$dm add 4 1 roll $dc add 4 1 roll}repeat pop pop pop pop +setflat}bd/@ff{@gs @dlt{$ctm setmatrix eoclip +newpath Bbllx Bblly moveto Bbllx Bbury lineto +Bburx Bbury lineto Bburx Bblly lineto $fan rotate +pathbbox newpath $fty 1 eq{@ftr}{@ftl}ifelse}if +@gr @np}bd/@Pf{@sv ColorSeparationMode 0 eq $ink 3 eq or{0 J 0 j [] 0 d +$t $c $m $y $k $n $o @scc pop $ctm setmatrix +72 1000 div dup matrix scale dup concat dup Bburx exch Bbury exch itransform +ceiling cvi/Bbury xd ceiling cvi/Bburx xd Bbllx exch Bblly exch itransform +floor cvi/Bblly xd floor cvi/Bbllx xd $Prm aload pop +$Psn load exec}{1 setgray eofill}ifelse @rs +@np}bd/g{1 exch sub/$k xd/$c 0 def/$m 0 def/$y 0 def/$t 1 def/$n _ def/$fil 0 def +}bd/G{1 exch sub/$K xd/$C 0 def/$M 0 def/$Y 0 def/$T 1 def/$N _ def}bd +/k{/$k xd/$y xd/$m xd/$c xd/$t 1 def/$n _ def/$fil 0 def}bd +/K{/$K xd/$Y xd/$M xd/$C xd/$T 1 def/$N _ def}bd +/x{/$t xd/$n xd/$k xd/$y xd/$m xd/$c xd/$fil 0 def}bd +/X{/$T xd/$N xd/$K xd/$Y xd/$M xd/$C xd}bd +/d/setdash ld/i{dup 0 ne{setflat}{pop}ifelse}bd +/j/setlinejoin ld/J/setlinecap ld/M/setmiterlimit ld +/w/setlinewidth ld/O{/$o xd}bd/R{/$O xd}bd +/c/curveto ld/C/c ld/v{4 -2 roll 2 copy 6 -2 roll curveto}bd +/V/v ld/y{2 copy curveto}bd/Y/y ld/l/lineto ld +/L/l ld/rl/rlineto ld/m/moveto ld/n/newpath ld +/N/newpath ld/F{matrix currentmatrix $sdf{$scf $sca $scp @ss}if +$fil 1 eq{@pf}{$fil 2 eq{@ff}{$fil 3 eq{@Pf}{$t $c $m $y $k $n $o @scc +{eofill}{@np}ifelse}ifelse}ifelse}ifelse $sdf{$dsf $dsa $dsp @ss}if +setmatrix}bd/f{@cp F}bd/S{matrix currentmatrix +$ctm setmatrix $SDF{$SCF $SCA $SCP @ss}if $T $C $M $Y $K $N $O @scc{ +matrix currentmatrix $ptm concat stroke setmatrix}{@np}ifelse +$SDF{$dsf $dsa $dsp @ss}if setmatrix}bd/s{@cp +S}bd/B{@gs F @gr S}bd/b{@cp B}bd/W{eoclip}bd +/p{/$pm xd 7{pop}repeat/$pyf xd/$pxf xd/$pn xd +/$fil 1 def}bd/P{11{pop}repeat}bd/u{}bd/U{}bd +/A{pop}bd/q/@gs ld/Q/@gr ld/E{5 array astore +exch cvlit exch def}bd/`{}bd/~{}bd/@{}bd/&{}bd +/CorelDrawReencodeVect [ 16#82/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl +16#88/circumflex/perthousand/Scaron/guilsinglleft/OE +16#91/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash +16#98/tilde/trademark/scaron/guilsinglright/oe +16#9F/Ydieresis 16#A1/exclamdown/cent/sterling/currency/yen/brokenbar/section +16#a8/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/minus/registered/macron +16#b0/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered +16#b8/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown +16#c0/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla +16#c8/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis +16#d0/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply +16#d8/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +16#e0/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla +16#e8/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis +16#f0/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide +16#f8/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis +] def/@cc{currentfile $dat readhexstring pop}bd +/@sm{/$ctm $ctm currentmatrix def}bd/@E{/Bbury xd/Bburx xd +/Bblly xd/Bbllx xd}bd/@c{@cp}bd/@p{/$fil 1 def +1 eq/$vectpat xd/$pm xd/$psy xd/$psx xd/$pyf xd/$pxf xd +/$pn xd}bd/@P{/$fil 3 def/$Psn xd array astore +/$Prm xd}bd/@k{/$fil 2 def/$roy xd/$rox xd/$pad xd +/$fty xd/$fan xd $fty 1 eq{/$fan 0 def}if/$tok xd/$toy xd/$tom xd/$toc xd +/$frk xd/$fry xd/$frm xd/$frc xd/$frn _ def/$frt 1 def/$ton _ def/$tot 1 def +}bd/@x{/$fil 2 def/$roy xd/$rox xd/$pad xd +/$fty xd/$fan xd/$tot xd/$ton xd/$tok xd/$toy xd/$tom xd/$toc xd +/$frt xd/$frn xd/$frk xd/$fry xd/$frm xd/$frc xd}bd +/@ii{concat 3 index 3 index m 3 index 1 index l +2 copy l 1 index 3 index l 3 index 3 index l +clip pop pop pop pop}bd/@i{@sm @gs @ii 6 index 1 ne{/$frg true def +pop pop}{1 eq{$T $C $M $Y $K $N $O @scc/$frg xd}{/$frg false def +}ifelse 1 eq{@gs $ctm setmatrix $t $c $m $y $k $n $o @scc{eofill}if +@gr}if}ifelse/$frg $frg $bkg or def @np/$ury xd/$urx xd/$lly xd/$llx xd +/$bts xd/$hei xd/$wid xd/$dat $wid $bts mul 8 div ceiling cvi string def +$frg{$SDF{$SCF $SCA $SCP @ss}if $llx $lly translate +$urx $llx sub $ury $lly sub scale $wid $hei abs +$bts 1 eq{false}{$bts}ifelse [ $wid 0 0 $hei neg 0 +$hei 0 gt{$hei}{0}ifelse]/@cc load $bts 1 eq{imagemask}{image}ifelse +$SDF{$dsf $dsa $dsp @ss}if}{$hei abs{@cc pop}repeat}ifelse +@gr $ctm setmatrix}def/@M{@sv}bd/@N{/@cc{}def +1 eq{12 -1 roll neg 12 1 roll @I}{13 -1 roll neg 13 1 roll +@i}ifelse @rs}bd/@I{@sm @gs @ii @np/$ury xd/$urx xd/$lly xd/$llx xd +/$ncl xd/$bts xd/$hei xd/$wid xd/$dat $wid $bts mul $ncl mul 8 div ceiling cvi string def +$llx $lly translate $urx $llx sub $ury $lly sub scale +$wid $hei abs $bts [ $wid 0 0 $hei neg 0 $hei 0 gt{$hei}{0}ifelse] +/@cc load false $ncl colorimage @gr $ctm setmatrix}bd +/z{exch findfont exch scalefont setfont}bd +/ZB{9 dict dup begin 4 1 roll/FontType 3 def +/FontMatrix xd/FontBBox xd/Encoding 256 array def +0 1 255{Encoding exch/.notdef put}for/CharStrings 256 dict def +CharStrings/.notdef{}put/Metrics 256 dict def +Metrics/.notdef 3 -1 roll put/BuildChar{exch +dup/$char exch/Encoding get 3 index get def +dup/Metrics get $char get aload pop setcachedevice +begin Encoding exch get CharStrings exch get +end exec}def end definefont pop}bd/ZBAddChar{findfont begin +dup 4 1 roll dup 6 1 roll Encoding 3 1 roll put +CharStrings 3 1 roll put Metrics 3 1 roll put +end}bd/Z{findfont dup maxlength 2 add dict exch +dup{1 index/FID ne{3 index 3 1 roll put}{pop pop}ifelse}forall +pop dup dup/Encoding get 256 array copy dup/$fe xd +/Encoding exch put dup/Fontname 3 index put +3 -1 roll dup length 0 ne{0 exch{dup type 0 type eq{exch pop}{ +$fe exch 2 index exch put 1 add}ifelse}forall +pop}if dup 256 dict dup/$met xd/Metrics exch put +dup/FontMatrix get 0 get 1000 mul 1 exch div +3 index length 256 eq{0 1 255{dup $fe exch get +dup/.notdef eq{pop pop}{5 index 3 -1 roll get +2 index mul $met 3 1 roll put}ifelse}for}if +pop definefont pop pop}bd/@ftx{{currentpoint 3 -1 roll +(0) dup 3 -1 roll 0 exch put dup @gs true charpath +$ctm setmatrix @@txt @gr @np stringwidth pop 3 -1 roll add exch moveto +}forall}bd/@ft{matrix currentmatrix exch $sdf{$scf $sca $scp @ss}if +$fil 1 eq{/@@txt/@pf ld @ftx}{$fil 2 eq{/@@txt/@ff ld @ftx}{$fil 3 eq +{/@@txt/@Pf ld @ftx}{$t $c $m $y $k $n $o @scc{show}{pop}ifelse}ifelse +}ifelse}ifelse $sdf{$dsf $dsa $dsp @ss}if setmatrix}bd +/@st{matrix currentmatrix exch $SDF{$SCF $SCA $SCP @ss}if +$T $C $M $Y $K $N $O @scc{{currentpoint 3 -1 roll +(0) dup 3 -1 roll 0 exch put dup @gs true charpath +$ctm setmatrix $ptm concat stroke @gr @np stringwidth pop 3 -1 roll add exch moveto +}forall}{pop}ifelse $SDF{$dsf $dsa $dsp @ss}if +setmatrix}bd/@te{@ft}bd/@tr{@st}bd/@ta{dup +@gs @ft @gr @st}bd/@t@a{dup @gs @st @gr @ft}bd +/@tm{/$textsave save def @sm concat}bd/e{/t{@te}def}bd +/r{/t{@tr}def}bd/o{/t{pop}def}bd/a{/t{@ta}def}bd +/@a{/t{@t@a}def}bd/t{@te}def/T{@np $ctm setmatrix +/$ttm matrix def $textsave restore}bd/@t{/$stm $stm currentmatrix def +3 1 roll moveto $ttm concat t $stm setmatrix}def +/@n{/$ttm exch matrix rotate def}bd/@s{}bd +/@l{}bd/@B{@gs S @gr F}bd/@b{@cp @B}bd/@w{matrix rotate/$ptm xd +matrix scale $ptm dup concatmatrix/$ptm xd +1 eq{$ptm exch dup concatmatrix/$ptm xd}if +1 w}bd/@g{1 eq dup/$sdf xd{/$scp xd/$sca xd +/$scf xd}if}bd/@G{1 eq dup/$SDF xd{/$SCP xd +/$SCA xd/$SCF xd}if}bd/@D{3 copy @ss/$dsp xd +/$dsa xd/$dsf xd}bd/@j{@sv @np}bind def/@J{@rs}bind def +/@sep{/ColorSeparationMode where{pop}{/ColorSeparationMode 0 def +/CurrentInkName (Composite) def}ifelse ColorSeparationMode 0 eq{ +/CurrentInkName (Composite) def}if/CurrentInkName where{pop}{ +/CurrentInkName (Composite) def}ifelse CurrentInkName (Composite) eq +{/$ink -1 def}{CurrentInkName (Cyan) eq{/$ink 0 def}{ +CurrentInkName (Magenta) eq{/$ink 1 def}{CurrentInkName (Yellow) eq +{/$ink 2 def}{CurrentInkName (Black) eq{/$ink 3 def}{/$ink 4 def +}ifelse}ifelse}ifelse}ifelse}ifelse}bd @sep +/@whi{@gs -72000 dup moveto -72000 72000 lineto +72000 dup lineto 72000 -72000 lineto closepath 1 setgray fill +@gr}bd/@neg{ [{1 exch sub}/exec cvx currenttransfer/exec cvx] cvx settransfer +@whi}bd/@reg{[] 0 d 0 setgray .3 setlinewidth +2 copy 5.4 0 360 arc closepath 2 copy moveto 9 0 rlineto +2 copy moveto -9 0 rlineto 2 copy moveto 0 9 rlineto +moveto 0 -9 rlineto stroke}bd/leftbracket{(\050)}def +/rightbracket{(\051)}def + +%%EndProlog +%%BeginSetup +11.4737 setmiterlimit +1.00 setflat +/$fst 128 def + +%%EndSetup +@sv +/$ctm matrix currentmatrix def +@sv +%%Note: Object +188.06 385.92 440.57 527.47 @E + 0 O 0 @g +0.20 0.10 0.00 0.00 k +%%CURV 5 +188.06 527.47 m +440.57 527.47 L +439.20 385.92 L +192.17 396.86 L +188.06 527.47 L +@c +F +%%Note: Object +216.00 452.23 288.86 468.65 @E + 0 O 0 @g +0.00 0.00 0.00 0.05 k +%%CURV 24 +216.00 465.91 m +216.00 465.91 228.24 463.18 231.62 465.91 c +235.08 468.65 252.07 465.91 252.07 465.91 c +252.07 465.91 260.21 461.81 265.68 461.81 c +271.15 461.81 284.76 460.37 284.76 460.37 c +288.86 453.53 l +288.86 453.53 284.11 452.88 277.92 452.88 c +271.80 452.88 252.72 452.23 252.72 452.23 c +236.38 452.23 L +226.15 458.35 L +218.02 460.37 L +216.00 465.91 L +@c +F +%%Note: Object +223.49 392.04 439.92 439.85 @E + 0 O 0 @g +0.00 0.00 0.00 0.10 k +%%CURV 20 +356.11 425.52 m +354.82 439.85 L +338.47 430.99 L +324.86 429.62 L +304.42 430.34 L +295.63 427.61 L +258.19 428.26 L +241.13 428.26 L +223.49 426.17 L +228.96 420.77 L +260.21 421.42 L +294.98 421.42 L +301.03 423.50 L +319.39 423.50 L +318.74 417.38 L +326.88 416.74 L +439.92 392.04 L +439.20 411.91 L +425.59 413.93 L +356.11 425.52 L +@c +F +%%Note: Object +413.78 461.88 439.92 506.23 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.60 0.60 0.00 k +%%CURV 6 +439.92 506.23 m +413.78 506.23 L +413.78 501.70 L +431.35 461.88 L +439.92 468.72 L +439.92 506.23 L +@c +B +%%Note: Object +385.85 414.00 427.32 483.62 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.10 0.10 0.00 k +%%CURV 7 +385.85 478.66 m +389.95 482.69 L +400.75 483.62 L +427.32 462.82 L +426.89 414.00 L +389.02 420.34 L +385.85 478.66 L +@c +B +%%Note: Object +322.99 428.69 340.63 446.26 @E + 0 O 0 @g +0.50 0.00 0.50 0.50 k +%%CURV 40 +332.28 446.26 m +332.28 446.26 329.98 445.39 329.11 443.09 c +328.25 440.78 326.38 438.62 326.38 438.62 c +326.38 438.62 324.86 437.47 324.00 434.88 c +323.21 432.36 322.99 432.14 322.99 431.06 c +322.99 429.98 323.21 429.19 324.43 429.41 c +325.73 429.55 326.81 430.63 326.81 430.63 c +329.33 429.84 l +329.33 429.84 329.90 429.62 331.42 430.85 c +332.86 432.14 333.29 434.52 333.72 433.22 c +334.15 431.93 333.94 432.58 334.73 431.06 c +335.59 429.55 337.03 428.98 338.11 429.41 c +339.19 429.84 338.47 428.69 339.55 430.20 c +340.63 431.71 339.19 435.74 339.19 435.74 c +336.24 445.39 L +332.28 446.26 L +@c +F +%%Note: Object +325.51 428.04 361.44 475.92 @E + 0 O 0 @g +0.60 0.00 0.60 0.40 k +%%CURV 42 +357.19 445.82 m +361.44 445.82 352.58 438.84 348.55 436.61 c +344.45 434.30 342.65 428.04 338.11 433.87 c +333.65 439.70 338.54 445.61 334.51 446.04 c +330.48 446.54 331.85 445.18 328.68 446.54 c +325.51 447.84 326.45 453.31 326.45 453.31 c +326.45 453.31 329.98 458.71 331.42 461.88 c +332.78 465.05 331.42 465.91 331.85 468.22 c +332.28 470.52 335.02 472.32 335.02 472.32 c +344.02 471.82 L +346.25 475.78 l +346.25 475.78 350.78 475.92 353.02 474.12 c +355.25 472.32 355.25 469.58 355.25 469.58 c +357.98 468.22 L +357.55 460.58 L +355.68 456.12 l +355.68 456.12 355.82 452.95 357.19 450.72 C +358.56 448.42 356.76 445.82 357.19 445.82 c +@c +F +%%Note: Object +154.87 359.28 227.88 448.34 @E + 0 O 0 @g +0.00 0.00 0.00 0.20 k +%%CURV 7 +155.38 448.34 m +217.94 442.01 L +221.98 427.97 L +227.88 421.63 L +211.68 402.26 L +154.87 359.28 L +155.38 448.34 L +@c +F +%%Note: Object +197.28 425.66 300.74 440.21 @E + 0 O 0 @g +0.60 0.00 0.60 0.40 k +%%CURV 65 +295.27 433.87 m +294.84 434.23 297.65 435.46 293.62 436.32 c +289.51 437.26 288.65 435.67 283.25 435.67 c +277.85 435.67 278.28 433.87 276.05 435.67 c +273.82 437.47 273.38 439.27 269.28 439.27 c +265.25 439.27 263.45 439.70 260.78 437.90 c +258.05 436.10 256.68 436.10 254.45 436.10 c +252.22 436.10 250.34 436.18 247.68 436.61 c +245.02 437.04 242.78 437.47 240.05 437.90 c +237.31 438.41 234.58 438.84 231.91 438.41 c +229.25 437.90 224.28 437.47 220.68 437.90 c +217.08 438.41 214.34 440.21 211.18 438.41 c +208.08 436.61 203.11 436.61 203.11 436.61 c +198.14 435.67 L +199.08 428.90 l +199.08 428.90 197.28 426.60 203.54 426.60 c +209.88 426.60 212.98 426.60 218.88 426.60 c +224.71 426.60 223.42 425.66 230.11 427.03 c +236.88 428.47 240.98 428.47 245.88 428.47 c +250.85 428.47 254.88 427.97 259.85 427.97 c +264.82 427.97 266.62 427.97 272.02 427.97 c +277.42 427.97 279.22 427.54 290.02 427.54 c +300.74 427.54 300.74 428.90 300.74 428.90 c +299.88 433.37 L +295.27 433.87 L +@c +F +%%Note: Object +154.87 380.95 228.31 427.03 @E + 0 O 0 @g +0.00 0.00 0.00 0.50 k +%%CURV 8 +159.84 411.26 m +181.51 422.14 L +200.38 426.60 L +224.28 427.03 L +228.31 422.57 L +203.54 418.54 L +154.87 380.95 L +159.84 411.26 L +@c +F +%%Note: Object +154.73 314.06 260.78 423.00 @E + 0 O 0 @g +0.00 0.50 0.80 0.20 k +%%CURV 17 +259.85 421.20 m +260.78 398.23 L +227.88 397.30 L +220.25 351.14 L +190.80 314.06 L +154.73 314.06 L +154.87 362.88 l +154.87 362.88 178.78 380.09 190.08 387.79 c +201.31 395.50 224.28 417.60 226.51 420.34 c +228.74 423.00 231.48 421.20 231.48 421.20 C +259.85 421.20 L +@c +F +%%Note: Object +229.25 398.23 259.85 420.77 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%RECT 56.088 -41.400 0.000 +229.25 420.77 m +259.85 420.77 L +259.85 398.23 L +229.25 398.23 L +229.25 420.77 L +@c +B +%%Note: Object +271.22 374.90 272.59 384.19 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.00 K +0 2.23 2.23 0.00 @w +%%CURV 2 +272.59 384.19 m +271.22 374.90 L +S +%%Note: Object +191.23 313.85 421.34 420.77 @E + 0 O 0 @g +0.10 0.05 0.00 0.00 k +%%CURV 12 +420.48 314.57 m +421.34 358.92 L +312.84 395.35 L +303.26 394.20 L +298.15 399.31 L +294.84 420.77 L +258.84 420.26 L +259.92 399.31 L +268.92 353.45 L +209.59 351.58 L +191.23 313.85 L +420.48 314.57 L +@c +F +%%Note: Object +189.65 314.06 322.34 353.09 @E + 0 O 0 @g +1.00 0.80 0.00 0.00 k +%%CURV 16 +209.16 353.09 m +267.98 350.21 L +307.94 338.90 l +307.94 338.90 277.42 330.84 299.88 327.67 c +322.34 324.43 312.91 324.00 306.65 320.40 c +300.31 316.80 272.95 314.06 267.48 314.06 c +262.08 314.06 189.65 314.06 189.65 314.06 C +209.16 353.09 L +@c +F +%%Note: Object +300.96 431.06 303.77 470.59 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 1.00 0.00 k +%%RECT 5.040 -73.800 0.000 +300.96 470.59 m +303.77 470.59 L +303.77 431.06 L +300.96 431.06 L +300.96 470.59 L +@c +B +%%Note: Object +262.66 467.86 334.37 474.05 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 1.00 0.00 k +%%CURV 5 +263.16 474.05 m +334.37 471.53 L +330.41 467.86 L +262.66 470.30 L +263.16 474.05 L +@c +B +%%Note: Object +261.65 472.54 346.18 479.74 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.10 1.00 0.00 k +%%CURV 5 +261.65 479.74 m +346.18 475.27 L +343.94 472.54 L +262.15 475.99 L +261.65 479.74 L +@c +B +%%Note: Object +303.77 423.07 307.80 476.86 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.10 1.00 0.00 k +%%RECT 7.416 -75.024 0.000 +303.77 476.86 m +307.80 476.86 L +307.80 423.07 L +303.77 423.07 L +303.77 476.86 L +@c +B +%%Note: Object +258.77 422.14 266.26 478.30 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 2.23 2.23 0.00 @w +%%CURV 2 +266.26 478.30 m +258.77 422.14 L +S +%%Note: Object +256.75 429.62 263.59 472.82 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 2.23 2.23 0.00 @w +%%CURV 2 +263.59 472.82 m +256.75 429.62 L +S +%%Note: Object +307.73 442.30 317.38 463.61 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w +%%CURV 2 +307.73 463.61 m +317.38 442.30 L +S +%%Note: Object +307.51 437.33 317.09 453.17 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w +%%CURV 2 +307.51 453.17 m +317.09 437.33 L +S +%%Note: Object +316.58 427.90 322.99 443.74 @E + 0 O 0 @g +1.00 0.80 0.00 0.00 k +%%RECT 11.736 -29.016 0.000 +316.58 443.74 m +322.99 443.74 L +322.99 427.90 L +316.58 427.90 L +316.58 443.74 L +@c +F +%%Note: Object +307.22 428.90 316.58 436.10 @E + 0 O 0 @g +1.00 0.60 0.00 0.00 k +%%RECT 17.136 -13.176 0.000 +307.22 436.10 m +316.58 436.10 L +316.58 428.90 L +307.22 428.90 L +307.22 436.10 L +@c +F +%%Note: Object +255.89 430.42 303.05 430.92 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 0.86 0.86 0.00 @w +%%CURV 2 +255.89 430.92 m +303.05 430.42 L +S +%%Note: Object +257.98 426.46 304.56 426.67 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 2.02 2.02 0.00 @w +%%CURV 2 +257.98 426.46 m +304.56 426.67 L +S +%%Note: Object +256.25 420.77 300.82 422.71 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%RECT 81.792 -3.600 0.000 +256.25 422.71 m +300.82 422.71 L +300.82 420.77 L +256.25 420.77 L +256.25 422.71 L +@c +B +%%Note: Object +244.44 430.92 246.17 471.02 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%RECT 2.736 -73.512 0.000 +244.44 471.02 m +246.17 471.02 L +246.17 430.92 L +244.44 430.92 L +244.44 471.02 L +@c +B +%%Note: Object +315.86 405.22 318.10 407.88 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w +%%RECT 4.104 -4.968 0.000 +315.86 407.88 m +318.10 407.88 L +318.10 405.22 L +315.86 405.22 L +315.86 407.88 L +@c +S +%%Note: Object +301.32 400.97 303.05 417.10 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.50 0.80 0.20 k +%%RECT 3.168 -29.448 0.000 +301.32 417.10 m +303.05 417.10 L +303.05 400.97 L +301.32 400.97 L +301.32 417.10 L +@c +B +%%Note: Object +302.54 400.68 304.27 417.60 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%RECT 3.168 -30.888 0.000 +302.54 417.60 m +304.27 417.60 L +304.27 400.68 L +302.54 400.68 L +302.54 417.60 L +@c +B +%%Note: Object +295.20 400.25 301.10 420.55 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%RECT 10.872 -37.224 0.000 +295.20 420.55 m +301.10 420.55 L +301.10 400.25 L +295.20 400.25 L +295.20 420.55 L +@c +B +%%Note: Object +295.49 394.20 315.22 401.18 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +1.00 0.25 0.00 0.00 k +%%CURV 5 +295.49 401.18 m +307.58 401.18 L +315.22 394.99 L +297.22 394.20 L +295.49 401.18 L +@c +B +%%Note: Object +300.53 400.97 319.10 423.22 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.60 1.00 0.00 k +%%CURV 7 +300.53 423.22 m +319.10 423.22 L +319.10 416.09 L +316.80 416.09 L +306.94 400.97 L +301.32 400.97 L +300.53 423.22 L +@c +B +%%Note: Object +306.43 343.66 439.92 417.31 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.50 1.00 0.00 k +%%CURV 15 +439.92 391.39 m +317.09 417.31 L +306.43 401.69 L +314.57 395.50 l +314.57 395.50 319.39 392.76 329.62 387.29 c +339.84 381.82 341.86 384.55 346.61 380.45 c +351.36 376.34 369.65 375.05 369.65 375.05 c +439.63 343.66 L +439.92 391.39 L +@c +B +%%Note: Object +155.38 429.62 222.98 527.47 @E + 0 O 0 @g +0.70 0.00 0.70 0.10 k +%%CURV 33 +194.18 527.47 m +201.67 527.47 191.02 515.59 194.40 508.82 c +197.78 501.98 195.05 507.46 201.89 500.62 c +208.66 493.78 213.41 491.76 213.41 486.29 c +213.41 480.82 213.41 479.45 214.13 472.61 c +214.78 465.77 218.81 458.93 219.53 454.82 c +220.25 450.79 222.98 447.34 220.25 443.95 c +217.51 440.57 216.79 440.57 206.64 440.57 c +196.49 440.57 196.49 443.30 187.63 438.48 c +178.78 433.73 179.50 429.62 172.66 433.73 c +165.89 437.76 155.66 441.22 155.66 441.22 c +155.38 527.47 L +194.18 527.47 L +@c +F +%%Note: Object +208.87 338.18 276.41 368.64 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 1.44 1.44 0.00 @w + 0 O 0 @g +1.00 0.50 0.00 0.00 k +%%CURV 30 +276.41 364.90 m +276.41 364.90 275.76 365.47 274.25 362.38 c +272.66 359.21 272.66 357.34 269.86 352.94 c +267.05 348.48 268.27 349.49 264.53 345.67 c +260.71 341.93 263.38 345.38 258.34 341.93 c +253.30 338.47 248.26 339.34 243.79 339.70 c +239.40 339.98 230.62 338.18 226.87 340.34 c +223.13 342.58 221.90 343.51 219.74 347.26 c +217.58 351.00 217.58 351.00 215.71 354.46 c +213.84 357.91 213.34 361.58 212.26 363.31 c +208.87 368.64 L +276.41 364.90 L +@c +B +%%Note: Object +354.53 420.26 388.87 480.10 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w +%%CURV 5 +356.04 469.87 m +354.53 425.81 L +388.87 420.26 L +387.29 480.10 L +356.04 469.87 L +@c +S +%%Note: Object +356.76 473.26 400.90 502.63 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.75 0.75 0.00 k +%%CURV 5 +400.90 502.63 m +377.06 490.32 L +356.76 473.26 L +384.55 483.55 L +400.90 502.63 L +@c +B +%%Note: Object +384.98 482.83 428.76 501.98 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.60 0.60 0.00 k +%%CURV 4 +400.25 501.98 m +384.98 483.62 L +428.76 482.83 L +400.25 501.98 L +@c +B +%%Note: Object +384.62 434.45 436.90 507.38 @E + 0 O 0 @g +0.70 0.00 0.70 0.00 k +%%CURV 40 +409.75 435.10 m +406.30 435.10 407.02 434.45 402.26 438.48 c +397.51 442.58 396.79 439.20 393.41 448.06 c +390.02 456.91 388.01 454.18 388.66 461.66 c +389.30 469.22 384.62 468.50 390.02 476.06 c +395.42 483.55 394.13 479.45 399.53 487.66 c +405.00 495.79 404.28 498.53 409.03 499.90 c +413.78 501.26 412.49 507.38 418.61 499.90 c +424.66 492.41 425.30 487.58 430.06 486.94 c +434.88 486.29 436.25 488.95 436.25 480.82 c +436.25 472.61 436.90 467.86 431.50 462.38 c +426.02 456.91 421.27 458.28 420.55 450.07 c +419.90 441.86 420.55 437.83 417.17 437.11 C +413.78 436.39 409.75 435.10 409.75 435.10 c +@c +F +%%Note: Object +424.66 313.63 430.78 365.47 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.50 0.80 0.20 k +%%RECT 11.232 -94.968 0.000 +424.66 365.47 m +430.78 365.47 L +430.78 313.63 L +424.66 313.63 L +424.66 365.47 L +@c +B +%%Note: Object +244.58 465.84 246.02 471.02 @E + 0 O 0 @g +0.00 0.90 0.90 0.10 k +%%RECT 2.664 -9.576 0.000 +244.58 471.02 m +246.02 471.02 L +246.02 465.84 L +244.58 465.84 L +244.58 471.02 L +@c +F +%%Note: Object +244.58 455.47 246.02 460.66 @E + 0 O 0 @g +0.00 0.90 0.90 0.10 k +%%RECT 2.664 -9.576 0.000 +244.58 460.66 m +246.02 460.66 L +246.02 455.47 L +244.58 455.47 L +244.58 460.66 L +@c +F +%%Note: Object +244.58 445.25 246.02 450.43 @E + 0 O 0 @g +0.00 0.90 0.90 0.10 k +%%RECT 2.664 -9.576 0.000 +244.58 450.43 m +246.02 450.43 L +246.02 445.25 L +244.58 445.25 L +244.58 450.43 L +@c +F +%%Note: Object +244.58 435.96 246.02 441.14 @E + 0 O 0 @g +0.00 0.90 0.90 0.10 k +%%RECT 2.664 -9.576 0.000 +244.58 441.14 m +246.02 441.14 L +246.02 435.96 L +244.58 435.96 L +244.58 441.14 L +@c +F +%%Note: Object +353.38 468.29 390.02 482.98 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.10 1.00 0.00 k +%%CURV 7 +357.34 473.98 m +354.53 473.98 L +353.38 468.29 L +387.22 480.17 L +390.02 482.98 L +384.34 482.98 L +357.34 473.98 L +@c +B +%%Note: Object +356.11 420.77 389.52 479.59 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.20 K +0 0.22 0.22 0.00 @w + 0 O 0 @g +0.00 0.00 0.30 0.00 k +%%CURV 5 +386.14 479.59 m +389.52 420.77 L +356.11 425.52 L +356.83 468.65 L +386.14 479.59 L +@c +B +%%Note: Object +368.42 458.35 371.81 470.66 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w +%%CURV 5 +368.42 469.30 m +368.42 458.35 L +371.81 459.07 L +371.16 470.66 L +368.42 469.30 L +@c +S +%%Note: Object +373.75 421.42 384.77 446.04 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 1.44 1.44 0.00 @w +%%CURV 5 +373.90 446.04 m +373.75 422.86 L +384.77 421.42 L +384.12 446.04 L +373.90 446.04 L +@c +S +%%Note: Object +350.06 430.34 378.65 466.42 @E + 0 O 0 @g +0.80 0.00 0.80 0.20 k +%%CURV 25 +366.34 431.64 m +371.16 435.10 373.82 430.34 375.19 439.20 c +376.56 448.13 378.65 450.86 375.91 454.25 c +373.18 457.70 367.06 459.07 367.06 459.07 c +367.06 459.07 367.70 465.26 362.30 462.46 c +356.83 459.72 350.06 466.42 350.06 458.93 c +350.06 451.37 354.10 448.13 357.55 444.67 c +360.94 441.29 360.22 440.57 361.58 437.18 C +362.95 433.73 366.34 431.64 366.34 431.64 c +@c +F +%%Note: Object +405.86 405.07 411.34 435.10 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%RECT 9.936 -55.080 0.000 +405.86 435.10 m +411.34 435.10 L +411.34 405.07 L +405.86 405.07 L +405.86 435.10 L +@c +B +%%Note: Object +209.16 359.21 277.06 377.42 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 1.44 1.44 0.00 @w + 0 O 0 @g +0.40 0.15 0.00 0.00 k +%%CURV 29 +270.50 375.84 m +270.50 375.84 277.06 370.22 277.06 367.99 c +277.06 365.83 276.98 364.25 272.66 362.95 c +268.27 361.73 258.62 360.79 256.10 360.79 c +253.58 360.79 247.32 359.86 245.45 359.86 c +243.58 359.86 231.05 359.21 228.53 359.86 c +226.08 360.43 219.82 359.21 217.58 360.79 c +215.42 362.38 212.33 362.95 210.74 365.47 c +209.16 367.99 209.16 368.35 209.16 371.16 c +209.16 373.97 213.84 377.42 213.84 377.42 C +270.50 375.84 L +@c +B +%%Note: Object +217.37 363.60 270.29 396.50 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.20 0.10 0.00 0.00 k +%%CURV 25 +217.37 394.42 m +217.37 394.42 235.51 396.50 241.85 396.50 c +248.18 396.50 265.82 395.14 265.82 395.14 c +265.82 395.14 268.06 384.41 268.06 383.04 c +268.06 381.74 269.64 377.64 269.64 377.64 c +270.29 367.63 l +270.29 367.63 252.50 365.54 247.25 365.54 c +241.99 365.54 223.27 363.60 221.47 364.25 c +219.67 364.90 219.67 372.82 219.67 372.82 c +217.37 376.49 L +217.37 394.42 L +@c +B +%%Note: Object +220.10 381.53 239.18 392.54 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 22 +220.68 391.25 m +222.91 392.26 228.24 392.26 229.82 392.26 c +231.34 392.26 238.25 392.54 238.25 392.54 c +239.18 390.02 L +239.18 385.63 L +237.60 383.76 L +237.60 383.76 234.22 383.76 231.05 383.11 c +227.88 382.46 222.26 381.53 222.26 381.53 c +222.26 381.53 220.10 382.46 220.10 384.05 C +220.10 385.63 220.68 391.25 220.68 391.25 c +@c +B +%%Note: Object +245.16 383.40 263.30 392.83 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 21 +247.03 392.83 m +259.85 392.54 l +259.85 392.54 262.37 392.26 262.66 390.31 c +262.94 388.44 263.30 385.92 263.30 385.92 c +263.30 385.92 262.94 383.76 261.43 383.76 c +259.85 383.76 247.61 383.40 247.61 383.40 c +247.61 383.40 245.45 384.34 245.45 385.92 c +245.45 387.50 245.16 390.31 245.16 390.31 C +247.03 392.83 L +@c +B +%%Note: Object +247.03 367.70 264.82 374.33 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 16 +249.48 374.33 m +252.65 374.33 262.01 374.33 262.01 374.33 c +264.82 371.81 L +264.82 369.29 L +262.01 368.35 250.42 367.99 250.42 367.99 c +250.42 367.99 247.32 367.70 247.32 369.29 c +247.32 370.87 247.03 372.38 247.03 372.38 C +249.48 374.33 L +@c +B +%%Note: Object +223.20 366.12 242.35 373.03 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 13 +238.54 373.03 m +242.28 371.81 L +242.28 368.64 l +242.28 368.64 242.35 367.70 240.12 367.70 c +237.96 367.70 225.72 366.12 225.72 366.12 c +223.20 367.70 L +223.20 370.51 L +225.43 372.74 L +238.54 373.03 L +@c +B +%%Note: Object +219.38 372.82 269.64 379.66 @E +0 J 0 j [] 0 d 0 R 0 @G +1.00 0.30 0.00 0.00 K +0 2.23 2.23 0.00 @w +%%CURV 7 +219.38 372.82 m +224.64 376.06 235.22 379.66 242.28 379.44 c +249.26 379.22 265.97 378.29 269.64 374.47 C +S +%%Note: Object +217.58 394.20 265.82 400.39 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 1.44 1.44 0.00 @w + 0 O 0 @g +0.60 0.20 0.00 0.00 k +%%CURV 18 +265.82 395.14 m +259.92 399.46 l +259.92 399.46 249.98 400.39 247.90 400.39 c +245.88 400.39 235.94 400.39 235.94 400.39 c +228.24 400.39 L +222.34 397.87 L +217.58 394.92 L +218.95 394.20 l +218.95 394.20 233.42 396.50 241.34 396.29 C +249.26 396.07 265.61 395.14 265.82 395.14 C +@c +B +%%Note: Object +210.82 375.77 276.62 386.93 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.00 K +0 2.81 2.81 0.00 @w +%%CURV 40 +267.84 385.85 m +268.92 385.85 270.29 385.85 272.16 384.70 c +273.96 383.54 273.53 383.54 275.11 381.96 c +276.62 380.38 275.98 379.22 275.98 379.22 c +275.98 379.22 274.82 378.58 273.02 378.58 c +271.22 378.58 265.82 378.07 263.74 378.07 c +261.72 378.07 257.40 378.07 253.80 378.07 c +250.20 378.07 244.94 377.86 242.28 377.86 c +239.54 377.86 233.42 377.14 230.47 376.92 c +227.52 376.70 223.49 376.70 220.10 376.70 c +216.72 376.70 217.80 375.77 215.35 377.14 c +212.83 378.58 211.97 377.21 211.97 379.66 c +211.97 382.18 210.82 382.46 213.34 384.70 c +215.78 386.93 215.35 386.06 217.15 386.06 C +S +%%Note: Object +211.82 372.17 212.11 380.09 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.00 K +0 2.23 2.23 0.00 @w +%%CURV 2 +211.97 380.09 m +211.97 372.17 L +S +%%Note: Object +216.79 364.25 217.08 375.77 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.00 K +0 2.23 2.23 0.00 @w +%%CURV 2 +216.94 375.77 m +216.94 364.25 L +S +%%Note: Object +244.30 361.94 245.45 377.86 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.00 K +0 2.23 2.23 0.00 @w +%%CURV 2 +244.30 377.86 m +245.45 361.94 L +S +%%Note: Object +274.61 367.63 275.26 379.01 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.00 K +0 2.23 2.23 0.00 @w +%%CURV 2 +275.26 379.01 m +274.61 367.63 L +S +%%Note: Object +214.92 379.01 216.00 385.85 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.00 K +0 2.23 2.23 0.00 @w +%%CURV 2 +214.92 385.85 m +216.00 379.01 L +S +%%Note: Object +268.56 380.38 268.85 385.56 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.00 K +0 2.23 2.23 0.00 @w +%%CURV 2 +268.70 385.56 m +268.70 380.38 L +S +%%Note: Object +238.61 400.10 238.90 407.38 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.00 K +0 2.81 2.81 0.00 @w +%%CURV 2 +238.61 400.10 m +238.90 407.38 L +S +%%Note: Object +250.70 399.46 250.99 403.78 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.00 K +0 2.81 2.81 0.00 @w +%%CURV 2 +250.85 399.46 m +250.85 403.78 L +S +%%Note: Object +248.11 404.21 253.15 409.25 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.90 0.90 0.10 K +0 2.23 2.23 0.00 @w + 0 O 0 @g +0.00 0.10 1.00 0.00 k +%%ELLI 9.216 -9.216 270.000 270.000 0 +250.63 409.25 m +252.00 409.25 253.15 408.17 253.15 406.73 c +253.15 405.29 252.00 404.21 250.63 404.21 c +249.26 404.21 248.11 405.29 248.11 406.73 c +248.11 408.17 249.26 409.25 250.63 409.25 c +@c +B +%%Note: Object +431.14 313.70 439.99 342.43 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.60 1.00 0.00 k +%%RECT 14.976 -52.632 0.000 +431.14 342.43 m +439.99 342.43 L +439.99 313.70 L +431.14 313.70 L +431.14 342.43 L +@c +B +%%Note: Object +425.16 361.94 430.70 365.62 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 5 +425.16 364.75 m +430.49 365.62 L +430.70 362.95 L +425.16 361.94 L +425.16 364.75 L +@c +B +%%Note: Object +430.85 342.36 439.56 345.53 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 5 +439.56 342.36 m +439.27 345.53 L +430.85 345.53 L +431.64 342.36 L +439.56 342.36 L +@c +B +%%Note: Object +319.82 415.08 326.95 417.53 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%RECT 13.104 -4.536 0.000 +319.82 417.53 m +326.95 417.53 L +326.95 415.08 L +319.82 415.08 L +319.82 417.53 L +@c +B +%%Note: Object +316.30 390.38 318.10 405.22 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%RECT 3.168 -25.920 0.000 +316.37 405.22 m +316.58 405.22 316.87 405.22 317.16 405.22 c +317.52 405.22 317.81 405.22 318.10 405.22 C +318.02 402.77 318.02 400.32 318.02 397.87 c +318.02 395.35 318.02 392.90 318.10 390.38 C +317.81 390.53 317.52 390.67 317.16 390.74 c +316.94 390.82 316.58 391.03 316.37 391.03 C +316.30 393.41 316.30 395.78 316.30 398.16 c +316.30 400.46 316.37 402.91 316.37 405.22 C +@c +B +%%Note: Object +315.94 405.65 318.31 406.66 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%RECT 4.248 1.800 0.000 +315.94 405.65 m +318.31 405.65 L +318.31 406.66 L +315.94 406.66 L +315.94 405.65 L +@c +B +%%Note: Object +301.25 417.53 304.34 418.90 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.90 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%RECT 5.688 -2.520 0.000 +301.25 418.90 m +304.34 418.90 L +304.34 417.53 L +301.25 417.53 L +301.25 418.90 L +@c +B +%%Note: Object +259.85 382.39 313.78 406.80 @E + 0 O 0 @g +1.00 0.30 0.00 0.00 k +%%CURV 33 +259.85 403.63 m +264.82 405.50 264.82 405.00 267.98 405.94 c +271.08 406.80 271.58 405.50 274.25 405.50 c +276.91 405.50 282.67 405.00 284.62 405.00 c +289.58 405.00 L +295.85 406.37 L +297.22 395.50 L +308.45 395.50 L +313.78 392.33 l +313.78 392.33 313.34 385.13 309.74 385.13 c +306.22 385.13 301.61 382.39 298.08 385.13 c +294.55 387.79 290.88 388.22 288.22 387.79 c +285.55 387.36 280.94 386.93 277.42 386.93 c +273.82 386.93 267.05 386.93 267.05 386.93 c +265.25 395.93 L +259.85 400.46 L +259.85 403.63 L +@c +F +%%Note: Object +258.55 404.93 293.18 417.89 @E + 0 O 0 @g +1.00 0.60 0.00 0.00 k +%%CURV 33 +263.88 413.93 m +270.22 416.45 273.82 416.23 277.85 416.66 c +281.95 417.10 286.49 417.89 287.35 417.60 c +292.75 415.80 L +290.02 412.63 l +290.02 412.63 292.25 406.30 290.02 408.10 c +287.78 409.90 284.18 409.90 281.02 410.33 c +277.85 410.76 272.45 408.53 275.18 408.53 c +277.85 408.53 285.98 408.53 288.65 407.23 c +293.18 404.93 l +293.18 404.93 266.18 404.93 262.51 404.93 c +258.91 404.93 258.55 409.03 260.78 409.03 c +263.02 409.03 269.78 411.70 269.78 411.70 c +261.65 413.06 L +263.88 413.93 L +@c +F +%%Note: Object +194.98 412.63 208.94 441.07 @E + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 18 +199.94 441.07 m +199.94 441.07 199.08 435.60 199.94 431.57 c +200.88 427.54 199.94 426.17 201.31 423.43 c +202.68 420.77 204.48 417.17 204.48 417.17 c +208.94 414.50 L +206.71 412.63 L +201.74 412.63 L +197.21 416.30 L +195.91 427.03 L +195.41 436.10 L +194.98 440.64 L +199.94 441.07 L +@c +F +%%Note: Object +185.04 407.23 199.08 441.07 @E + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 24 +199.08 408.17 m +199.08 408.17 196.27 411.70 195.41 414.94 c +194.54 418.10 192.74 424.37 192.74 427.97 c +192.74 431.57 192.74 441.07 192.74 441.07 c +185.54 437.04 l +185.54 437.04 185.04 432.50 185.54 429.34 c +185.98 426.17 186.84 421.20 187.34 418.10 c +187.78 414.94 188.21 413.57 188.21 410.83 c +188.21 408.17 193.68 407.23 193.68 407.23 C +199.08 408.17 L +@c +F +%%Note: Object +167.98 398.23 181.94 436.61 @E + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 24 +181.94 400.46 m +181.94 400.46 181.51 409.46 181.51 412.20 c +181.51 414.94 181.51 426.17 181.51 426.17 c +181.08 433.37 L +176.98 432.07 L +169.34 436.61 l +169.34 436.61 169.34 426.60 169.34 423.94 c +169.34 421.20 169.78 414.50 169.34 409.97 c +168.91 405.43 169.78 405.00 168.91 401.83 c +167.98 398.66 175.18 399.53 175.18 399.53 c +180.14 398.23 L +181.94 400.46 L +@c +F +%%Note: Object +155.38 390.53 169.34 440.64 @E + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 16 +155.38 391.39 m +169.34 390.53 l +169.34 390.53 168.84 393.70 167.54 396.36 c +166.18 399.10 161.64 399.96 160.78 405.86 c +159.84 411.77 158.54 415.80 158.54 420.77 c +158.54 425.74 158.11 440.21 158.11 440.21 c +155.38 440.64 L +155.38 391.39 L +@c +F +%%Note: Object +371.45 343.94 421.42 376.92 @E + 0 O 0 @g +1.00 0.25 0.00 0.00 k +%%CURV 29 +374.62 376.92 m +371.45 371.52 L +377.78 364.68 l +377.78 364.68 384.98 360.22 388.15 359.28 c +391.32 358.34 398.52 356.54 398.52 356.54 c +411.12 356.54 L +415.66 357.05 L +421.42 355.68 L +420.55 349.34 L +413.78 345.74 l +413.78 345.74 408.46 343.94 402.98 345.74 c +397.58 347.54 394.92 347.11 390.38 347.98 c +385.85 348.91 376.42 350.71 375.98 353.45 c +375.55 356.11 373.32 362.02 373.32 362.02 c +371.45 367.42 L +372.38 375.55 L +374.62 376.92 L +@c +F +%%Note: Object +372.82 354.74 420.98 376.92 @E + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 17 +373.75 376.92 m +389.02 376.92 l +389.02 376.92 392.18 376.92 397.15 375.12 c +402.12 373.32 411.12 369.22 411.12 369.22 c +416.09 364.25 L +420.98 361.58 L +420.98 355.68 L +414.72 357.05 L +400.32 354.74 L +385.42 359.78 L +376.42 365.18 L +372.82 370.15 L +373.75 376.92 L +@c +F +%%Note: Object +377.78 359.28 410.18 374.69 @E + 0 O 0 @g +0.00 0.10 1.00 0.00 k +%%CURV 18 +377.78 368.78 m +381.38 373.75 L +385.42 374.69 l +385.42 374.69 389.88 374.69 392.62 374.26 c +395.35 373.75 399.38 372.38 402.12 370.58 c +404.78 368.78 410.18 365.62 410.18 365.62 c +408.89 361.58 L +403.42 359.28 L +397.58 361.08 L +391.75 366.05 L +387.65 367.92 L +377.78 368.78 L +@c +F +%%Note: Object +375.34 355.25 405.29 369.22 @E + 0 O 0 @g +0.00 0.00 0.00 0.60 k +%%CURV 14 +375.34 367.42 m +378.65 363.38 l +378.65 363.38 383.62 360.65 386.35 359.78 c +389.02 358.85 394.56 357.62 394.92 357.48 c +400.75 355.25 L +405.29 361.08 L +397.58 364.25 L +390.02 367.42 L +383.18 369.22 L +375.34 367.42 L +@c +F +%%Note: Object +372.38 351.65 421.42 376.06 @E + 0 O 0 @g +0.00 0.00 0.00 0.20 k +%%CURV 32 +373.32 376.06 m +373.32 371.02 L +378.22 364.25 l +378.22 364.25 385.92 360.22 389.02 358.85 c +392.18 357.48 397.15 356.11 399.89 356.11 c +402.55 356.11 407.09 356.11 409.75 356.11 c +412.42 356.11 416.02 357.05 418.32 356.11 c +420.55 355.25 421.42 353.45 421.42 353.45 c +416.09 351.65 l +416.09 351.65 409.75 351.65 405.65 351.65 c +401.62 351.65 394.92 352.51 391.32 353.45 c +387.65 354.31 380.88 356.98 377.78 360.22 c +374.62 363.38 372.38 366.98 372.38 366.98 C +373.32 376.06 L +@c +F +%%Note: Object +420.34 314.42 426.17 367.20 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 7 +425.45 365.90 m +425.23 314.42 L +420.34 314.42 L +420.41 367.20 L +420.41 367.20 426.17 366.19 425.45 365.90 C +@c +B +%%Note: Object +420.26 361.94 425.16 367.13 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 5 +425.16 364.75 m +420.26 367.13 L +420.26 363.89 L +425.16 361.94 L +425.16 364.75 L +@c +B +%%Note: Object +257.62 338.47 349.99 364.68 @E + 0 O 0 @g +0.40 0.15 0.00 0.00 k +%%CURV 47 +275.98 361.08 m +283.82 361.51 292.90 361.51 297.36 361.51 c +301.75 361.51 311.69 364.68 317.52 362.02 c +323.42 359.28 322.99 357.05 328.82 356.54 c +334.66 356.11 343.66 352.51 343.66 352.51 c +343.66 352.51 344.52 348.84 347.26 347.04 c +349.99 345.24 339.62 342.50 339.62 342.50 c +327.89 348.84 l +327.89 348.84 310.32 353.88 306.72 353.88 c +303.12 353.88 288.79 352.94 288.79 352.94 c +288.79 352.94 284.69 347.47 294.19 347.04 c +303.55 346.61 311.69 343.94 311.69 343.94 c +311.69 343.94 310.32 338.47 306.72 338.47 c +303.12 338.47 283.82 339.41 279.36 339.41 c +274.82 339.41 257.62 341.21 262.51 343.94 c +267.48 346.61 270.79 354.31 270.79 354.31 c +270.79 354.31 272.59 359.71 275.98 361.08 C +@c +F +%%Note: Object +420.12 364.46 430.70 367.99 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 5 +420.12 367.13 m +425.30 364.46 L +430.70 365.62 L +427.68 367.99 L +420.12 367.13 L +@c +B +%%Note: Object +330.19 468.07 343.73 472.75 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 5 +343.73 472.75 m +339.05 468.07 L +330.19 468.07 L +335.09 472.75 L +343.73 472.75 L +@c +B +%%Note: Object +344.38 416.16 349.06 436.54 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 20 +345.24 434.45 m +345.24 431.71 345.24 428.54 345.24 426.89 c +345.24 425.16 345.60 422.35 345.24 420.91 c +344.81 419.54 344.38 418.46 344.38 418.46 c +344.59 416.16 L +347.98 417.02 L +348.41 419.54 l +348.41 419.54 348.41 424.94 348.41 426.02 c +348.41 427.03 349.06 436.54 349.06 436.54 C +345.24 434.45 L +@c +B +%%Note: Object +365.40 411.55 370.58 433.37 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 29 +370.58 411.55 m +370.58 413.21 370.15 412.34 370.01 415.73 c +369.79 419.11 369.14 420.12 369.14 423.22 c +369.14 426.46 369.14 429.98 369.14 431.06 c +369.14 432.14 369.14 433.37 369.14 433.37 c +366.19 432.36 l +366.19 432.36 366.19 431.71 366.19 429.98 c +366.19 428.33 366.19 426.17 366.19 424.30 c +366.19 422.42 366.19 422.50 366.19 419.98 c +366.19 417.46 366.05 414.94 366.05 414.94 c +365.40 412.34 L +367.27 411.70 L +370.58 411.55 L +@c +B +%%Note: Object +336.67 421.78 338.54 429.19 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 11 +338.54 421.78 m +338.54 427.46 L +337.46 429.19 L +336.67 427.46 l +336.67 427.46 336.82 426.24 336.82 425.16 c +336.82 424.08 336.82 422.64 336.82 422.64 C +338.54 421.78 L +@c +B +%%Note: Object +330.98 422.64 332.42 430.85 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 11 +332.28 430.85 m +332.28 430.85 332.42 428.76 332.42 427.68 c +332.42 426.60 332.42 424.30 332.42 424.30 c +330.98 422.64 L +330.98 426.46 L +330.98 429.55 L +332.28 430.85 L +@c +B +%%Note: Object +333.29 421.99 334.73 431.06 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 16 +334.51 422.21 m +334.51 422.21 334.30 422.50 334.51 425.16 c +334.73 427.90 334.73 430.85 334.73 430.85 c +333.50 431.06 l +333.50 431.06 333.50 428.90 333.50 427.90 c +333.50 426.89 333.29 423.86 333.29 423.86 c +333.50 421.99 L +334.51 422.21 L +@c +B +@rs +@sv +%%Note: Object +336.24 446.90 349.06 464.98 @E + 0 O 0 @g +0.50 0.00 0.50 0.50 k +%%CURV 23 +346.46 463.97 m +339.55 463.54 336.60 464.98 336.38 461.88 c +336.24 458.71 338.54 463.97 339.34 458.28 c +340.20 452.59 340.85 451.51 340.85 449.21 c +340.85 446.90 342.86 446.90 343.30 449.42 c +343.73 451.94 344.02 453.89 346.10 455.11 c +348.19 456.41 349.06 459.94 345.46 459.50 c +341.86 459.14 344.59 462.89 344.59 462.89 C +346.46 463.97 L +@c +F +%%Note: Object +375.77 458.93 381.17 476.06 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w +%%CURV 5 +375.77 472.61 m +381.17 476.06 L +380.52 459.65 L +376.42 458.93 L +375.77 472.61 L +@c +S +%%Note: Object +359.28 462.10 361.80 468.43 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w +%%CURV 3 +361.80 468.43 m +359.28 466.92 L +359.28 462.10 L +S +%%Note: Object +358.63 430.63 363.24 438.48 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 1.44 1.44 0.00 @w +%%CURV 3 +358.63 438.48 m +358.63 431.28 L +363.24 430.63 L +S +%%Note: Object +378.00 461.88 378.14 473.90 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w +%%CURV 2 +378.00 473.90 m +378.14 461.88 L +S +%%Note: Object +376.06 467.78 380.88 470.09 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w +%%CURV 2 +376.06 467.78 m +380.88 470.09 L +S +%%Note: Object +369.79 458.71 370.01 464.62 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w +%%CURV 2 +370.01 464.62 m +369.79 458.71 L +S +%%Note: Object +377.50 437.40 382.18 443.52 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 1.44 1.44 0.00 @w +%%CURV 3 +377.50 443.52 m +381.96 443.52 L +382.18 437.40 L +S +%%Note: Object +376.70 428.11 382.39 431.28 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 1.44 1.44 0.00 @w +%%CURV 3 +376.70 431.28 m +376.70 428.76 L +382.39 428.11 L +S +%%Note: Object +376.27 436.18 381.53 436.32 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 1.44 1.44 0.00 @w +%%CURV 2 +376.27 436.32 m +381.53 436.18 L +S +%%Note: Object +390.82 426.17 395.35 439.70 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.50 K +0 0.22 0.22 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 5 +394.42 439.27 m +390.82 439.70 L +390.82 426.17 L +395.35 426.17 L +394.42 439.27 L +@c +B +%%Note: Object +396.65 424.80 402.55 439.70 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.50 K +0 0.22 0.22 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 6 +400.75 439.70 m +396.65 439.70 L +397.58 425.23 L +402.12 424.80 L +402.55 432.07 L +400.75 439.70 L +@c +B +%%Note: Object +412.27 424.66 417.24 436.82 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.50 K +0 0.22 0.22 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 6 +412.70 432.79 m +412.70 424.66 L +416.74 424.66 L +417.24 436.82 L +412.27 435.96 L +412.70 432.79 L +@c +B +%%Note: Object +418.82 423.22 424.73 439.49 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.50 K +0 0.22 0.22 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 5 +423.36 439.49 m +418.82 439.49 L +419.33 423.22 L +424.73 423.22 L +423.36 439.49 L +@c +B +%%Note: Object +427.32 411.26 439.92 469.58 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.20 0.20 0.00 k +%%CURV 5 +427.32 414.50 m +439.92 411.26 L +439.92 469.58 L +427.32 458.28 L +427.32 414.50 L +@c +B +%%Note: Object +430.92 420.77 439.92 438.41 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.40 K +0 1.44 1.44 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.05 k +%%CURV 5 +431.86 438.41 m +430.92 422.57 L +439.92 420.77 L +439.49 436.61 L +431.86 438.41 L +@c +B +%%Note: Object +432.29 436.61 439.92 445.18 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.40 K +0 1.44 1.44 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.10 k +%%CURV 5 +432.29 438.84 m +439.49 436.61 L +439.92 444.24 L +432.29 445.18 L +432.29 438.84 L +@c +B +%%Note: Object +391.32 434.16 394.42 434.45 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.40 K +0 0.86 0.86 0.00 @w +%%CURV 2 +391.32 434.30 m +394.42 434.30 L +S +%%Note: Object +397.15 433.87 402.12 434.30 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.50 K +0 0.86 0.86 0.00 @w +%%CURV 2 +397.15 434.30 m +402.12 433.87 L +S +%%Note: Object +413.35 432.94 416.52 433.37 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.50 K +0 0.86 0.86 0.00 @w +%%CURV 2 +413.35 433.37 m +416.52 432.94 L +S +%%Note: Object +419.69 433.87 423.22 434.30 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.50 K +0 0.86 0.86 0.00 @w +%%CURV 2 +419.69 434.30 m +423.22 433.87 L +S +%%Note: Object +320.04 388.58 326.74 414.94 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%RECT 12.168 -43.128 0.000 +320.04 414.86 m +321.12 414.94 322.20 414.94 323.35 414.94 c +324.43 414.94 325.51 414.94 326.74 414.86 C +326.66 410.54 326.66 406.15 326.66 401.76 c +326.66 397.37 326.66 392.98 326.74 388.58 C +325.51 389.09 324.43 389.59 323.35 390.02 c +322.27 390.46 321.12 390.96 320.04 391.32 C +320.04 395.28 320.04 399.17 320.04 403.13 c +320.04 407.02 320.04 410.98 320.04 414.86 C +@c +B +%%Note: Object +157.39 457.70 189.43 508.32 @E + 0 O 0 @g +0.60 0.00 0.60 0.40 k +%%CURV 31 +179.21 464.54 m +189.43 470.66 187.34 474.05 186.70 482.33 c +186.05 490.54 183.31 496.01 184.68 502.13 c +186.05 508.32 179.93 500.04 177.84 494.57 c +175.82 489.17 167.62 484.34 167.62 484.34 c +167.62 484.34 159.48 480.89 162.86 492.55 c +166.25 504.22 159.48 502.78 159.48 498.02 c +159.48 493.27 157.39 483.62 159.48 477.50 c +161.50 471.38 166.32 470.66 166.97 474.05 c +167.62 477.50 171.07 472.68 171.07 465.19 C +171.07 457.70 179.21 464.54 179.21 464.54 c +@c +F +%%Note: Object +188.06 447.41 213.26 491.18 @E + 0 O 0 @g +0.60 0.00 0.60 0.40 k +%%CURV 20 +192.82 456.98 m +198.29 463.18 198.29 468.00 198.29 472.75 c +198.29 477.50 197.57 491.18 200.30 487.73 c +203.04 484.34 207.79 476.86 207.79 471.38 c +207.79 465.91 200.38 461.09 205.13 456.98 c +209.88 452.88 213.26 449.50 204.41 449.50 c +195.55 449.50 188.06 447.41 188.06 447.41 C +192.82 456.98 L +@c +F +%%Note: Object +405.14 442.66 423.58 483.70 @E + 0 O 0 @g +0.80 0.00 0.80 0.20 k +%%CURV 21 +408.60 450.86 m +408.60 458.42 405.14 461.16 408.60 468.00 c +411.98 474.84 415.44 483.70 415.44 483.70 c +415.44 483.70 416.74 483.70 416.74 478.94 c +416.74 474.12 422.93 469.30 422.93 469.30 c +423.58 462.46 L +416.09 454.97 l +416.09 454.97 416.09 452.23 416.09 447.48 C +416.09 442.66 408.60 450.86 408.60 450.86 c +@c +F +%%Note: Object +201.67 479.52 360.29 518.54 @E + 0 O 0 @g +0.00 0.00 0.00 0.05 k +%%CURV 43 +234.36 510.34 m +271.80 510.34 252.07 515.81 277.92 515.81 c +303.77 515.81 304.42 516.53 316.66 513.79 c +328.97 511.06 328.25 508.25 339.84 506.23 c +351.43 504.22 360.29 502.78 358.92 498.02 c +357.55 493.27 334.44 487.15 328.97 489.82 c +323.50 492.55 309.17 497.38 304.42 497.38 c +299.66 497.38 264.31 505.58 264.31 505.58 c +264.31 505.58 256.82 501.41 269.14 498.74 c +281.38 496.01 308.52 491.90 296.28 485.71 c +284.04 479.52 269.78 489.17 260.93 489.17 c +252.07 489.17 239.18 489.82 232.99 492.55 c +226.87 495.29 215.28 503.50 208.51 506.95 c +201.67 510.34 203.69 518.54 213.26 517.18 C +222.77 515.81 234.36 510.34 234.36 510.34 c +@c +F +%%Note: Object +166.25 331.20 199.66 372.89 @E + 0 O 0 @g +0.00 0.60 1.00 0.00 k +%%CURV 20 +168.34 353.81 m +175.82 358.56 186.70 366.05 188.78 369.50 c +190.80 372.89 191.45 362.66 191.45 362.66 c +199.66 370.15 L +199.66 360.65 l +199.66 360.65 196.20 355.82 193.54 351.00 c +190.80 346.25 176.47 331.20 176.47 331.20 c +173.81 338.04 L +179.21 347.62 L +177.84 354.46 L +166.25 348.26 L +168.34 353.81 L +@c +F +%%Note: Object +409.25 405.72 432.43 409.18 @E + 0 O 0 @g +0.00 0.00 0.00 0.70 k +%%CURV 5 +411.98 409.18 m +432.43 407.81 L +418.18 405.72 L +409.25 405.72 L +411.98 409.18 L +@c +F +%%Note: Object +369.14 410.54 384.77 415.37 @E + 0 O 0 @g +0.00 0.00 0.00 0.60 k +%%CURV 10 +369.14 415.37 m +369.14 415.37 371.16 413.28 374.54 413.28 c +378.00 413.28 384.77 412.56 384.77 412.56 c +381.31 411.19 L +369.79 410.54 L +369.14 415.37 L +@c +F +%%Note: Object +347.33 413.93 358.92 417.38 @E + 0 O 0 @g +0.00 0.00 0.00 0.60 k +%%CURV 5 +347.98 417.38 m +358.92 417.38 L +357.55 413.93 L +347.33 415.37 L +347.98 417.38 L +@c +F +%%Note: Object +313.06 313.70 420.12 331.70 @E + 0 O 0 @g +1.00 0.50 0.00 0.00 k +%%CURV 26 +420.12 324.86 m +414.65 328.25 405.79 331.70 400.32 331.70 c +394.85 331.70 393.48 330.34 384.62 330.34 c +375.70 330.34 366.91 328.97 360.07 330.34 c +353.23 331.70 345.74 329.62 340.92 329.62 c +336.17 329.62 337.54 324.14 332.06 323.50 c +326.59 322.78 325.94 318.67 321.84 318.67 c +317.74 318.67 313.06 313.85 322.49 313.85 c +331.92 313.85 420.12 313.70 420.12 314.42 C +420.12 324.86 L +@c +F +%%Note: Object +155.02 313.85 440.28 528.34 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w +%%RECT 522.576 -392.976 0.000 +155.02 528.34 m +440.28 528.34 L +440.28 313.85 L +155.02 313.85 L +155.02 528.34 L +@c +S +%%Note: Object +431.42 344.66 440.28 348.84 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%CURV 5 +440.28 344.66 m +434.81 348.84 L +431.42 348.84 L +431.42 344.66 L +440.28 344.66 L +@c +B +%%Note: Object +223.27 498.24 235.58 505.73 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 2.81 2.81 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.70 k +%%CURV 5 +223.27 505.73 m +228.74 503.71 229.46 498.89 229.46 498.89 c +235.58 498.24 L +S +%%Note: Object +216.14 489.60 226.44 493.27 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 2.81 2.81 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.70 k +%%CURV 5 +216.14 491.62 m +221.54 489.60 223.70 489.89 223.70 489.89 c +226.44 493.27 L +S +%%Note: Object +206.35 502.27 215.21 509.11 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 2.81 2.81 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.70 k +%%CURV 5 +206.35 509.11 m +211.82 507.02 212.47 502.27 212.47 502.27 c +215.21 505.66 L +S +%%Note: Object +327.17 341.50 329.18 343.73 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 2.23 2.23 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 1.00 k +%%CURV 5 +327.17 343.73 m +327.17 342.72 327.38 341.50 327.38 341.50 c +329.18 342.07 L +S +%%Note: Object +322.13 342.36 329.98 347.40 @E + 0 O 0 @g +0.00 0.00 0.00 0.80 k +%%CURV 13 +322.99 345.74 m +324.50 347.40 325.51 346.18 326.88 345.53 c +328.25 344.88 329.98 345.31 329.11 344.23 c +328.32 343.22 322.56 342.36 322.56 342.65 c +322.63 343.94 L +322.13 344.66 L +322.99 345.74 L +@c +F +%%Note: Object +327.24 345.31 329.33 347.54 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 2.23 2.23 0.00 @w +%%CURV 5 +327.24 345.31 m +327.24 346.32 327.46 347.54 327.46 347.54 c +329.33 346.97 L +S +%%Note: Object +338.33 335.16 340.42 337.39 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 2.23 2.23 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 1.00 k +%%CURV 5 +338.33 337.39 m +338.33 336.38 338.54 335.16 338.54 335.16 c +340.42 335.81 L +S +%%Note: Object +333.29 336.02 341.14 341.06 @E + 0 O 0 @g +0.00 0.00 0.00 0.80 k +%%CURV 13 +334.22 339.41 m +335.74 341.06 336.67 339.84 338.04 339.19 c +339.41 338.54 341.14 338.98 340.34 337.97 c +339.55 336.89 333.72 336.02 333.72 336.31 c +333.86 337.61 L +333.29 338.40 L +334.22 339.41 L +@c +F +%%Note: Object +338.47 338.98 340.56 341.21 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 2.23 2.23 0.00 @w +%%CURV 5 +338.47 338.98 m +338.47 339.98 338.69 341.21 338.69 341.21 c +340.56 340.63 L +S +%%Note: Object +349.70 345.53 351.79 347.83 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 2.23 2.23 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 1.00 k +%%CURV 5 +349.70 347.83 m +349.70 346.75 349.92 345.53 349.92 345.53 c +351.79 346.18 L +S +%%Note: Object +344.66 346.46 352.51 351.50 @E + 0 O 0 @g +0.00 0.00 0.00 0.80 k +%%CURV 13 +345.60 349.78 m +347.04 351.50 348.05 350.28 349.42 349.63 c +350.78 348.91 352.51 349.34 351.72 348.34 c +350.86 347.33 345.10 346.46 345.10 346.68 c +345.24 348.05 L +344.66 348.77 L +345.60 349.78 L +@c +F +%%Note: Object +349.85 349.34 351.94 351.65 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 2.23 2.23 0.00 @w +%%CURV 5 +349.85 349.34 m +349.85 350.42 350.06 351.65 350.06 351.65 c +351.94 351.00 L +S +%%Note: Object +352.44 336.96 354.53 339.26 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 2.23 2.23 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 1.00 k +%%CURV 5 +352.44 339.26 m +352.44 338.18 352.66 336.96 352.66 336.96 c +354.53 337.61 L +S +%%Note: Object +347.40 337.90 355.25 342.94 @E + 0 O 0 @g +0.00 0.00 0.00 0.80 k +%%CURV 13 +348.34 341.21 m +349.85 342.94 350.78 341.71 352.15 341.06 c +353.52 340.34 355.25 340.78 354.46 339.77 c +353.66 338.76 347.83 337.90 347.83 338.11 c +347.98 339.48 L +347.40 340.20 L +348.34 341.21 L +@c +F +%%Note: Object +352.58 340.78 354.67 343.08 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 2.23 2.23 0.00 @w +%%CURV 5 +352.58 340.78 m +352.58 341.86 352.80 343.08 352.80 343.08 c +354.67 342.43 L +S +%%Note: Object +311.47 331.78 313.56 334.08 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 1.00 K +0 2.23 2.23 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 1.00 k +%%CURV 5 +311.47 334.08 m +311.47 333.00 311.76 331.78 311.76 331.78 c +313.56 332.42 L +S +%%Note: Object +306.43 332.71 314.35 337.75 @E + 0 O 0 @g +0.00 0.00 0.00 0.80 k +%%CURV 13 +307.37 336.02 m +308.88 337.75 309.82 336.53 311.18 335.88 c +312.62 335.16 314.35 335.59 313.49 334.58 c +312.70 333.58 306.86 332.71 306.86 332.93 c +307.01 334.30 L +306.43 335.02 L +307.37 336.02 L +@c +F +%%Note: Object +311.62 335.59 313.70 337.90 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 2.23 2.23 0.00 @w +%%CURV 5 +311.62 335.59 m +311.62 336.67 311.83 337.90 311.83 337.90 c +313.70 337.25 L +S +%%Note: Object +268.70 422.71 268.99 426.60 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 0.86 0.86 0.00 @w +%%CURV 2 +268.85 426.60 m +268.85 422.71 L +S +%%Note: Object +278.50 422.28 278.78 426.60 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 0.86 0.86 0.00 @w +%%CURV 2 +278.64 426.60 m +278.64 422.28 L +S +%%Note: Object +288.86 422.93 289.15 426.46 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 0.86 0.86 0.00 @w +%%CURV 2 +289.01 426.46 m +289.01 422.93 L +S +%%Note: Object +297.94 423.07 298.22 426.46 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.30 0.60 0.40 K +0 0.86 0.86 0.00 @w +%%CURV 2 +298.08 426.46 m +298.08 423.07 L +S +%%Note: Object +345.38 380.38 373.39 402.98 @E + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 9 +345.38 402.98 m +366.55 396.79 L +366.55 391.32 L +373.39 385.13 L +372.02 380.38 L +358.34 387.22 L +359.06 393.34 L +346.10 398.88 L +345.38 402.98 L +@c +F +%%Note: Object +402.70 378.29 429.98 389.95 @E + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%CURV 9 +429.98 386.50 m +417.02 389.95 L +412.27 384.48 L +404.06 385.85 L +402.70 380.38 L +415.01 378.29 L +421.13 384.48 L +429.98 381.10 L +429.98 386.50 L +@c +F +%%Note: Object +223.27 388.58 229.46 389.95 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 0.86 0.86 0.00 @w +%%CURV 2 +223.27 388.58 m +229.46 389.95 L +S +%%Note: Object +252.86 389.52 259.92 390.67 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w +%%CURV 2 +252.86 390.67 m +259.92 389.52 L +S +%%Note: Object +226.94 387.14 230.40 387.65 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.50 K +0 0.86 0.86 0.00 @w +%%CURV 2 +226.94 387.14 m +230.40 387.65 L +S +%%Note: Object +255.17 387.50 259.63 388.44 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.60 K +0 0.86 0.86 0.00 @w +%%CURV 2 +255.17 388.44 m +259.63 387.50 L +S +%%Note: Object +168.19 375.34 171.43 381.74 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%RECT 5.904 11.736 1.584 +169.06 375.34 m +170.57 375.34 l +171.07 375.34 171.43 375.70 171.43 376.20 c +171.43 380.88 l +171.43 381.38 171.07 381.74 170.57 381.74 c +169.06 381.74 l +168.55 381.74 168.19 381.38 168.19 380.88 c +168.19 376.20 l +168.19 375.70 168.55 375.34 169.06 375.34 c +@c +B +%%Note: Object +166.32 380.02 173.02 383.11 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 1.44 1.44 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%RECT 12.168 -5.760 1.800 +167.33 383.11 m +172.01 383.11 l +172.58 383.11 173.02 382.68 173.02 382.18 c +173.02 380.95 l +173.02 380.45 172.58 380.02 172.01 380.02 c +167.33 380.02 l +166.75 380.02 166.32 380.45 166.32 380.95 c +166.32 382.18 l +166.32 382.68 166.75 383.11 167.33 383.11 c +@c +B +%%Note: Object +215.86 362.45 217.73 366.26 @E +0 J 0 j [] 0 d 0 R 0 @G +1.00 0.80 0.00 0.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.10 0.05 0.00 0.00 k +%%RECT 5.904 11.736 1.584 +216.36 362.45 m +217.22 362.45 l +217.51 362.45 217.73 362.66 217.73 362.95 c +217.73 365.76 l +217.73 366.05 217.51 366.26 217.22 366.26 c +216.36 366.26 l +216.00 366.26 215.86 366.05 215.86 365.76 c +215.86 362.95 l +215.86 362.66 216.00 362.45 216.36 362.45 c +@c +B +%%Note: Object +214.70 365.18 218.66 367.06 @E +0 J 0 j [] 0 d 0 R 0 @G +1.00 0.80 0.00 0.00 K +0 1.44 1.44 0.00 @w + 0 O 0 @g +0.10 0.05 0.00 0.00 k +%%RECT 12.168 -5.760 1.800 +215.35 367.06 m +218.09 367.06 l +218.38 367.06 218.66 366.84 218.66 366.48 c +218.66 365.83 l +218.66 365.47 218.38 365.18 218.09 365.18 c +215.35 365.18 l +214.99 365.18 214.70 365.47 214.70 365.83 c +214.70 366.48 l +214.70 366.84 214.99 367.06 215.35 367.06 c +@c +B +%%Note: Object +272.23 364.46 274.10 368.21 @E +0 J 0 j [] 0 d 0 R 0 @G +1.00 0.80 0.00 0.00 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.10 0.05 0.00 0.00 k +%%RECT 5.904 11.736 1.584 +272.74 364.46 m +273.60 364.46 l +273.89 364.46 274.10 364.61 274.10 364.97 c +274.10 367.70 l +274.10 367.99 273.89 368.21 273.60 368.21 c +272.74 368.21 l +272.38 368.21 272.23 367.99 272.23 367.70 c +272.23 364.97 l +272.23 364.61 272.38 364.46 272.74 364.46 c +@c +B +%%Note: Object +271.08 367.20 274.97 369.00 @E +0 J 0 j [] 0 d 0 R 0 @G +1.00 0.80 0.00 0.00 K +0 1.44 1.44 0.00 @w + 0 O 0 @g +0.10 0.05 0.00 0.00 k +%%RECT 12.168 -5.760 1.800 +271.73 369.00 m +274.46 369.00 l +274.75 369.00 274.97 368.78 274.97 368.42 c +274.97 367.78 l +274.97 367.49 274.75 367.20 274.46 367.20 c +271.73 367.20 l +271.37 367.20 271.08 367.49 271.08 367.78 c +271.08 368.42 l +271.08 368.78 271.37 369.00 271.73 369.00 c +@c +B +%%Note: Object +205.13 403.34 207.36 407.88 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 0.86 0.86 0.00 @w + 0 O 0 @g +0.00 0.30 0.60 0.40 k +%%RECT 5.904 11.736 1.584 +205.70 403.34 m +206.78 403.34 l +207.14 403.34 207.36 403.63 207.36 403.99 c +207.36 407.30 l +207.36 407.66 207.14 407.88 206.78 407.88 c +205.70 407.88 l +205.34 407.88 205.13 407.66 205.13 407.30 c +205.13 403.99 l +205.13 403.63 205.34 403.34 205.70 403.34 c +@c +B +%%Note: Object +203.83 406.66 208.51 408.89 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.70 K +0 1.44 1.44 0.00 @w + 0 O 0 @g +0.00 0.00 0.00 0.00 k +%%RECT 12.168 -5.760 1.800 +204.48 408.89 m +207.79 408.89 l +208.22 408.89 208.51 408.60 208.51 408.24 c +208.51 407.38 l +208.51 406.94 208.22 406.66 207.79 406.66 c +204.48 406.66 l +204.12 406.66 203.83 406.94 203.83 407.38 c +203.83 408.24 l +203.83 408.60 204.12 408.89 204.48 408.89 c +@c +B +%%Note: Object +207.00 380.88 217.58 405.65 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 1.44 1.44 0.00 @w +%%CURV 7 +207.00 405.65 m +207.00 401.83 209.30 393.41 211.54 389.88 c +213.77 386.35 217.58 380.88 217.58 380.88 C +S +%%Note: Object +169.85 362.52 217.15 379.30 @E +0 J 0 j [] 0 d 0 R 0 @G +0.00 0.00 0.00 0.80 K +0 2.02 2.02 0.00 @w +%%CURV 7 +217.15 365.26 m +217.15 365.26 211.03 362.52 195.98 365.98 c +180.94 369.36 170.86 379.01 169.85 379.30 C +S +%%Note: Object +241.70 426.89 248.54 436.46 @E + 0 O 0 @g +0.00 0.90 0.90 0.10 k +%%RECT 12.528 -17.568 0.000 +241.70 436.46 m +248.54 436.46 L +248.54 426.89 L +241.70 426.89 L +241.70 436.46 L +@c +F +@rs +@rs +%%Trailer + end diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-00.mp b/doc/context/sources/general/manuals/start/graphics/ma-cb-00.mp new file mode 100644 index 000000000..be9ad9b28 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-00.mp @@ -0,0 +1,1282 @@ +% Converted from PostScript(TM) to MetaPost by pstoedit +% MetaPost backend contributed by Scott Pakin <pakin@uiuc.edu> +% pstoedit is Copyright (C) 1993 - 1999 Wolfgang Glunz <wglunz@geocities.com> + +% Generate structured PostScript +prologues := 1; + +% Display a given string with its *baseline* at a given location +% and with a given rotation angle +vardef showtext(expr origin)(expr angle)(expr string) = + draw string infont defaultfont scaled defaultscale + rotated angle shifted origin; +enddef; + +beginfig(1); +drawoptions (withcolor (0.8,0.9,1)); +linecap := butt; +linejoin := mitered; +fill (34.0598,214.47)--(286.57,214.47)--(285.2,72.9199) + --(38.1699,83.8599)--(34.0598,214.47)--cycle; +drawoptions (withcolor (0.95,0.95,0.95)); +fill (62,152.91)..controls (62,152.91) and (74.24,150.18)..(77.6199,152.91) + ..controls (81.0798,155.65) and (98.0698,152.91)..(98.0698,152.91) + ..controls (98.0698,152.91) and (106.21,148.81)..(111.68,148.81) + ..controls (117.15,148.81) and (130.76,147.37)..(130.76,147.37) + --(134.86,140.53)..controls (134.86,140.53) and (130.11,139.88)..(123.92,139.88) + ..controls (117.8,139.88) and (98.72,139.23)..(98.72,139.23) + --(82.3799,139.23)--(72.1499,145.35)--(64.0198,147.37) + --(62,152.91)--cycle; +drawoptions (withcolor (0.9,0.9,0.9)); +fill (202.11,112.52)--(200.82,126.85)--(184.47,117.99) + --(170.86,116.62)--(150.42,117.34)--(141.63,114.61) + --(104.19,115.26)--(87.1299,115.26)--(69.49,113.17) + --(74.96,107.77)--(106.21,108.42)--(140.98,108.42) + --(147.03,110.5)--(165.39,110.5)--(164.74,104.38) + --(172.88,103.74)--(285.92,79.0398)--(285.2,98.9099) + --(271.59,100.93)--(202.11,112.52)--cycle; +drawoptions (withcolor (1,0.4,0.4)); +fill (285.92,193.23)--(259.78,193.23)--(259.78,188.7) + --(277.35,148.88)--(285.92,155.72)--(285.92,193.23) + --cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0.86bp; +draw (285.92,193.23)--(259.78,193.23)--(259.78,188.7) + --(277.35,148.88)--(285.92,155.72)--(285.92,193.23); +drawoptions (withcolor (1,0.9,0.9)); +pickup pencircle scaled 0bp; +fill (231.85,165.66)--(235.95,169.69)--(246.75,170.62) + --(273.32,149.82)--(272.89,101)--(235.02,107.34) + --(231.85,165.66)--cycle; +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 0.86bp; +draw (231.85,165.66)--(235.95,169.69)--(246.75,170.62) + --(273.32,149.82)--(272.89,101)--(235.02,107.34) + --(231.85,165.66); +drawoptions (withcolor (0,0.5,0)); +pickup pencircle scaled 0bp; +fill (178.28,133.26)..controls (178.28,133.26) and (175.98,132.39)..(175.11,130.09) + ..controls (174.25,127.78) and (172.38,125.62)..(172.38,125.62) + ..controls (172.38,125.62) and (170.86,124.47)..(170,121.88) + ..controls (169.21,119.36) and (168.99,119.14)..(168.99,118.06) + ..controls (168.99,116.98) and (169.21,116.19)..(170.43,116.41) + ..controls (171.73,116.55) and (172.81,117.63)..(172.81,117.63) + --(175.33,116.84)..controls (175.33,116.84) and (175.9,116.62)..(177.42,117.85) + ..controls (178.86,119.14) and (179.29,121.52)..(179.72,120.22) + ..controls (180.15,118.93) and (179.94,119.58)..(180.73,118.06) + ..controls (181.59,116.55) and (183.03,115.98)..(184.11,116.41) + ..controls (185.19,116.84) and (184.47,115.69)..(185.55,117.2) + ..controls (186.63,118.71) and (185.19,122.74)..(185.19,122.74) + --(182.24,132.39)--(178.28,133.26)--cycle; +drawoptions (withcolor (0,0.6,0)); +fill (203.19,132.82)..controls (207.44,132.82) and (198.58,125.84)..(194.55,123.61) + ..controls (190.45,121.3) and (188.65,115.04)..(184.11,120.87) + ..controls (179.65,126.7) and (184.54,132.61)..(180.51,133.04) + ..controls (176.48,133.54) and (177.85,132.18)..(174.68,133.54) + ..controls (171.51,134.84) and (172.45,140.31)..(172.45,140.31) + ..controls (172.45,140.31) and (175.98,145.71)..(177.42,148.88) + ..controls (178.78,152.05) and (177.42,152.91)..(177.85,155.22) + ..controls (178.28,157.52) and (181.02,159.32)..(181.02,159.32) + --(190.02,158.82)--(192.25,162.78)..controls (192.25,162.78) and (196.78,162.92)..(199.02,161.12) + ..controls (201.25,159.32) and (201.25,156.58)..(201.25,156.58) + --(203.98,155.22)--(203.55,147.58)--(201.68,143.12) + ..controls (201.68,143.12) and (201.82,139.95)..(203.19,137.72) + ..controls (204.56,135.42) and (202.76,132.82)..(203.19,132.82) + --cycle; +drawoptions (withcolor (0.8,0.8,0.8)); +fill (1.37988,135.34)--(63.9399,129.01)--(67.98,114.97) + --(73.8799,108.63)--(57.6799,89.26)--(0.869873,46.2798) + --(1.37988,135.34)--cycle; +drawoptions (withcolor (0,0.6,0)); +fill (141.27,120.87)..controls (140.84,121.23) and (143.65,122.46)..(139.62,123.32) + ..controls (135.51,124.26) and (134.65,122.67)..(129.25,122.67) + ..controls (123.85,122.67) and (124.28,120.87)..(122.05,122.67) + ..controls (119.82,124.47) and (119.38,126.27)..(115.28,126.27) + ..controls (111.25,126.27) and (109.45,126.7)..(106.78,124.9) + ..controls (104.05,123.1) and (102.68,123.1)..(100.45,123.1) + ..controls (98.22,123.1) and (96.3398,123.18)..(93.6799,123.61) + ..controls (91.0198,124.04) and (88.7798,124.47)..(86.0498,124.9) + ..controls (83.3098,125.41) and (80.5798,125.84)..(77.9099,125.41) + ..controls (75.25,124.9) and (70.2798,124.47)..(66.6799,124.9) + ..controls (63.0798,125.41) and (60.3398,127.21)..(57.1799,125.41) + ..controls (54.0798,123.61) and (49.1099,123.61)..(49.1099,123.61) + --(44.1399,122.67)--(45.0798,115.9)..controls (45.0798,115.9) and (43.2798,113.6)..(49.5398,113.6) + ..controls (55.8799,113.6) and (58.98,113.6)..(64.8799,113.6) + ..controls (70.71,113.6) and (69.4199,112.66)..(76.1099,114.03) + ..controls (82.8799,115.47) and (86.98,115.47)..(91.8799,115.47) + ..controls (96.8499,115.47) and (100.88,114.97)..(105.85,114.97) + ..controls (110.82,114.97) and (112.62,114.97)..(118.02,114.97) + ..controls (123.42,114.97) and (125.22,114.54)..(136.02,114.54) + ..controls (146.74,114.54) and (146.74,115.9)..(146.74,115.9) + --(145.88,120.37)--(141.27,120.87)--cycle; +drawoptions (withcolor (0.5,0.5,0.5)); +fill (5.83984,98.26)--(27.5098,109.14)--(46.3799,113.6) + --(70.2798,114.03)--(74.3098,109.57)--(49.5398,105.54) + --(0.869873,67.95)--(5.83984,98.26)--cycle; +drawoptions (withcolor (0.8,0.3,0)); +fill (105.85,108.2)--(106.78,85.23)--(73.8799,84.2998) + --(66.25,38.1399)--(36.7998,1.05981)--(0.72998,1.05981) + --(0.869873,49.8799)..controls (0.869873,49.8799) and (24.7798,67.0898)..(36.0798,74.7898) + ..controls (47.3098,82.5) and (70.2798,104.6)..(72.5098,107.34) + ..controls (74.74,110) and (77.48,108.2)..(77.48,108.2) + --(105.85,108.2)--cycle; +drawoptions (withcolor (0.6,0.3,0)); +fill (75.25,107.77)--(105.85,107.77)--(105.85,85.23) + --(75.25,85.23)--(75.25,107.77)--cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0.86bp; +draw (75.25,107.77)--(105.85,107.77)--(105.85,85.23) + --(75.25,85.23)--(75.25,107.77); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 2.23bp; +draw (118.59,71.1899)--(117.22,61.8999); +drawoptions (withcolor (0.9,0.95,1)); +pickup pencircle scaled 0bp; +fill (266.48,1.56982)--(267.34,45.9199)--(158.84,82.3499) + --(149.26,81.2)--(144.15,86.3098)--(140.84,107.77) + --(104.84,107.26)--(105.92,86.3098)--(114.92,40.45) + --(55.5898,38.5798)--(37.23,0.849854)--(266.48,1.56982) + --cycle; +drawoptions (withcolor (0,0.2,1)); +fill (55.1599,40.0898)--(113.98,37.21)--(153.94,25.8999) + ..controls (153.94,25.8999) and (123.42,17.8398)..(145.88,14.6699) + ..controls (168.34,11.4299) and (158.91,11)..(152.65,7.3999) + ..controls (146.31,3.7998) and (118.95,1.05981)..(113.48,1.05981) + ..controls (108.08,1.05981) and (35.6499,1.05981)..(35.6499,1.05981) + --(55.1599,40.0898)--cycle; +drawoptions (withcolor (1,0.7,0)); +fill (146.96,157.59)--(149.77,157.59)--(149.77,118.06) + --(146.96,118.06)--(146.96,157.59)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (146.96,157.59)--(149.77,157.59)--(149.77,118.06) + --(146.96,118.06)--(146.96,157.59); +drawoptions (withcolor (1,0.7,0)); +pickup pencircle scaled 0bp; +fill (109.16,161.05)--(180.37,158.53)--(176.41,154.86) + --(108.66,157.3)--(109.16,161.05)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (109.16,161.05)--(180.37,158.53)--(176.41,154.86) + --(108.66,157.3)--(109.16,161.05); +drawoptions (withcolor (1,0.9,0)); +pickup pencircle scaled 0bp; +fill (107.65,166.74)--(192.18,162.27)--(189.94,159.54) + --(108.15,162.99)--(107.65,166.74)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (107.65,166.74)--(192.18,162.27)--(189.94,159.54) + --(108.15,162.99)--(107.65,166.74); +drawoptions (withcolor (1,0.9,0)); +pickup pencircle scaled 0bp; +fill (149.77,163.86)--(153.8,163.86)--(153.8,110.07) + --(149.77,110.07)--(149.77,163.86)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (149.77,163.86)--(153.8,163.86)--(153.8,110.07) + --(149.77,110.07)--(149.77,163.86); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 2.23bp; +draw (112.26,165.3)--(104.77,109.14); +draw (109.59,159.82)--(102.75,116.62); +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (153.73,150.61)--(163.38,129.3); +draw (153.51,140.17)--(163.09,124.33); +drawoptions (withcolor (0,0.2,1)); +pickup pencircle scaled 0bp; +fill (162.58,130.74)--(168.99,130.74)--(168.99,114.9) + --(162.58,114.9)--(162.58,130.74)--cycle; +drawoptions (withcolor (0,0.4,1)); +fill (153.22,123.1)--(162.58,123.1)--(162.58,115.9) + --(153.22,115.9)--(153.22,123.1)--cycle; +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0.86bp; +draw (101.89,117.92)--(149.05,117.42); +pickup pencircle scaled 2.02bp; +draw (103.98,113.46)--(150.56,113.67); +pickup pencircle scaled 0bp; +fill (102.25,109.71)--(146.82,109.71)--(146.82,107.77) + --(102.25,107.77)--(102.25,109.71)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (102.25,109.71)--(146.82,109.71)--(146.82,107.77) + --(102.25,107.77)--(102.25,109.71); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (90.4399,158.02)--(92.1699,158.02)--(92.1699,117.92) + --(90.4399,117.92)--(90.4399,158.02)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (90.4399,158.02)--(92.1699,158.02)--(92.1699,117.92) + --(90.4399,117.92)--(90.4399,158.02); +drawoptions (withcolor (0,0,0)); +draw (161.86,94.8799)--(164.1,94.8799)--(164.1,92.22) + --(161.86,92.22)--(161.86,94.8799); +drawoptions (withcolor (0.8,0.3,0)); +pickup pencircle scaled 0bp; +fill (147.32,104.1)--(149.05,104.1)--(149.05,87.97) + --(147.32,87.97)--(147.32,104.1)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (147.32,104.1)--(149.05,104.1)--(149.05,87.97) + --(147.32,87.97)--(147.32,104.1); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0bp; +fill (148.54,104.6)--(150.27,104.6)--(150.27,87.6799) + --(148.54,87.6799)--(148.54,104.6)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (148.54,104.6)--(150.27,104.6)--(150.27,87.6799) + --(148.54,87.6799)--(148.54,104.6); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0bp; +fill (141.2,107.55)--(147.1,107.55)--(147.1,87.25) + --(141.2,87.25)--(141.2,107.55)--cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0.86bp; +draw (141.2,107.55)--(147.1,107.55)--(147.1,87.25) + --(141.2,87.25)--(141.2,107.55); +drawoptions (withcolor (0,0.75,1)); +pickup pencircle scaled 0bp; +fill (141.49,88.1799)--(153.58,88.1799)--(161.22,81.99) + --(143.22,81.2)--(141.49,88.1799)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (141.49,88.1799)--(153.58,88.1799)--(161.22,81.99) + --(143.22,81.2)--(141.49,88.1799); +drawoptions (withcolor (1,0.4,0)); +pickup pencircle scaled 0bp; +fill (146.53,110.22)--(165.1,110.22)--(165.1,103.09) + --(162.8,103.09)--(152.94,87.97)--(147.32,87.97) + --(146.53,110.22)--cycle; +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 0.86bp; +draw (146.53,110.22)--(165.1,110.22)--(165.1,103.09) + --(162.8,103.09)--(152.94,87.97)--(147.32,87.97) + --(146.53,110.22); +drawoptions (withcolor (1,0.5,0)); +pickup pencircle scaled 0bp; +fill (285.92,78.3899)--(163.09,104.31)--(152.43,88.6899) + --(160.57,82.5)..controls (160.57,82.5) and (165.39,79.76)..(175.62,74.2898) + ..controls (185.84,68.8198) and (187.86,71.5498)..(192.61,67.45) + ..controls (197.36,63.3398) and (215.65,62.0498)..(215.65,62.0498) + --(285.63,30.6599)--(285.92,78.3899)--cycle; +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0.86bp; +draw (285.92,78.3899)--(163.09,104.31)--(152.43,88.6899) + --(160.57,82.5)..controls (160.57,82.5) and (165.39,79.76)..(175.62,74.2898) + ..controls (185.84,68.8198) and (187.86,71.5498)..(192.61,67.45) + ..controls (197.36,63.3398) and (215.65,62.0498)..(215.65,62.0498) + --(285.63,30.6599)--(285.92,78.3899); +drawoptions (withcolor (0.2,0.9,0.2)); +pickup pencircle scaled 0bp; +fill (40.1799,214.47)..controls (47.6699,214.47) and (37.0198,202.59)..(40.3999,195.82) + ..controls (43.7798,188.98) and (41.0498,194.46)..(47.8899,187.62) + ..controls (54.6599,180.78) and (59.4099,178.76)..(59.4099,173.29) + ..controls (59.4099,167.82) and (59.4099,166.45)..(60.1299,159.61) + ..controls (60.7798,152.77) and (64.8098,145.93)..(65.5298,141.82) + ..controls (66.25,137.79) and (68.98,134.34)..(66.25,130.95) + ..controls (63.5098,127.57) and (62.7898,127.57)..(52.6399,127.57) + ..controls (42.49,127.57) and (42.49,130.3)..(33.6299,125.48) + ..controls (24.7798,120.73) and (25.5,116.62)..(18.6599,120.73) + ..controls (11.8899,124.76) and (1.65991,128.22)..(1.65991,128.22) + --(1.37988,214.47)--(40.1799,214.47)--cycle; +drawoptions (withcolor (0,0.5,1)); +fill (122.41,51.8999)..controls (122.41,51.8999) and (121.76,52.47)..(120.25,49.3799) + ..controls (118.66,46.21) and (118.66,44.3398)..(115.86,39.9399) + ..controls (113.05,35.48) and (114.27,36.49)..(110.53,32.6699) + ..controls (106.71,28.9299) and (109.38,32.3799)..(104.34,28.9299) + ..controls (99.2998,25.47) and (94.2598,26.3398)..(89.7898,26.7) + ..controls (85.3999,26.98) and (76.6199,25.1799)..(72.8699,27.3398) + ..controls (69.1299,29.5798) and (67.8999,30.51)..(65.74,34.26) + ..controls (63.5798,38) and (63.5798,38)..(61.71,41.46) + ..controls (59.8398,44.9099) and (59.3398,48.5798)..(58.2598,50.3098) + --(54.8699,55.6399)--(122.41,51.8999)--cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 1.44bp; +draw (122.41,51.8999)..controls (122.41,51.8999) and (121.76,52.47)..(120.25,49.3799) + ..controls (118.66,46.21) and (118.66,44.3398)..(115.86,39.9399) + ..controls (113.05,35.48) and (114.27,36.49)..(110.53,32.6699) + ..controls (106.71,28.9299) and (109.38,32.3799)..(104.34,28.9299) + ..controls (99.2998,25.47) and (94.2598,26.3398)..(89.7898,26.7) + ..controls (85.3999,26.98) and (76.6199,25.1799)..(72.8699,27.3398) + ..controls (69.1299,29.5798) and (67.8999,30.51)..(65.74,34.26) + ..controls (63.5798,38) and (63.5798,38)..(61.71,41.46) + ..controls (59.8399,44.9099) and (59.3398,48.5798)..(58.2598,50.3098) + --(54.8699,55.6399)--(122.41,51.8999); +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (202.04,156.87)--(200.53,112.81)--(234.87,107.26) + --(233.29,167.1)--(202.04,156.87); +drawoptions (withcolor (1,0.25,0.25)); +pickup pencircle scaled 0bp; +fill (246.9,189.63)--(223.06,177.32)--(202.76,160.26) + --(230.55,170.55)--(246.9,189.63)--cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0.86bp; +draw (246.9,189.63)--(223.06,177.32)--(202.76,160.26) + --(230.55,170.55)--(246.9,189.63); +drawoptions (withcolor (1,0.4,0.4)); +pickup pencircle scaled 0bp; +fill (246.25,188.98)--(230.98,170.62)--(274.76,169.83) + --(246.25,188.98)--cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0.86bp; +draw (246.25,188.98)--(230.98,170.62)--(274.76,169.83) + --(246.25,188.98); +drawoptions (withcolor (0.3,1,0.3)); +pickup pencircle scaled 0bp; +fill (255.75,122.1)..controls (252.3,122.1) and (253.02,121.45)..(248.26,125.48) + ..controls (243.51,129.58) and (242.79,126.2)..(239.41,135.06) + ..controls (236.02,143.91) and (234.01,141.18)..(234.66,148.66) + ..controls (235.3,156.22) and (230.62,155.5)..(236.02,163.06) + ..controls (241.42,170.55) and (240.13,166.45)..(245.53,174.66) + ..controls (251,182.79) and (250.28,185.53)..(255.03,186.9) + ..controls (259.78,188.26) and (258.49,194.38)..(264.61,186.9) + ..controls (270.66,179.41) and (271.3,174.58)..(276.06,173.94) + ..controls (280.88,173.29) and (282.25,175.95)..(282.25,167.82) + ..controls (282.25,159.61) and (282.9,154.86)..(277.5,149.38) + ..controls (272.02,143.91) and (267.27,145.28)..(266.55,137.07) + ..controls (265.9,128.86) and (266.55,124.83)..(263.17,124.11) + ..controls (259.78,123.39) and (255.75,122.1)..(255.75,122.1) + --cycle; +drawoptions (withcolor (0.8,0.3,0)); +fill (270.66,52.47)--(276.78,52.47)--(276.78,0.629883) + --(270.66,0.629883)--(270.66,52.47)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (270.66,52.47)--(276.78,52.47)--(276.78,0.629898) + --(270.66,0.629898)--(270.66,52.47); +drawoptions (withcolor (0.9,0,0)); +pickup pencircle scaled 0bp; +fill (90.5798,158.02)--(92.0198,158.02)--(92.0198,152.84) + --(90.5798,152.84)--(90.5798,158.02)--cycle; +fill (90.5798,147.66)--(92.0198,147.66)--(92.0198,142.47) + --(90.5798,142.47)--(90.5798,147.66)--cycle; +fill (90.5798,137.43)--(92.0198,137.43)--(92.0198,132.25) + --(90.5798,132.25)--(90.5798,137.43)--cycle; +fill (90.5798,128.14)--(92.0198,128.14)--(92.0198,122.96) + --(90.5798,122.96)--(90.5798,128.14)--cycle; +drawoptions (withcolor (1,0.9,0)); +fill (203.34,160.98)--(200.53,160.98)--(199.38,155.29) + --(233.22,167.17)--(236.02,169.98)--(230.34,169.98) + --(203.34,160.98)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (203.34,160.98)--(200.53,160.98)--(199.38,155.29) + --(233.22,167.17)--(236.02,169.98)--(230.34,169.98) + --(203.34,160.98); +drawoptions (withcolor (1,1,0.7)); +pickup pencircle scaled 0bp; +fill (232.14,166.59)--(235.52,107.77)--(202.11,112.52) + --(202.83,155.65)--(232.14,166.59)--cycle; +drawoptions (withcolor (0.8,0.8,0.8)); +pickup pencircle scaled 0.22bp; +draw (232.14,166.59)--(235.52,107.77)--(202.11,112.52) + --(202.83,155.65)--(232.14,166.59); +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (214.42,156.3)--(214.42,145.35)--(217.81,146.07) + --(217.16,157.66)--(214.42,156.3); +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 1.44bp; +draw (219.9,133.04)--(219.75,109.86)--(230.77,108.42) + --(230.12,133.04)--(219.9,133.04); +drawoptions (withcolor (0,0.8,0)); +pickup pencircle scaled 0bp; +fill (212.34,118.64)..controls (217.16,122.1) and (219.82,117.34)..(221.19,126.2) + ..controls (222.56,135.13) and (224.65,137.86)..(221.91,141.25) + ..controls (219.18,144.7) and (213.06,146.07)..(213.06,146.07) + ..controls (213.06,146.07) and (213.7,152.26)..(208.3,149.46) + ..controls (202.83,146.72) and (196.06,153.42)..(196.06,145.93) + ..controls (196.06,138.37) and (200.1,135.13)..(203.55,131.67) + ..controls (206.94,128.29) and (206.22,127.57)..(207.58,124.18) + ..controls (208.95,120.73) and (212.34,118.64)..(212.34,118.64) + --cycle; +drawoptions (withcolor (0.6,0.3,0)); +fill (251.86,122.1)--(257.34,122.1)--(257.34,92.0698) + --(251.86,92.0698)--(251.86,122.1)--cycle; +pickup pencircle scaled 0.86bp; +draw (251.86,122.1)--(257.34,122.1)--(257.34,92.0698) + --(251.86,92.0698)--(251.86,122.1); +drawoptions (withcolor (0.6,0.85,1)); +pickup pencircle scaled 0bp; +fill (116.5,62.8398)..controls (116.5,62.8398) and (123.06,57.22)..(123.06,54.99) + ..controls (123.06,52.8298) and (122.98,51.25)..(118.66,49.95) + ..controls (114.27,48.73) and (104.62,47.7898)..(102.1,47.7898) + ..controls (99.5798,47.7898) and (93.3198,46.8599)..(91.45,46.8599) + ..controls (89.5798,46.8599) and (77.0498,46.21)..(74.5298,46.8599) + ..controls (72.0798,47.4299) and (65.8198,46.21)..(63.5798,47.7898) + ..controls (61.4199,49.3799) and (58.3298,49.95)..(56.74,52.47) + ..controls (55.1599,54.99) and (55.1599,55.3499)..(55.1599,58.1599) + ..controls (55.1599,60.97) and (59.8398,64.4199)..(59.8398,64.4199) + --(116.5,62.8398)--cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 1.44bp; +draw (116.5,62.8398)..controls (116.5,62.8398) and (123.06,57.22)..(123.06,54.99) + ..controls (123.06,52.8298) and (122.98,51.25)..(118.66,49.95) + ..controls (114.27,48.73) and (104.62,47.7898)..(102.1,47.7898) + ..controls (99.5798,47.7898) and (93.3198,46.8599)..(91.45,46.8599) + ..controls (89.5798,46.8599) and (77.0498,46.21)..(74.5298,46.8599) + ..controls (72.0798,47.4299) and (65.8198,46.21)..(63.5798,47.7898) + ..controls (61.4199,49.3799) and (58.3298,49.95)..(56.74,52.47) + ..controls (55.1599,54.99) and (55.1599,55.3498)..(55.1599,58.1599) + ..controls (55.1599,60.97) and (59.8399,64.4199)..(59.8399,64.4199) + --(116.5,62.8398); +drawoptions (withcolor (0.8,0.9,1)); +pickup pencircle scaled 0bp; +fill (63.3699,81.4199)..controls (63.3699,81.4199) and (81.5098,83.5)..(87.8499,83.5) + ..controls (94.1799,83.5) and (111.82,82.1399)..(111.82,82.1399) + ..controls (111.82,82.1399) and (114.06,71.4099)..(114.06,70.0398) + ..controls (114.06,68.74) and (115.64,64.6399)..(115.64,64.6399) + --(116.29,54.6299)..controls (116.29,54.6299) and (98.5,52.5398)..(93.25,52.5398) + ..controls (87.99,52.5398) and (69.2698,50.5999)..(67.47,51.25) + ..controls (65.6699,51.8999) and (65.6699,59.8198)..(65.6699,59.8198) + --(63.3699,63.49)--(63.3699,81.4199)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (63.3699,81.4199)..controls (63.3699,81.4199) and (81.5098,83.5)..(87.8499,83.5) + ..controls (94.1799,83.5) and (111.82,82.1399)..(111.82,82.1399) + ..controls (111.82,82.1399) and (114.06,71.4099)..(114.06,70.0398) + ..controls (114.06,68.74) and (115.64,64.6399)..(115.64,64.6399) + --(116.29,54.6299)..controls (116.29,54.6299) and (98.5,52.5398)..(93.25,52.5398) + ..controls (87.99,52.5398) and (69.2698,50.5999)..(67.47,51.25) + ..controls (65.6699,51.8999) and (65.6699,59.8198)..(65.6699,59.8198) + --(63.3699,63.49)--(63.3699,81.4199); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (66.6799,78.25)..controls (68.9099,79.26) and (74.24,79.26)..(75.8198,79.26) + ..controls (77.3398,79.26) and (84.25,79.5398)..(84.25,79.5398) + --(85.1799,77.0198)--(85.1799,72.6299)--(83.5999,70.76) + ..controls (83.5999,70.76) and (80.22,70.76)..(77.0498,70.1099) + ..controls (73.8799,69.46) and (68.2598,68.5298)..(68.2598,68.5298) + ..controls (68.2598,68.5298) and (66.0999,69.46)..(66.0999,71.0498) + ..controls (66.0999,72.6299) and (66.6799,78.25)..(66.6799,78.25) + --cycle; +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 0.86bp; +draw (66.6799,78.25)..controls (68.9099,79.26) and (74.24,79.26)..(75.8198,79.26) + ..controls (77.3398,79.26) and (84.25,79.5398)..(84.25,79.5398) + --(85.1799,77.0198)--(85.1799,72.6299)--(83.5999,70.76) + ..controls (83.5999,70.76) and (80.22,70.76)..(77.0498,70.1099) + ..controls (73.8799,69.46) and (68.2598,68.5298)..(68.2598,68.5298) + ..controls (68.2598,68.5298) and (66.0999,69.46)..(66.0999,71.0498) + ..controls (66.0999,72.6299) and (66.6799,78.25)..(66.6799,78.25) + --cycle; +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (93.0298,79.8298)--(105.85,79.5398)..controls (105.85,79.5398) and (108.37,79.26)..(108.66,77.3098) + ..controls (108.94,75.4399) and (109.3,72.9199)..(109.3,72.9199) + ..controls (109.3,72.9199) and (108.94,70.76)..(107.43,70.76) + ..controls (105.85,70.76) and (93.6099,70.3999)..(93.6099,70.3999) + ..controls (93.6099,70.3999) and (91.45,71.3398)..(91.45,72.9199) + ..controls (91.45,74.5) and (91.1599,77.3098)..(91.1599,77.3098) + --(93.0298,79.8298)--cycle; +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 0.86bp; +draw (93.0298,79.8298)--(105.85,79.5398)..controls (105.85,79.5398) and (108.37,79.26)..(108.66,77.3098) + ..controls (108.94,75.4399) and (109.3,72.9199)..(109.3,72.9199) + ..controls (109.3,72.9199) and (108.94,70.76)..(107.43,70.76) + ..controls (105.85,70.76) and (93.6098,70.3999)..(93.6098,70.3999) + ..controls (93.6098,70.3999) and (91.45,71.3399)..(91.45,72.9199) + ..controls (91.45,74.5) and (91.1599,77.3098)..(91.1599,77.3098) + --(93.0298,79.8298); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (95.48,61.3298)..controls (98.6499,61.3298) and (108.01,61.3298)..(108.01,61.3298) + --(110.82,58.8098)--(110.82,56.2898)..controls (108.01,55.3499) and (96.4199,54.99)..(96.4199,54.99) + ..controls (96.4199,54.99) and (93.3198,54.7)..(93.3198,56.2898) + ..controls (93.3198,57.8699) and (93.0298,59.3799)..(93.0298,59.3799) + --(95.48,61.3298)--cycle; +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 0.86bp; +draw (95.48,61.3298)..controls (98.6499,61.3298) and (108.01,61.3298)..(108.01,61.3298) + --(110.82,58.8098)--(110.82,56.2898)..controls (108.01,55.3499) and (96.4199,54.99)..(96.4199,54.99) + ..controls (96.4199,54.99) and (93.3198,54.7)..(93.3198,56.2898) + ..controls (93.3198,57.8699) and (93.0298,59.3799)..(93.0298,59.3799) + --(95.48,61.3298); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (84.5398,60.0298)--(88.2798,58.8098)--(88.2798,55.6399) + ..controls (88.2798,55.6399) and (88.3499,54.7)..(86.1199,54.7) + ..controls (83.96,54.7) and (71.72,53.1199)..(71.72,53.1199) + --(69.2,54.7)--(69.2,57.51)--(71.4299,59.74) + --(84.5398,60.0298)--cycle; +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 0.86bp; +draw (84.5398,60.0298)--(88.2798,58.8098)--(88.2798,55.6399) + ..controls (88.2798,55.6399) and (88.3499,54.7)..(86.1199,54.7) + ..controls (83.96,54.7) and (71.72,53.1199)..(71.72,53.1199) + --(69.2,54.7)--(69.2,57.51)--(71.4299,59.74) + --(84.5398,60.0298); +drawoptions (withcolor (0,0.7,1)); +pickup pencircle scaled 2.23bp; +draw (65.3799,59.8198)..controls (70.6399,63.0598) and (81.22,66.6599)..(88.2798,66.4399) + ..controls (95.2598,66.22) and (111.97,65.2898)..(115.64,61.47); +drawoptions (withcolor (0.4,0.8,1)); +pickup pencircle scaled 0bp; +fill (111.82,82.1399)--(105.92,86.46)..controls (105.92,86.46) and (95.98,87.3899)..(93.8999,87.3899) + ..controls (91.8799,87.3899) and (81.9399,87.3899)..(81.9399,87.3899) + --(74.24,87.3899)--(68.3398,84.8699)--(63.5798,81.9199) + --(64.95,81.2)..controls (64.95,81.2) and (79.4199,83.5)..(87.3398,83.2898) + ..controls (95.2598,83.0698) and (111.61,82.1399)..(111.82,82.1399) + --cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 1.44bp; +draw (111.82,82.1399)--(105.92,86.46)..controls (105.92,86.46) and (95.98,87.3899)..(93.8999,87.3899) + ..controls (91.8799,87.3899) and (81.9399,87.3899)..(81.9399,87.3899) + --(74.24,87.3899)--(68.3398,84.8699)--(63.5798,81.9199) + --(64.95,81.2)..controls (64.95,81.2) and (79.4199,83.5)..(87.3398,83.2898) + ..controls (95.2598,83.0698) and (111.61,82.1399)..(111.82,82.1399) + --cycle; +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 2.81bp; +draw (113.84,72.8498)..controls (114.92,72.8498) and (116.29,72.8498)..(118.16,71.7) + ..controls (119.96,70.5398) and (119.53,70.5398)..(121.11,68.96) + ..controls (122.62,67.3799) and (121.98,66.22)..(121.98,66.22) + ..controls (121.98,66.22) and (120.82,65.5798)..(119.02,65.5798) + ..controls (117.22,65.5798) and (111.82,65.0698)..(109.74,65.0698) + ..controls (107.72,65.0698) and (103.4,65.0698)..(99.7998,65.0698) + ..controls (96.2,65.0698) and (90.9399,64.8599)..(88.2798,64.8599) + ..controls (85.5398,64.8599) and (79.4199,64.1399)..(76.47,63.9199) + ..controls (73.5198,63.7) and (69.49,63.7)..(66.0999,63.7) + ..controls (62.72,63.7) and (63.7998,62.7698)..(61.3499,64.1399) + ..controls (58.8298,65.5798) and (57.97,64.2099)..(57.97,66.6599) + ..controls (57.97,69.1799) and (56.8198,69.46)..(59.3398,71.7) + ..controls (61.7798,73.9299) and (61.3499,73.0598)..(63.1499,73.0598); +pickup pencircle scaled 2.23bp; +draw (57.97,67.0899)--(57.97,59.1699); +draw (62.9399,62.7698)--(62.9399,51.25); +draw (90.2998,64.8598)--(91.45,48.9399); +draw (121.26,66.01)--(120.61,54.6299); +draw (60.9199,72.8499)--(62,66.01); +draw (114.7,72.5598)--(114.7,67.3799); +pickup pencircle scaled 2.81bp; +draw (84.6099,87.0999)--(84.8999,94.3799); +draw (96.8498,86.46)--(96.8498,90.7798); +drawoptions (withcolor (1,0.9,0)); +pickup pencircle scaled 0bp; +fill (96.6299,96.25)..controls (98,96.25) and (99.1499,95.1699)..(99.1499,93.73) + ..controls (99.1499,92.2898) and (98,91.21)..(96.6299,91.21) + ..controls (95.2598,91.21) and (94.1099,92.2898)..(94.1099,93.73) + ..controls (94.1099,95.1699) and (95.2598,96.25)..(96.6299,96.25) + --cycle; +drawoptions (withcolor (0.9,0,0)); +pickup pencircle scaled 2.23bp; +draw (96.6299,96.25)..controls (98,96.25) and (99.1499,95.1699)..(99.1499,93.73) + ..controls (99.1499,92.2898) and (98,91.21)..(96.6299,91.21) + ..controls (95.2598,91.21) and (94.1099,92.2898)..(94.1099,93.73) + ..controls (94.1099,95.1699) and (95.2598,96.25)..(96.6299,96.25) + --cycle; +drawoptions (withcolor (1,0.4,0)); +pickup pencircle scaled 0bp; +fill (277.14,29.4299)--(285.99,29.4299)--(285.99,0.699951) + --(277.14,0.699951)--(277.14,29.4299)--cycle; +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0.86bp; +draw (277.14,29.4299)--(285.99,29.4299)--(285.99,0.699936) + --(277.14,0.699936)--(277.14,29.4299); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (271.16,51.75)--(276.49,52.6199)--(276.7,49.95) + --(271.16,48.9399)--(271.16,51.75)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (271.16,51.75)--(276.49,52.6199)--(276.7,49.95) + --(271.16,48.9399)--(271.16,51.75); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (285.56,29.3599)--(285.27,32.5298)--(276.85,32.5298) + --(277.64,29.3599)--(285.56,29.3599)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (285.56,29.3599)--(285.27,32.5298)--(276.85,32.5298) + --(277.64,29.3599)--(285.56,29.3599); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (165.82,104.53)--(172.95,104.53)--(172.95,102.08) + --(165.82,102.08)--(165.82,104.53)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (165.82,104.53)--(172.95,104.53)--(172.95,102.08) + --(165.82,102.08)--(165.82,104.53); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0bp; +fill (162.37,92.22)..controls (162.58,92.22) and (162.87,92.22)..(163.16,92.22) + ..controls (163.52,92.22) and (163.81,92.22)..(164.1,92.22) + ..controls (164.02,89.7698) and (164.02,87.3198)..(164.02,84.8699) + ..controls (164.02,82.3499) and (164.02,79.8999)..(164.1,77.3799) + ..controls (163.81,77.5298) and (163.52,77.6699)..(163.16,77.74) + ..controls (162.94,77.8198) and (162.58,78.0298)..(162.37,78.0298) + ..controls (162.3,80.4099) and (162.3,82.7798)..(162.3,85.1599) + ..controls (162.3,87.46) and (162.37,89.9099)..(162.37,92.22) + --cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (162.37,92.22)..controls (162.58,92.22) and (162.87,92.22)..(163.16,92.22) + ..controls (163.52,92.22) and (163.81,92.22)..(164.1,92.22) + ..controls (164.02,89.7698) and (164.02,87.3198)..(164.02,84.8699) + ..controls (164.02,82.3499) and (164.02,79.8999)..(164.1,77.3799) + ..controls (163.81,77.5298) and (163.52,77.6699)..(163.16,77.74) + ..controls (162.94,77.8198) and (162.58,78.0298)..(162.37,78.0298) + ..controls (162.3,80.4099) and (162.3,82.7798)..(162.3,85.1599) + ..controls (162.3,87.46) and (162.37,89.9099)..(162.37,92.22) + --cycle; +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (161.94,92.6499)--(164.31,92.6499)--(164.31,93.6599) + --(161.94,93.6599)--(161.94,92.6499)--cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0.86bp; +draw (161.94,92.6499)--(164.31,92.6499)--(164.31,93.6599) + --(161.94,93.6599)--(161.94,92.6499); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (147.25,105.9)--(150.34,105.9)--(150.34,104.53) + --(147.25,104.53)--(147.25,105.9)--cycle; +drawoptions (withcolor (0.1,0.1,0.1)); +pickup pencircle scaled 0.86bp; +draw (147.25,105.9)--(150.34,105.9)--(150.34,104.53) + --(147.25,104.53)--(147.25,105.9); +drawoptions (withcolor (0,0.7,1)); +pickup pencircle scaled 0bp; +fill (105.85,90.6299)..controls (110.82,92.5) and (110.82,92)..(113.98,92.9399) + ..controls (117.08,93.7998) and (117.58,92.5)..(120.25,92.5) + ..controls (122.91,92.5) and (128.67,92)..(130.62,92) + --(135.58,92)--(141.85,93.3699)--(143.22,82.5) + --(154.45,82.5)--(159.78,79.3298)..controls (159.78,79.3298) and (159.34,72.1299)..(155.74,72.1299) + ..controls (152.22,72.1299) and (147.61,69.3899)..(144.08,72.1299) + ..controls (140.55,74.7898) and (136.88,75.22)..(134.22,74.7898) + ..controls (131.55,74.3599) and (126.94,73.9299)..(123.42,73.9299) + ..controls (119.82,73.9299) and (113.05,73.9299)..(113.05,73.9299) + --(111.25,82.9299)--(105.85,87.46)--(105.85,90.6299) + --cycle; +drawoptions (withcolor (0,0.4,1)); +fill (109.88,100.93)..controls (116.22,103.45) and (119.82,103.23)..(123.85,103.66) + ..controls (127.95,104.1) and (132.49,104.89)..(133.35,104.6) + --(138.75,102.8)--(136.02,99.6299)..controls (136.02,99.6299) and (138.25,93.2998)..(136.02,95.0999) + ..controls (133.78,96.8999) and (130.18,96.8999)..(127.02,97.3298) + ..controls (123.85,97.76) and (118.45,95.5298)..(121.18,95.5298) + ..controls (123.85,95.5298) and (131.98,95.5298)..(134.65,94.23) + --(139.18,91.9299)..controls (139.18,91.9299) and (112.18,91.9299)..(108.51,91.9299) + ..controls (104.91,91.9299) and (104.55,96.0298)..(106.78,96.0298) + ..controls (109.02,96.0298) and (115.78,98.7)..(115.78,98.7) + --(107.65,100.06)--(109.88,100.93)--cycle; +drawoptions (withcolor (0.6,0.3,0)); +fill (45.9399,128.07)..controls (45.9399,128.07) and (45.0798,122.6)..(45.9399,118.57) + ..controls (46.8799,114.54) and (45.9399,113.17)..(47.3098,110.43) + ..controls (48.6799,107.77) and (50.48,104.17)..(50.48,104.17) + --(54.9399,101.5)--(52.71,99.6299)--(47.74,99.6299) + --(43.21,103.3)--(41.9099,114.03)--(41.4099,123.1) + --(40.98,127.64)--(45.9399,128.07)--cycle; +fill (45.0798,95.1699)..controls (45.0798,95.1699) and (42.2698,98.7)..(41.4099,101.94) + ..controls (40.5398,105.1) and (38.74,111.37)..(38.74,114.97) + ..controls (38.74,118.57) and (38.74,128.07)..(38.74,128.07) + --(31.5398,124.04)..controls (31.5398,124.04) and (31.0398,119.5)..(31.5398,116.34) + ..controls (31.98,113.17) and (32.8398,108.2)..(33.3398,105.1) + ..controls (33.7798,101.94) and (34.21,100.57)..(34.21,97.8298) + ..controls (34.21,95.1699) and (39.6799,94.23)..(39.6799,94.23) + --(45.0798,95.1699)--cycle; +fill (27.9399,87.46)..controls (27.9399,87.46) and (27.5098,96.46)..(27.5098,99.2) + ..controls (27.5098,101.94) and (27.5098,113.17)..(27.5098,113.17) + --(27.0798,120.37)--(22.98,119.07)--(15.3398,123.61) + ..controls (15.3398,123.61) and (15.3398,113.6)..(15.3398,110.94) + ..controls (15.3398,108.2) and (15.7798,101.5)..(15.3398,96.97) + ..controls (14.9099,92.4299) and (15.7798,92)..(14.9099,88.8298) + ..controls (13.98,85.6599) and (21.1799,86.5298)..(21.1799,86.5298) + --(26.1399,85.23)--(27.9399,87.46)--cycle; +fill (1.37988,78.3899)--(15.3398,77.5298)..controls (15.3398,77.5298) and (14.8398,80.7)..(13.5398,83.3599) + ..controls (12.1799,86.0999) and (7.63989,86.96)..(6.77979,92.8599) + ..controls (5.83984,98.7698) and (4.53979,102.8)..(4.53979,107.77) + ..controls (4.53979,112.74) and (4.10986,127.21)..(4.10986,127.21) + --(1.37988,127.64)--(1.37988,78.3899)--cycle; +drawoptions (withcolor (0,0.75,1)); +fill (220.62,63.9199)--(217.45,58.5198)--(223.78,51.6799) + ..controls (223.78,51.6799) and (230.98,47.22)..(234.15,46.2798) + ..controls (237.32,45.3398) and (244.52,43.5398)..(244.52,43.5398) + --(257.12,43.5398)--(261.66,44.0498)--(267.42,42.6799) + --(266.55,36.3398)--(259.78,32.74)..controls (259.78,32.74) and (254.46,30.9399)..(248.98,32.74) + ..controls (243.58,34.5398) and (240.92,34.1099)..(236.38,34.98) + ..controls (231.85,35.9099) and (222.42,37.71)..(221.98,40.45) + ..controls (221.55,43.1099) and (219.32,49.0198)..(219.32,49.0198) + --(217.45,54.4199)--(218.38,62.5498)--(220.62,63.9199) + --cycle; +drawoptions (withcolor (0.6,0.3,0)); +fill (219.75,63.9199)--(235.02,63.9199)..controls (235.02,63.9199) and (238.18,63.9199)..(243.15,62.1199) + ..controls (248.12,60.3198) and (257.12,56.22)..(257.12,56.22) + --(262.09,51.25)--(266.98,48.5798)--(266.98,42.6799) + --(260.72,44.0498)--(246.32,41.74)--(231.42,46.7798) + --(222.42,52.1799)--(218.82,57.1499)--(219.75,63.9199) + --cycle; +drawoptions (withcolor (1,0.9,0)); +fill (223.78,55.7798)--(227.38,60.75)--(231.42,61.6899) + ..controls (231.42,61.6899) and (235.88,61.6899)..(238.62,61.26) + ..controls (241.35,60.75) and (245.38,59.3799)..(248.12,57.5798) + ..controls (250.78,55.7798) and (256.18,52.6199)..(256.18,52.6199) + --(254.89,48.5798)--(249.42,46.2798)--(243.58,48.0798) + --(237.75,53.0498)--(233.65,54.9199)--(223.78,55.7798) + --cycle; +drawoptions (withcolor (0.4,0.4,0.4)); +fill (221.34,54.4199)--(224.65,50.3799)..controls (224.65,50.3799) and (229.62,47.6499)..(232.35,46.7798) + ..controls (235.02,45.8499) and (240.56,44.6199)..(240.92,44.48) + --(246.75,42.25)--(251.29,48.0798)--(243.58,51.25) + --(236.02,54.4199)--(229.18,56.22)--(221.34,54.4199) + --cycle; +drawoptions (withcolor (0.8,0.8,0.8)); +fill (219.32,63.0598)--(219.32,58.0198)--(224.22,51.25) + ..controls (224.22,51.25) and (231.92,47.22)..(235.02,45.8499) + ..controls (238.18,44.48) and (243.15,43.1099)..(245.89,43.1099) + ..controls (248.55,43.1099) and (253.09,43.1099)..(255.75,43.1099) + ..controls (258.42,43.1099) and (262.02,44.0498)..(264.32,43.1099) + ..controls (266.55,42.25) and (267.42,40.45)..(267.42,40.45) + --(262.09,38.6499)..controls (262.09,38.6499) and (255.75,38.6499)..(251.65,38.6499) + ..controls (247.62,38.6499) and (240.92,39.51)..(237.32,40.45) + ..controls (233.65,41.3098) and (226.88,43.98)..(223.78,47.22) + ..controls (220.62,50.3799) and (218.38,53.98)..(218.38,53.98) + --(219.32,63.0598)--cycle; +drawoptions (withcolor (0.6,0.3,0)); +fill (271.45,52.8999)--(271.23,1.41992)--(266.34,1.41992) + --(266.41,54.2)..controls (266.41,54.2) and (272.17,53.1899)..(271.45,52.8999) + --cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0.86bp; +draw (271.45,52.8999)--(271.23,1.41992)--(266.34,1.41992) + --(266.41,54.2)..controls (266.41,54.2) and (272.17,53.1899)..(271.45,52.8999) + --cycle; +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (271.16,51.75)--(266.26,54.1299)--(266.26,50.8899) + --(271.16,48.9399)--(271.16,51.75)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (271.16,51.75)--(266.26,54.1299)--(266.26,50.8899) + --(271.16,48.9399)--(271.16,51.75); +drawoptions (withcolor (0.6,0.85,1)); +pickup pencircle scaled 0bp; +fill (121.98,48.0798)..controls (129.82,48.51) and (138.9,48.51)..(143.36,48.51) + ..controls (147.75,48.51) and (157.69,51.6799)..(163.52,49.0198) + ..controls (169.42,46.2798) and (168.99,44.0498)..(174.82,43.5398) + ..controls (180.66,43.1099) and (189.66,39.51)..(189.66,39.51) + ..controls (189.66,39.51) and (190.52,35.8398)..(193.26,34.0398) + ..controls (195.99,32.24) and (185.62,29.5)..(185.62,29.5) + --(173.89,35.8398)..controls (173.89,35.8398) and (156.32,40.8799)..(152.72,40.8799) + ..controls (149.12,40.8799) and (134.79,39.9399)..(134.79,39.9399) + ..controls (134.79,39.9399) and (130.69,34.47)..(140.19,34.0398) + ..controls (149.55,33.6099) and (157.69,30.9399)..(157.69,30.9399) + ..controls (157.69,30.9399) and (156.32,25.47)..(152.72,25.47) + ..controls (149.12,25.47) and (129.82,26.4099)..(125.36,26.4099) + ..controls (120.82,26.4099) and (103.62,28.21)..(108.51,30.9399) + ..controls (113.48,33.6099) and (116.79,41.3098)..(116.79,41.3098) + ..controls (116.79,41.3098) and (118.59,46.71)..(121.98,48.0798) + --cycle; +drawoptions (withcolor (1,1,1)); +fill (266.12,54.1299)--(271.3,51.46)--(276.7,52.6199) + --(273.68,54.99)--(266.12,54.1299)--cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0.86bp; +draw (266.12,54.1299)--(271.3,51.46)--(276.7,52.6199) + --(273.68,54.99)--(266.12,54.1299); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0bp; +fill (189.73,159.75)--(185.05,155.07)--(176.19,155.07) + --(181.09,159.75)--(189.73,159.75)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (189.73,159.75)--(185.05,155.07)--(176.19,155.07) + --(181.09,159.75)--(189.73,159.75); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0bp; +fill (191.24,121.45)..controls (191.24,118.71) and (191.24,115.54)..(191.24,113.89) + ..controls (191.24,112.16) and (191.6,109.35)..(191.24,107.91) + ..controls (190.81,106.54) and (190.38,105.46)..(190.38,105.46) + --(190.59,103.16)--(193.98,104.02)--(194.41,106.54) + ..controls (194.41,106.54) and (194.41,111.94)..(194.41,113.02) + ..controls (194.41,114.03) and (195.06,123.54)..(195.06,123.54) + --(191.24,121.45)--cycle; +pickup pencircle scaled 0.86bp; +draw (191.24,121.45)..controls (191.24,118.71) and (191.24,115.54)..(191.24,113.89) + ..controls (191.24,112.16) and (191.6,109.35)..(191.24,107.91) + ..controls (190.81,106.54) and (190.38,105.46)..(190.38,105.46) + --(190.59,103.16)--(193.98,104.02)--(194.41,106.54) + ..controls (194.41,106.54) and (194.41,111.94)..(194.41,113.02) + ..controls (194.41,114.03) and (195.06,123.54)..(195.06,123.54) + --(191.24,121.45); +pickup pencircle scaled 0bp; +fill (216.58,98.5498)..controls (216.58,100.21) and (216.15,99.3398)..(216.01,102.73) + ..controls (215.79,106.11) and (215.14,107.12)..(215.14,110.22) + ..controls (215.14,113.46) and (215.14,116.98)..(215.14,118.06) + ..controls (215.14,119.14) and (215.14,120.37)..(215.14,120.37) + --(212.19,119.36)..controls (212.19,119.36) and (212.19,118.71)..(212.19,116.98) + ..controls (212.19,115.33) and (212.19,113.17)..(212.19,111.3) + ..controls (212.19,109.42) and (212.19,109.5)..(212.19,106.98) + ..controls (212.19,104.46) and (212.05,101.94)..(212.05,101.94) + --(211.4,99.3398)--(213.27,98.7)--(216.58,98.5498) + --cycle; +pickup pencircle scaled 0.86bp; +draw (216.58,98.5498)..controls (216.58,100.21) and (216.15,99.3399)..(216.01,102.73) + ..controls (215.79,106.11) and (215.14,107.12)..(215.14,110.22) + ..controls (215.14,113.46) and (215.14,116.98)..(215.14,118.06) + ..controls (215.14,119.14) and (215.14,120.37)..(215.14,120.37) + --(212.19,119.36)..controls (212.19,119.36) and (212.19,118.71)..(212.19,116.98) + ..controls (212.19,115.33) and (212.19,113.17)..(212.19,111.3) + ..controls (212.19,109.42) and (212.19,109.5)..(212.19,106.98) + ..controls (212.19,104.46) and (212.05,101.94)..(212.05,101.94) + --(211.4,99.3399)--(213.27,98.6999)--(216.58,98.5498); +pickup pencircle scaled 0bp; +fill (184.54,108.78)--(184.54,114.46)--(183.46,116.19) + --(182.67,114.46)..controls (182.67,114.46) and (182.82,113.24)..(182.82,112.16) + ..controls (182.82,111.08) and (182.82,109.64)..(182.82,109.64) + --(184.54,108.78)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (184.54,108.78)--(184.54,114.46)--(183.46,116.19) + --(182.67,114.46)..controls (182.67,114.46) and (182.82,113.24)..(182.82,112.16) + ..controls (182.82,111.08) and (182.82,109.64)..(182.82,109.64) + --(184.54,108.78); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0bp; +fill (178.28,117.85)..controls (178.28,117.85) and (178.42,115.76)..(178.42,114.68) + ..controls (178.42,113.6) and (178.42,111.3)..(178.42,111.3) + --(176.98,109.64)--(176.98,113.46)--(176.98,116.55) + --(178.28,117.85)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (178.28,117.85)..controls (178.28,117.85) and (178.42,115.76)..(178.42,114.68) + ..controls (178.42,113.6) and (178.42,111.3)..(178.42,111.3) + --(176.98,109.64)--(176.98,113.46)--(176.98,116.55) + --(178.28,117.85); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0bp; +fill (180.51,109.21)..controls (180.51,109.21) and (180.3,109.5)..(180.51,112.16) + ..controls (180.73,114.9) and (180.73,117.85)..(180.73,117.85) + --(179.5,118.06)..controls (179.5,118.06) and (179.5,115.9)..(179.5,114.9) + ..controls (179.5,113.89) and (179.29,110.86)..(179.29,110.86) + --(179.5,108.99)--(180.51,109.21)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (180.51,109.21)..controls (180.51,109.21) and (180.3,109.5)..(180.51,112.16) + ..controls (180.73,114.9) and (180.73,117.85)..(180.73,117.85) + --(179.5,118.06)..controls (179.5,118.06) and (179.5,115.9)..(179.5,114.9) + ..controls (179.5,113.89) and (179.29,110.86)..(179.29,110.86) + --(179.5,108.99)--(180.51,109.21); +drawoptions (withcolor (0,0.5,0)); +pickup pencircle scaled 0bp; +fill (192.46,150.97)..controls (185.55,150.54) and (182.6,151.98)..(182.38,148.88) + ..controls (182.24,145.71) and (184.54,150.97)..(185.34,145.28) + ..controls (186.2,139.59) and (186.85,138.51)..(186.85,136.21) + ..controls (186.85,133.9) and (188.86,133.9)..(189.3,136.42) + ..controls (189.73,138.94) and (190.02,140.89)..(192.1,142.11) + ..controls (194.19,143.41) and (195.06,146.94)..(191.46,146.5) + ..controls (187.86,146.14) and (190.59,149.89)..(190.59,149.89) + --(192.46,150.97)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (221.77,159.61)--(227.17,163.06)--(226.52,146.65) + --(222.42,145.93)--(221.77,159.61); +draw (207.8,155.43)--(205.28,153.92)--(205.28,149.1); +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 1.44bp; +draw (204.63,125.48)--(204.63,118.28)--(209.24,117.63); +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (224,160.9)--(224.14,148.88); +draw (222.06,154.78)--(226.88,157.09); +draw (216.01,151.62)--(215.79,145.71); +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 1.44bp; +draw (223.5,130.52)--(227.96,130.52)--(228.18,124.4); +draw (222.7,118.28)--(222.7,115.76)--(228.39,115.11); +draw (222.27,123.32)--(227.53,123.18); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (240.42,126.27)--(236.82,126.7)--(236.82,113.17) + --(241.35,113.17)--(240.42,126.27)--cycle; +drawoptions (withcolor (0.5,0.5,0.5)); +pickup pencircle scaled 0.22bp; +draw (240.42,126.27)--(236.82,126.7)--(236.82,113.17) + --(241.35,113.17)--(240.42,126.27); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (246.75,126.7)--(242.65,126.7)--(243.58,112.23) + --(248.12,111.8)--(248.55,119.07)--(246.75,126.7) + --cycle; +drawoptions (withcolor (0.5,0.5,0.5)); +pickup pencircle scaled 0.22bp; +draw (246.75,126.7)--(242.65,126.7)--(243.58,112.23) + --(248.12,111.8)--(248.55,119.07)--(246.75,126.7); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (258.7,119.79)--(258.7,111.66)--(262.74,111.66) + --(263.24,123.82)--(258.27,122.96)--(258.7,119.79) + --cycle; +drawoptions (withcolor (0.5,0.5,0.5)); +pickup pencircle scaled 0.22bp; +draw (258.7,119.79)--(258.7,111.66)--(262.74,111.66) + --(263.24,123.82)--(258.27,122.96)--(258.7,119.79); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (269.36,126.49)--(264.82,126.49)--(265.33,110.22) + --(270.73,110.22)--(269.36,126.49)--cycle; +drawoptions (withcolor (0.5,0.5,0.5)); +pickup pencircle scaled 0.22bp; +draw (269.36,126.49)--(264.82,126.49)--(265.33,110.22) + --(270.73,110.22)--(269.36,126.49); +drawoptions (withcolor (1,0.8,0.8)); +pickup pencircle scaled 0bp; +fill (273.32,101.5)--(285.92,98.26)--(285.92,156.58) + --(273.32,145.28)--(273.32,101.5)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (273.32,101.5)--(285.92,98.26)--(285.92,156.58) + --(273.32,145.28)--(273.32,101.5); +drawoptions (withcolor (0.95,0.95,0.95)); +pickup pencircle scaled 0bp; +fill (277.86,125.41)--(276.92,109.57)--(285.92,107.77) + --(285.49,123.61)--(277.86,125.41)--cycle; +drawoptions (withcolor (0.6,0.6,0.6)); +pickup pencircle scaled 1.44bp; +draw (277.86,125.41)--(276.92,109.57)--(285.92,107.77) + --(285.49,123.61)--(277.86,125.41); +drawoptions (withcolor (0.9,0.9,0.9)); +pickup pencircle scaled 0bp; +fill (278.29,125.84)--(285.49,123.61)--(285.92,131.24) + --(278.29,132.18)--(278.29,125.84)--cycle; +drawoptions (withcolor (0.6,0.6,0.6)); +pickup pencircle scaled 1.44bp; +draw (278.29,125.84)--(285.49,123.61)--(285.92,131.24) + --(278.29,132.18)--(278.29,125.84); +pickup pencircle scaled 0.86bp; +draw (237.32,121.3)--(240.42,121.3); +drawoptions (withcolor (0.5,0.5,0.5)); +draw (243.15,121.3)--(248.12,120.87); +draw (259.35,120.37)--(262.52,119.94); +draw (265.69,121.3)--(269.22,120.87); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0bp; +fill (166.04,101.86)..controls (167.12,101.94) and (168.2,101.94)..(169.35,101.94) + ..controls (170.43,101.94) and (171.51,101.94)..(172.74,101.86) + ..controls (172.66,97.5398) and (172.66,93.1499)..(172.66,88.76) + ..controls (172.66,84.3699) and (172.66,79.98)..(172.74,75.5798) + ..controls (171.51,76.0898) and (170.43,76.5898)..(169.35,77.0198) + ..controls (168.27,77.46) and (167.12,77.96)..(166.04,78.3198) + ..controls (166.04,82.2798) and (166.04,86.1699)..(166.04,90.1299) + ..controls (166.04,94.0198) and (166.04,97.98)..(166.04,101.86) + --cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0.86bp; +draw (166.04,101.86)..controls (167.12,101.94) and (168.2,101.94)..(169.35,101.94) + ..controls (170.43,101.94) and (171.51,101.94)..(172.74,101.86) + ..controls (172.66,97.5398) and (172.66,93.1499)..(172.66,88.76) + ..controls (172.66,84.3699) and (172.66,79.98)..(172.74,75.5798) + ..controls (171.51,76.0899) and (170.43,76.5898)..(169.35,77.0198) + ..controls (168.27,77.4599) and (167.12,77.9599)..(166.04,78.3198) + ..controls (166.04,82.2798) and (166.04,86.1699)..(166.04,90.1299) + ..controls (166.04,94.0198) and (166.04,97.98)..(166.04,101.86) + --cycle; +drawoptions (withcolor (0,0.6,0)); +pickup pencircle scaled 0bp; +fill (25.21,151.54)..controls (35.4299,157.66) and (33.3398,161.05)..(32.7,169.33) + ..controls (32.0498,177.54) and (29.3098,183.01)..(30.6799,189.13) + ..controls (32.0498,195.32) and (25.9299,187.04)..(23.8398,181.57) + ..controls (21.8198,176.17) and (13.6199,171.34)..(13.6199,171.34) + ..controls (13.6199,171.34) and (5.47998,167.89)..(8.85986,179.55) + ..controls (12.25,191.22) and (5.47998,189.78)..(5.47998,185.02) + ..controls (5.47998,180.27) and (3.38989,170.62)..(5.47998,164.5) + ..controls (7.5,158.38) and (12.3198,157.66)..(12.97,161.05) + ..controls (13.6199,164.5) and (17.0698,159.68)..(17.0698,152.19) + ..controls (17.0698,144.7) and (25.21,151.54)..(25.21,151.54) + --cycle; +fill (38.8198,143.98)..controls (44.2898,150.18) and (44.2898,155)..(44.2898,159.75) + ..controls (44.2898,164.5) and (43.5698,178.18)..(46.2998,174.73) + ..controls (49.0398,171.34) and (53.7898,163.86)..(53.7898,158.38) + ..controls (53.7898,152.91) and (46.3799,148.09)..(51.1299,143.98) + ..controls (55.8799,139.88) and (59.2598,136.5)..(50.4099,136.5) + ..controls (41.5498,136.5) and (34.0598,134.41)..(34.0598,134.41) + --(38.8198,143.98)--cycle; +drawoptions (withcolor (0,0.8,0)); +fill (254.6,137.86)..controls (254.6,145.42) and (251.14,148.16)..(254.6,155) + ..controls (257.98,161.84) and (261.44,170.7)..(261.44,170.7) + ..controls (261.44,170.7) and (262.74,170.7)..(262.74,165.94) + ..controls (262.74,161.12) and (268.93,156.3)..(268.93,156.3) + --(269.58,149.46)--(262.09,141.97)..controls (262.09,141.97) and (262.09,139.23)..(262.09,134.48) + ..controls (262.09,129.66) and (254.6,137.86)..(254.6,137.86) + --cycle; +drawoptions (withcolor (0.95,0.95,0.95)); +fill (80.3599,197.34)..controls (117.8,197.34) and (98.0698,202.81)..(123.92,202.81) + ..controls (149.77,202.81) and (150.42,203.53)..(162.66,200.79) + ..controls (174.97,198.06) and (174.25,195.25)..(185.84,193.23) + ..controls (197.43,191.22) and (206.29,189.78)..(204.92,185.02) + ..controls (203.55,180.27) and (180.44,174.15)..(174.97,176.82) + ..controls (169.5,179.55) and (155.17,184.38)..(150.42,184.38) + ..controls (145.66,184.38) and (110.31,192.58)..(110.31,192.58) + ..controls (110.31,192.58) and (102.82,188.41)..(115.14,185.74) + ..controls (127.38,183.01) and (154.52,178.9)..(142.28,172.71) + ..controls (130.04,166.52) and (115.78,176.17)..(106.93,176.17) + ..controls (98.0698,176.17) and (85.1799,176.82)..(78.99,179.55) + ..controls (72.8699,182.29) and (61.2798,190.5)..(54.5098,193.95) + ..controls (47.6699,197.34) and (49.6899,205.54)..(59.2598,204.18) + ..controls (68.7698,202.81) and (80.3599,197.34)..(80.3599,197.34) + --cycle; +drawoptions (withcolor (1,0.4,0)); +fill (14.3398,40.8098)..controls (21.8198,45.5598) and (32.7,53.0498)..(34.7798,56.5) + ..controls (36.7998,59.8899) and (37.45,49.6599)..(37.45,49.6599) + --(45.6599,57.1499)--(45.6599,47.6499)..controls (45.6599,47.6499) and (42.2,42.8198)..(39.5398,38) + ..controls (36.7998,33.25) and (22.47,18.2)..(22.47,18.2) + --(19.8098,25.0398)--(25.21,34.6199)--(23.8398,41.46) + --(12.25,35.26)--(14.3398,40.8098)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +fill (257.98,96.1799)--(278.43,94.8098)--(264.18,92.72) + --(255.25,92.72)--(257.98,96.1799)--cycle; +drawoptions (withcolor (0.4,0.4,0.4)); +fill (215.14,102.37)..controls (215.14,102.37) and (217.16,100.28)..(220.54,100.28) + ..controls (224,100.28) and (230.77,99.5598)..(230.77,99.5598) + --(227.31,98.1899)--(215.79,97.5398)--(215.14,102.37) + --cycle; +fill (193.98,104.38)--(204.92,104.38)--(203.55,100.93) + --(193.33,102.37)--(193.98,104.38)--cycle; +drawoptions (withcolor (0,0.5,1)); +fill (266.12,11.8599)..controls (260.65,15.25) and (251.79,18.7)..(246.32,18.7) + ..controls (240.85,18.7) and (239.48,17.3398)..(230.62,17.3398) + ..controls (221.7,17.3398) and (212.91,15.97)..(206.07,17.3398) + ..controls (199.23,18.7) and (191.74,16.6199)..(186.92,16.6199) + ..controls (182.17,16.6199) and (183.54,11.1399)..(178.06,10.5) + ..controls (172.59,9.77979) and (171.94,5.66992)..(167.84,5.66992) + ..controls (163.74,5.66992) and (159.06,0.849854)..(168.49,0.849854) + ..controls (177.92,0.849854) and (266.12,0.699951)..(266.12,1.41992) + --(266.12,11.8599)--cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (1.01978,215.34)--(286.28,215.34)--(286.28,0.849854) + --(1.01978,0.849854)--(1.01978,215.34); +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (286.28,31.6599)--(280.81,35.8398)--(277.42,35.8398) + --(277.42,31.6599)--(286.28,31.6599)--cycle; +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 0.86bp; +draw (286.28,31.6599)--(280.81,35.8398)--(277.42,35.8398) + --(277.42,31.6599)--(286.28,31.6599); +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 2.81bp; +draw (69.2698,192.73)..controls (74.74,190.71) and (75.46,185.89)..(75.46,185.89) + --(81.5798,185.24); +draw (62.1399,178.62)..controls (67.5398,176.6) and (69.7,176.89)..(69.7,176.89) + --(72.4399,180.27); +draw (52.3499,196.11)..controls (57.8198,194.02) and (58.47,189.27)..(58.47,189.27) + --(61.21,192.66); +drawoptions (withcolor (0,0,0)); +pickup pencircle scaled 2.23bp; +draw (173.17,30.73)..controls (173.17,29.72) and (173.38,28.5)..(173.38,28.5) + --(175.18,29.0698); +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0bp; +fill (168.99,32.74)..controls (170.5,34.3999) and (171.51,33.1799)..(172.88,32.5298) + ..controls (174.25,31.8799) and (175.98,32.3098)..(175.11,31.23) + ..controls (174.32,30.22) and (168.56,29.3599)..(168.56,29.6499) + --(168.63,30.9399)--(168.13,31.6599)--(168.99,32.74) + --cycle; +pickup pencircle scaled 2.23bp; +draw (173.24,32.3098)..controls (173.24,33.3198) and (173.46,34.5398)..(173.46,34.5398) + --(175.33,33.97); +drawoptions (withcolor (0,0,0)); +draw (184.33,24.3899)..controls (184.33,23.3799) and (184.54,22.1599)..(184.54,22.1599) + --(186.42,22.8098); +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0bp; +fill (180.22,26.4099)..controls (181.74,28.0598) and (182.67,26.8398)..(184.04,26.1899) + ..controls (185.41,25.5398) and (187.14,25.98)..(186.34,24.97) + ..controls (185.55,23.8899) and (179.72,23.0198)..(179.72,23.3098) + --(179.86,24.6099)--(179.29,25.3999)--(180.22,26.4099) + --cycle; +pickup pencircle scaled 2.23bp; +draw (184.47,25.98)..controls (184.47,26.98) and (184.69,28.21)..(184.69,28.21) + --(186.56,27.6299); +drawoptions (withcolor (0,0,0)); +draw (195.7,34.8298)..controls (195.7,33.75) and (195.92,32.5298)..(195.92,32.5298) + --(197.79,33.1799); +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0bp; +fill (191.6,36.7798)..controls (193.04,38.5) and (194.05,37.2798)..(195.42,36.6299) + ..controls (196.78,35.9099) and (198.51,36.3398)..(197.72,35.3398) + ..controls (196.86,34.3298) and (191.1,33.46)..(191.1,33.6799) + --(191.24,35.0498)--(190.66,35.7698)--(191.6,36.7798) + --cycle; +pickup pencircle scaled 2.23bp; +draw (195.85,36.3398)..controls (195.85,37.4199) and (196.06,38.6499)..(196.06,38.6499) + --(197.94,38); +drawoptions (withcolor (0,0,0)); +draw (198.44,26.26)..controls (198.44,25.1799) and (198.66,23.96)..(198.66,23.96) + --(200.53,24.6099); +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0bp; +fill (194.34,28.21)..controls (195.85,29.9399) and (196.78,28.71)..(198.15,28.0598) + ..controls (199.52,27.3398) and (201.25,27.7798)..(200.46,26.7698) + ..controls (199.66,25.76) and (193.83,24.8999)..(193.83,25.1099) + --(193.98,26.48)--(193.4,27.2)--(194.34,28.21) + --cycle; +pickup pencircle scaled 2.23bp; +draw (198.58,27.7798)..controls (198.58,28.8599) and (198.8,30.0798)..(198.8,30.0798) + --(200.67,29.4299); +drawoptions (withcolor (0,0,0)); +draw (157.47,21.0798)..controls (157.47,20) and (157.76,18.7798)..(157.76,18.7798) + --(159.56,19.4199); +drawoptions (withcolor (0.2,0.2,0.2)); +pickup pencircle scaled 0bp; +fill (153.37,23.0198)..controls (154.88,24.75) and (155.82,23.5298)..(157.18,22.8799) + ..controls (158.62,22.1599) and (160.35,22.5898)..(159.49,21.5798) + ..controls (158.7,20.5798) and (152.86,19.71)..(152.86,19.9299) + --(153.01,21.2998)--(152.43,22.0198)--(153.37,23.0198) + --cycle; +pickup pencircle scaled 2.23bp; +draw (157.62,22.5899)..controls (157.62,23.6699) and (157.83,24.8999)..(157.83,24.8999) + --(159.7,24.25); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0.86bp; +draw (114.85,113.6)--(114.85,109.71); +draw (124.64,113.6)--(124.64,109.28); +draw (135.01,113.46)--(135.01,109.93); +draw (144.08,113.46)--(144.08,110.07); +pickup pencircle scaled 0bp; +fill (191.38,89.98)--(212.55,83.7898)--(212.55,78.3198) + --(219.39,72.1299)--(218.02,67.3799)--(204.34,74.22) + --(205.06,80.3398)--(192.1,85.8799)--(191.38,89.98) + --cycle; +fill (275.98,73.5)--(263.02,76.95)--(258.27,71.48) + --(250.06,72.8499)--(248.7,67.3799)--(261.01,65.2898) + --(267.13,71.48)--(275.98,68.0999)--(275.98,73.5) + --cycle; +drawoptions (withcolor (0.4,0.4,0.4)); +pickup pencircle scaled 0.86bp; +draw (69.2698,75.5798)--(75.46,76.95); +drawoptions (withcolor (0.3,0.3,0.3)); +draw (98.8599,77.6699)--(105.92,76.5198); +drawoptions (withcolor (0.5,0.5,0.5)); +draw (72.9399,74.1399)--(76.3999,74.6499); +drawoptions (withcolor (0.4,0.4,0.4)); +draw (101.17,75.4399)--(105.63,74.5); +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0bp; +fill (15.0598,62.3398)--(16.5698,62.3398)..controls (17.0698,62.3398) and (17.4299,62.7)..(17.4299,63.2) + --(17.4299,67.8799)..controls (17.4299,68.3799) and (17.0698,68.74)..(16.5698,68.74) + --(15.0598,68.74)..controls (14.5498,68.74) and (14.1899,68.3799)..(14.1899,67.8799) + --(14.1899,63.2)..controls (14.1899,62.7) and (14.5498,62.3398)..(15.0598,62.3398) + --cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (15.0598,62.3399)--(16.5698,62.3399)..controls (17.0698,62.3399) and (17.4299,62.7)..(17.4299,63.2) + --(17.4299,67.8799)..controls (17.4299,68.3799) and (17.0698,68.74)..(16.5698,68.74) + --(15.0598,68.74)..controls (14.5498,68.74) and (14.1899,68.3799)..(14.1899,67.8799) + --(14.1899,63.2)..controls (14.1899,62.7) and (14.5498,62.3399)..(15.0598,62.3399) + --cycle; +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (13.3298,70.1099)--(18.0098,70.1099)..controls (18.5798,70.1099) and (19.0198,69.6799)..(19.0198,69.1799) + --(19.0198,67.95)..controls (19.0198,67.45) and (18.5798,67.0198)..(18.0098,67.0198) + --(13.3298,67.0198)..controls (12.75,67.0198) and (12.3198,67.45)..(12.3198,67.95) + --(12.3198,69.1799)..controls (12.3198,69.6799) and (12.75,70.1099)..(13.3298,70.1099) + --cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 1.44bp; +draw (13.3298,70.1098)--(18.0098,70.1098)..controls (18.5798,70.1098) and (19.0198,69.6799)..(19.0198,69.1799) + --(19.0198,67.9499)..controls (19.0198,67.45) and (18.5798,67.0198)..(18.0098,67.0198) + --(13.3298,67.0198)..controls (12.75,67.0198) and (12.3198,67.45)..(12.3198,67.9499) + --(12.3198,69.1799)..controls (12.3198,69.6799) and (12.75,70.1098)..(13.3298,70.1098) + --cycle; +drawoptions (withcolor (0.9,0.95,1)); +pickup pencircle scaled 0bp; +fill (62.3599,49.45)--(63.22,49.45)..controls (63.5098,49.45) and (63.73,49.6599)..(63.73,49.95) + --(63.73,52.76)..controls (63.73,53.0498) and (63.5098,53.26)..(63.22,53.26) + --(62.3599,53.26)..controls (62,53.26) and (61.8599,53.0498)..(61.8599,52.76) + --(61.8599,49.95)..controls (61.8599,49.6599) and (62,49.45)..(62.3599,49.45) + --cycle; +drawoptions (withcolor (0,0.2,1)); +pickup pencircle scaled 0.86bp; +draw (62.3599,49.45)--(63.22,49.45)..controls (63.5098,49.45) and (63.73,49.6599)..(63.73,49.95) + --(63.73,52.76)..controls (63.73,53.0498) and (63.5098,53.26)..(63.22,53.26) + --(62.3599,53.26)..controls (62,53.26) and (61.8599,53.0498)..(61.8599,52.76) + --(61.8599,49.95)..controls (61.8599,49.6599) and (62,49.45)..(62.3599,49.45) + --cycle; +drawoptions (withcolor (0.9,0.95,1)); +pickup pencircle scaled 0bp; +fill (61.3499,54.0598)--(64.0898,54.0598)..controls (64.3799,54.0598) and (64.6599,53.8398)..(64.6599,53.48) + --(64.6599,52.8298)..controls (64.6599,52.47) and (64.3799,52.1799)..(64.0898,52.1799) + --(61.3499,52.1799)..controls (60.99,52.1799) and (60.7,52.47)..(60.7,52.8298) + --(60.7,53.48)..controls (60.7,53.8398) and (60.99,54.0598)..(61.3499,54.0598) + --cycle; +drawoptions (withcolor (0,0.2,1)); +pickup pencircle scaled 1.44bp; +draw (61.3499,54.0598)--(64.0899,54.0598)..controls (64.3799,54.0598) and (64.6599,53.8398)..(64.6599,53.48) + --(64.6599,52.8298)..controls (64.6599,52.47) and (64.3799,52.1799)..(64.0899,52.1799) + --(61.3499,52.1799)..controls (60.99,52.1799) and (60.7,52.47)..(60.7,52.8298) + --(60.7,53.48)..controls (60.7,53.8398) and (60.99,54.0598)..(61.3499,54.0598) + --cycle; +drawoptions (withcolor (0.9,0.95,1)); +pickup pencircle scaled 0bp; +fill (118.74,51.46)--(119.6,51.46)..controls (119.89,51.46) and (120.1,51.6099)..(120.1,51.97) + --(120.1,54.7)..controls (120.1,54.99) and (119.89,55.21)..(119.6,55.21) + --(118.74,55.21)..controls (118.38,55.21) and (118.23,54.99)..(118.23,54.7) + --(118.23,51.97)..controls (118.23,51.6099) and (118.38,51.46)..(118.74,51.46) + --cycle; +drawoptions (withcolor (0,0.2,1)); +pickup pencircle scaled 0.86bp; +draw (118.74,51.46)--(119.6,51.46)..controls (119.89,51.46) and (120.1,51.6098)..(120.1,51.97) + --(120.1,54.7)..controls (120.1,54.99) and (119.89,55.21)..(119.6,55.21) + --(118.74,55.21)..controls (118.38,55.21) and (118.23,54.99)..(118.23,54.7) + --(118.23,51.97)..controls (118.23,51.6098) and (118.38,51.46)..(118.74,51.46) + --cycle; +drawoptions (withcolor (0.9,0.95,1)); +pickup pencircle scaled 0bp; +fill (117.73,56)--(120.46,56)..controls (120.75,56) and (120.97,55.7798)..(120.97,55.4199) + --(120.97,54.7798)..controls (120.97,54.49) and (120.75,54.2)..(120.46,54.2) + --(117.73,54.2)..controls (117.37,54.2) and (117.08,54.49)..(117.08,54.7798) + --(117.08,55.4199)..controls (117.08,55.7798) and (117.37,56)..(117.73,56) + --cycle; +drawoptions (withcolor (0,0.2,1)); +pickup pencircle scaled 1.44bp; +draw (117.73,56)--(120.46,56)..controls (120.75,56) and (120.97,55.7798)..(120.97,55.4199) + --(120.97,54.7798)..controls (120.97,54.49) and (120.75,54.2)..(120.46,54.2) + --(117.73,54.2)..controls (117.37,54.2) and (117.08,54.49)..(117.08,54.7798) + --(117.08,55.4199)..controls (117.08,55.7798) and (117.37,56)..(117.73,56) + --cycle; +drawoptions (withcolor (0.6,0.3,0)); +pickup pencircle scaled 0bp; +fill (51.7,90.3398)--(52.7798,90.3398)..controls (53.1399,90.3398) and (53.3599,90.6299)..(53.3599,90.99) + --(53.3599,94.2998)..controls (53.3599,94.6599) and (53.1399,94.8799)..(52.7798,94.8799) + --(51.7,94.8799)..controls (51.3398,94.8799) and (51.1299,94.6599)..(51.1299,94.2998) + --(51.1299,90.99)..controls (51.1299,90.6299) and (51.3398,90.3398)..(51.7,90.3398) + --cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 0.86bp; +draw (51.7,90.3399)--(52.7798,90.3399)..controls (53.1399,90.3399) and (53.3599,90.6299)..(53.3599,90.99) + --(53.3599,94.2998)..controls (53.3599,94.6599) and (53.1399,94.8799)..(52.7798,94.8799) + --(51.7,94.8799)..controls (51.3398,94.8799) and (51.1299,94.6599)..(51.1299,94.2998) + --(51.1299,90.99)..controls (51.1299,90.6299) and (51.3398,90.3399)..(51.7,90.3399) + --cycle; +drawoptions (withcolor (1,1,1)); +pickup pencircle scaled 0bp; +fill (50.48,95.8899)--(53.7898,95.8899)..controls (54.22,95.8899) and (54.5098,95.5999)..(54.5098,95.24) + --(54.5098,94.3799)..controls (54.5098,93.9399) and (54.22,93.6599)..(53.7898,93.6599) + --(50.48,93.6599)..controls (50.1199,93.6599) and (49.8298,93.9399)..(49.8298,94.3799) + --(49.8298,95.24)..controls (49.8298,95.5999) and (50.1199,95.8899)..(50.48,95.8899) + --cycle; +drawoptions (withcolor (0.3,0.3,0.3)); +pickup pencircle scaled 1.44bp; +draw (50.48,95.8899)--(53.7898,95.8899)..controls (54.22,95.8899) and (54.5098,95.5998)..(54.5098,95.24) + --(54.5098,94.3799)..controls (54.5098,93.9399) and (54.22,93.6599)..(53.7898,93.6599) + --(50.48,93.6599)..controls (50.1199,93.6599) and (49.8298,93.9399)..(49.8298,94.3799) + --(49.8298,95.24)..controls (49.8298,95.5998) and (50.1199,95.8899)..(50.48,95.8899) + --cycle; +drawoptions (withcolor (0.2,0.2,0.2)); +draw (53,92.6499)..controls (53,88.8298) and (55.2998,80.4099)..(57.5398,76.8799) + ..controls (59.7698,73.3498) and (63.5798,67.8799)..(63.5798,67.8799); +pickup pencircle scaled 2.02bp; +draw (63.1499,52.26)..controls (63.1499,52.26) and (57.0298,49.5198)..(41.98,52.98) + ..controls (26.9399,56.3599) and (16.8599,66.01)..(15.8498,66.2998); +drawoptions (withcolor (0.9,0,0)); +pickup pencircle scaled 0bp; +fill (87.7,123.46)--(94.5398,123.46)--(94.5398,113.89) + --(87.7,113.89)--(87.7,123.46)--cycle; +endfig; +end + diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-00.pdf b/doc/context/sources/general/manuals/start/graphics/ma-cb-00.pdf Binary files differnew file mode 100644 index 000000000..118276b5d --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-00.pdf diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-01.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-01.png Binary files differnew file mode 100644 index 000000000..be41b9e22 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-01.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-03.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-03.png Binary files differnew file mode 100644 index 000000000..2a0b2de58 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-03.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-04.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-04.png Binary files differnew file mode 100644 index 000000000..5487062fd --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-04.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-07.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-07.png Binary files differnew file mode 100644 index 000000000..e69c2877f --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-07.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-08.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-08.png Binary files differnew file mode 100644 index 000000000..e49426e89 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-08.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-12.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-12.png Binary files differnew file mode 100644 index 000000000..f27252027 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-12.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-13.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-13.png Binary files differnew file mode 100644 index 000000000..9e8d72e6c --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-13.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-15.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-15.png Binary files differnew file mode 100644 index 000000000..8c7ed6ae7 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-15.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-16.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-16.png Binary files differnew file mode 100644 index 000000000..e22eab8dc --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-16.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-18.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-18.png Binary files differnew file mode 100644 index 000000000..25a529b33 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-18.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-19.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-19.png Binary files differnew file mode 100644 index 000000000..d1af184c4 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-19.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-20.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-20.png Binary files differnew file mode 100644 index 000000000..289738886 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-20.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-21.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-21.png Binary files differnew file mode 100644 index 000000000..af876a546 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-21.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-22.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-22.png Binary files differnew file mode 100644 index 000000000..55ded4c35 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-22.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-23.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-23.png Binary files differnew file mode 100644 index 000000000..9a1bf14e8 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-23.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-24.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-24.png Binary files differnew file mode 100644 index 000000000..47b4409e0 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-24.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-25.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-25.png Binary files differnew file mode 100644 index 000000000..079b8556a --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-25.png diff --git a/doc/context/sources/general/manuals/start/graphics/ma-cb-26.png b/doc/context/sources/general/manuals/start/graphics/ma-cb-26.png Binary files differnew file mode 100644 index 000000000..f4294dc57 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/ma-cb-26.png diff --git a/doc/context/sources/general/manuals/start/graphics/minibook-en.pdf b/doc/context/sources/general/manuals/start/graphics/minibook-en.pdf Binary files differnew file mode 100644 index 000000000..a75e7e491 --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/minibook-en.pdf diff --git a/doc/context/sources/general/manuals/start/graphics/minibook-en.tex b/doc/context/sources/general/manuals/start/graphics/minibook-en.tex new file mode 100644 index 000000000..1bde2de3c --- /dev/null +++ b/doc/context/sources/general/manuals/start/graphics/minibook-en.tex @@ -0,0 +1,20 @@ +\setuppapersize[A10][A10] +\setuplayout[cutspace=2mm,backspace=6mm,width=15mm] +\setupbodyfont[6pt] +\setuppagenumbering[state=stop] +\setupbackgrounds[text][text][background=color,backgroundcolor=orange] +\setupbackgrounds[header,text,footer][leftmargin][background=color,backgroundcolor=lightgreen] +\setupbackgrounds[header,text,footer][leftmargin,text,rightmargin][frame=on] +\setupfootertexts[margin][\midaligned{l}][\midaligned{r}][\midaligned{r}][\midaligned{l}] +\starttext +\midaligned{design page} \page +\setuppagenumbering[alternative={singlesided}] +\inmargin{\midaligned{m}}\midaligned{left page} \page +\inmargin{\midaligned{m}}\midaligned{right page} \page +\setuppagenumbering[alternative={singlesided,doublesided}] +\inmargin{\midaligned{m}}\midaligned{left page} \page +\inmargin{\midaligned{m}}\midaligned{right page} \page +\setuppagenumbering[alternative={doublesided}] +\inmargin{\midaligned{m}}\midaligned{left page} \page +\inmargin{\midaligned{m}}\midaligned{right page} +\stoptext diff --git a/doc/context/sources/general/manuals/start/ma-cb-abbreviations.tex b/doc/context/sources/general/manuals/start/ma-cb-abbreviations.tex new file mode 100644 index 000000000..1f5f10744 --- /dev/null +++ b/doc/context/sources/general/manuals/start/ma-cb-abbreviations.tex @@ -0,0 +1,7 @@ +\startenvironment ma-cb-abbreviations + +% a weird one: (\keycap) ... volledige lijst maken ... symbol + +\logo [Enter] {\type{Enter}} + +\stopenvironment diff --git a/doc/context/sources/general/manuals/start/ma-cb-colofon.tex b/doc/context/sources/general/manuals/start/ma-cb-colofon.tex new file mode 100644 index 000000000..feb77726a --- /dev/null +++ b/doc/context/sources/general/manuals/start/ma-cb-colofon.tex @@ -0,0 +1,95 @@ +\startcomponent ma-cb-colophon + +\unprotect + +\startmakeup[\v!standard] + + % This reference is needed for the interactive version. + + \pagereference[colofon] + + % We align the text in the middle. + + \setupalign + [\v!middle] + + % We use the default \framed macro but add a background. For most + % texts an offset of 20pt is adequate. + + \defineframed + [colofon] + [\c!frame=\v!off, + \c!background=basic-shape-dark, + \c!rulethickness=10pt, + \c!align=\v!middle, + \c!offset=15pt] + + \bfa \setupinterlinespace + + \doifsomething {\documentvariable{author}} { + + \dontleavehmode \startframed[colofon] + \labeltext{document:author}:\space + \documentvariable{author} + \stopframed + + \vfill + + } + + \doifsomething {\documentvariable{translator}} { + + \dontleavehmode \startframed[colofon] + \labeltext{document:translations}:\space + \documentvariable{translator} + \stopframed + + \vfill + + } + + \doifsomething {\documentvariable{contributer}} { + + \dontleavehmode \startframed[colofon] + \labeltext{document:contributions}:\space + \documentvariable{contributer} + \stopframed + + \vfill + + } + + \dontleavehmode \startframed[colofon] + \labeltext{document:design}:\space + Hans Hagen + \stopframed + + \vfill + + \dontleavehmode \startframed[colofon] + \labeltext{document:illustrations}:\space + Johan Jonker + \stopframed + + \vfill + + \dontleavehmode \startframed[colofon][offset=25pt] + PRAGMA ADE\\ + Ridderstraat 27\\ + 8061GH Hasselt NL\\ + www.pragma-ade.com + \stopframed + + \vfill + + \dontleavehmode \startframed[colofon] + \currentdate + \stopframed + + \vfill + +\stopmakeup + +\protect + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/ma-cb-copyright.tex b/doc/context/sources/general/manuals/start/ma-cb-copyright.tex new file mode 100644 index 000000000..abb344eef --- /dev/null +++ b/doc/context/sources/general/manuals/start/ma-cb-copyright.tex @@ -0,0 +1,41 @@ +\startcomponent ma-cb-copyright + +% The copyright page. English it is and english it will be. + +\unprotect + +\page + [\v!right] + +\startmakeup[\v!standard] + + \switchtobodyfont + [\v!small] + + \setupframed + [\c!frame=\v!off, + \c!width=.8\textwidth, + \c!align=\v!normal, + \c!background=basic-shape-dark, + \c!rulethickness=10pt, + \c!offset=30pt] + + \vfill + + \hfill \startframed + This document is produced with \CONTEXT\ \MKIV\ and \LUATEX. The source is edited + with \SCITE\ and previewed with \SUMATRAPDF. + \stopframed + + \blank[3*\v!big] + + \hfill \startframed + \copyright\ 1991\endash\currentdate[\v!year]\ PRAGMA ADE, Ridderstraat 27, 8061GH + Hasselt, The Netherlands, www.pragma-ade.com + \stopframed + +\stopmakeup + +\protect + +\stopcomponent diff --git a/doc/context/sources/general/manuals/start/ma-cb-graphics.tex b/doc/context/sources/general/manuals/start/ma-cb-graphics.tex new file mode 100644 index 000000000..bb85c0031 --- /dev/null +++ b/doc/context/sources/general/manuals/start/ma-cb-graphics.tex @@ -0,0 +1,266 @@ +\startenvironment ma-cb-graphics + +% These graphics were made when I had little experience in MetaPost so +% they are not that efficient or nicely codes. Sorry about that. + +\definecolor[ShapeDarkLine] [s=.4] +\definecolor[ShapeDarkDots] [r=1] +\definecolor[ShapeDarkEnd] [g=1] +\definecolor[ShapeLightLine] [s=.95] +\definecolor[ShapeLightDots] [r=.9,g=,5,b=.5] +\definecolor[ShapeLightFill] [s=.95] +\definecolor[ShapeLightFrame][r=.5,g=.50,b=.9] + +\startuseMPgraphic{basic-shape-dark} + color shapedotscolor ; shapedotscolor := \MPcolor{ShapeDarkDots} ; + color shapelinecolor ; shapelinecolor := \MPcolor{ShapeDarkLine} ; + \includeMPgraphic{basic-shape} +\stopuseMPgraphic + +\startuseMPgraphic{basic-shape-light} + color shapedotscolor ; shapedotscolor := \MPcolor{ShapeLightDots} ; + color shapelinecolor ; shapelinecolor := \MPcolor{ShapeLightLine} ; + \includeMPgraphic{basic-shape} +\stopuseMPgraphic + +\startuseMPgraphic{basic-shape} + w := OverlayWidth ; width := 100 ; wfactor := w/width ; + h := OverlayHeight ; height := 100 ; hfactor := h/height ; + d := OverlayOffset ; + % + def random_delta (expr d) = + d - (uniformdeviate 2d) + enddef; + % + z1 = (0,height) ; + z2 = (0,0) ; + z3 = (width,0) ; + z4 = (width,height) ; + % + z5 = ( width+random_delta(.2width),height+random_delta(.2height)) ; + z6 = (.5width+random_delta(.1width),height+random_delta(.1height)) ; + % + pickup pencircle + xscaled (OverlayLineWidth/ wfactor) + yscaled (OverlayLineWidth/(2*hfactor)) + rotated 30 ; + % + draw z5 .. z1 .. z2 .. z3 .. z4 .. z6 withcolor shapelinecolor ; + % + pickup pencircle + xscaled (OverlayLineWidth/wfactor) + yscaled (OverlayLineWidth/hfactor) ; + % + draw z1 withcolor shapedotscolor ; + draw z2 withcolor shapedotscolor ; + draw z3 withcolor shapedotscolor ; + draw z4 withcolor shapedotscolor ; + draw z5 withcolor shapedotscolor ; + draw z6 withcolor shapedotscolor ; + % + currentpicture := currentpicture xysized (w,h) ; +\stopuseMPgraphic + +\startuniqueMPpagegraphic{chapter-state} + color shapelinecolor ; shapelinecolor := \MPcolor{ShapeDarkLine} ; + % + delta := OverlayOffset ; + width := OverlayWidth - 2*delta ; + height := (OverlayHeight - 2*delta) / 3 ; + % + z1 = (0,3height) ; + z2 = (0,2height) ; + z3 = (if not odd RealPageNumber : - fi width,1.5height) ; + z4 = (0,height) ; + z5 = (0,0) ; + % + pickup pencircle + xscaled delta + yscaled .5delta + rotated 30 ; + % + draw z1 -- z2{up} .. z3 .. {up} z4 -- z5 withcolor shapelinecolor ; + % + pickup pencircle + scaled delta ; + % + draw z1 withcolor red ; + draw z2 withcolor red ; + draw z3 withcolor red ; + draw z4 withcolor red ; + draw z5 withcolor red ; + % +\stopuniqueMPpagegraphic + +\startreusableMPgraphic{pagenumber-state} + color shapelinecolor ; shapelinecolor := \MPcolor{ShapeDarkLine} ; + % + delta := OverlayOffset ; + width := OverlayWidth - 2delta ; + height := OverlayHeight - 2delta ; + lines := 5*OverlayOffset ; + % + z1 = (0,0) ; + z2 = (lines,0) ; + z3 = (.5width,height) ; + z4 = (width-lines,0) ; + z5 = (width,0) ; + % + pickup pencircle + xscaled delta + yscaled .5delta + rotated 30; + % + draw z1 -- z2 {dir 135} ... z3 ... {dir -135} z4 -- z5 withcolor shapelinecolor ; + % + pickup pencircle + scaled delta ; + % + draw z1 withcolor red ; + draw z2 withcolor red ; + draw z3 withcolor red ; + draw z4 withcolor red ; + draw z5 withcolor red ; + % +\stopreusableMPgraphic + +\startreusableMPgraphic{manualsymbol} + logo_type := 401 ; + input "mp-prag" ; + currentpicture := currentpicture scaled 0.25 ; +\stopreusableMPgraphic + +\startuseMPgraphic{frame-shape} + delta := OverlayOffset ; + width := OverlayWidth - 2delta ; + height := OverlayHeight - 2delta ; + % + vardef gamma = + g := OverlayOffset ; ((g/3) + (uniformdeviate (2g/3))) + enddef; + % + z1 = (0,0) ; + z2 = (width,0) ; + z3 = (width,height) ; + z4 = (0,height) ; + % + x12= .5[x1,x2] ; y12=y1 + gamma ; + y23= .5[y2,y3] ; x23=x2 - gamma ; + x34= .5[x3,x4] ; y34=y3 - gamma ; + y41= .5[y4,y1] ; x41=x4 + gamma ; + % + pickup pencircle + xscaled OverlayLineWidth + yscaled .5OverlayLineWidth + rotated 30; + % + path p; + p := + z1..z12..z2 & + z2..z23..z3 & + z3..z34..z4 & + z4..z41..z1 & + cycle ; + % + fill p withcolor shapefillcolor ; + draw p withcolor shapelinecolor ; +\stopuseMPgraphic + +\startuseMPgraphic{setup-shape} + color shapelinecolor ; shapelinecolor := \MPcolor{ShapeLightFrame} ; + color shapefillcolor ; shapefillcolor := \MPcolor{ShapeLightFill} ; + \includeMPgraphic{frame-shape} +\stopuseMPgraphic + +% \startuseMPgraphic{setup-shape-x} +% color shapelinecolor ; shapelinecolor := \MPcolor{ShapeLightFrame} ; +% color shapelinecolor ; shapelinecolor := \MPcolor{ShapeLightFill} ; +% \includeMPgraphic{frame-shape} +% \stopuseMPgraphic + +\startuniqueMPgraphic{note-rule} + color shapelinecolor ; shapelinecolor := \MPcolor{ShapeDarkLine} ; + color shapeendcolor ; shapeendcolor := \MPcolor{ShapeDarkEnd} ; + % + draw bottomboundary OverlayBox withcolor shapelinecolor withpen pencircle scaled OverlayLineWidth ; + draw llcorner OverlayBox withcolor shapeendcolor withpen pencircle scaled 3OverlayLineWidth ; + draw lrcorner OverlayBox withcolor shapeendcolor withpen pencircle scaled 3OverlayLineWidth ; + % +\stopuniqueMPgraphic + +\startuniqueMPgraphic{column-rule} + color shapelinecolor ; shapelinecolor := \MPcolor{ShapeDarkLine} ; + color shapeendcolor ; shapeendcolor := \MPcolor{ShapeDarkEnd} ; + % + draw leftboundary OverlayBox withcolor shapelinecolor withpen pencircle scaled OverlayLineWidth ; + draw ulcorner OverlayBox withcolor shapeendcolor withpen pencircle scaled 3OverlayLineWidth ; + draw llcorner OverlayBox withcolor shapeendcolor withpen pencircle scaled 3OverlayLineWidth ; + % +\stopuniqueMPgraphic + +% alternative implemenation +% +% \startuniqueMPgraphic{column-rule}{height,linewidth} +% color shapelinecolor ; shapelinecolor := \MPcolor{ShapeDarkLine} ; +% color shapeendcolor ; shapeendcolor := \MPcolor{ShapeDarkEnd} ; +% numeric shapelinewidth ; shapelinewidth := \MPvar{linewidth} ; +% pair shapeboundary ; shapeboundary := (0,\MPvar{height}) ; +% % +% draw origin -- shapeboundary withcolor shapelinecolor withpen pencircle scaled shapelinewidth ; +% draw origin withcolor shapeendcolor withpen pencircle scaled 3shapelinewidth ; +% draw shapeboundary withcolor shapeendcolor withpen pencircle scaled 3shapelinewidth ; +% % +% \stopuniqueMPgraphic + +% todo + +% \startreusableMPgraphic{clip:six} +% % +% delta := OverlayOffset ; +% height := OverlayWidth - delta ; +% % +% color green; green := (.1,.8,.1) ; +% % +% z1 = (0,0) ; +% z2 = (0,height) ; +% % +% pickup pencircle +% scaled OverlayLineWidth ; +% % +% draw z1 -- z2 withcolor .5white ; +% % +% pickup pencircle +% scaled 3OverlayLineWidth ; +% % +% draw z1 withcolor green ; +% draw z2 withcolor green ; +% % +% \stopreusableMPgraphic + +% \startreusableMPgraphic{clip:seven} +% % +% width := OverlayWidth ; +% height := OverlayHeight ; +% delta := OverlayOffset ; +% % +% color green ; green := (.1,.8,.1) ; +% % +% x1 = x4 = 0 ; x2 = x3 = width ; +% y1 = y2 = 0 ; y3 = y4 = height ; +% % +% pickup pencircle +% scaled OverlayLineWidth ; +% % +% draw z1 -- z2 -- z3 -- z4 -- cycle withcolor .white ; +% % +% pickup pencircle +% scaled 3OverlayLineWidth ; +% % +% draw z1 withcolor green ; +% draw z2 withcolor green ; +% draw z3 withcolor green ; +% draw z4 withcolor green ; +% % +% \stopreusableMPgraphic + +\stopenvironment diff --git a/doc/context/sources/general/manuals/start/ma-cb-links.tex b/doc/context/sources/general/manuals/start/ma-cb-links.tex new file mode 100644 index 000000000..d2e03944d --- /dev/null +++ b/doc/context/sources/general/manuals/start/ma-cb-links.tex @@ -0,0 +1,268 @@ +\startenvironment ma-cb-links + +% Links to external document for referencing. + +% --- www + +\useURL + [www:pragma] + [http://www.pragma-ade.com] + [] + [Pragma ADE] + +\useURL + [www:garden] + [http://wiki.contextgarden.net] + [] + [ConTeXt garden] + +\useURL + [www:showweb] + [http://texshow.contextgarden.net] + [] + [Show-web] + +\useURL + [www:wiki-modules] + [http://wiki.contextgarden.net/Modules] + [] + [Wiki Modules] + +\useURL + [www:supelec] + [https://foundry.supelec.fr] + [] + [Supelec] + +\useURL + [www:dir] + [http://www.pragma-ade.com/dir/general] + [] + [http://www.pragma-ade.com/dir/general] + +\useURL + [www:cstug] + [http://www.cstug.cz] + [] + [\CSTUG] + +\useURL + [modul:storm] + [http://modules.contextgarden.net/stormfontsupport] + [] + [http://modules.contextgarden.net/stormfontsupport] + +\useURL + [modul:storm-catalog] + [http://dl.contextgarden.net/modules/stormfontsupport/cont-storm-catalog.pdf] + [] + [cont-storm-catalog.pdf] + +% --- usergroups + +\useURL + [list:context] + [http://www.ntg.nl/mailman/listinfo/ntg-context] + [] + [] + +\useURL + [group:tug] + [https://tug.org] + [] + [] + +\useURL + [group:ntg] + [www.ntg.nl] + [] + [] + +\useURL + [group:context] + [www.????] + [] + [] + +\useURL + [install] + [http://wiki.contextgarden.net/ConTeXt_Standalone] + [] + [] + + +% --- manuals + +\useURL + [manual:general] + [http://www.pragma-ade.com/general/manuals/cont-eni.pdf] + [] + [cont-eni.pdf] + +\useURL + [manual:metafun] + [http://www.pragma-ade.com/general/manuals/metafun-s.pdf] + [] + [metafun-s.pdf] + +\useURL + [manual:columns] + [http://www.pragma-ade.com/general/manuals/columns.pdf] + [] + [columns.pdf] + +\useURL + [manual:nattab] + [http://www.pragma-ade.com/general/manuals/enattab.pdf] + [] + [enattab.pdf] + +\useURL + [manual:extab] + [http://www.pragma-ade.com/general/manuals/xtables-mkiv.pdf] + [] + [xtables-mkiv.pdf] + +\useURL + [manual:details] + [http://www.pragma-ade.com/general/manuals/details.pdf] + [] + [details.pdf] + +\useURL + [manual:fonts] + [http://www.pragma-ade.com/general/manuals/mfonts.pdf] + [] + [mfonts.pdf] + +\useURL + [manual:charts] + [http://www.pragma-ade.com/general/manuals/mcharts.pdf] + [] + [mcharts.pdf] + +\useURL + [manual:context] + [http://www.pragma-ade.com/general/manuals/cont-enp.pdf] + [] + [cont-enp.pdf] + +\useURL + [manual:chemic] + [http://www.pragma-ade.com/general/manuals/mp-ch-en.pdf] + [] + [mp-ch-en.pdf] + +\useURL + [manual:chemic-ex] + [http://www.pragma-ade.com/general/manuals/eppchtex.pdf] + [] + [eppchtex.pdf] + +\useURL + [manual:labels] + [http://www.pragma-ade.com/general/manuals/mlabels.pdf] + [] + [mlabels.pdf] + +\useURL + [manual:widgets] + [http://www.pragma-ade.com/general/manuals/mwidget.pdf] + [] + [mwidget.pdf] + +\useURL + [manual:style] + [http://www.pragma-ade.com/general/manuals/style.pdf] + [] + [style.pdf] + +\useURL + [manual:xml] + [http://www.pragma-ade.com/general/manuals/xml-mkiv.pdf] + [] + [xml-mkiv.pdf] + +\useURL + [manual:units] + [http://www.pragma-ade.com/general/manuals/units-mkiv.pdf] + [] + [units-mkiv.pdf] + +\useURL + [manual:scite] + [http://www.pragma-ade.com/general/manuals/scite-context-readme.pdf] + [] + [scite-context-readme.pdf] + +\useURL + [manual:qr-en] + [http://www.pragma-ade.com/general/qrcs/setup-en.pdf] + [] + [setup-en.pdf] + +\useURL + [manual:qr-nl] + [http://www.pragma-ade.com/general/qrcs/setup-nl.pdf] + [] + [setup-nl.pdf] + +\useURL + [manual:tools] + [http://www.pragma-ade.com/general/manuals/tools-mkiv.pdf] + [] + [tools-mkiv.pdf] + +\useURL + [manual:figures] + [http://www.pragma-ade.com/general/manuals/xfigures-p.pdf] + [] + [xfigures-p.pdf] + +\useURL + [manual:color] + [http://www.pragma-ade.nl/general/manuals/msplit.pdf] + [] + [msplit.pdf] + +% --- magazins + +\useURL + [thisway:shapes] + [http://www.pragma-ade.com/general/myway/mag-0010.pdf] + [] + [mag-0010.pdf] + +\useURL + [thisway:crossrefs] + [http://www.pragma-ade.com/general/magazines/mag-1103.pdf] + [] + [mag-1103.pdf] + +\useURL + [thisway:proj-struc] + [http://www.pragma-ade.com/general/magazines/mag-1101.pdf] + [] + [mag-1103.pdf] + +\useURL + [myway:nattab] + [http://www.pragma-ade.com/general/myway/NaturalTables.pdf] + [] + [NaturalTables.pdf] + +\useURL + [myway:startalign] + [http://www.pragma-ade.com/general/myway/mathalign.pdf] + [] + [mathalign.pdf] + +% AFO 2013: needed for example in manual + +\useURL + [loc:cityplan] + [http://www.stadindex.nl/plattegrond/hasselt] + [] + [] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/start/ma-cb-screen.tex b/doc/context/sources/general/manuals/start/ma-cb-screen.tex new file mode 100644 index 000000000..c3af1f783 --- /dev/null +++ b/doc/context/sources/general/manuals/start/ma-cb-screen.tex @@ -0,0 +1,201 @@ +\startenvironment ma-cb-screen + +% This setups adds some functionality as well as redefines +% some of the previously defined layout. + +\unprotect + +\definepapersize + [LocalPaperFormat] + [\c!width=28cm, + \c!height=21cm] + +\setuppapersize + [LocalPaperFormat] + [LocalPaperFormat] + +\setuplayout + [\c!location=\v!middle, + \c!topspace=.5cm, + \c!header=1.5cm, + \c!height=20cm, + \c!rightedge=5cm, + \c!rightedgedistance=1cm] + +\setupinteractionscreen + [\c!width=28cm, + \c!height=21cm, + \c!option=\v!max] + +% We place the pagenumber (not that useful in an interactive +% document) somewhere else and the chapter number in the +% footer. + +\setuppagenumbering + [\c!alternative=\v!singlesided, + \c!location=, + \c!command=\NummerCommando] + +\unexpanded\def\NummerCommando#1% uitlijnen op onderkant voet + {\hbox to \rightedgewidth + {\scratchcounter=\lastpage + \advance\scratchcounter by -\realpageno + \hskip0pt plus \realpageno cm + \framed + [\c!background=NummerAchtergrond, + \c!frame=\v!off, + \c!offset=4pt]% + {\lower.5\dp\strutbox\hbox spread 60pt{\hss\tx#1\hss}}% {\hss#1\hss}}% + \hskip0pt plus \scratchcounter cm}} + +\setupfootertexts + [\v!edge] + [][\v!pagenumber] + +\unexpanded\def\PlaatsHoofdstukStatus + {\determineheadnumber[\v!chapter]% + \ifnum\currentheadnumber>0 + \hbox to \hsize + {\hss + \framed + [\c!background=NummerAchtergrond, + \c!frame=\v!off, + \c!offset=6pt] + {\lower.5\dp\strutbox\hbox spread 60pt + {\hss\getmarking[\v!chapter\v!number]\hss}}% + \hss} + \fi} + +\setupfootertexts + [\v!margin] + [][] + +\setupfootertexts + [\v!text] + [][\PlaatsHoofdstukStatus] + +\setupinteraction + [\c!state=\v!start, + \c!color=, + \c!menu=\v!on] + +% We let users click on the whole table of contents line and +% provide some menus. + +\setuplist + [\v!chapter] + [\c!interaction=\v!all] + +\setupinteractionmenu + [\v!right] + [\c!state=\v!start, + \c!color=, + \c!offset=4pt, + \c!background=MenuAchtergrond, + \c!frame=\v!off] + +\startmode[**nl] + + \setupinteractionmenu + [\v!right] + [ {inhoud[contents]}, + {index[subind]}, + {commando's[comind]}, + {definities[comdefs]}, + {colofon[colofon]}, + {\vfill}, + {stoppen[\v!CloseDocument]}, + {\ZoekEnZoek{zoeken}}, + {terug[\v!PreviousJump]}, + {\HeenEnWeer}] + +\stopmode + +\startmode[**en,**uk] + + \setupinteractionmenu + [\v!right] + [ {contents[contents]}, + {index[subind]}, + {commands[comind]}, + {definitions[comdefs]}, + {colofon[colofon]}, + {\vfill}, + {exit[\v!CloseDocument]}, + {\ZoekEnZoek{search}}, + {go back[\v!PreviousJump]}, + {\HeenEnWeer}] + +\stopmode + +\startmode[**cz] + + \setupinteractionmenu + [\v!right] + [ {obsah[contents]}, + {rejst\rcaron\iacute k[subind]}, + {seznam p\rcaron\iacute kaz\uring[comind]}, + {definice p\rcaron\iacute kaz\uring[comdefs]}, + {tir\aacute\zcaron[colofon]}, + {\vfill}, + {konec[\v!CloseDocument]}, + {\ZoekEnZoek{vyhledej}}, + {krok zp\ecaron t[\v!PreviousJump]}, + {\HeenEnWeer}] + +\stopmode + +\startmode[**fr] + + \setupinteractionmenu + [\v!right] + [ {table des mati\egrave res[contents]}, + {index[subind]}, + {commandes[comind]}, + {d\eacute finitions[comdefs]}, + {colophon[colofon]}, + {\vfill}, + {quitter[\v!CloseDocument]}, + {\ZoekEnZoek{recherche}}, + {retour[\v!PreviousJump]}, + {\HeenEnWeer}] + +\stopmode + +\startmode[**vn] + + \setupinteractionmenu + [\v!right] + [ {mục lục[contents]}, + {bảng tra[subind]}, + {lệnh[comind]}, + {định nghĩa[comdefs]}, + {trang cuối[colofon]}, + {\vfill}, + {thoát[\v!CloseDocument]}, + {\ZoekEnZoek{tìm kiếm}}, + {quay lại[\v!PreviousJump]}, + {\HeenEnWeer}] + +\stopmode + +% This not that \TEX nical definition deals with the two sets +% of buttons. Someday I'll make a general macro for this. + +\def\TwoMenuButtons#1[#2]#3[#4]% + {\hbox to \hsize + {\dimen0=\hsize + \advance\hsize by -12pt + \menubutton[\v!right][\c!width=.5\hsize]{#1}[#2]% + \hss + \menubutton[\v!right][\c!width=.5\hsize]{#3}[#4]}} + +\def\HeenEnWeer + {\TwoMenuButtons{--}[\v!previouspage]{+}[\v!nextpage]} + +\def\ZoekEnZoek#1% + {\TwoMenuButtons{#1}[\v!SearchDocument]{+}[\v!SearchAgain]} + +\protect + +\stopenvironment diff --git a/doc/context/sources/general/manuals/start/ma-cb-style.tex b/doc/context/sources/general/manuals/start/ma-cb-style.tex new file mode 100644 index 000000000..294e4a5cc --- /dev/null +++ b/doc/context/sources/general/manuals/start/ma-cb-style.tex @@ -0,0 +1,678 @@ +% macros=mkvi + +\startenvironment ma-cb-style + +\usemodule[chart] + +\usemodule[s][abr-03] +\usemodule[x][set-11] + +\unprotect + +% Setups are kind of special. + +\loadsetups[cont-\currentmainlanguage.xml] + +\setupsetup + [\c!criterium=\v!used] + +\setupframedtexts + [setuptext] + [\c!before={\blank[\v!big]}, + \c!after={\blank[\v!big]}, + \c!background=setup-shape, + \c!backgroundoffset=10pt, + \c!rulethickness=5pt, + \c!offset=15pt, + \c!frame=\v!off] + +\setupexternalfigures + [\c!directory={../graphics}] + +% The layout dimensions are based on the A4 paper dimensions because that way users +% can print this manual themselves. Let's be economical with paper. We also assume a +% decent doublesided A4 printer. We use equal margins so that a single sided run or +% print also comes out all right. + +\setuplayout + [\c!backspace=22.5mm, + \c!width=\v!fit, + \c!cutspace=22.5mm, + \c!margin=20mm, + \c!margindistance=5mm, + \c!topspace=15mm, + \c!header=10mm, + \c!headerdistance=5mm, + \c!height=\v!fit, + \c!footerdistance=5mm, + \c!footer=15mm, + \c!bottomspace=15mm] + +\setuppagenumbering + [\c!alternative=\v!doublesided] + +% The lucida fonts look a bit more informal. + +\doifmodeelse {atpragma} { + \setupbodyfont[lucidaot,10pt] +} { + \setupbodyfont[palatino,10pt] +} + +% All colors will go here. + +% todo + +% Let's keep the text compact. + +\setupwhitespace + [\v!medium] + +\setupblank + [\v!medium] + +% We indent verbatim with the default indenting value. + +\setuptyping + [\c!margin=\v!standard, + \c!blank=\v!medium] + +% Manuals as usual need a bit more tolerance, because a lot of in||line verbatim is +% used. + +\setuptolerance + [\v!verytolerant,\v!stretch] + +% This manual makes heavy use of backgrounds. During a run about many metaclips are +% generated. + +\defineoverlay [chapter-state] [\uniqueMPpagegraphic{chapter-state}] +\defineoverlay [pagenumber-state] [\uniqueMPgraphic{pagenumber-state}] + +\defineoverlay [basic-shape-light] [\useMPgraphic{basic-shape-light}] +\defineoverlay [basic-shape-dark] [\useMPgraphic{basic-shape-dark}] + +\defineoverlay [setup-shape] [\useMPgraphic{setup-shape}] +\defineoverlay [note-rule] [\uniqueMPgraphic{note-rule}] +\defineoverlay [column-rule] [\uniqueMPgraphic{column-rule}] + +% \defineoverlay +% [MenuAchtergrond] +% [\MPclipTwoA{\overlaywidth}{\overlayheight}{3pt}{3pt}{red}{white}] + +\starttexdefinition unexpanded FootnoteRule + \blank[2*\v!big] + \framed + [\c!background=note-rule, + \c!width=.4\makeupwidth, + \c!height=2pt, + \c!offset=\v!overlay, + \c!rulethickness=2pt, + \c!frame=\v!off] + {} + \blank[\v!small] +\stoptexdefinition + +\setupfootnotes + [\c!rule=off, + \c!before=\FootnoteRule] + +% Chapter titles have a fancy shape around them. Because we have a lot of small +% chapters, we don't go to a new page. Titles look the same, but there we go to +% a new page. + +\setuphead + [\v!chapter] + [\c!command=\HeadCommand, + \c!page=, + \c!before={\blank[3*\v!big]}, + \c!after={\blank[2*\v!big,\v!samepage]}] + +\setuphead + [\v!title] + [\c!page=\v!right] + +\starttexdefinition unexpanded HeadCommand #number #title + \alignedline {\v!outer} {\v!left} { + \framed [ + \c!background=basic-shape-dark, + \c!rulethickness=10pt, + \c!frame=\v!off, + \c!strut=\v!no, + \c!offset=24pt, + \c!align=\v!middle + ] { + \doifmode {*\v!sectionnumber} { + #number + \kern.5em + \blackrule [ + color=green, + width=1pt, + height=1.5\ht\strutbox, + depth=1.25\dp\strutbox + ] + \kern.5em + } + #title + } + } +\stoptexdefinition + +% The current chapter number is typeset in the (outer) margin and slowly moves +% down. We could have directly put it in the margin but using the footermargin as +% starting point works better. This is an old command and there is no reason to +% change the definition to more fabce MkIV version. + +\setupfootertexts + [\v!margin] + [][\fastsetup{chapterindicator}] + +\startsetups chapterindicator + \determineheadnumber[\v!chapter] + \ifcase\currentheadnumber\else + \vbox to \makeupheight { + \scratchcounter=\numexpr\lastpage-\realpageno\relax + \vskip2cm + \vskip0pt plus \realpageno cm + \framed [ + \c!background=chapter-state, + \c!width=36pt, + \c!height=72pt, + \c!backgroundoffset=5pt, + %\c!align={\v!lohi,\v!middle}, + \c!frame=\v!off + ] { + \lower.5\dp\strutbox\hbox { + \bfb + \getmarking[\v!chapter\v!number] + } + } + \vskip0pt plus \scratchcounter cm + \vskip2cm + } + \fi +\stopsetups + +% The index is put on a double collumned grid. The numbers is surrounded by a +% shape. + +\setupregister + [\v!index] + [\c!command=\IndexCommand, + \c!before={\blank[\v!line]}, + \c!after=] + +\starttexdefinition unexpanded IndexCommand #text + \framed [ + \c!background=basic-shape-dark, + \c!width=36pt, + \c!frame=\v!off, + \c!offset=4pt, + \c!align=\v!middle, + \c!rulethickness=4pt + ] { + #text + } +\stoptexdefinition + +% When bound, we use a double sided layout and put the pagenumber in the margin, +% enhanced by a fancy background. + +\setuppagenumbering + [\c!location={\v!footer,\v!middle}, + \c!command=\PageNumberCommand] + +\starttexdefinition unexpanded PageNumberCommand #pagenumber + \framed [ + \c!background=pagenumber-state, + \c!backgroundoffset=5pt, + \c!frame=\v!off, + \c!offset=6pt + ] { + \lower.5\dp\strutbox\hbox spread 60pt { + \hss + #pagenumber + \hss + } + } +\stoptexdefinition + +% We put the chapter title in the head. If we wouldn't have to center, the more +% simple setting would be: + +\setupheadertexts + [{\getmarking[\v!chapter]}] + +% Guess what the next one does. + +\setupitemgroup + [\v!itemize] + [1] + [\v!autointro] + +% The coverpage looks more complex than it is. We can reuse it. + +\newbox\CoverBackgroundBox % reuse saves .8 sec, could be an object! + +\starttexdefinition unexpanded ShowSetupOnCover #n #tag #xmlroot + \dontleavehmode + \framed [ + \c!background=basic-shape-light, + \c!backgroundoffset=5pt, + \c!rulethickness=2pt, + \c!frame=\v!off + ] { + \xmlsetup{#xmlroot}{xml:setups:assemblename} + \tttf + \texescape\currentSETUPfullname + } + \hskip1.25em plus 1em minus 1em\relax +\stoptexdefinition + +% \startsetups coverbackground +% +% \ifvoid\CoverBackgroundBox +% +% \global\setbox\CoverBackgroundBox=\vbox to \paperheight \bgroup +% \hsize\paperwidth +% \emergencystretch3em +% \parfillskip0pt +% \switchtobodyfont +% [6pt] +% \baselineskip 0pt plus 1pt minus 1pt +% \setupsorting +% [texcommand] +% [\c!command=\ShowSetupOnCover, +% \c!criterium=\v!all] +% \beginofshapebox +% \leftskip3pt +% \rightskip3pt +% \placelistofsorts +% [texcommand] +% \endofshapebox +% \doreshapebox +% {\box\shapebox} +% {\penalty\shapepenalty} +% {\kern\shapekern} +% {\vfil} +% \kern3pt +% \vfilneg +% \flushshapebox +% \vfilneg +% \kern3pt +% \egroup +% +% \fi +% +% \copy\CoverBackgroundBox +% +% \stopsetups + +\startsetups coverbackground + + \ifvoid\CoverBackgroundBox + + \global\setbox\CoverBackgroundBox + \startnicelyfilledbox + [\c!width=\paperwidth, + \c!height=\paperheight, + \c!offset=\exheight, + \c!strut=\v!no] + \switchtobodyfont + [6pt] + \placelistofsorts + [texcommand] + [\c!command=\ShowSetupOnCover, + \c!criterium=\v!all] + \stopnicelyfilledbox + + \fi + + \copy\CoverBackgroundBox + +\stopsetups + +\defineoverlay[coverbackground][\setups{coverbackground}] + +\setupdocument + [author={Ton Otten\crlf PRAGMA ADE}, + translator=, + contributer=, + before=\setups{coverpage}, + after=\setups{backpage}] + +\defineoverlay[gotocontents][\overlaybutton{contents}] + +\startsetups coverpage + + \setupbackgrounds + [\v!rightpage] + [\c!background=coverbackground] + + \setupbackgrounds + [\v!text] + [\v!text] + [\c!background=gotocontents] + + \startmakeup + [\v!standard] + [\c!doublesided=\v!empty, + \c!headerstate=\v!none, + \c!footerstate=\v!none] + + \hbox to \hsize \bgroup + \hss + \definedfont[SansBold*default at 40pt] + \framed + [\c!background=basic-shape-dark, + \c!frame=\v!off, + \c!rulethickness=15pt, + \c!align=\v!middle, + \c!offset=40pt] + {\documentvariable{title}} + \egroup + + \vfill + + \doifsomething {\documentvariable{subtitle}} { + + \hbox to \hsize \bgroup + \definedfont[SansBold*default at 14pt] + \framed + [\c!background=basic-shape-dark, + \c!frame=\v!off, + \c!rulethickness=10pt, + \c!align=\v!middle, + \c!offset=20pt] + {\documentvariable{subtitle}} + \hss + \egroup + + } + + \hbox to \hsize \bgroup + \hss + \definedfont[SansBold*default at 20pt] + \framed + [\c!background=basic-shape-dark, + \c!frame=\v!off, + \c!rulethickness=12.5pt, + \c!align=\v!middle, + \c!offset=35pt] + {\documentvariable{author}} + \egroup + + \stopmakeup + + \setupbackgrounds + [\v!text] + [\v!text] + [\c!background=] + + \setupbackgrounds + [\v!rightpage] + [\c!background=] + + \doifmode {screen} { + + \setupbackgrounds + [\v!page] + [\c!background=\v!screen, + \c!backgroundscreen=.95] + + \setupbackgrounds + [\v!text] + [\v!text] + [\c!backgroundoffset=.25cm, + \c!depth=.125cm, + \c!background=\v!color, + \c!backgroundcolor=white] + + } + + \component[ma-cb-copyright] + +\stopsetups + +% The backpage uses the same background and overlays a piece of text. + +\startsetups backpage + + \page + [\v!yes,\v!blank,\v!right] + + \component[ma-cb-colofon] + + \page + [\v!yes,\v!blank,\v!left] + + \setupbackgrounds + [\v!leftpage] + [\c!background=coverbackground] + + \startmakeup + [\v!standard] + [\c!page=, + \c!doublesided=\v!no, + \c!headerstate=\v!none, + \c!footerstate=\v!none] + + \setuptolerance + [\v!verytolerant] + + \vfill + + \hbox to \hsize \bgroup + + \framed + [\c!background=\v!color, + \c!backgroundcolor=white, + \c!frame=\v!off, + \c!offset=10pt, + \c!corner=\v!round, + \c!width=.4\makeupwidth, + \c!height=\textheight, + \c!align=\v!middle, + \c!strut=\v!no] + { + \vfil + \component[ma-cb-en-backpage] + \vfil + } + + \hss + + \egroup + + \vfill + + \stopmakeup + +\stopsetups + +% To save space we don't start chapters on a new page, except in appendices and the +% introduction. These settings happen in dedicated setups sections (see later). We +% also add some white space between table of content entries. + +\setupsectionblock [\v!frontpart] [\c!page=\v!right,\c!before=\setups{frontpart}] +\setupsectionblock [\v!bodypart] [\c!page=\v!right,\c!before=\setups{bodypart}] +\setupsectionblock [\v!appendix] [\c!page=\v!right,\c!before=\setups{appendix}] +\setupsectionblock [\v!backpart] [\c!page=\v!right,\c!before=\setups{backpart}] + +\setuplist + [\v!chapter] + [\c!criterium=\v!all, + \c!before=, + \c!after=] + +\startsetups frontpart + + \setuphead[\v!chapter][\c!page=\v!right] + + \writebetweenlist[\v!chapter]{\blank} + + \startnamedsection[\v!chapter][\c!title=\labeltext{document:contents}] + + \startmixedcolumns[documentcolumns] + \placelist[\v!chapter] + \stopmixedcolumns + + \stopnamedsection + + \page[\v!right] + +\stopsetups + +\startsetups bodypart + + \setuphead[\v!chapter][\c!page=] + + \writebetweenlist[\v!chapter]{\blank} + +\stopsetups + +\startsetups appendix + + \setuphead[\v!chapter][\c!page=\v!right] + + \writebetweenlist[\v!chapter]{\blank} + + \startnamedsection[\v!chapter][\c!title=\labeltext{document:commanddefinitions},\c!reference=commandsetups] + + \component[ma-cb-\currentmainlanguage-commandlist] + + \blank[2*\v!big] + + \start + + \switchtobodyfont[8pt] + + \startmixedcolumns[documentcolumns] + \placelistofsorts[texcommand] + \stopmixedcolumns + + \stop + + \stopnamedsection + + \startnamedsection[\v!chapter][\c!title=\labeltext{document:commandindex}] + + \startmixedcolumns[documentcolumns] + \placeregister[Command] + \stopmixedcolumns + + \stopnamedsection + + \startnamedsection[\v!chapter][\c!title=\labeltext{document:subjectindex}] + + \startmixedcolumns[documentcolumns] + \placeregister[\v!index] + \stopmixedcolumns + + \stopnamedsection + + \startnamedsection[\v!chapter][\c!title=\labeltext{document:supportandreading}] + + \index{support} + + \startnamedsection[\v!section][\c!title=\labeltext{document:support}] + + \component[ma-cb-\currentmainlanguage-support] + + \stopnamedsection + + \startnamedsection[\v!section][\c!title=\labeltext{document:manuals}] + + % this will be done from a bib file + + \startlines + \goto {Chemical Formulas in \CONTEXT} [ url (manual:chemic-ex) ] + \goto {Color Separation} [ url (manual:color) ] + \goto {Columns} [ url (manual:columns) ] + \goto {\CONTEXT, the manual} [ url (manual:context) ] + \goto {Dealing with \XML} [ url (manual:xml) ] + \goto {Extreme Tables} [ url (manual:extab) ] + \goto {Figures} [ url (manual:figures) ] + \goto {Fonts in \CONTEXT} [ url (manual:fonts) ] + \goto {luatools, mtxrun, context} [ url (manual:tools) ] + \goto {\METAFUN\ manual} [ url (manual:metafun) ] + \goto {Natural Tables} [ url (manual:nattab) ] + \goto {\PPCHTEX\ Manual} [ url (manual:chemic) ] + \goto {Quick Reference (dutch)} [ url (manual:qr-nl) ] + \goto {Quick Reference (english)} [ url (manual:qr-en) ] + \goto {\SCITE\ in \CONTEXT} [ url (manual:scite) ] + \goto {Units} [ url (manual:units) ] + \goto {Widgets} [ url (manual:widgets) ] + \stoplines + + \stopnamedsection + + \startnamedsection[\v!section][\c!title=\labeltext{document:magazines}] + + % this will be done from a bib file + + \startlines + \goto {\CONTEXT\ Magazine 1103} [ url (thisway:crossrefs) ] + \goto {Project structure} [ url (thisway:proj-struc) ] + \stoplines + + \stopnamedsection + + \stopnamedsection + +\stopsetups + +\startsetups backpart + + \setuphead[\v!chapter][\c!page=\v!right] + + \writebetweenlist[\v!chapter]{\blank} + +\stopsetups + +% In normal documents one will never find awful things like below. Because we want +% an international setup, we just call the chapters in an indirect way. + +% We draw a nice line between columns. The next command does the job. Of course a +% normal line can be set more easily, but here we hook in a command. + +\installmixedcolumnseparator{ColumnRule}% + {\framed + [\c!background=column-rule, + \c!height=\mixedcolumnseparatorheight, + \c!depth=\mixedcolumnseparatordepth, + \c!width=\mixedcolumnseparatorwidth, + \c!offset=\v!overlay, + \c!rulethickness=2pt, + \c!frame=\v!off] + {}} + +% alternative implemenation +% +% \installmixedcolumnseparator{ColumnRule}% +% {\lower\mixedcolumnseparatordepth\hbox{\uniqueMPgraphic +% {column-rule}% +% {height=\the\dimexpr\mixedcolumnseparatorheight+\mixedcolumnseparatordepth,linewidth=2pt}}} + +\setupmixedcolumns + [\c!n=2, + \c!distance=36pt, + \c!separator=ColumnRule] + +\definemixedcolumns + [documentcolumns] + [\c!n=2, + \c!distance=36pt, + \c!separator=ColumnRule] + +\defineregister + [Command] + +\setupregister + [Command] + [\c!indicator=\v!off, + c!before={\blank[\v!line]}] + +\protect + +\stopenvironment diff --git a/doc/context/sources/general/manuals/start/ma-cb.tex b/doc/context/sources/general/manuals/start/ma-cb.tex new file mode 100644 index 000000000..7f23597a1 --- /dev/null +++ b/doc/context/sources/general/manuals/start/ma-cb.tex @@ -0,0 +1,17 @@ +\startproject ma-cb + + \environment ma-cb-language + + \environment ma-cb-abbreviations + \environment ma-cb-graphics + \environment ma-cb-style + \environment ma-cb-links + + \startmode[screen] + \environment ma-cb-screen + \stopmode + + \product ma-cb-en + \product ma-cb-nl + +\stopproject diff --git a/doc/context/sources/general/manuals/steps/steps-mkiv.tex b/doc/context/sources/general/manuals/steps/steps-mkiv.tex new file mode 100644 index 000000000..947f08fbb --- /dev/null +++ b/doc/context/sources/general/manuals/steps/steps-mkiv.tex @@ -0,0 +1,655 @@ +\environment manuals-xml-environment.tex + +\useMPlibrary [ove] + +\usemodule[x][mathml] +\usemodule[m][steps] + +\startdocument[title=Steps,author=Hans Hagen,palet=steps] + +\startbuffer +\startSTEPchart +\cell {A} +\cell {one} \text{+2} +\cell {two} \text{+3} +\cell {three} \text{+4} +\cell {four} \text{+5} +\cell {five} +\stopSTEPchart +\stopbuffer + +\startsection[title=Description] + +This module is written in the process of defining a couple of styles for an +educational math book. The macros provide you a way to visualize steps in for +instance solving equations. + +The horizontal visualization is called stepchart, while the vertical alternative +carries the name steptable. The vertical alternative has a special case that +permits alignment on a mid symbol (in most cases a relation). + +The implementation uses a combination of \TEX\ and \METAPOST, and is set up in +such a way that hyperlinks and alike will work okay. + +\stopsection + +\startsection[title=Structure] + +The horizontal stepcharts have at most four rows: two rows of cells with each an +associated row of texts. The plural elements \type {cells} and \type {texts} each +have two subelements. The \type {texts} elements are put between \type {cells}. + +\startbuffer +<stepchart> + <cells> <top> some text </top> <bot> some text </bot> </cells> + <texts> <top> text </top> <bot> text </bot> </texts> + <cells> <top> some text </top> <bot> some text </bot> </cells> +</stepchart> +\stopbuffer + +\typebuffer \processxmlbuffer + +When a singular \type {cell} element is used in combination with the plural \type +{texts}, we get one row of step cells with both top and bottom texts. + +\startbuffer +<stepchart> + <cell> some text </cell> + <texts> <top> text </top> <bot> text </bot> </texts> + <cell> some text </cell> +</stepchart> +\stopbuffer + +\typebuffer \processxmlbuffer + +The third horizontal alternative only has singular elements, and as a result the +texts are put above the step cells. + +\startbuffer +<stepchart> + <cell> some cell </cell> + <cell> another cell </cell> <text> a bit of text </text> + <cell> third cell </cell> <text> more text </text> + <cell> last cell </cell> +</stepchart> +\stopbuffer + +\typebuffer \processxmlbuffer + +Normally, the lines go from cell to cell via a text. When you let the \type +{cell} element follow by more than one \type {text} element (or their plural +forms), all lines will start at the same point. + +\startbuffer +<stepchart> + <cell> some text </cell> + <cell> some text </cell> <text> text 1 </text> <text> text 2 </text> + <cell> some text </cell> + <cell> some text </cell> <text> text 3 </text> + <cell> some text </cell> +</stepchart> +\stopbuffer + +\typebuffer \processxmlbuffer + +The vertical alternative (of course) looks different and permits pretty long +explanations. + +\startbuffer +<steptable> + <cell> cell 1 </cell> + <text> text 1 </text> + <cell> cell 2 </cell> + <text> text 2 </text> + <cell> cell 3 </cell> +</steptable> +\stopbuffer + +\typebuffer \processxmlbuffer + +When the plural element \type {cells} is used, three sub||elements are expected. +These align around the mid element \type {c2}. + +\startbuffer +<stepaligntable> + <cells> <c1> left </c1> <c2> center </c2> <c3> right </c3> </cells> + <text> text </text> + <cells> <c1> lft </c1> <c2> ctr </c2> <c3> rgt </c3> </cells> + <text> text </text> + <cells> <c1> l </c1> <c2> c </c2> <c3> r </c3> </cells> +</stepaligntable> +\stopbuffer + +\typebuffer \processxmlbuffer + +\stopsection + +\startsection[title=Usage] + +The step chart module is loaded with: + +\starttyping +\usemodule[cell] % was step +\stoptyping + +\noindentation but in the case of embedded math, you should also load the \MATHML\ module: + +\starttyping +\usemodule[cell,mathml] +\stoptyping + +\stopsection + +\startsection[title=\XML\ example] + +Because we don't want to clutter the examples with \MATHML\ we stick to a simple +mapping: + +\startbuffer +\startxmlsetups xml:math:simple + \xmlsetsetup {#1} {m} {xml:math:simple:tex} +\stopxmlsetups + +\startxmlsetups xml:math:simple:tex + \mathematics{\xmlflush{#1}} +\stopxmlsetups + +\xmlregistersetup{xml:math:simple} +\stopbuffer + +\typebuffer \getbuffer + +So, in the next examples the \type {m} element contains \TEX\ math. + +\startbuffer +<stepchart> + <cells> <top> A </top> <bot> B </bot> </cells> + <cells> <top> one </top> <bot> five </bot> </cells> + <texts> <top> <m> +2 </m> </top> <bot> <m> -2 </m> </bot> </texts> + <cells> <top> two </top> <bot> four </bot> </cells> + <texts> <top> <m> +3 </m> </top> <bot> <m> -3 </m> </bot> </texts> + <cells> <top> three </top> <bot> three </bot> </cells> + <texts> <top> <m> +4 </m> </top> <bot> <m> -4 </m> </bot> </texts> + <cells> <top> four </top> <bot> two </bot> </cells> + <texts> <top> <m> +5 </m> </top> <bot> <m> -5 </m> </bot> </texts> + <cells> <top> five </top> <bot> one </bot> </cells> +</stepchart> +\stopbuffer + +\typebuffer \processxmlbuffer + +\startbuffer +<stepchart> + <cell> A </cell> + <cell> one </cell> <text> <m> +2 </m> </text> + <cell> two </cell> <text> <m> +3 </m> </text> + <cell> three </cell> <text> <m> +4 </m> </text> + <cell> four </cell> <text> <m> +5 </m> </text> + <cell> five </cell> +</stepchart> +\stopbuffer + +\typebuffer \processxmlbuffer + +\startbuffer +<steptable> + <cell> + <math xmlns="mathml"> + <apply> <eq/> <ci> c </ci> + <apply> <plus/> + <apply> <times/> <cn> 2 </cn> <ci> a </ci> </apply> + <apply> <times/> <cn> 3 </cn> <ci> b </ci> </apply> + </apply> + </apply> + </math> + </cell> + <text> with + <math xmlns="mathml"> + <apply> <eq/> <ci> a </ci> <cn> 5 </cn> </apply> + </math> + </text> + <cell> + <math xmlns="mathml"> + <apply> <eq/> <ci> c </ci> + <apply> <plus/> <cn> 10 </cn> + <apply> <times/> <cn> 3 </cn> <ci> b </ci> </apply> + </apply> + </apply> + </math> + </cell> + <text> and + <math xmlns="mathml"> + <apply> <eq/> <ci> b </ci> <cn> 6 </cn> </apply> + </math> + </text> + <cell> + <math xmlns="mathml"> + <apply> <eq/> <ci> c </ci> + <apply> <plus/> <cn> 10 </cn> <cn> 18 </cn> </apply> + </apply> + </math> + </cell> + <text> + we get + </text> + <cell> + <math xmlns="mathml"> + <apply> <eq/> <ci> c </ci> <cn> 28 </cn> </apply> + </math> + </cell> +</steptable> +\stopbuffer + +\typebuffer \processxmlbuffer + +\startbuffer +<stepaligntable> + <cells> + <c1> <m>c</m> </c1> <c2> <m>=</m> </c2> <c3> <m>2a+3b</m> </c3> + </cells> + <text> + with <m>a=5</m> + </text> + <cells> + <c1> <m>c</m> </c1> <c2> <m>=</m> </c2> <c3> <m>10+3b</m> </c3> + </cells> + <text> + and <m>b=6</m> + </text> + <cells> + <c1> <m>c</m> </c1> <c2> <m>=</m> </c2> <c3> <m>10+18</m> </c3> + </cells> + <text> + we get + </text> + <cells> + <c1> <m>c</m> </c1> <c2> <m>=</m> </c2> <c3> <m>28</m> </c3> + </cells> +</stepaligntable> +\stopbuffer + +\typebuffer \processxmlbuffer + +\stopsection + +\startsection[title=\TEX\ example] + +\startbuffer +\startSTEPchart +\cells {A} {B} +\cells {one} {five or more} \texts{$+2$}{$-2$} +\cells {two} {four} \texts{$+3$}{$-3$} +\cells {three} {three} \texts{$+4$}{$-4$} +\cells {four} {two} \texts{$+5$}{$-5$} +\cells {five or more} {one} +\stopSTEPchart +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startSTEPchart +\cell {A} +\cell {one} \texts{$+2$}{$-2$} +\cell {two} \texts{$+3$}{$-3$} +\cell {three} \texts{$+4$}{$-4$} +\cell {four} \texts{$+5$}{$-5$} +\cell {five or more} +\stopSTEPchart +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startSTEPchart +\cells {A} {B} +\cells {one} {five or more} \texts{$+2$}{} +\cells {two} {four} \texts{}{$-3$} +\cells {three} {three} \texts{$+4$}{} +\cells {four} {two} \texts{}{$-5$} +\cells {five or more} {one} +\stopSTEPchart +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startSTEPchart +\cell {A} +\cell {one} \text{+2} \text{+3} \text{+4} \text{+5} +\cell {two} +\cell {three} +\cell {four} +\cell {five} +\stopSTEPchart +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startSTEPchart +\cell {A} +\cell {one} \texts{}{+2} \texts{}{+3} +\cell {two} +\cell {three} \texts{+4}{} \texts{+5}{} +\cell {four} +\cell {five} +\stopSTEPchart +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startSTEPchart +\cell {A} +\cell {one} \text{+2} +\cell {two} \text{+3} +\cell {three} \text{+4} +\cell {four} \text{+5} +\cell {five} +\stopSTEPchart +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startSTEPtable +\cell {$c=2a+3b$} +\text {with $a=5$} +\cell {$c=10+3b$} +\text {and $b=6$} +\cell {$c=10+18$} +\text {we get} +\cell {$c=28$} +\stopSTEPtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startSTEPaligntable +\cells {$2c$} {$=$} {$2a+3b$} +\text {with $a=5$} +\cells {$2c$}{$=$} {$10+3b$} +\text {and $b=6$} +\cells {$2c$} {$=$} {$10+18$} +\text {we get} +\cells {$2c$} {$=$} {$28$} +\text {and therefore} +\cells {$c$} {$=$} {$28/2$} +\text {which reduces to} +\cells {$c$} {$=$} {$14$} +\stopSTEPaligntable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startSTEPchart + \cells {A} {B} + \cells {one} {five} \texts{$+2$}{$-2$} + \cells {two} {four} \texts{$+3$}{$-3$} + \cells {three} {three} \texts{$+4$}{$-4$} + \cells {four} {two} \texts{$+5$}{$-5$} + \cells {five} {one} +\stopSTEPchart +\stopbuffer + +\typebuffer \getbuffer + +\stopsection + +\startsection[title=Configuring] + +The charts and tables can have their own spacing set. Quite certainly the +distances between cells will differ. + +\starttabulate[|Tl|l|] +\HL +\NC \rlap{\tex{setupSTEPcharts} \tex{setupSTEPtables}} \NC \NC \NR +\HL +\NC after \NC hook for commands to execute after the table \NC \NR +\NC before \NC hook for commands to execute before the table \NC \NR +% \NC method \NC line drawing method\NC \NR +% \NC height \NC height of the connecting line \NC \NR +% \NC offset \NC the distance between lines and cells and texts \NC \NR +% \NC hoffset \NC the horizontal distance between cells \NC \NR +% \NC voffset \NC the vertical distance between cells \NC \NR +\HL +\stoptabulate + +Both charts and tables have common settings with respect to the cells, texts and +lines. + +\starttabulate[|Tl|l|] +\HL +\NC \rlap{\tex{setupSTEPcells} \tex{setupSTEPtexts}} \NC \NC \NR +\HL +\NC alternative \NC the kind of shape to be drawn \NC \NR +\NC backgroundcolor \NC the background color identified by name \NC \NR +\NC rulethickness \NC the width of frame around cells \NC \NR +\NC framecolor \NC the frame color identified by name \NC \NR +\NC offset \NC the space between content and frame \NC \NR +\NC style \NC a (preferable named) style \NC \NR +\NC color \NC the color of the content \NC \NR +\HL +\stoptabulate + +\starttabulate[|Tl|l|] +\HL +\NC \rlap{\tex{setupSTEPlines}} \NC \NC \NR +\HL +\NC alternative \NC the kind of line to draw between cells \NC \NR +\NC distance \NC the distance between lines and text \NC \NR +\NC offset \NC the shift to the right of the start of the line \NC \NR +\NC height \NC the height of the (curved) line \NC \NR +\NC rulethickness \NC the width of the lines between cells \NC \NR +\NC color \NC the line color identified by name \NC \NR +\HL +\stoptabulate + +In \TEX, some of the settings, like \type {style} and \type {color} can be set +between elements. In \XML, the settings are passed as processing instructions. + +\startbuffer +\startSTEPchart +\cell {A} +\cell {one} \text{+2} +\cell {two} \text{+3} +\start + \setupSTEPcells[color=darkred,style=bold] + \cell {three} \text{+4} + \cell {four} \text{+5} +\stop +\cell {five} +\stopSTEPchart +\stopbuffer + +\typebuffer \getbuffer + +There are a couple of alternative shapes available. The most relevant ones are: +\removeunwantedspaces \dostepwiserecurse {5} {9} {1} { \TestShape {\recurselevel}} +\removeunwantedspaces \dostepwiserecurse {12} {19} {1} { \TestShape {\recurselevel}} +\removeunwantedspaces \dostepwiserecurse {22} {29} {1} { \TestShape {\recurselevel}}. + +Although it is not too wise to set up the layout in the middle of a document, for +graphics one can seldom get by some local fine||tuning. Here we encounter a +rather fundamental difference between \TEX\ and \XML. In \TEX, you can easily +change settings on a temporary basis by using groups. In \XML\ on the other hand, +settings are bound to a category. So, in \TEX\ you can do this: + +\startbuffer +\setupSTEPcells + [important] + [color=darkgreen, + style=bold] + +\startSTEPchart +\cell {A} +\cell {one} \text{+2} +\cell {two} \text{+3} +\cell [important] {three} \text{+4} +\cell [important] {four} \text{+5} +\cell {five} +\stopSTEPchart +\stopbuffer + +\typebuffer \getbuffer + +\noindentation An \XML\ example is: + +\startbuffer +\setupSTEPcells[demo-1][alternative=5] +\setupSTEPcells[demo-1][framecolor=darkred] +\setupSTEPtexts[demo-1][framecolor=darkgreen] +\setupSTEPlines[demo-1][alternative=4] +\setupSTEPtexts[demo-2][style=bold] +\stopbuffer + +\typebuffer \getbuffer + +\noindentation This will be applied to: + +\startbuffer +<steptable class="demo-1"> + <cell> type 5 </cell> + <text> type 6 </text> + <cell> type 7 </cell> + <text class="demo-2"> type 8 </text> + <cell> type 9 </cell> +</steptable> +\stopbuffer + +\typebuffer + +\noindentation so that we get: + +\processxmlbuffer + +You can also use processing instructions: + +\startbuffer +<stepchart> + <cells> <top> some text 1 </top> <bot> some text 2 </bot> </cells> + <?context-stepchart-directive text color darkred ?> + <texts> <top> text 3 </top> <bot> text 4 </bot> </texts> + <cells> <top> some text 5 </top> <bot> some text 6 </bot> </cells> + <?context-stepchart-directive text color darkblue ?> + <texts> <top> text 7t </top> </texts> + <cells> <top> some text 8 </top> </cells> +</stepchart> +\stopbuffer + +\typebuffer \processxmlbuffer + +\startbuffer +<steptable> + <?context-stepchart-directive cell alternative 12 ?> + <cell> cell 12 </cell> <text> 12 to 13 </text> + <?context-stepchart-directive cell alternative 13 ?> + <cell> cell 13 </cell> <text> 13 to 14 </text> + <?context-stepchart-directive cell alternative 14 ?> + <cell> cell 14 </cell> <text> 14 to 15 </text> + <?context-stepchart-directive cell alternative 15 ?> + <cell> cell 15 </cell> +</steptable> +\stopbuffer + +\typebuffer \processxmlbuffer + +Some settings apply to the whole chart. In \TEX\ this is easy since we +can group the whole chart including settings but in \XML\ this is somewhat +problematic. We can however fall back on basic tex commands but it's +probably better to use as category (class), like: + +\startbuffer +\setupSTEPtexts[demo-5][distance=3em] +\stopbuffer + +\typebuffer \getbuffer + +\noindentation So, the following works as expected: + +\startbuffer +<document> + <?context-tex-directive start ?> + <?context-stepchart-directive text distance 1em ?> + <stepaligntable> + <cells> <c1>a</c1> <c2>b</c2> <c3>c</c3> </cells> + <text> test 1 </text> + <cells> <c1>aa</c1> <c2>b</c2> <c3>ccc</c3> </cells> + </stepaligntable> + <?context-tex-directive stop ?> + <stepaligntable> + <cells> <c1>a</c1> <c2>b</c2> <c3>c</c3> </cells> + <text> test 2 </text> + <cells> <c1>aa</c1> <c2>b</c2> <c3>ccc</c3> </cells> + </stepaligntable> + <stepaligntable class="demo-5"> + <cells> <c1>a</c1> <c2>b</c2> <c3>c</c3> </cells> + <text> test 3 </text> + <cells> <c1>aa</c1> <c2>b</c2> <c3>ccc</c3> </cells> + </stepaligntable> +</document> +\stopbuffer + +\typebuffer \processxmlbuffer + +\startbuffer +<document> + <?context-tex-directive start ?> + <?context-stepchart-directive cell dx 10ex ?> + <stepchart> + <cells> <top> from here </top> <bot> there </bot> </cells> + <texts> <top> to </top> <bot> to </bot> </texts> + <cells> <top> and here </top> <bot> there </bot> </cells> + </stepchart> + <?context-tex-directive stop ?> +</document> +\stopbuffer + +\typebuffer \processxmlbuffer + +\startbuffer +<document> + <?context-tex-directive start ?> + <?context-stepchart-directive line height 30pt ?> + <?context-stepchart-directive line offset 5pt ?> + <steptable> + <cell> some cell </cell> + <cell> another cell </cell> <text> a bit of text </text> + <cell> third cell </cell> <text> more text </text> + <cell> last cell </cell> + </steptable> + <?context-tex-directive stop ?> +</document> +\stopbuffer + +\typebuffer \processxmlbuffer + +\startbuffer +<document> + <?context-tex-directive start ?> + <?context-stepchart-directive line height 30pt ?> + <?context-stepchart-directive line offset 15pt ?> + <stepchart> + <cell> some cell </cell> + <cell> another cell </cell> <text> a bit of text </text> + <cell> third cell </cell> <text> more text </text> + <cell> last cell </cell> + </stepchart> + <?context-tex-directive stop ?> +</document> +\stopbuffer + +\typebuffer \processxmlbuffer + +\stopsection + +\startsection[title=Documentation] + +There is no additional documentation on this module. + +\stopsection + +\stopdocument diff --git a/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.jpg b/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.jpg Binary files differnew file mode 100644 index 000000000..8c45b41b9 --- /dev/null +++ b/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.jpg diff --git a/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.pdf b/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.pdf Binary files differnew file mode 100644 index 000000000..d576c7d91 --- /dev/null +++ b/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.pdf diff --git a/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.png b/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.png Binary files differnew file mode 100644 index 000000000..fba526e9f --- /dev/null +++ b/doc/context/sources/general/manuals/swiglib/swiglib-mkiv-gm-1.png diff --git a/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex b/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex new file mode 100644 index 000000000..c24be76bf --- /dev/null +++ b/doc/context/sources/general/manuals/swiglib/swiglib-mkiv.tex @@ -0,0 +1,352 @@ +% language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. + +\usemodule[art-01,abr-02] + +\definecolor + [maincolor] + [r=.4] + +\definecolor + [extracolor] + [g=.4] + +\setupbodyfont + [11pt] + +\setuptype + [color=maincolor] + +\setuptyping + [color=maincolor] + +\definefontsynonym + [TitlePageMono] + [file:lmmonoproplt10-bold*default] + +\setuphead + [color=maincolor] + +\usesymbols + [cc] + +\setupinteraction + [hidden] + +\loadfontgoodies[lm] + +\startdocument + [metadata:author=Hans Hagen, + metadata:title=SwigLib basics, + author=Hans Hagen, + affiliation=PRAGMA ADE, + location=Hasselt NL, + title=SwigLib basics, + support=www.contextgarden.net, + website=www.pragma-ade.nl] + +\startluasetups[swiglib] + for i=1,640 do + context.definedfont { string.formatters["TitlePageMono at %p"](65536*(10+math.random(5))) } + context("SwigLib ") + end + context.removeunwantedspaces() +\stopluasetups + +\startMPpage + +StartPage ; + + fill Page enlarged 1cm withcolor \MPcolor{extracolor} ; + + draw textext("\framed[loffset=2pt,roffset=2pt,frame=off,width=\paperwidth,align={normal,paragraph,verytolerant,stretch}]{\luasetup{swiglib}}") + xysized (PaperWidth,PaperHeight) + shifted center Page + withcolor .8white ; + + draw textext.ulft("\definedfont[TitlePageMono]basics") + xsized .75PaperWidth + shifted lrcorner Page + shifted (-1cm,2cm) + withcolor \MPcolor{maincolor} ; + + % draw textext.ulft("\definedfont[TitlePageMono]in context mkiv") + % xsized .6PaperWidth + % shifted lrcorner Page + % shifted (-1cm,6cm) + % withcolor \MPcolor{maincolor} ; + +StopPage ; + +\stopMPpage + +\dontcomplain + +\startsubject[title=Contents] + +\placelist[section][alternative=a] + +\stopsubject + +\startsection[title=Introduction] + +The \SWIGLIB\ project is related to \LUATEX\ and aims as adding portable library +support to this \TEX\ engine without too much fixed binding. The project does not +provide \LUA\ code, unless really needed, because it assumes that macro packages +have different demands. It also fits in the spirit of \TEX\ and \LUA\ to minimize +the core components. + +The technical setup is by Luigi Scarso and documentation about how to build the +libraries is part of the \SWIGLIB\ repository. Testing happens with help of the +\CONTEXT\ (garden) infrastructure. This short document only deals with usage in +\CONTEXT\ but also covers rather plain usage. + +\blank \start \em todo: reference to Luigi's manual \stop \blank + +\stopsection + +\startsection[title=Inside \CONTEXT] + +The recommended way to load a library in \CONTEXT\ is by using the +\type {swiglib} function. This function lives in the global namespace. + +\starttyping +local gm = swiglib("gmwand.core") +\stoptyping + +After this call you have the functionality available in the \type {gm} +namespace. This way of loading makes \CONTEXT\ aware that such a library +has been loading and it will report the loaded libraries as part of the +statistics. + +If you want, you can use the more ignorant \type {require} instead but in +that case you need to be more explicit. + +\starttyping +local gm = require("swiglib.gmwand.core") +\stoptyping + +Here is an example of using such a library (by Luigi): + +\startbuffer +\startluacode +local gm = swiglib("gmwand.core") +local findfile = resolvers.findfile + +if not gm then + -- no big deal for this manual as we use a system in flux + logs.report("swiglib","no swiglib libraries loaded") + return +end + +gm.InitializeMagick(".") + +local magick_wand = gm.NewMagickWand() +local drawing_wand = gm.NewDrawingWand() +local pixel_wand = gm.NewPixelWand(); + +gm.MagickSetSize(magick_wand,800,600) +gm.MagickReadImage(magick_wand,"xc:gray") + +gm.DrawPushGraphicContext(drawing_wand) + +gm.DrawSetFillColor(drawing_wand,pixel_wand) + +gm.DrawSetFont(drawing_wand,findfile("dejavuserifbold.ttf")) +gm.DrawSetFontSize(drawing_wand,96) +gm.DrawAnnotation(drawing_wand,200,200,"ConTeXt 1") + +gm.DrawSetFont(drawing_wand,findfile("texgyreschola-bold.otf")) +gm.DrawSetFontSize(drawing_wand,78) +gm.DrawAnnotation(drawing_wand,250,300,"ConTeXt 2") + +gm.DrawSetFont(drawing_wand,findfile("lmroman10-bold.otf")) +gm.DrawSetFontSize(drawing_wand,48) +gm.DrawAnnotation(drawing_wand,300,400,"ConTeXt 3") + +gm.DrawPopGraphicContext(drawing_wand) + +gm.MagickDrawImage(magick_wand,drawing_wand) + +gm.MagickWriteImages(magick_wand,"./swiglib-mkiv-gm-1.png",1) +gm.MagickWriteImages(magick_wand,"./swiglib-mkiv-gm-1.jpg",1) +gm.MagickWriteImages(magick_wand,"./swiglib-mkiv-gm-1.pdf",1) + +gm.DestroyDrawingWand(drawing_wand) +gm.DestroyPixelWand(pixel_wand) +gm.DestroyMagickWand(magick_wand) +\stopluacode +\stopbuffer + +\typebuffer + +\getbuffer + +In practice you will probably stay away from manipulating text this way, but it +illustrates that you can use the regular \CONTEXT\ helpers to locate files. + +\startlinecorrection[big] + \startcombination[3*1] + {\externalfigure[swiglib-mkiv-gm-1.png][width=.3\textwidth]} {png} + {\externalfigure[swiglib-mkiv-gm-1.pdf][width=.3\textwidth]} {pdf} + {\externalfigure[swiglib-mkiv-gm-1.jpg][width=.3\textwidth]} {jpg} + \stopcombination +\stoplinecorrection + +You'd better make sure to use unique filenames for such graphics. Of course a more +clever mechanism would only run time consuming tasks once for each iteration of a +document. + +\stopsection + +\startsection[title=Outside \CONTEXT] + +In the \CONTEXT\ distribution we ship some generic macros and code for usage in +plain \TEX\ but there is no reason why they shouldn't work in other macro packages +as well. A rather plain example is this: + +\starttyping +\input luatex-swiglib.tex + +\directlua { + dofile("luatex-swiglib-test.lua") +} + +\pdfximage {luatex-swiglib-test.jpg} \pdfrefximage\pdflastximage + +\end +\stoptyping + +Assuming that you made the \type {luatex-plain} format, such a file can be processed using: + +\starttyping +luatex --fmt=luatex=plain luatex-swiglib-test.tex +\stoptyping + +The loaded \LUA\ file \type {luatex-swiglib-test.lua} liike like this: + +\starttyping +local gm = swiglib("gmwand.core") + +gm.InitializeMagick(".") + +local magick_wand = gm.NewMagickWand() +local drawing_wand = gm.NewDrawingWand() + +gm.MagickSetSize(magick_wand,800,600) +gm.MagickReadImage(magick_wand,"xc:red") +gm.DrawPushGraphicContext(drawing_wand) +gm.DrawSetFillColor(drawing_wand,gm.NewPixelWand()) +gm.DrawPopGraphicContext(drawing_wand) +gm.MagickDrawImage(magick_wand,drawing_wand) +gm.MagickWriteImages(magick_wand,"./luatex-swiglib-test.jpg",1) + +gm.DestroyDrawingWand(drawing_wand) +gm.DestroyMagickWand(magick_wand) +\stoptyping + +Instead of loading a library with the \type {swiglib} function, you can also +use \type {require}: + +\starttyping +local gm = require("swiglib.gmwand.core") +\stoptyping + +Watch the explicit \type {swiglib} reference. Both methods are equivalent. + +\stopsection + +\startsection[title={The libraries}] + +Most libraries are small but some can be rather large and have additional files. +This is why we keep them separated. On my system they are collected in the +platform binary tree: + +\starttyping +e:/tex-context/tex/texmf-mswin/bin/lib/luatex/lua/swiglib/gmwand +e:/tex-context/tex/texmf-mswin/bin/lib/luatex/lua/swiglib/mysql +e:/tex-context/tex/texmf-mswin/bin/lib/luatex/lua/swiglib/.... +\stoptyping + +One can modulate on this: + +\starttyping +...tex/texmf-mswin/bin/lib/luatex/lua/swiglib/mysql/core.dll +...tex/texmf-mswin/bin/lib/luajittex/lua/swiglib/mysql/core.dll +...tex/texmf-mswin/bin/lib/luatex/context/lua/swiglib/mysql/core.dll +\stoptyping + +are all valid. When versions are used you can provide an additional argument to the +\type {swiglib} loader: + +\starttyping +tex/texmf-mswin/bin/lib/luatex/lua/swiglib/mysql/5.6/core.dll +\stoptyping + +This works with: + +\starttyping +local mysql = swiglib("mysql.core","5.6") +\stoptyping + +as well as: + +\starttyping +local mysql = swiglib("mysql.core") +\stoptyping + +It is hard to predict how operating systems look up libraries and especially +nested loads, but as long as the root of the \type {swiglib} path is known to the +file search routine. We've kept the main conditions for success simple: the core +library is called \type {core.dll} or \type {core.so}. Each library has an +(automatically called) initialize function named \type {luaopen_core}. There is no +reason why (sym)links from the \type {swiglib} path to someplace else shouldn't +work. + +In \type {texmfcnf.lua} you will find an entry like: + +\starttyping +CLUAINPUTS = ".;$SELFAUTOLOC/lib/{$engine/context,$engine}/lua//" +\stoptyping + +Which in practice boils down to a search for \type {luatex} or \type {luajittex} +specific libraries. When both binaries are compatible and there are no \type +{luajittex} binaries, the regular \type {luatex} libraries will be used. + +The \type {swiglib} loader function mentioned in previous sections load libraries +in a special way: it changes dir to the specific path and then loads the library +in the usual way. After that it returns to the path where it started out. After +this, when the library needs additional libraries (and for instance graphicmagick +needs a lot of them) it will first look on its own path (which is remembered). + +The \MKIV\ lookups are somewhat more robust in the sense that they first check +for matches on engine specific paths. This comes in handy when the search +patterns are too generic and one can match on for instance \type {luajittex} +while \type {luatex} is used. + +\stopsection + +\startsection[title=Colofon] + +\starttabulate[|B|p|] +\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR +\NC version \NC \currentdate \NC \NR +\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR +\NC comment \NC the swiglib infrastructure is implemented by Luigi Scarso \NC \NR +\stoptabulate + +\stopsection + +\stopdocument diff --git a/doc/context/sources/general/manuals/templates/templates-mkiv.tex b/doc/context/sources/general/manuals/templates/templates-mkiv.tex new file mode 100644 index 000000000..01f2c429e --- /dev/null +++ b/doc/context/sources/general/manuals/templates/templates-mkiv.tex @@ -0,0 +1,283 @@ +% language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. + +\usemodule[art-01,abr-02] + +\definecolor[maincolor] [r=.4] +\definecolor[extracolor][b=.4] + +\setupbodyfont + [10pt] + +\usesymbols + [cc] + +\setuptyping + [color=extracolor] + +\setuptype + [color=extracolor] + +\setuphead + [section] + [color=maincolor] + +\setupinteraction + [hidden] + +\startdocument + [metadata:author=Hans Hagen, + metadata:title=LMX Templates, + author=Hans Hagen, + affiliation=PRAGMA ADE, + location=Hasselt NL, + title=LMX Templates, + extra-1=LMX, + extra-2=TEMPLATES, + extra-3=HANS HAGEN, + support=www.contextgarden.net, + website=www.pragma-ade.nl] + +\startMPpage + + StartPage; + + numeric n, m ; n := 3 * 4 ; m := 4 * 4 ; + numeric w, h ; w := PaperWidth/n ; h := PaperHeight/m ; + numeric max ; max := 20 ; + + for i=1 upto n : + for j=1 upto m : + fill + unitsquare + xysized (w,h) + shifted ((i-1)*w,(j-1)*h) + withcolor (.5[red,blue] randomized(.75,.75,.75)) + ; + endfor ; + endfor ; + + path p ; p := Page enlarged -5mm ; + + pair a[] ; % < + + a[1] := .80[lrcorner p,urcorner p] ; + a[2] := .50[llcorner p,ulcorner p] ; + a[3] := .20[lrcorner p,urcorner p] ; + + pair b[] ; % \ + + b[1] := ulcorner p ; + b[2] := center p ; + b[3] := lrcorner p ; + + path c[] ; % from < (xml) to \ (tex) + + c[1] := a[1] .. b[1] ; + c[2] := a[2] .. b[2] ; + c[3] := a[3] .. b[3] ; + + linecap := butt ; + + numeric fraction ; + + for i=1 step 1 until max : + fraction := i/max ; + draw + ((point fraction along c[1]) -- (point fraction along c[2]) -- (point fraction along c[3])) + withpen pencircle scaled 5mm + withcolor .75[(max+1-i)*green/n,i*yellow/max] + withtransparency (1,.5) + ; + endfor ; + + draw + textext.rt("\ssbf{\documentvariable{extra-1}}") + xsized (7w) + shifted (.8w,3h) + withcolor white + ; + + draw + textext.rt("\ssbf{\documentvariable{extra-2}}") + xsized (8w) + shifted (w,h) + withcolor white + ; + + draw + textext.ulft("\ssbf{\documentvariable{extra-3}}") + rotated 90 + ysized (5.9h) + shifted (PaperWidth-1.2w,PaperHeight/2+2.95h) + withcolor white + ; + + StopPage; + +\stopMPpage + +\startsubject[title={Contents}] + +\placelist[section][criterium=all,interaction=all] + +\stopsubject + +\startsection [title={Introduction}] + +{\em This manual is not finished yet. The main reason is that what is described +here is an afternoon experiment resulting in a dozen lines of \LUA\ glue code +that builds upon an already existing mechanism. When users like this, I will +extend the basic \LMX\ handler to suit the \TEX\ end better. There will also be +also support for cache based and in||document templates.)} + +The acronym \type {lmx} stands for document that are a mix of \LUA\ and \XML\ and +is just the three letters \type {xml} reversed. Such documents showed up pretty +soon in \MKIV\ while I was exploring ways to present debugging and error +information to users using \XML. As a consequence this is one of the older +mechanisms available, although I doubt if users start looking for it when they +start using \CONTEXT. + +Anyhow, because we also use \LMX\ for populating web pages, at some point I wondered +if using the same approach for \TEX\ files made sense. I'm still not sure about it +but who knows where this ends up. Currently code is shared but in the future we might +end up with a variant that adds some more flexibility. + +\stopsection + +\startsection [title={How it works}] + +First of all, using this mechanism involves yet another kind of \type {mk}, so +now we have: + +\starttabulate[|TB||] +\HL +\NC mkii \NC The old version of \CONTEXT, using \PDFTEX,\XETEX, etc. \NC \NR +\HL +\NC mkiv \NC The new version of \CONTEXT, using \LUATEX. \NC \NR +\NC mkvi \NC Similar to \MKIV\ but with named macro parameters. \NC \NR +\HL +\NC mkix \NC A \MKIV\ file mixed with \LUA\ wrapped in \XML\ processing instructions. \NC \NR +\NC mkxi \NC Similar to \MKIX\ but with named macro parameters. \NC \NR +\HL +\stoptabulate + +The nice thing about sticking to wrapping in angle brackets is that it plays nice +with syntax highlighting. Before we show an example of such a mix, we first point +out that loading (and thereby conversion) happens automatically. A \type {mkix} or +\type {mkxi} file is just a regular \CONTEXT\ file. In the test suite there +is a demo file that can be included like this: + +\starttyping +\input lmxlike-001.mkxi +\stoptyping + +This file is loaded and converted on the fly. No caching takes place, but in due time +we can use the cache built into the \LMX\ handlers if needed. The template itself +can be fed with variables in the \type {document} namespace: + +\starttyping +\starttext + + \startluacode + document.variables.text = "set" + \stopluacode + + \input lmxlike-001.mkxi + +\stoptext +\stoptyping + +Instead of a special suffix, you can also force conversion with the \type {macros} +directive: + +\starttyping +% macros=mkix +\stoptyping + +Part of the mentioned looks as follows: + +\starttyping +\bTABLE + <?lua for i=1,40 do ?> + \bTR + <?lua for j=1,5 do ?> + \bTD + cell (<?lua inject(i) ?>,<?lua inject(j)?>) + is <?lua inject(variables.text or "unset") ?> + \eTD + <?lua end ?> + \eTR + <?lua end ?> +\eTABLE +\stoptyping + +The \type {<?lua ... ?>} command is conceptually different from (say) \type +{\ctxlua} in the sense that the later executes some \LUA\ code at that spot, +while in a template a \LUA\ function is constructed out of the whole that gets +executed. In fact, we use \LUA\ to construct an input file. + +For the moment we only mention the predefined \type {inject} command. There are +some more but they make more sense for \XML\ and \HTML\ and in due time this will +be decoupled so that we can have dedicated helpers. Even the \XML\ and \HTML\ +part is somewhat in flux. + +The previous example can of course also be done differently. It's a matter of +taste and usage what method gets used: + +\starttyping +\startluacode + context.bTABLE() + for i=1,40 do + context.bTR() + for j=1,5 do + context.bTD() + context("cell (%s,%s) is %s",i,j,document.variables.text or "unset") + context.eTD() + end + context.eTR() + end + context.eTABLE() +\stopluacode +\stoptyping + +The difference between a \MKIX\ and \MKXI\ file is the same as between a \MKIV\ +and \MKVI\ file: the way macros can be defined: + +\starttyping +\def\testmacro#one#two{[#one,#two]} + +\testmacro{1}{2} +\testmacro{one}{two} +\testmacro{second}{first} +\stoptyping + +In practice one will seldom need macro definitions in a template file but the +possibility is provided. + +\stopsection + +\startsubject[title={Colofon}] + +\starttabulate[|B|p|] +\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR +\NC version \NC \currentdate \NC \NR +\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR +\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR +\stoptabulate + +\stopsubject + +\stopdocument diff --git a/doc/context/sources/general/manuals/tiptrick/tiptrick.tex b/doc/context/sources/general/manuals/tiptrick/tiptrick.tex new file mode 100644 index 000000000..54a785134 --- /dev/null +++ b/doc/context/sources/general/manuals/tiptrick/tiptrick.tex @@ -0,0 +1,117 @@ +% interface=en +% +% author: Hans Hagen - Pragma ADE - www.pragma-ade.com + +\setupbodyfont + [dejavu] + +\setuppapersize + [HD-] + +\setuplayout + [location=middle, + header=0pt, + footer=0pt, + backspace=2.25cm, + topspace=2.25cm, + width=middle, + height=middle] + +\setupcolors + [state=start] + +\startreusableMPgraphic{page} + StartPage ; + picture p ; path s ; + fill Page withcolor .5red ; + draw Page withpen pensquare scaled 2cm withcolor .75[.5red,white] ; + s := (Field[Text][Text] enlarged .5cm) squeezed (.1cm,.15cm) ; + fill s withcolor .75[.5red,white] ; + if false : + p := image (graphictext "\ss TIP" withfillcolor .2white ;) ; + else : + p := textext.raw("\ss TIP") ; + setbounds p to (boundingbox p rightenlarged -0.025bbwidth(p)) ; + fi ; + p := p xysized(PaperWidth-1cm,PaperHeight-1cm) ; + p := p shifted .5(bbwidth(Page)-bbwidth(p),bbheight(Page)-bbheight(p)) ; + draw p withcolor .2white ; + clip p to s ; + draw p withcolor .875[.5red,white] ; ; + StopPage ; +\stopreusableMPgraphic + +\defineoverlay + [page] + [\reuseMPgraphic{page}] + +\setupbackgrounds + [page] + [background=page, + state=repeat] + +\definecolor[red][r=.5] + +\setuphead + [chapter] + [style=\tfb, + before=, + after={\blank[line]}] + +\setupblank + [halfline] + +% xml interface + +\startxmlsetups xml:tips + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:tip + \startstandardmakeup + \startnamedsection[title][title=\xmlfirst{#1}{/title}] + \xmlall{#1}{/(remark|command)} + \vfill + \stopnamedsection + \stopstandardmakeup +\stopxmlsetups + +\startxmlsetups xml:remark + \blank + \xmlflush{#1} + \blank +\stopxmlsetups + +\definehighlight + [command] + [style=mono, + color=red, + command=no] + +\startxmlsetups xml:command + \blank + \starthighlight[command] + \xmlflush{#1} + \stophighlight + \blank +\stopxmlsetups + +\startxmlsetups xml:reference + \vfill + \hfill\strut see:\space + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:initialize + \xmlsetsetup {#1} { + tips|tip|remark|command|reference + } {xml:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{main}{xml:initialize} + +\starttext + + \xmlprocessfile{main}{tiptrick.xml}{} + +\stoptext diff --git a/doc/context/sources/general/manuals/tiptrick/tiptrick.xml b/doc/context/sources/general/manuals/tiptrick/tiptrick.xml new file mode 100644 index 000000000..8b4a30011 --- /dev/null +++ b/doc/context/sources/general/manuals/tiptrick/tiptrick.xml @@ -0,0 +1,53 @@ +<?xml version='1.0'?> + +<!-- author: Hans Hagen - Pragma ADE - www.pragma-ade.com --> + +<!-- feel free to submit more tips --> + +<tips xmlns="www.pragma-ade.com/schemas/tip.rng"> + + <tip> + <title>Generating Formats</title> + <remark>for all languages:</remark> + <command>context --make --all</command> + <remark>only english interface:</remark> + <command>context --make en</command> + <remark>for plain tex:</remark> + <command>mtxrun --script plain --make</command> + <!-- reference>mtexexec.pdf</reference --> + </tip> + + <tip> + <title>Updating</title> + <remark>when installed from the wiki:</remark> + <command>..../first-setup(.cmd)</command> + <remark>when downloaded from the website:</remark> + <command>cd ..../tex/texmf-context</command> + <command>wget http://www.pragma-ade.com/context/current/cont-tmf.zip</command> + <command>unzip cont-tmf.zip</command> + <command>mtxrun --generate</command> + <!-- reference>minstall.pdf</reference --> + </tip> + + <tip> + <title>Generating Command Lists</title> + <remark>quick reference document of english and dutch commands:</remark> + <command>context --interface=nl --global --result=setup-nl x-set-12.mkiv</command> + <command>context --interface=en --global --result=setup-en x-set-12.mkiv</command> + </tip> + + <tip> + <title>Module Documentation</title> + <remark>pretty printed, annotated module documentation:</remark> + <command>mtxrun --script modules syst-aux.mkiv</command> + </tip> + + <tip> + <title>Listings</title> + <remark>verbatim listings of (ascii) files:</remark> + <command>context --extra=listing --bodyfont=8pt --scite somefile.tex</command> + <command>context --extra=listing --bodyfont=8pt --scite somefile.lua</command> + <command>context --extra=listing --bodyfont=8pt --scite somefile.xml</command> + </tip> + +</tips> diff --git a/doc/context/sources/general/manuals/tools/tools-mkiv.tex b/doc/context/sources/general/manuals/tools/tools-mkiv.tex new file mode 100644 index 000000000..2ac1e15f4 --- /dev/null +++ b/doc/context/sources/general/manuals/tools/tools-mkiv.tex @@ -0,0 +1,511 @@ +% language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. + +\usemodule[abr-02] + +\setuplayout + [width=middle, + height=middle, + backspace=2cm, + topspace=1cm, + footer=0pt, + bottomspace=2cm] + +\definecolor + [DocumentColor] + [r=.5] + +\setuptype + [color=DocumentColor] + +\setuptyping + [color=DocumentColor] + +\usetypescript + [iwona] + +\setupbodyfont + [iwona] + +\setuphead + [chapter] + [style=\bfc, + color=DocumentColor] + +\setuphead + [section] + [style=\bfb, + color=DocumentColor] + +\setupinteraction + [hidden] + +\setupwhitespace + [big] + +\setupheadertexts + [] + +\setupheadertexts + [] + [{\DocumentColor \type {luatools mtxrun context}\quad\pagenumber}] + +\usesymbols[cc] + +\def\sTEXMFSTART{\type{texmfstart}} +\def\sLUATOOLS {\type{luatools}} +\def\sMTXRUN {\type{mtxrun}} +\def\sCONTEXT {\type{context}} +\def\sKPSEWHICH {\type{kpsewhich}} +\def\sMKTEXLSR {\type{mktexlsr}} +\def\sXSLTPROC {\type{xsltproc}} + +\usemodule[narrowtt] + +\startdocument + [metadata:author=Hans Hagen, + metadata:title={Tools: luatools, mtxrun, context}, + author=Hans Hagen, + affiliation=PRAGMA ADE, + location=Hasselt NL, + title=Tools, + extra-1=luatools, + extra-2=mtxrun, + extra-3=context, + support=www.contextgarden.net, + website=www.pragma-ade.nl] + +\startMPpage + StartPage ; + picture p ; p := image ( + for i=1 upto 21 : + for j=1 upto 30 : + drawarrow (fullcircle rotated uniformdeviate 360) scaled 10 shifted (i*15,j*15) ; + endfor ; + endfor ; + ) ; + p := p ysized (bbheight(Page)-4mm) ; + fill Page enlarged 2mm withcolor \MPcolor{DocumentColor} ; + draw p shifted (center Page - center p) withpen pencircle scaled 2 withcolor .5white ; + numeric dx ; dx := bbwidth(Page)/21 ; + numeric dy ; dy := bbheight(Page)/30 ; + p := textext("\tt\bf\white\getvariable{document}{extra-1}") xsized(14*dx) ; + p := p shifted (-lrcorner p) shifted lrcorner Page shifted (-1dx,8dy) ; + draw p ; + p := textext("\tt\bf\white\getvariable{document}{extra-2}") xsized(14*dx) ; + p := p shifted (-lrcorner p) shifted lrcorner Page shifted (-1dx,5dy) ; + draw p ; + p := textext("\tt\bf\white\getvariable{document}{extra-3}") xsized(14*dx) ; + p := p shifted (-lrcorner p) shifted lrcorner Page shifted (-1dx,2dy) ; + draw p ; + setbounds currentpicture to Page ; + StopPage +\stopMPpage + +\startsubject[title=Contents] + +\placelist[section][alternative=a] + +\stopsubject + +\startsection[title={Remark}] + +This manual is work in progress. Feel free to submit additions or corrections. +Before you start reading, it is good to know that in order to get starting with +\CONTEXT, the easiest way to do that is to download the standalone distribution +from \type {contextgarden.net}. After that you only need to make sure that \type +{luatex} is in your path. The main command you use is then \type {context} and +normally it does all the magic it needs itself. + +\stopsection + +\startsection[title={Introduction}] + +Right from the start \CONTEXT\ came with programs that managed the process of +\TEX-ing. Although you can perfectly well run \TEX\ directly, it is a fact that +often multiple runs are needed as well as that registers need to be sorted. +Therefore managing a job makes sense. + +First we had \TEXEXEC\ and \TEXUTIL, and both were written in \MODULA, and as +this language was not supported on all platforms the programs were rewritten in +\PERL. Following that a few more tools were shipped with \CONTEXT. + +When we moved on to \RUBY\ all the \PERL\ scripts were rewritten and when +\CONTEXT\ \MKIV\ showed up, \LUA\ replaced \RUBY. As we use \LUATEX\ this means +that currently the tools and the main program share the same language. For \MKII\ +scripts like \TEXEXEC\ will stay around but the idea is that there will be \LUA\ +alternatives for them as well. + +Because we shipped many scripts, and because the de facto standard \TEX\ +directory structure expects scripts to be in certain locations we not only ship +tools but also some more generic scripts that locate and run these tools. + +\stopsection + +\startsection[title={The location}] + +Normally you don't need to know so many details about where the scripts +are located but here they are: + +\starttyping +<texroot>/scripts/context/perl +<texroot>/scripts/context/ruby +<texroot>/scripts/context/lua +<texroot>/scripts/context/stubs +\stoptyping + +This hierarchy was actually introduced because \CONTEXT\ was shipped with a bunch +of tools. As mentioned, we nowadays focus on \LUA\ but we keep a few of the older +scripts around in the \PERL\ and \RUBY\ paths.Now, if you're only using \CONTEXT\ +\MKIV, and this is highly recommended, you can forget about all but the \LUA\ +scripts. + +\stopsection + +\startsection[title={The traditional finder}] + +When you run scripts multiple times, and in the case of \CONTEXT\ they are even +run inside other scripts, you want to minimize the startup time. Unfortunately +the traditional way to locate a script, using \sKPSEWHICH, is not that fast, +especially in a setup with many large trees Also, because not all tasks can be +done with the traditional scripts (take format generation) we provided a runner +that could deal with this: \sTEXMFSTART. As this script was also used in more +complex workflows, it had several tasks: + +\startitemize[packed] +\item locate scripts in the distribution and run them using the right + interpreter +\item do this selectively, for instance identify the need for a run using + checksums for potentially changed files (handy for image conversion) +\item pass information to child processes so that lookups are avoided +\item choose a distribution among several installed versions (set the root + of the \TEX\ tree) +\item change the working directory before running the script +\item resolve paths and names on demand and launch programs with arguments + where names are expanded controlled by prefixes (handy for + \TEX-unware programs) +\item locate and open documentation, mostly as part the help systems in + editors, but also handy for seeing what configuration file is used +\item act as a \KPSEWHICH\ server cq.\ client (only used in special cases, + and using its own database) +\stopitemize + +Of course there were the usual more obscure and undocumented features as +well. The idea was to use this runner as follows: + +\starttyping +texmfstart texexec <further arguments> +texmfstart --tree <rootoftree> texexec <further arguments> +\stoptyping + +These are just two ways of calling this program. As \sTEXMFSTART\ can initialize +the environment as well, it is basically the only script that has to be present +in the binary path. This is quite comfortable as this avoids conflicts in names +between the called scripts and other installed programs. + +Of course calls like above can be wrapped in a shell script or batch file without +penalty as long as \sTEXMFSTART\ itself is not wrapped in a caller script that +applies other inefficient lookups. If you use the \CONTEXT\ minimals you can be +sure that the most efficient method is chosen, but we've seen quite inefficient +call chains elsewhere. + +In the \CONTEXT\ minimals this script has been replaced by the one we will +discuss in the next section: \sMTXRUN\ but a stub is still provided. + +\stopsection + +\startsection[title={The current finder}] + +In \MKIV\ we went a step further and completely abandoned the traditional lookup +methods and do everything in \LUA. As we want a clear separation between +functionality we have two main controlling scripts: \sMTXRUN\ and \sLUATOOLS. The +last name may look somewhat confusing but the name is just one on in a series. +\footnote {We have \type {ctxtools}, \type {exatools}, \type {mpstools}, \type +{mtxtools}, \type {pdftools}, \type {rlxtools}, \type {runtools}, \type +{textools}, \type {tmftools} and \type {xmltools}. Most if their funtionality is +already reimplemented.} + +In \MKIV\ the \sLUATOOLS\ program is nowadays seldom used. It's just a drop in +for \sKPSEWHICH\ plus a bit more. In that respect it's rather dumb in that it +does not use the database, but clever at the same time because it can make one +based on the little information available when it runs. It can also be used to +generate format files either or not using \LUA\ stubs but in practice this is not +needed at all. + +For \CONTEXT\ users, the main invocation of this tool is when the \TEX\ tree is +updated. For instance, after adding a font to the tree or after updating +\CONTEXT, you need to run: + +\starttyping +mtxrun --generate +\stoptyping + +After that all tools will know where to find stuff and how to behave well within +the tree. This is because they share the same code, mostly because they are +started using \sMTXRUN. For instance, you process a file with: + +\starttyping +mtxrun --script context <somefile> +\stoptyping + +Because this happens often, there's also a shortcut: + +\starttyping +context <somefile> +\stoptyping + +But this does use \sMTXRUN\ as well. The help information of \sMTXRUN\ is rather +minimalistic and if you have no clue what an option does, you probably never +needed it anyway. Here we discuss a few options. We already saw that we can +explicitly ask for a script: + +\starttyping +mtxrun --script context <somefile> +\stoptyping + +but + +\starttyping +mtxrun context <somefile> +\stoptyping + +also works. However, by using \type {--script} you limit te lookup to the valid +\CONTEXT\ \MKIV\ scripts. In the \TEX\ tree these have names prefixed by \type +{mtx-} and a lookup look for a plural as well. So, the next two lookups are +equivalent: + +\starttyping +mtxrun --script font +mtxrun --script fonts +\stoptyping + +Both will run \type {mtx-fonts.lua}. Actually, this is one of the scripts that +you might need when your font database is somehow outdated and not updated +automatically: + +\starttyping +mtxrun --script fonts --reload --force +\stoptyping + +Normally \sMTXRUN\ is all you need in order to run a script. However, there are a +few more options: + +\ctxlua{os.execute("mtxrun > tools-mkiv-help.tmp")} + +\typefile[ntyping]{tools-mkiv-help.tmp} + +Don't worry,you only need those obscure features when you integrate \CONTEXT\ in +for instance a web service or when you run large projects where runs and paths +take special care. + +\stopsection + +\startsection[title={Updating}] + +There are two ways to update \CONTEXT\ \MKIV. When you manage your +trees yourself or when you use for instance \TEXLIVE, you act as +follows: + +\startitemize[packed] +\item download the file cont-tmf.zip from \type {www.pragma-ade.com} or elsewhere +\item unzip this file in a subtree, for instance \type {tex/texmf-local} +\item run \type {mtxrun --generate} +\item run \type {mtxrun --script font --reload} +\item run \type {mtxrun --script context --make} +\stopitemize + +Or shorter: + +\startitemize[packed] +\item run \type {mtxrun --generate} +\item run \type {mtxrun font --reload} +\item run \type {context --make} +\stopitemize + +Normally these commands are not even needed, but they are a nice test if your +tree is still okay. To some extend \sCONTEXT\ is clever enough to decide if the +databases need to be regenerated and|/|or a format needs to be remade and|/|or if +a new font database is needed. + +Now, if you also want to run \MKII, you need to add: + +\startitemize[packed] +\item run \type {mktexlsr} +\item run \type {texexec --make} +\stopitemize + +The question is, how to act when \sLUATOOLS\ and \sMTXRUN\ have been updated +themselves? In that case, after unzipping the archive, you need to do the +following: + +\startitemize[packed] +\item run \type {luatools --selfupdate} +\item run \type {mtxrun --selfupdate} +\stopitemize + +For quite a while we shipped so called \CONTEXT\ minimals. These zip files +contained only the resources and programs that made sense for running \CONTEXT. +Nowadays the minimals are installed and synchronized via internet. \footnote +{This project was triggered by Mojca Miklavec who is also charge of this bit of +the \CONTEXT\ infrastructure. More information can be found at \type +{contextgarden.net}.} You can just run the installer again and no additional +commands are needed. In the console you will see several calls to \sMTXRUN\ and +\sLUATOOLS\ fly by. + +\stopsection + +\startsection[title={The tools}] + +We only mention the tools here. The most important ones are \sCONTEXT\ and \type +{fonts}. You can ask for a list of installed scripts with: + +\starttyping +mtxrun --script +\stoptyping + +On my machine this gives: + +\ctxlua{os.execute("mtxrun --script > tools-mkiv-help.tmp")} + +\typefile[ntyping]{tools-mkiv-help.tmp} + +The most important scripts are \type {mtx-fonts} and \type {mtx-context}. By +default fonts are looked up by filename (the \type {file:} prefix before font +names in \CONTEXT\ is default). But you can also lookup fonts by name (\type +{name:}) or by specification (\type {spec:}). If you want to use these two +methods, you need to generate a font database as mentioned in the previous +section. You can also use the font tool to get information about the fonts +installed on your system. + +\stopsection + +\startsection[title={Running \CONTEXT}] + +The \sCONTEXT\ tool is what you will use most as it manages your +run. + +\ctxlua{os.execute("context > tools-mkiv-help.tmp")} + +\typefile[ntyping]{tools-mkiv-help.tmp} + +There are few exert options too: + +\ctxlua{os.execute("context --expert > tools-mkiv-help.tmp")} + +\typefile[ntyping]{tools-mkiv-help.tmp} + +You might as well forget about these unless you are one of the +\CONTEXT\ developers. + +\stopsection + +\startsection[title={Prefixes}] + +A handy feature of \sMTXRUN\ (and as most features an inheritance of +\sTEXMFSTART) is that it will resolve prefixed arguments. This can be of help +when you run programs that are unaware of the \TEX\ tree but nevertheless need to +locate files in it. + +\ctxlua{os.execute("mtxrun --prefixes > tools-mkiv-help.tmp")} + +\typefile[ntyping]{tools-mkiv-help.tmp} + +An example is: + +\starttyping +mtxrun --execute xsltproc file:whatever.xsl file:whatever.xml +\stoptyping + +The call to \sXSLTPROC\ will get two arguments, being the complete path to the +files (given that it can be resolved). This permits you to organize the files in +a similar was as \TEX\ files. + +\stopsection + +\startsection[title={Stubs}] + +As the tools are written in the \LUA\ language we need a \LUA\ interpreter and or +course we use \LUATEX\ itself. On \UNIX\ we can copy \sLUATOOLS\ and \sMTXRUN\ to +files in the binary path with the same name but without suffix. Starting them in +another way is a waste of time, especially when \sKPSEWHICH\ is used to find +then, something which is useless in \MKIV\ anyway. Just use these scripts +directly as they are self contained. + +For \sCONTEXT\ and other scripts that we want convenient access to, stubs are +needed, like: + +\starttyping +#!/bin/sh +mtxrun --script context "$@" +\stoptyping + +This is also quite efficient as the \sCONTEXT\ script \type {mtx-context} is +loaded in \sMTXRUN\ and uses the same database. + +On \WINDOWS\ you can copy the scripts as|-|is and associate the suffix with +\LUATEX\ (or more precisely: \type {texlua}) but then all \LUA\ script will be +run that way which is not what you might want. + +In \TEXLIVE\ stubs for starting scripts were introduced by Fabrice Popineau. Such +a stub would start for instance \sTEXMFSTART, that is: it located the script +(\PERL\ or \RUBY) in the \TEX\ tree and launched it with the right interpreter. +Later we shipped pseudo binaries of \sTEXMFSTART: a \RUBY\ interpreter plus +scripts wrapped into a self contained binary. + +For \MKIV\ we don't need such methods and started with simple batch files, +similar to the \UNIX\ startup scripts. However, these have the disadvantage that +they cannot be used in other batch files without using the \type {start} command. +In \TEXLIVE\ this is taken care of by a small binary written bij T.M.\ Trzeciak +so on \TEXLIVE\ 2009 we saw a call chain from \type {exe} to \type {cmd} to \type +{lua} which is somewhat messy. + +This is why we now use an adapted and stripped down version of that program that +is tuned for \sMTXRUN, \sLUATOOLS\ and \sCONTEXT. So, we moved from the original +\type {cmd} based approach to an \type {exe} one. + +\starttyping +mtxrun.dll +mtxrun.exe +\stoptyping + +You can copy \type {mtxrun.exe} to for instance \type {context.exe} and it will +still use \sMTXRUN\ for locating the right script. It also takes care of mapping +\sTEXMFSTART\ to \sMTXRUN. So we've removed the intermediate \type {cmd} step, +can not run the script as any program, and most of all, we're as efficient as can +be. + +Of course this program is only meaningful for the \CONTEXT\ approach to tools. + +It may all sound more complex than it is but once it works users will not notice +those details. Als, in practice not that much has changed in running the tools +between \MKII\ and \MKIV\ as we've seen no reason to change the methods. + +\stopsection + +\startsubject[title={Colofon}] + +\starttabulate[|B|p|] + \NC author \NC \documentvariable{author}, + \documentvariable{affiliation}, + \documentvariable{location} \NC \NR + \NC version \NC \currentdate \NC \NR + \NC website \NC \documentvariable{website} \endash\ + \documentvariable{support} \NC \NR + \NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR +\stoptabulate + +\stopsubject + +\stopdocument diff --git a/doc/context/sources/general/manuals/units/units-mkiv.tex b/doc/context/sources/general/manuals/units/units-mkiv.tex new file mode 100644 index 000000000..0d91c67df --- /dev/null +++ b/doc/context/sources/general/manuals/units/units-mkiv.tex @@ -0,0 +1,538 @@ +% language=uk + +\usemodule[art-01,abr-02,physics-units] + +\definecolor[red] [darkred] +\definecolor[green] [darkgreen] +\definecolor[blue] [darkblue] +\definecolor[yellow] [darkyellow] +\definecolor[magenta][darkmagenta] +\definecolor[cyan] [darkcyan] + +\definecolor[maincolor] [darkcyan] +\definecolor[extracolor][darkmagenta] + +\setupbodyfont + [10pt] + +\setuptyping + [color=extracolor] + +\setuptype + [color=extracolor] % darkyellow + +% \setupnumbering +% [alternative=doublesided] + +\setupinteraction + [hidden] + +\setuphead + [section] + [color=maincolor] + +\usesymbols[cc] + +\startdocument + [metadata:author=Hans Hagen, + metadata:title=Units, + author=Hans Hagen, + affiliation=PRAGMA ADE, + location=Hasselt NL, + title=Units, + extra=ConTeXt MkIV, + support=www.contextgarden.net, + website=www.pragma-ade.nl] + +\unexpanded\def\UnitsHack#1#2% + {\setbox\scratchbox\hbox{\bf\strut#1#2/}% kerning and such + \hbox to \wd\scratchbox{\bf\strut#1\hss/\hss#2}} + +\startMPpage + + StartPage ; + fill Page enlarged 2mm withcolor \MPcolor{darkcyan} ; + pickup pencircle scaled 2mm ; + picture p, q, r ; + p := textext("\ssbf\WORD{\documentvariable{title}}") xsized (bbheight Page - 2cm) rotated 90 ; + q := textext("\ssbf\WORD{\documentvariable{author}}") ysized 1cm ; + r := textext("\ssbf\WORD{\documentvariable{extra}}") xsized bbwidth q ; + draw anchored.rt (p, center rightboundary Page shifted (-1cm, 0mm)) withcolor white ; + draw anchored.lft(q, ulcorner Page shifted ( 1cm, -84mm)) withcolor white ; % \MPcolor{darkred} ; + draw anchored.lft(r, ulcorner Page shifted ( 1cm,-108mm)) withcolor white ; % \MPcolor{darkred} ; + StopPage ; + +\stopMPpage + +% \page[empty] \setuppagenumber[start=1] + +\startsubject[title={Contents}] + +\placelist[section][criterium=all,interaction=all] + +\stopsubject + +\startsection[title={Introduction}] + +In \CONTEXT\ \MKII\ there is a module that implements consistent +typesetting of units (quantities and dimensions). In \MKIV\ this +functionality is now part of the physics core modules. This is +also one of the mechanisms that got a new user interface: instead +of using commands we now parse text. Thanks to those users who +provided input we're more complete now that in \MKII. You can browse +the mailing list archive to get some sense of history. + +\stopsection + +\startsection[title={The main command}] + +The core command is \type {\unit}. The argument to this command gets +parsed and converted into a properly typeset dimension. Normally there +will be a quantity in front. + +\starttabulate +\NC \type{10 meter} \NC \unit{10 meter} \NC \NR +\NC \type{10 meter per second} \NC \unit{10 meter per second} \NC \NR +\NC \type{10 square meter per second} \NC \unit{10 square meter per second} \NC \NR +\stoptabulate + +The parser knows about special cases, like synonyms: + +\starttabulate +\NC \type{10 degree celsius} \NC \unit{10 degree celsius} \NC \NR +\NC \type{10 degrees celsius} \NC \unit{10 degrees celsius} \NC \NR +\NC \type{10 celsius} \NC \unit{10 celsius} \NC \NR +\stoptabulate + +The units can be rather complex, for example: + +\startbuffer +\unit{30 kilo pascal square meter / second kelvin} +\stopbuffer + +\typebuffer + +This comes out as: \ignorespaces\getbuffer\removeunwantedspaces. Depending +on the unit at had, recognition is quite flexible. The following variants +all work out ok. + +\starttabulate +\NC \type{10 kilogram} \NC \unit{10 kilogram} \NC \NR +\NC \type{10 kilo gram} \NC \unit{10 kilo gram} \NC \NR +\NC \type{10 k gram} \NC \unit{10 k gram} \NC \NR +\NC \type{10 kilo g} \NC \unit{10 kilo g} \NC \NR +\NC \type{10 k g} \NC \unit{10 k g} \NC \NR +\NC \type{10 kg} \NC \unit{10 kg} \NC \NR +\NC \type{10 kilog} \NC \unit{10 kilog} \NC \NR +\NC \type{10 kgram} \NC \unit{10 kgram} \NC \NR +\stoptabulate + +Of course being consistent makes sense, so normally you will use +a consistent mix of short or long keywords. + +You can provide a qualifier that gets lowered and appended to +the preceding unit. + +\startbuffer +\unit{112 decibel (A)} +\stopbuffer + +\typebuffer + +This gives: \ignorespaces\getbuffer\removeunwantedspaces. Combinations +are also possible: + +\starttabulate +\NC \type{5 watt per meter celsius} \NC \unit{5 watt per meter celsius} \NC \NR +\NC \type{5 watt per meter degrees celsius} \NC \unit{5 watt per meter degrees celsius} \NC \NR +\NC \type{5 watt per meter kelvin} \NC \unit{5 watt per meter kelvin} \NC \NR +\NC \type{5 watt per meter per kelvin} \NC \unit{5 watt per meter per kelvin} \NC \NR +\NC \type{10 arcminute} \NC \unit{10 arcminute} \NC \NR +\NC \type{10 arcminute 20 arcsecond} \NC \unit{10 arcminute 20 arcsecond} \NC \NR +\stoptabulate + +\stopsection + +\startsection[title={Extra units}] + +To some extent units can be tuned. You can for instance +influence the spacing between a number and a unit: + +\startbuffer + \unit{35 kilogram per cubic meter} +\setupunit[space=normal] \unit{35 kilogram per cubic meter} +\setupunit[space=big] \unit{35 kilogram per cubic meter} +\setupunit[space=medium] \unit{35 kilogram per cubic meter} +\setupunit[space=small] \unit{35 kilogram per cubic meter} +\setupunit[space=none] \unit{35 kilogram per cubic meter} +\stopbuffer + +\typebuffer + +Of course no spacing looks rather bad: + +\startlines +\getbuffer +\stoplines + +Another parameter is \type {separator}. In order to demonstrate +this we define an extra unit command: + +\startbuffer +\defineunit[sunit][separator=small] +\defineunit[nunit][separator=none] +\stopbuffer + +\typebuffer \getbuffer + +We now have two more commands: + +\startbuffer +\unit {35 kilogram cubic meter} +\sunit{35 kilogram cubic meter} +\nunit{35 kilogram cubic meter} +\stopbuffer + +\typebuffer + +These three commands give different results: + +\startlines +\getbuffer +\stoplines + +Valid separators are \type {normal}, \type {big}, \type {medium}, +\type {small}, \type {none}. You can let units stand out by +applying color or a specific style. + +\startbuffer +\setupunit[style=\bi,color=maincolor] +\unit{10 square meter per second} +\stopbuffer + +\typebuffer + +Keep in mind that all defined units inherit from their parent +definition unless they are set up themselves. + +\start \blank \getbuffer \blank \stop + +To some extent you can control rendering in text and math mode. As +an example we define an extra instance. + +\startbuffer +\defineunit[textunit][alternative=text] +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +test \unit {10 cubic meter per second} test +test \textunit{10 cubic meter per second} test +test $\unit {10 cubic meter per second}$ test +test $\textunit{10 cubic meter per second}$ test +test 10 \unit {cubic meter per second} test +test 10 \textunit{cubic meter per second} test +test $10 \unit {cubic meter per second}$ test +test $10 \textunit{cubic meter per second}$ test +\stopbuffer + +\typebuffer + +\startlines +\getbuffer +\stoplines + +\stopsection + +\startsection[title={Labels}] + +The units, prefixes and operators are typeset using the label +mechanism which means that they can be made to adapt to a language +and|/|or adapted. Instead of language specific labels you can also +introduce mappings that don't relate to a language at all. As an +example we define some bogus mapping. + +\startbuffer +\setupunittext + [whatever] + [meter=retem, + second=dnoces] + +\setupprefixtext + [whatever] + [kilo=olik] + +\setupoperatortext + [whatever] + [solidus={ rep }] +\stopbuffer + +\typebuffer \getbuffer + +Such a mapping can be partial and the current language will +be the default fallback and itselfs falls back on the English +language mapping. + +\startbuffer +\unit{10 km/s} +\unit{10 Kilo Meter/s} +\unit{10 kilo Meter/s} +\unit{10 Kilo m/s} +\unit{10 k Meter/s} +\stopbuffer + +\typebuffer + +When we typeset this we get the normal rendering: + +\startlines +\getbuffer +\stoplines + +However, when we change the language parameter, we get +a different result: + +\startlines +\setupunit[language=whatever]\getbuffer +\stoplines + +The alternative rendering is set up as follows: + +\starttyping +\setupunit[language=whatever] +\stoptyping + +You can also decide to use a special instance of units: + +\starttyping +\defineunit[wunit][language=whatever] +\stoptyping + +This will define the \type {\wunit} command and leave the original +\type {\unit} command untouched. + +\stopsection + +\startsection[title={Digits}] + +In addition to units we have digits. These can be used independently +but the same functionality is also integrated in the unit commands. +The main purpose of this command is formatting in tables, of which +we give an example below. + +\starttabulate[|l|r|] +\NC \type{12,345.67 kilogram} \NC \unit{12,345.67 kilogram} \NR +\NC \type{__,__1.23 kilogram} \NC \unit{__,__1.23 kilogram} \NR +\NC \type{__,___.12 kilogram} \NC \unit{__,___.12 kilogram} \NR +\NC \type{__,__1.== kilogram} \NC \unit{__,__1.== kilogram} \NR +\NC \type{__,___:23 kilogram} \NC \unit{__,___:23 kilogram} \NR +\stoptabulate + +The \type {_} character serves as placeholders. There are some +assumptions to how numbers are constructed. In principe the input +assumes a comma to separate thousands and a period to separate the +fraction. + +\getbuffer + +You can swap periods and commas in the output. In fact there are a +few methods available. For instance we can separate the thousands +with a small space instead of a symbol. + +\startbuffer +\starttabulate[|c|r|r|] +\HL +\NC 0 \NC \setupunit[method=0]\unit{00,000.10 kilogram} + \NC \setupunit[method=0]\unit{@@,@@0.10 kilogram} \NC \NR +\NC 1 \NC \setupunit[method=1]\unit{00,000.10 kilogram} + \NC \setupunit[method=1]\unit{@@,@@0.10 kilogram} \NC \NR +\NC 2 \NC \setupunit[method=2]\unit{00,000.10 kilogram} + \NC \setupunit[method=2]\unit{@@,@@0.10 kilogram} \NC \NR +\NC 3 \NC \setupunit[method=3]\unit{00,000.10 kilogram} + \NC \setupunit[method=3]\unit{@@,@@0.10 kilogram} \NC \NR +\NC 4 \NC \setupunit[method=4]\unit{00,000.10 kilogram} + \NC \setupunit[method=4]\unit{@@,@@0.10 kilogram} \NC \NR +\NC 5 \NC \setupunit[method=5]\unit{00,000.10 kilogram} + \NC \setupunit[method=5]\unit{@@,@@0.10 kilogram} \NC \NR +\NC 6 \NC \setupunit[method=6]\unit{00,000.10 kilogram} + \NC \setupunit[method=6]\unit{@@,@@0.10 kilogram} \NC \NR +\HL +\stoptabulate +\stopbuffer + +\typebuffer % [bodyfont=9pt] + +\getbuffer + +The digit modes can be summarized as:: + +\startitemize[n,packed] +\item periods/comma +\item commas/period +\item thinmuskips/comma +\item thinmuskips/period +\item thickmuskips/comma +\item thickmuskips/period +\stopitemize + +You can reverse the order of commas and period in the input by +setting the parameter \type {order} to \type {reverse}. + +The digit parser handles a bunch of special characters as +well as different formats. We strongly suggest you to use +the grouped call. + +\starttabulate[|l|l|l|] +\NC \type{.} \NC , . \NC comma or period \NC \NR +\NC \type{,} \NC , . \NC comma or period \NC \NR +\NC \type{:} \NC \NC invisible period \NC \NR +\NC \type{;} \NC \NC invisible comma \NC \NR +\NC \type{_} \NC \NC invisible space \NC \NR +\NC \type{/} \NC \NC invisible sign \NC \NR +\NC \type{-} \NC $-$ \NC minus sign \NC \NR +\NC \type{+} \NC $+$ \NC plus sign \NC \NR +\NC \type{//} \NC \NC invisible high sign \NC \NR +\NC \type{--} \NC $\negative$ \NC high minus sign \NC \NR +\NC \type{++} \NC $\positive$ \NC high plus sign \NC \NR +\NC \type{=} \NC $\zeroamount$ \NC zero padding \NC \NR +\stoptabulate + +Let's give some examples: + +\starttabulate[|l|r|] +\NC \type{1} \NC \ruledhbox{\strut\digits{1}} \NC \NR +\NC \type{12} \NC \ruledhbox{\strut\digits{12}} \NC \NR +\NC \type{12.34} \NC \ruledhbox{\strut\digits{12.34}} \NC \NR +\NC \type{123,456} \NC \ruledhbox{\strut\digits{123,456}} \NC \NR +\NC \type{123,456.78} \NC \ruledhbox{\strut\digits{123,456.78}} \NC \NR +\NC \type{12,34} \NC \ruledhbox{\strut\digits{12,34}} \NC \NR +\NC \type{.1234} \NC \ruledhbox{\strut\digits{.1234}} \NC \NR +\NC \type{1234} \NC \ruledhbox{\strut\digits{1234}} \NC \NR +\NC \type{123,456.78^9} \NC \ruledhbox{\strut\digits{123,456.78^9}} \NC \NR +\NC \type{123,456.78e9} \NC \ruledhbox{\strut\digits{123,456.78e9}} \NC \NR +\NC \type{/123,456.78e-9} \NC \ruledhbox{\strut\digits{/123,456.78e-9}} \NC \NR +\NC \type{-123,456.78e-9} \NC \ruledhbox{\strut\digits{-123,456.78e-9}} \NC \NR +\NC \type{+123,456.78e-9} \NC \ruledhbox{\strut\digits{+123,456.78e-9}} \NC \NR +\NC \type{//123,456.78e-9} \NC \ruledhbox{\strut\digits{//123,456.78e-9}} \NC \NR +\NC \type{--123,456.78e-9} \NC \ruledhbox{\strut\digits{--123,456.78e-9}} \NC \NR +\NC \type{++123,456.78e-9} \NC \ruledhbox{\strut\digits{++123,456.78e-9}} \NC \NR +\NC \type{___,___,123,456,789.00} \NC \ruledhbox{\strut\digits{___,___,123,456,789.00}} \NC \NR +\NC \type{___,___,_12,345,678.==} \NC \ruledhbox{\strut\digits{___,___,_12,345,678.==}} \NC \NR +\stoptabulate + +\stopsection + +\startsection[title={Adding units}] + +It is possible to add extra snippets. This is a two step process: +first some snippet is defined, next a proper label is set up. In the +next example we define a couple of \TEX\ dimensions: + +\startbuffer +\registerunit + [unit] + [point=point, + basepoint=basepoint, + scaledpoint=scaledpoint, + didot=didot, + cicero=cicero] +\stopbuffer + +\typebuffer \getbuffer + +Possible categories are: \type {prefix}, \type {unit}, \type {operator}, +\type {suffix}, \type {symbol},\type {packaged}. Next we define labels: + +\startbuffer +\setupunittext + [point=pt, + basepoint=bp, + scaledpoint=sp, + didot=dd, + cicero=cc] +\stopbuffer + +\typebuffer \getbuffer + +Now we can use use these: + +\startbuffer +\unit{10 point / second} +\stopbuffer + +\typebuffer + +Of course you can wonder what this means. + +\blank \getbuffer \blank + +When no label is defined the long name is used: + +\startbuffer +\registerunit + [unit] + [page=page] +\stopbuffer + +\typebuffer \getbuffer + +This is used as: + +\startbuffer +\unit{10 point / page} +\stopbuffer + +\typebuffer + +Which gives: + +\blank \getbuffer \blank + +\stopsection + +\startsection[title={Built in keywords}] + +A given sequence of keywords is translated in an list of internal +keywords. For instance \type {m}, \type {Meter} and \type {meter} +all become \type {meter} and that one is used when resolving a +label. In the next tables the right column mentions the internal +keyword. The right column shows the Cased variant, but a lowercase +one is built|-|in as well. + +The following prefixes are built|-|in: + +\showunits[prefixes] + +The following units are supported, including some combinations: + +\showunits[units] + +The amount of operators is small: + +\showunits[operators] + +There is also a small set of (names) suffixes: + +\showunits[suffixes] + +Some symbols get a special treatment: + +\showunits[symbols] + +These are also special: + +\showunits[packaged] + +\startsection[title={Colofon}] + +\starttabulate[|B|p|] +\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR +\NC version \NC \currentdate \NC \NR +\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR +\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR +\stoptabulate + +\stopsection + +\stopdocument diff --git a/doc/context/sources/general/manuals/workflows/workflows-contents.tex b/doc/context/sources/general/manuals/workflows/workflows-contents.tex new file mode 100644 index 000000000..a32f4737d --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-contents.tex @@ -0,0 +1,13 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-contents + +\starttitle[title=Contents] + + \placelist[chapter] + +\stoptitle + +\stopcomponent diff --git a/doc/context/sources/general/manuals/workflows/workflows-graphics.tex b/doc/context/sources/general/manuals/workflows/workflows-graphics.tex new file mode 100644 index 000000000..55a8ad701 --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-graphics.tex @@ -0,0 +1,157 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-graphics + +\startchapter[title=Graphics] + +\startsection[title=Bad names] + +After many years of using \CONTEXT\ in workflows where large amounts of source files +as well as graphics were involved we can safely say that it's hard for publishers to +control the way these are named. This is probably due to the fact that in a +click|-|and|-|point based desktop publishing workflow names don't matter as one stays on +one machine, and names are only entered once (after that these names become abstractions and +get cut and pasted). Proper consistent resource managament is simply not part of the flow. + +This means that you get names like: + +\starttyping +foo_Bar_01_03-a.EPS +foo__Bar-01a_03.eps +foo__Bar-01a_03.eps +foo BarA 01-03.eps +\stoptyping + +Especially when a non proportional screen font is used multiple spaces can look +like one. In fancy screen fonts upper and lowercase usage might get obscured. It +really makes one wonder if copy|-|editing or adding labels to graphics isn't +suffering from the same problem. + +Anyhow, as in an automated rendering workflow the rendering is often the last step you +can imagine that when names get messed up it's that last step that gets blamed. It's not +that hard to sanitize names of files on disk as well as in the files that refer to them, +and we normally do that we have complete control. This is no option when all the resources +are synchronzied from elsewhere. In that case the only way out is signaling potential +issues. Say that in the source file there is a reference: + +\starttyping +foo_Bar_01_03-a.EPS +\stoptyping + +and that the graphic on disk has the same name, but for some reason after an update +has become: + +\starttyping +foo-Bar_01_03-a.EPS +\stoptyping + +The old image is probably still there so the update is not reflected in the final +product. This is not that uncommon when you deal with tens of thousands of files, +many editors and graphic designers, and no strict filename policy. + +For this we provide the following tracing option: + +\starttyping +\enabletrackers[graphics.lognames] +\stoptyping + +This will put information in the log file about included graphics, like: + +\starttyping +system > graphics > start names + +used graphic > asked : cow.pdf +used graphic > comment : not found +used graphic > asked : t:/sources/cow.pdf +used graphic > format : pdf +used graphic > found : t:/sources/cow.pdf +used graphic > used : t:/sources/cow.pdf + +system > graphics > stop names +\stoptyping + +You can also add information to the file itself: + +\starttyping +\usemodule[s-figures-names] +\stoptyping + +Of course that has to be done at the end of the document. Bad names are reported +and suitable action can be taken. + +\stopsection + +\startsection[title=Downsampling] + +You can plug in you rown converter, here is an example: + +\starttyping +\startluacode + +figures.converters.jpg = figures.converters.jpg or { } + +figures.converters.jpg["lowresjpg.pdf"] = + function(oldname,newname,resolution) + figures.programs.run ( + [[gm]], + [[convert -geometry %nx%x%ny% -compress JPEG "%old%" "%new%"]], + { + old = old, + new = new, + nx = resolution or 300, + ny = resolution or 300, + } + ) + end +\stopluacode +\stoptyping + +You can limit the search to a few types and set the resolution with: + +\starttyping +\setupexternalfigures + [order={pdf,jpg}, + resolution=100, + method=auto] +\stoptyping + +And use it like: + +\starttyping +\externalfigure[verybig.jpg][height=10cm] +\stoptyping + +The second string passed to the \type {run} helper contains the arguments to the +first one. The variables between percent signs get replaced by the variables in +the tables passed as third argument. + +\stopsection + +\startsection[title=Trackers] + +If you want a lot of info you can say: + +\starttyping +\enabletrackers[figures.*] +\stoptyping + +But you can be more specific. With \type {graphics.locating} you will get some +insight in where files are looked for. The \type {graphics.inclusion} tracker +gives some more info about actual inclusion. The \type {graphics.bases} is kind +of special and only makes sense when you use the graphic database options. The +\type {graphics.conversion} and related tracker \type {graphics.programs} show if +and how conversion of images takes place. + +The \type {graphics.lognames} will make sure that some extra information about +used graphics is saved in the log file, while \type {graphics.usage} will produce +a file \typ {<jobname>-figures-usage.lua} that contains information about found +(or not found) images and the way they are used. + +\stopsection + +\stopchapter + +\stopcomponent + diff --git a/doc/context/sources/general/manuals/workflows/workflows-injectors.tex b/doc/context/sources/general/manuals/workflows/workflows-injectors.tex new file mode 100644 index 000000000..daae11c82 --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-injectors.tex @@ -0,0 +1,102 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-injectors + +\startchapter[title={Injectors}] + +When you have no control over the source but need to manually tweak some aspects +of the typesetting, like an occasional page break of column switch, you can use +the injector mechanism. This mechanism is part of list and register building but +can also be used elsewhere. + +\startbuffer[one] +\startmixedcolumns[balance=yes] + \dotestinjector{test}line 1 \par + \dotestinjector{test}line 2 \par + \dotestinjector{test}line 3 \par + \dotestinjector{test}line 4 \par + \dotestinjector{test}line 5 +\stopmixedcolumns +\stopbuffer + +\startbuffer[two] +\startmixedcolumns[balance=yes] + \dotestinjector{test}line 1 \par + \dotestinjector{test}line 2 \par + \dotestinjector{test}line 3 \par + \dotestinjector{test}line 4 \par + \dotestinjector{test}line 5 +\stopmixedcolumns +\stopbuffer + +We have two buffers: + +\typebuffer[one] + +and + +\typebuffer[two] + +When typeset these come out as: + +\blank \startpacked \bf \getbuffer[one] \stoppacked \blank + +and + +\blank \startpacked \bf \getbuffer[two] \stoppacked \blank + +We can enable (and show) the injectors with: + +\startbuffer +\doactivateinjector{test} \showinjector +\stopbuffer + +\typebuffer \getbuffer + +Now we get: + +\blank \startpacked \bf \getbuffer[one] \stoppacked \blank + +and + +\blank \startpacked \bf \getbuffer[two] \stoppacked \blank + +The small numbers are injector points. These will of course change when we add +more in|-|between. Let's add actions to some of the injection points: + +\startbuffer +\setinjector[test][13][{\column}] +\setinjector[test][17][{\column}] +\stopbuffer + +\typebuffer \getbuffer + +As expected we now get column breaks: + +\blank \startpacked \bf \getbuffer[one] \stoppacked \blank + +and + +\blank \startpacked \bf \getbuffer[two] \stoppacked \blank + +\stopchapter + +\stopcomponent + +% to be described: + +% \setinjector[register][3][\column] +% \setinjector[list] [2][{\blank[3*big]}] + +% \starttext +% \placelist[section][criterium=text] +% \blank[3*big] +% \placeregister[index][criterium=text] +% \page +% \startsection[title=Alpha] first \index{first} \stopsection +% \startsection[title=Beta] second \index{second} \stopsection +% \startsection[title=Gamma] third \index{third} \stopsection +% \startsection[title=Delta] fourth \index{fourth} \stopsection +% \stoptext diff --git a/doc/context/sources/general/manuals/workflows/workflows-introduction.tex b/doc/context/sources/general/manuals/workflows/workflows-introduction.tex new file mode 100644 index 000000000..a88640b27 --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-introduction.tex @@ -0,0 +1,25 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-introduction + +\startchapter[title=Introduction] + +This manual contains some information about features that can help you to manage +workflows or \CONTEXT\ related processes. Because we use \CONTEXT\ ourselves all +that we need ends up in the distribution. When you discover something workflow +related that is not yet covered here, you can tell me. I simply forget about all +there is, especially if it's made for projects. Don't expect this manual to be +complete or extensive, it's just a goodie. + +\startlines +\documentvariable{author}, +\documentvariable{affiliation} +\documentvariable{location} +\currentdate[month,year] +\stoplines + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex b/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex new file mode 100644 index 000000000..3820e04fa --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-mkiv.tex @@ -0,0 +1,32 @@ +\setupbackend[export=yes] + +\environment workflows-style + +\startdocument + [metadata:author=Hans Hagen, + metadata:title=Workflow support in context, + author=Hans Hagen, + affiliation=PRAGMA ADE, + location=Hasselt NL, + title=workflow, + extra=support in context, + support=www.contextgarden.net, + website=www.pragma-ade.nl] + +\component workflows-titlepage + +\startfrontmatter + \component workflows-contents + \component workflows-introduction +\stopfrontmatter + +\startbodymatter + \component workflows-resources + \component workflows-graphics + \component workflows-suspects + \component workflows-injectors + \component workflows-xml + \component workflows-setups +\stopbodymatter + +\stopdocument diff --git a/doc/context/sources/general/manuals/workflows/workflows-resources.tex b/doc/context/sources/general/manuals/workflows/workflows-resources.tex new file mode 100644 index 000000000..cbed64864 --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-resources.tex @@ -0,0 +1,156 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-resources + +\startchapter[title=Accessing resources] + +One of the benefits of \TEX\ is that you can use it in automated workflows +where large quantities of data is involved. A document can consist of +several files and normally also includes images. Of course there are styles +involved too. At \PRAGMA\ normally put styles and fonts in: + +\starttyping +/data/site/context/tex/texmf-project/tex/context/user/<project>/... +/data/site/context/tex/texmf-fonts/data/<foundry>/<collection>/... +\stoptyping + +alongside + +\starttyping +/data/framework/... +\stoptyping + +where the job management services are put, while we put resources in: + +\starttyping +/data/resources/... +\stoptyping + +The processing happens in: + +\starttyping +/data/work/<uuid user space>/ +\stoptyping + +Putting styles (and resources like logos and common images) and fonts (if the +project has specific ones not present in the distribution) in the \TEX\ tree +makes sense because that is where such files are normally searched. Of course you +need to keep the distributions file database upto|-|date after adding files there. + +Processing has to happen isolated from other runs so there we use unique +locations. The services responsible for running also deal with regular cleanup +of these temporary files. + +Resources are somewhat special. They can be stable, i.e.\ change seldom, but more +often they are updated or extended periodically (or even daily). We're not +talking of a few files here but of thousands. In one project we have 20 thousand +resources, that can be combined into arbitrary books, and in another one, each +chapter alone is about 400 \XML\ and image files. That means we can have 5000 +files per book and as we have at least 20 books, we end up with 100K files. In +the first case accessing the resources is easy because there is a well defined +structure (under our control) so we know exactly where each file sits in the +resource tree. In the 100K case there is a deeper structure which is in itself +predictable but because many authors are involved the references to these files +are somewhat instable (and undefined). It is surprising to notice that publishers +don't care about filenames (read: cannot control all the parties involved) which +means that we have inconsist use of mixed case in filenames, and spaces, +underscores and dashes creeping in. Because typesetting for paper is always at +the end of the pipeline (which nowadays is mostly driven by (limitations) of web +products) we need to have a robust and flexible lookup mechanism. It's a side +effect of the click and point culture: if objects are associated (filename in +source file with file on the system) anything you key in will work, and +consistency completely depends on the user. And bad things then happen when files +are copied, renamed, etc. In that stadium we can better be tolerant than try to +get it fixed. \footnote {From what we normally receive we often conclude that +copy|-|editing and image production companies don't impose any discipline or +probably simply lack the tools and methods to control this. Some of our workflows +had checkers and fixers, so that when we got 5000 new resources while only a few +needed to be replaced we could filter the right ones. It was not uncommon to find +duplicates for thousands of pictures: similar or older variants.} + +\starttyping +foo.jpg +bar/foo.jpg +images/bar/foo.jpg +images/foo.jpg +\stoptyping + +The xml files have names like: + +\starttyping +b-c.xml +a/b-c.jpg +a/b/b-c.jpg +a/b/c/b-c.jpg +\stoptyping + +So it's sort of a mess, especially if you add arbitrary casing to this. Of course +one can argue that a wrong (relative) location is asking for problems, it's less +an issue here because each image has a unique name. We could flatten the resource +tree but having tens of thousands of files on one directory is asking for +problems when you want to manage them. + +The typesetting (and related services) run on virtual machines. The three +directories: + +\starttyping +/data/site +/data/resources +/data/work +\stoptyping + +are all mounted as nfs shares on a network storage. For the styles (and binaries) +this is no big deal as normally these files are cached, but the resources are +another story. Scanning the complete (mounted) resource tree each run is no +option so there we use a special mechanism in \CONTEXT\ for locating files. + +Already early in the development of \MKIV\ one of the locating mechanisms was +the following: + +\starttyping +tree:////data/resources/foo/**/drawing.jpg +tree:////data/resources/foo/**/Drawing.jpg +\stoptyping + +Here the tree is scanned once per run, which is normally quite okay when there +are not that many files and when the files reside on the machine itself. For a +more high performance approach using network shares we have a different +mechanism. This time it looks like this: + +\starttyping +dirlist:/data/resources/**/drawing.jpg +dirlist:/data/resources/**/Drawing.jpg +dirlist:/data/resources/**/just/some/place/drawing.jpg +dirlist:/data/resources/**/images/drawing.jpg +dirlist:/data/resources/**/images/drawing.jpg?option=fileonly +dirfile:/data/resources/**/images/drawing.jpg +\stoptyping + +The first two lookups are wildcard. If there is a file with that name, it will be +found. If there are more, the first hit is used. The second and third examples +are more selective. Here the part after the \type {**} has to match too. So here +we can deal with multiple files named \type {drawing.jpg}. The last two +equivalent examples are more tolerant. If no explicit match is found, a lookup +happens without being selective. The case of a name is ignored but when found, a +name with the right case is used. + +You can hook a path into the resolver for source files, for example: + +\starttyping +\usepath [dirfile://./resources/**] +\setupexternalfigures[directory=dirfile://./resources/**] +\stoptyping + +You need to make sure that file(name)s in that location don't override ones in +the regular \TEX\ tree. These extra paths are only used for source file lookups +so for instance font lookups are not affected. + +When you add, remove or move files the tree, you need to remove the \type +{dirlist.*} files in the root because these are used for locating files. A new +file will be generated automatically. Don't forget this! + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/workflows/workflows-setups.tex b/doc/context/sources/general/manuals/workflows/workflows-setups.tex new file mode 100644 index 000000000..e9d120f7b --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-setups.tex @@ -0,0 +1,72 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-setups + +\startchapter[title={Setups}] + +Setups are a powerful way to organize styles. They are basically macros but live +in their own namespace. One advantage is that spaces in a setup are ignored so +you can code without bothering about spurious spaces. Here is a trick that you +can use when one style contains directives for multiple products: + +\startbuffer +\startsetups tex:whatever + \fastsetup{tex:whatever:\documentvariable{stylevariant}} +\stopsetups + +\startsetups tex:whatever:foo + FOO +\stopsetups + +\startsetups tex:whatever:bar + BAR +\stopsetups +\stopbuffer + +\typebuffer \getbuffer + +Here we define a main setup \type {tex:whatever} that gets expanded in one of two +variants, controlled by a document variable. + +\startbuffer +\setups{tex:whatever} + +\setupdocument + [stylevariant=foo] + +\setups{tex:whatever} + +\setupdocument + [stylevariant=bar] + +\setups{tex:whatever} +\stopbuffer + +\typebuffer + +These lines result in: + +\getbuffer + +In a similar fashion you can define \XML\ setups that are used to render +elements: + +\starttyping +\startxmlsetups xml:whatever + \xmlsetup{#1}{xml:whatever:\documentvariable{stylevariant}} +\stopxmlsetups + +\startxmlsetups xml:whatever:foo + FOO: \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:whatever:bar + BAR: \xmlflush{#1} +\stopxmlsetups +\stoptyping + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/workflows/workflows-style.tex b/doc/context/sources/general/manuals/workflows/workflows-style.tex new file mode 100644 index 000000000..f29129fcd --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-style.tex @@ -0,0 +1,49 @@ +\startenvironment workflows-style + +\usemodule + [abr-03] + +\setupbodyfont + [bookman,11pt] + +\definecolor + [maincolor] + [s=.35] + +\setuplayout + [height=middle, + width=middle, + footer=0pt] + +\setupwhitespace + [big] + +\setuphead + [chapter] + [style=\bfc, + color=maincolor, + header=high] + +\setuphead + [section] + [style=\bfb, + color=maincolor] + +\setuptyping + [color=maincolor] + +\setuptype + [color=maincolor] + +\setupdocument + [metadata:author=<author>, + metadata:title=<title>, + author=<author>, + affiliation=<affiliation>, + location=<location>, + title=<title>, + extra=<extra>, + support=<support>, + website=<website>] + +\stopenvironment diff --git a/doc/context/sources/general/manuals/workflows/workflows-suspects.tex b/doc/context/sources/general/manuals/workflows/workflows-suspects.tex new file mode 100644 index 000000000..621fd6f59 --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-suspects.tex @@ -0,0 +1,54 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-suspects + +\startchapter[title={Suspects}] + +When many authors and editors are involved there is the danger of inconsistent +spacing being applied. We're not only talking of the (often invisible in editing +programs) nobreak spaces, but also spacing inside or outside quotations and +before and after punctuation or around math. + +In \CONTEXT\ we have a built||in suspects checker that you can enable with the +following command: + +\starttyping +\enabletrackers[typesetters.suspects] +\stoptyping + +The next table shows some identified suspects. + +\starttexdefinition ShowSample #1 + \NC \type{#1} + \NC \enabletrackers[typesetters.suspects]#1\disabletrackers[typesetters.spacing] + \NC \NR +\stoptexdefinition + +\starttabulate[|||][before=,after=] + \ShowSample{foo$x$} + \ShowSample{$x$bar} + \ShowSample{foo$x$bar} + \ShowSample{$f+o+o$:} + \ShowSample{;$f+o+o$} + \ShowSample{; bar} + \ShowSample{foo:bar} + \ShowSample{\quote{ foo }} + \ShowSample{\quote{bar }} + \ShowSample{\quote{ bar}} + \ShowSample{(foo )} + \ShowSample{\{foo \}} + \ShowSample{foo{\bf gnu}bar} + \ShowSample{foo{\it gnu}bar} + \ShowSample{foo$x^2$bar} + \ShowSample{foo\nobreakspace bar} +\stoptabulate + +Of course this analysis is not perfect but we use it in final checking of complex +documents that are generated automatically from \XML. \footnote {Think of math +school books where each book is assembled from over a thousands files.} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex b/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex new file mode 100644 index 000000000..f184152b3 --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-titlepage.tex @@ -0,0 +1,37 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-titlepage + +\definefontfeature[LatinModernMonoVariable][default][liga=no] +\definefont[LatinModernMonoVariable][LMTypewriterVarWd-Regular*LatinModernMonoVariable sa 1] + +\startMPpage + + fill fullsquare xysized(PaperWidth,PaperHeight) withcolor .4white ; + + draw image ( + fill arrowhead fullcircle scaled .5 rotated 0 scaled 10 withcolor white ; + fill arrowhead fullcircle scaled .5 rotated 120 scaled 10 withcolor white ; + fill arrowhead fullcircle scaled .5 rotated 240 scaled 10 withcolor white ; + fill arrowhead fullcircle scaled .5 rotated 60 scaled 10 withcolor white ; + fill arrowhead fullcircle scaled .5 rotated 180 scaled 10 withcolor white ; + fill arrowhead fullcircle scaled .5 rotated 300 scaled 10 withcolor white ; + ) xsized (.9PaperWidth) shifted (0,.2PaperWidth) ; + + draw image ( + fill arrowhead fullcircle scaled .5 rotated 0 scaled 10 withcolor .4red withtransparency (1,.5) ; + fill arrowhead fullcircle scaled .5 rotated 120 scaled 10 withcolor .4green withtransparency (1,.5) ; + fill arrowhead fullcircle scaled .5 rotated 240 scaled 10 withcolor .4blue withtransparency (1,.5) ; + fill arrowhead fullcircle scaled .5 rotated 60 scaled 10 withcolor .4cyan withtransparency (1,.5) ; + fill arrowhead fullcircle scaled .5 rotated 180 scaled 10 withcolor .4magenta withtransparency (1,.5) ; + fill arrowhead fullcircle scaled .5 rotated 300 scaled 10 withcolor .4yellow withtransparency (1,.5) ; + ) xsized (.9PaperWidth) shifted (0,.2PaperWidth) ; + + draw textext ("\LatinModernMonoVariable \documentvariable{title}") xsized (.9PaperWidth) shifted (0,-.425PaperWidth) withcolor white ; + draw textext ("\LatinModernMonoVariable \documentvariable{extra}") xsized (.9PaperWidth) shifted (0,-.575PaperWidth) withcolor white ; + +\stopMPpage + +\stopcomponent diff --git a/doc/context/sources/general/manuals/workflows/workflows-xml.tex b/doc/context/sources/general/manuals/workflows/workflows-xml.tex new file mode 100644 index 000000000..0f29f5f55 --- /dev/null +++ b/doc/context/sources/general/manuals/workflows/workflows-xml.tex @@ -0,0 +1,96 @@ +% language=uk + +\environment workflows-style + +\startcomponent workflows-xml + +\startluacode + for i=1,10 do + local filename = string.formatters["temp-%02i.xml"](i) + local filedata = string.formatters["<?xml version='1.0'?><p>snippet %i</p>"](i) + io.savedata(filename,filedata) + end +\stopluacode + +\startchapter[title={XML}] + +When you have an \XML\ project with many files involved, finding the right spot +of something that went wrong can be a pain. In one of our project the production of +some 50 books involves 60.000 \XML\ files and 20.000 images. Say that we have the +following file: + +\startbuffer[demo] +<?xml version='1.0'?> +<document> + <include name="temp-01.xml"/> <include name="temp-02.xml"/> + <include name="temp-03.xml"/> <include name="temp-04.xml"/> + <include name="temp-05.xml"/> <include name="temp-06.xml"/> + <include name="temp-07.xml"/> <include name="temp-08.xml"/> + <include name="temp-09.xml"/> <include name="temp-10.xml"/> +</document> +\stopbuffer + +\typebuffer[demo] + +Before we process this file we will merge the content of the files defined +as includes into it. When this happens the filename is automatically +registered so it can be accessed later. + +\startbuffer +\startxmlsetups xml:initialize + \xmlincludeoptions{#1}{include}{filename|name}{recurse,basename} + \xmlsetsetup{#1}{p|document}{xml:*} +\stopxmlsetups + +\startxmlsetups xml:document + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:p + \inleftmargin{\infofont\xmlinclusion{#1}} + \xmlflush{#1} + \par +\stopxmlsetups + +\xmlregistersetup{xml:initialize} + +\xmlprocessbuffer{main}{demo}{} +\stopbuffer + +\typebuffer + +In this case we put the name of the file in the margin. Depending on when and how +elements are flushed other solutions, like overlays, can be used. + +\startpacked +\getbuffer +\stoppacked + +At any moment you can see what the current node contains. The whole (merged) +document is also available: + +\startbuffer +\xmlshow{main} +\stopbuffer + +\typebuffer + +A small font is used to typeset the (sub)tree: + +\blank \getbuffer \blank + +You can also save the tree: + +\startbuffer +\xmlsave{main}{temp.xml} +\stopbuffer + +\typebuffer \getbuffer + +This file looks like: + +\typefile{temp.xml} + +\stopchapter + +\stopcomponent diff --git a/doc/context/sources/general/manuals/xml/xml-mkiv-01.xml b/doc/context/sources/general/manuals/xml/xml-mkiv-01.xml new file mode 100644 index 000000000..c2feac218 --- /dev/null +++ b/doc/context/sources/general/manuals/xml/xml-mkiv-01.xml @@ -0,0 +1,15 @@ +<name>Land Of Dreams</name> +<tracks> + <track length="248">Dixie Flyer</track> + <track length="212">New Orleans Wins The War</track> + <track length="218">Four Eyes</track> + <track length="181">Falling In Love</track> + <track length="187">Something Special</track> + <track length="168">Bad News From Home</track> + <track length="207">Roll With The Punches</track> + <track length="209">Masterman And Baby J</track> + <track length="134">Follow The Flag</track> + <track length="246">I Want You To Hurt Like I Do</track> + <track length="248">It's Money That Matters</track> + <track length="156">Red Bandana</track> +</tracks> diff --git a/doc/context/sources/general/manuals/xml/xml-mkiv-02.xml b/doc/context/sources/general/manuals/xml/xml-mkiv-02.xml new file mode 100644 index 000000000..997123ad6 --- /dev/null +++ b/doc/context/sources/general/manuals/xml/xml-mkiv-02.xml @@ -0,0 +1,15 @@ +<name>Bad Love</name> +<tracks> + <track length="340">My Country</track> + <track length="295">Shame</track> + <track length="205">I'm Dead (But I Don't Know It)</track> + <track length="213">Every Time It Rains</track> + <track length="206">The Great Nations of Europe</track> + <track length="220">The One You Love</track> + <track length="164">The World Isn't Fair</track> + <track length="264">Big Hat, No Cattle</track> + <track length="243">Better Off Dead</track> + <track length="236">I Miss You</track> + <track length="126">Going Home</track> + <track length="180">I Want Everyone To Like Me</track> +</tracks> diff --git a/doc/context/sources/general/manuals/xml/xml-mkiv.tex b/doc/context/sources/general/manuals/xml/xml-mkiv.tex new file mode 100644 index 000000000..3933c0063 --- /dev/null +++ b/doc/context/sources/general/manuals/xml/xml-mkiv.tex @@ -0,0 +1,3812 @@ +% language=uk + +% to be checked: +% +% \Ux in index +% +% undocumented: +% +% \processXMLbuffer +% \processxmlbuffer +% \processxmlfile +% +% kind of special ... tricky explanation needed: +% +% \xmldirect + +\input lxml-ctx.mkiv + +\settrue \xmllshowtitle +\setfalse\xmllshowwarning + +\usemodule[set-11] + +\loadsetups[i-en-xml.xml] + +% \definehspace[squad][1em plus .25em minus .25em] + +\usemodule[abr-02] + +\setuplayout + [location=middle, + marking=on, + backspace=20mm, + cutspace=20mm, + topspace=15mm, + header=15mm, + footer=15mm, + height=middle, + width=middle] + +\setuppagenumbering + [alternative=doublesided, + location=] + +\setupfootertexts + [][pagenumber] + +\setupheadertexts + [][chapter] + +\setupheader + [color=colortwo, + style=bold] + +\setupfooter + [color=colortwo, + style=bold] + +\setuphead + [chapter] + [page={yes,header,right}, + header=empty, + style=\bfc] + +\setupsectionblock + [page={yes,header,right}] + +\starttexdefinition unexpanded section:chapter:number #1 + \doifmode{*sectionnumber} { + \llap{<\enspace}#1\enspace> + } +\stoptexdefinition + +\starttexdefinition unexpanded section:section:number #1 + \doifmode{*sectionnumber} { + \llap{<<\enspace}#1\enspace>> + } +\stoptexdefinition + +\starttexdefinition unexpanded section:subsection:number #1 + \doifmode{*sectionnumber} { + \llap{<<<\enspace}#1\enspace>>> + } +\stoptexdefinition + +\setuphead[chapter] [numbercolor=black,numbercommand=\texdefinition{section:chapter:number}] +\setuphead[section] [numbercolor=black,numbercommand=\texdefinition{section:section:number}] +\setuphead[subsection][numbercolor=black,numbercommand=\texdefinition{section:subsection:number}] + +\setuphead + [section] + [style=\bfa] + +\setuplist + [chapter] + [style=bold] + +\setupinteractionscreen + [option=doublesided] + +\setupalign + [tolerant,stretch] + +\setupwhitespace + [big] + +\setuptolerance + [tolerant] + +\doifelsemode {atpragma} { + \setupbodyfont[lucidaot,10pt] +} { + \setupbodyfont[dejavu,10pt] +} + +\definecolor[colorone] [b=.5] +\definecolor[colortwo] [s=.3] +\definecolor[colorthree][y=.5] + +\setuptype + [color=colorone] + +\setuptyping + [color=colorone] + +\setuphead + [lshowtitle] + [style=\tt, + color=colorone] + +\setuphead + [chapter,section] + [numbercolor=colortwo, + color=colorone] + +\definedescription + [xmlcmd] + [alternative=hanging, + width=line, + distance=1em, + margin=2em, + headstyle=monobold, + headcolor=colorone] + +\setupframedtext + [setuptext] + [framecolor=colorone, + rulethickness=1pt, + corner=round] + +\usemodule[punk] + +\usetypescript[punk] + +\definelayer + [page] + [width=\paperwidth, + height=\paperheight] + +\starttext + +\setuplayout[page] + +\startstandardmakeup + \startfontclass[none] % nil the current fontclass since it may append its features + \EnableRandomPunk + \setlayerframed + [page] + [width=\paperwidth,height=\paperheight, + background=color,backgroundcolor=colorone,backgroundoffset=1ex,frame=off] + {} + \definedfont[demo@punk at 18pt] + \setbox\scratchbox\vbox { + \hsize\dimexpr\paperwidth+2ex\relax + \setupinterlinespace + \baselineskip 1\baselineskip plus 1pt minus 1pt + \raggedcenter + \color[colortwo]{\dorecurse{1000}{XML }} + } + \setlayer + [page] + [preset=middle] + {\vsplit\scratchbox to \dimexpr\paperheight+2ex\relax} + \definedfont[demo@punk at 90pt] + \setstrut + \setlayerframed + [page] + [preset=rightbottom,offset=10mm] + [foregroundcolor=colorthree,align=flushright,offset=overlay,frame=off] + {Dealing\\with XML in\\Con\TeX t MkIV} + \definedfont[demo@punk at 18pt] + \setstrut + \setlayerframed + [page] + [preset=righttop,offset=10mm,x=3mm,rotation=90] + [foregroundcolor=colorthree,align=flushright,offset=overlay,frame=off] + {Hans Hagen, Pragma ADE, \currentdate} + \tightlayer[page] + \stopfontclass +\stopstandardmakeup + +\setuplayout + +\startfrontmatter + +\starttitle[title=Contents] + +\placelist + [chapter,section] + +\stoptitle + +\startchapter[title={Introduction}] + +This manual presents the \MKIV\ way of dealing with \XML. Although the +traditional \MKII\ streaming parser has a charming simplicity in its control, for +complex documents the tree based \MKIV\ method is more convenient. It is for this +reason that the old method has been removed from \MKIV. If you are familiar with +\XML\ processing in \MKII, then you will have noticed that the \MKII\ commands +have \type {XML} in their name. The \MKIV\ commands have a lowercase \type {xml} +in their names. That way there is no danger for confusion or a mixup. + +You may wonder why we do these manipulations in \TEX\ and not use \XSLT\ (or +other transformation methods) instead. The advantage of an integrated approach is +that it simplifies usage. Think of not only processing the document, but also +using \XML\ for managing resources in the same run. An \XSLT\ approach is just as +verbose (after all, you still need to produce \TEX\ code) and probably less +readable. In the case of \MKIV\ the integrated approach is also faster and gives +us the option to manipulate content at runtime using \LUA. It has the additional +advantage that to some extend we can handle a mix of \TEX\ and \XML\ because we +know when we're doing one or the other. + +This manual is dedicated to Taco Hoekwater, one of the first \CONTEXT\ users, and +also the first to use it for processing \XML. Who could have thought at that time +that we would have a more convenient way of dealing with those angle brackets. +The second version for this manual is dedicated to Thomas Schmitz, a power user +who occasionally became victim of the evolving mechanisms. + +\blank + +\startlines +Hans Hagen +\PRAGMA +Hasselt NL +2008\endash2016 +\stoplines + +\stopchapter + +\stopfrontmatter + +\startbodymatter + +\startchapter[title={Setting up a converter}] + +\startsection[title={from structure to setup}] + +We use a very simple document structure for demonstrating how a converter is +defined. In practice a mapping will be more complex, especially when we have a +style with complex chapter openings using data coming from all kind of places, +different styling of sections with the same name, selectively (out of order) +flushed content, special formatting, etc. + +\typefile{manual-demo-1.xml} + +Say that this document is stored in the file \type {demo.xml}, then the following +code can be used as starting point: + +\starttyping +\startxmlsetups xml:demo:base + \xmlsetsetup{#1}{*}{-} + \xmlsetsetup{#1}{document|section|p}{xml:demo:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{demo}{xml:demo:base} + +\startxmlsetups xml:demo:document + \starttitle[title={Contents}] + \placelist[chapter] + \stoptitle + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:demo:section + \startchapter[title=\xmlfirst{#1}{/title}] + \xmlfirst{#1}{/content} + \stopchapter +\stopxmlsetups + +\startxmlsetups xml:demo:p + \xmlflush{#1}\endgraf +\stopxmlsetups + +\xmlprocessfile{demo}{demo.xml}{} +\stoptyping + +Watch out! These are not just setups, but specific \XML\ setups which get an +argument passed (the \type {#1}). If for some reason your \XML\ processing fails, +it might be that you mistakenly have used a normal setup definition. The argument +\type {#1} represents the current node (element) and is a unique identifier. For +instance a \type {<p>..</p>} can have an identifier {demo::5}. So, we can get +something: + +\starttyping +\xmlflush{demo::5}\endgraf +\stoptyping + +but as well: + +\starttyping +\xmlflush{demo::6}\endgraf +\stoptyping + +Keep in mind that the references tor the actual nodes (elements) are +abstractions, you never see those \type {<id>::<number>}'s, because we will use +either the abstract \type {#1} (any node) or an explicit reference like \type +{demo}. The previous setup when issued will be like: + +\starttyping +\startchapter[title=\xmlfirst{demo::3}{/title}] + \xmlfirst{demo::4}{/content} +\stopchapter +\stoptyping + +Here the \type {title} is used to typeset the chapter title but also for an entry +in the table of contents. At the moment the title is typeset the \XML\ node gets +looked up and expanded in real text. However, for the list it gets stored for +later use. One can argue that this is not needed for \XML, because one can just +filter all the titles and use page references, but then one also looses the +control one normally has over such titles. For instance it can be that some +titles are rendered differently and for that we need to keep track of usage. +Doing that with transformations or filtering is often more complex than leaving +that to \TEX. As soon as the list gets typeset, the reference (\type {demo::#3}) +is used for the lookup. This is because by default the title is stored as given. +So, as long as we make sure the \XML\ source is loaded before the table of +contents is typeset we're ok. Later we will look into this in more detail, for +now it's enough to know that in most cases the abstract \type {#1} reference will +work out ok. + +Contrary to the style definitions this interface looks rather low level (with no +optional arguments) and the main reason for this is that we want processing to be +fast. So, the basic framework is: + +\starttyping +\startxmlsetups xml:demo:base + % associate setups with elements +\stopxmlsetups + +\xmlregisterdocumentsetup{demo}{xml:demo:base} + +% define setups for matches + +\xmlprocessfile{demo}{demo.xml}{} +\stoptyping + +In this example we mostly just flush the content of an element and in the case of +a section we flush explicit child elements. The \type {#1} in the example code +represents the current element. The line: + +\starttyping +\xmlsetsetup{demo}{*}{-} +\stoptyping + +sets the default for each element to \quote {just ignore it}. A \type {+} would +make the default to always flush the content. This means that at this point we +only handle: + +\starttyping +<section> + <title>Some title</title> + <content> + <p>a paragraph of text</p> + </content> +</section> +\stoptyping + +In the next section we will deal with the slightly more complex itemize and +figure placement. At first sight all these setups may look overkill but keep in +mind that normally the number of elements is rather limited. The complexity is +often in the style and having access to each snippet of content is actually +quite handy for that. + +\stopsection + +\startsection[title={alternative solutions}] + +Dealing with an itemize is rather simple (as long as we forget about +attributes that control the behaviour): + +\starttyping +<itemize> + <item>first</item> + <item>second</item> +</itemize> +\stoptyping + +First we need to add \type {itemize} to the setup assignment (unless we've used +the wildcard \type {*}): + +\starttyping +\xmlsetsetup{demo}{document|section|p|itemize}{xml:demo:*} +\stoptyping + +The setup can look like: + +\starttyping +\startxmlsetups xml:demo:itemize + \startitemize + \xmlfilter{#1}{/item/command(xml:demo:itemize:item)} + \stopitemize +\stopxmlsetups + +\startxmlsetups xml:demo:itemize:item + \startitem + \xmlflush{#1} + \stopitem +\stopxmlsetups +\stoptyping + +An alternative is to map item directly: + +\starttyping +\xmlsetsetup{demo}{document|section|p|itemize|item}{xml:demo:*} +\stoptyping + +and use: + +\starttyping +\startxmlsetups xml:demo:itemize + \startitemize + \xmlflush{#1} + \stopitemize +\stopxmlsetups + +\startxmlsetups xml:demo:item + \startitem + \xmlflush{#1} + \stopitem +\stopxmlsetups +\stoptyping + +Sometimes, a more local solution using filters and \type {/command(...)} makes more +sense, especially when the \type {item} tag is used for other purposes as well. + +Explicit flushing with \type {command} is definitely the way to go when you have +complex products. In one of our projects we compose math school books from many +thousands of small \XML\ files, and from one source set several products are +typeset. Within a book sections get done differently, content gets used, ignored +or interpreted differently depending on the kind of content, so there is a +constant checking of attributes that drive the rendering. In that a generic setup +for a title element makes less sense than explicit ones for each case. (We're +talking of huge amounts of files here, including multiple images on each rendered +page.) + +When using \type {command} you can pass two arguments, the first is the setup for +the match, the second one for the miss, as in: + +\starttyping +\xmlfilter{#1}{/element/command(xml:true,xml:false)} +\stoptyping + +Back to the example, this leaves us with dealing with the resources, like +figures: + +\starttyping +<resource type='figure'> + <caption>A picture of a cow.</caption> + <content><external file="cow.pdf"/></content> +</resource> +\stoptyping + +Here we can use a more restricted match: + +\starttyping +\xmlsetsetup{demo}{resource[@type='figure']}{xml:demo:figure} +\xmlsetsetup{demo}{external}{xml:demo:*} +\stoptyping + +and the definitions: + +\starttyping +\startxmlsetups xml:demo:figure + \placefigure + {\xmlfirst{#1}{/caption}} + {\xmlfirst{#1}{/content}} +\stopxmlsetups + +\startxmlsetups xml:demo:external + \externalfigure[\xmlatt{#1}{file}] +\stopxmlsetups +\stoptyping + +At this point it is good to notice that \type {\xmlatt{#1}{file}} is passed as it +is: a macro call. This means that when a macro like \type {\externalfigure} uses +the first argument frequently without first storing its value, the lookup is done +several times. A solution for this is: + +\starttyping +\startxmlsetups xml:demo:external + \expanded{\externalfigure[\xmlatt{#1}{file}]} +\stopxmlsetups +\stoptyping + +Because the lookup is rather fast, normally there is no need to bother about this +too much because internally \CONTEXT\ already makes sure such expansion happens +only once. + +An alternative definition for placement is the following: + +\starttyping +\xmlsetsetup{demo}{resource}{xml:demo:resource} +\stoptyping + +with: + +\starttyping +\startxmlsetups xml:demo:resource + \placefloat + [\xmlatt{#1}{type}] + {\xmlfirst{#1}{/caption}} + {\xmlfirst{#1}{/content}} +\stopxmlsetups +\stoptyping + +This way you can specify \type {table} as type too. Because you can define your +own float types, more complex variants are also possible. In that case it makes +sense to provide some default behaviour too: + +\starttyping +\definefloat[figure-here][figure][default=here] +\definefloat[figure-left][figure][default=left] +\definefloat[table-here] [table] [default=here] +\definefloat[table-left] [table] [default=left] + +\startxmlsetups xml:demo:resource + \placefloat + [\xmlattdef{#1}{type}{figure}-\xmlattdef{#1}{location}{here}] + {\xmlfirst{#1}{/caption}} + {\xmlfirst{#1}{/content}} +\stopxmlsetups +\stoptyping + +In this example we support two types and two locations. We default to a figure +placed (when possible) at the current location. + +\stopsection + +\stopchapter + +\startchapter[title={Filtering content}] + +\startsection[title={\TEX\ versus \LUA}] + +It will not come as a surprise that we can access \XML\ files from \TEX\ as well +as from \LUA. In fact there are two methods to deal with \XML\ in \LUA. First +there are the low level \XML\ functions in the \type {xml} namespace. On top of +those functions there is a set of functions in the \type {lxml} namespace that +deals with \XML\ in a more \TEX ie way. Most of these have similar commands at +the \TEX\ end. + +\startbuffer +\startxmlsetups first:demo:one + \xmlfilter {#1} {artist/name[text()='Randy Newman']/.. + /albums/album[position()=3]/command(first:demo:two)} +\stopxmlsetups + +\startxmlsetups first:demo:two + \blank \start \tt + \xmldisplayverbatim{#1} + \stop \blank +\stopxmlsetups + +\xmlprocessfile{demo}{music-collection.xml}{first:demo:one} +\stopbuffer + +\typebuffer + +This gives the following snippet of verbatim \XML\ code. The indentation is +conform the indentation in the whole \XML\ file. \footnote {The (probably +outdated) \XML\ file contains the collection stores on my slimserver instance. +You can use the \type {mtxrun --script flac} to generate such files.} + +\doifmodeelse {atpragma} { + \getbuffer +} { + \typefile{xml-mkiv-01.xml} +} + +An alternative written in \LUA\ looks as follows: + +\startbuffer +\blank \start \tt \startluacode + local m = lxml.load("mine","music-collection.xml") -- m == lxml.id("mine") + local p = "artist/name[text()='Randy Newman']/../albums/album[position()=4]" + local l = lxml.filter(m,p) -- returns a list (with one entry) + lxml.displayverbatim(l[1]) +\stopluacode \stop \blank +\stopbuffer + +\typebuffer + +This produces: + +\doifmodeelse {atpragma} { + \getbuffer +} { + \typefile{xml-mkiv-02.xml} +} + +You can use both methods mixed but in practice we will use the \TEX\ commands in +regular styles and the mixture in modules, for instance in those dealing with +\MATHML\ and cals tables. For complex matters you can write your own finalizers +(the last action to be taken in a match) in \LUA\ and use them at the \TEX\ end. + +\stopsection + +\startsection[title={a few details}] + +In \CONTEXT\ setups are a rather common variant on macros (\TEX\ commands) but +with their own namespace. An example of a setup is: + +\starttyping +\startsetup doc:print + \setuppapersize[A4][A4] +\stopsetup + +\startsetup doc:screen + \setuppapersize[S6][S4] +\stopsetup +\stoptyping + +Given the previous definitions, later on we can say something like: + +\starttyping +\doifmodeelse {paper} { + \setup[doc:print] +} { + \setup[doc:screen] +} +\stoptyping + +Another example is: + +\starttyping +\startsetup[doc:header] + \marking[chapter] + \space + -- + \space + \pagenumber +\stopsetup +\stoptyping + +in combination with: + +\starttyping +\setupheadertexts[\setup{doc:header}] +\stoptyping + +Here the advantage is that instead of ending up with an unreadable header +definitions, we use a nicely formatted setup. An important property of setups and +the reason why they were introduced long ago is that spaces and newlines are +ignored in the definition. This means that we don't have to worry about so called +spurious spaces but it also means that when we do want a space, we have to use +the \type {\space} command. + +The only difference between setups and \XML\ setups is that the following ones +get an argument (\type {#1}) that reflects the current node in the \XML\ tree. + +\stopsection + +\startsection[title={CDATA}] + +What to do with \type {CDATA}? There are a few methods at tle \LUA\ end for +dealing with it but here we just mention how you can influence the rendering. +There are four macros that play a role here: + +\starttyping +\unexpanded\def\xmlcdataobeyedline {\obeyedline} +\unexpanded\def\xmlcdataobeyedspace{\strut\obeyedspace} +\unexpanded\def\xmlcdatabefore {\begingroup\tt} +\unexpanded\def\xmlcdataafter {\endgroup} +\stoptyping + +Technically you can overload them but beware of side effects. Normally you won't +see much \type {CDATA} and whenever we do, it involves special data that needs +very special treatment anyway. + +\stopsection + +\startsection[title={Entities}] + +As usual with any way of encoding documents you need escapes in order to encode +the characters that are used in tagging the content, embedding comments, escaping +special characters in strings (in programming languages), etc. In \XML\ this +means that in order characters like \type {<} you need an escape like \type +{<} and in order then to encode an \type {&} you need \type {&}. + +In a typesetting workflow using a programming language like \TEX, another problem +shows up. There we have different special characters, like \type {$ $} for triggering +math, but also the backslash, braces etc. Even one such special character is already +enough to have yet another escaping mechanism at work. + +Ideally a user should not worry about these issues but it helps figuring out issues +when you know what happens under the hood. Also it is good to know that in the +code there are several ways to deal with these issues. Take the following document: + +\starttyping +<text> + Here we have a bit of a <&mess>: + + # # + % % + \ \ + { { + | | + } } + ~ ~ +</text> +\stoptyping + +When the file is read the \type {<} entity will be replaced by \type {<} and +the \type {>} by \type {>}. The numeric entities will be replaced by the +characters they refer to. The \type {&mess} is kind of special. We do preload +a huge list of more or less standardized entities but \type {mess} is not in +there. However, it is possible to have it defined in the document preamble, like: + +\starttyping +<!DOCTYPE dummy SYSTEM "dummy.dtd" [ + <!ENTITY mess "what a mess" > +]> +\stoptyping + +or even this: + +\starttyping +<!DOCTYPE dummy SYSTEM "dummy.dtd" [ + <!ENTITY mess "<p>what a mess</p>" > +]> +\stoptyping + +You can also define it in your document style using one of: + +\startxmlcmd {\cmdbasicsetup{xmlsetentity}} + replaces entity with name \cmdinternal {cd:name} by \cmdinternal {cd:text} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmltexentity}} + replaces entity with name \cmdinternal {cd:name} by \cmdinternal {cd:text} + typeset under a \TEX\ regime +\stopxmlcmd + +Such a definition will always have a higher priority than the one defined +in the document. Anyway, when the document is read in all entities are +resolved and those that need a special treatment because they map to some +text are stored in such a way that we can roundtrip them. As a consequence, +as soon as the content gets pushed into \TEX, we need not only to intercept +special characters but also have to make sure that the following works: + +\starttyping +\xmltexentity {tex} {\TEX} +\stoptyping + +Here the backslash starts a control sequence while in regular content a +backslash is just that: a backslash. + +Special characters are really special when we have to move text around +in a \TEX\ ecosystem. + +\starttyping +<text> + <title>About #3</title> +</text> +\stoptyping + +If we map and define title as follows: + +\starttyping +\startxmlsetup xml:title + \title{\xmlflush{#1}} +\stopxmlsetup +\stoptyping + +normally something \type {\xmlflush {id::123}} will be written to the +auxiliary file and in most cases that is quite okay, but if we have this: + +\starttyping +\setuphead[title][expansion=yes] +\stoptyping + +then we don't want the \type {#} to end up as hash because later on \TEX\ +can get very confused about it because it sees some argument then in a +probably unexpected way. This is solved by escaping the hash like this: + +\starttyping +About \Ux{23}3 +\stoptyping + +The \type {\Ux} command will convert its hexadecimal argument into a +character. Of course one then needs to typeset such a text under a \TEX\ +character regime but that is normally the case anyway. + +\stopsection + +\stopchapter + +\startchapter[title={Commands}] + +\startsection[title={nodes and lpaths}] + +The amount of commands available for manipulating the \XML\ file is rather large. +Many of the commands cooperate with the already discussed setups, a fancy name +for a collection of macro calls either or not mixed with text. + +Most of the commands are just shortcuts to \LUA\ calls, which means that the real +work is done by \LUA. In fact, what happens is that we have a continuous transfer +of control from \TEX\ to \LUA, where \LUA\ prints back either data (like element +content or attribute values) or just invokes a setup whereby it passes a +reference to the node resolved conform the path expression. The invoked setup +itself might return control to \LUA\ again, etc. + +This sounds complicated but examples will show what we mean here. First we +present the whole repertoire of commands. Because users can read the source code, +they might uncover more commands, but only the ones discussed here are official. +The commands are grouped in categories. + +In the following sections \cmdinternal {cd:node} means a reference to a node: +this can be the identifier of the root (the loaded xml tree) or a reference to a +node in that tree (often the result of some lookup. A \cmdinternal {cd:lpath} is +a fancy name for a path expression (as with \XSLT) but resolved by \LUA. + +\stopsection + +\startsection[title={commands}] + +There are a lot of commands available but you probably can ignore most of them. +We try to be complete which means that there is for instance \type {\xmlfirst} as +well as \type {\xmllast} but you probably never need the last one. There are also +commands that were used when testing this interface and we see no reason to +remove them. Some obscure ones are used in modules and after a while even I often +forget that they exist. To give you an idea of what commands are important we +show their use in generating the \CONTEXT\ command definitions (\type +{x-set-11.mkiv}) per Januari 2016: + +\startcolumns[n=2,balance=yes] +\starttabulate[|l|r|] +\NC \type {\xmlall} \NC 1 \NC \NR +\NC \type {\xmlatt} \NC 23 \NC \NR +\NC \type {\xmlattribute} \NC 1 \NC \NR +\NC \type {\xmlcount} \NC 1 \NC \NR +\NC \type {\xmldoif} \NC 2 \NC \NR +\NC \type {\xmldoifelse} \NC 1 \NC \NR +\NC \type {\xmlfilterlist} \NC 4 \NC \NR +\NC \type {\xmlflush} \NC 5 \NC \NR +\NC \type {\xmlinclude} \NC 1 \NC \NR +\NC \type {\xmlloadonly} \NC 1 \NC \NR +\NC \type {\xmlregisterdocumentsetup} \NC 1 \NC \NR +\NC \type {\xmlsetsetup} \NC 1 \NC \NR +\NC \type {\xmlsetup} \NC 4 \NC \NR +\stoptabulate +\stopcolumns + +As you can see filtering, flushing and accessing attributes score high. Below we show +the statistics of a quite complex rendering (5 variants of schoolbooks: basic book, +answers, teachers guide, worksheets, full blown version with extensive tracing). + +\startcolumns[n=2,balance=yes] +\starttabulate[|l|r|] +\NC \type {\xmladdindex} \NC 3 \NC \NR +\NC \type {\xmlall} \NC 5 \NC \NR +\NC \type {\xmlappendsetup} \NC 1 \NC \NR +\NC \type {\xmlapplyselectors} \NC 1 \NC \NR +\NC \type {\xmlatt} \NC 40 \NC \NR +\NC \type {\xmlattdef} \NC 9 \NC \NR +\NC \type {\xmlattribute} \NC 10 \NC \NR +\NC \type {\xmlbadinclusions} \NC 3 \NC \NR +\NC \type {\xmlconcat} \NC 3 \NC \NR +\NC \type {\xmlcount} \NC 1 \NC \NR +\NC \type {\xmldelete} \NC 11 \NC \NR +\NC \type {\xmldoif} \NC 39 \NC \NR +\NC \type {\xmldoifelse} \NC 28 \NC \NR +\NC \type {\xmldoifelsetext} \NC 13 \NC \NR +\NC \type {\xmldoifnot} \NC 2 \NC \NR +\NC \type {\xmldoifnotselfempty} \NC 1 \NC \NR +\NC \type {\xmlfilter} \NC 100 \NC \NR +\NC \type {\xmlfirst} \NC 51 \NC \NR +\NC \type {\xmlflush} \NC 69 \NC \NR +\NC \type {\xmlflushcontext} \NC 2 \NC \NR +\NC \type {\xmlinclude} \NC 1 \NC \NR +\NC \type {\xmlincludeoptions} \NC 5 \NC \NR +\NC \type {\xmlinclusion} \NC 16 \NC \NR +\NC \type {\xmlinjector} \NC 1 \NC \NR +\NC \type {\xmlloaddirectives} \NC 1 \NC \NR +\NC \type {\xmlmapvalue} \NC 4 \NC \NR +\NC \type {\xmlmatch} \NC 1 \NC \NR +\NC \type {\xmlprependsetup} \NC 5 \NC \NR +\NC \type {\xmlregisterdocumentsetup} \NC 2 \NC \NR +\NC \type {\xmlregistersetup} \NC 1 \NC \NR +\NC \type {\xmlremapnamespace} \NC 1 \NC \NR +\NC \type {\xmlsetfunction} \NC 2 \NC \NR +\NC \type {\xmlsetinjectors} \NC 2 \NC \NR +\NC \type {\xmlsetsetup} \NC 11 \NC \NR +\NC \type {\xmlsetup} \NC 76 \NC \NR +\NC \type {\xmlstrip} \NC 1 \NC \NR +\NC \type {\xmlstripanywhere} \NC 1 \NC \NR +\NC \type {\xmltag} \NC 1 \NC \NR +\NC \type {\xmltext} \NC 53 \NC \NR +\NC \type {\xmlvalue} \NC 2 \NC \NR +\stoptabulate +\stopcolumns + +Here many more are used but this is an exceptional case. The top is again +dominated by filtering, flushing and attribute consulting. The list can actually +be smaller. For instance, the \type {\xmlcount} can just as well be \type +{\xmlfilter} with a \type {count} finalizer. There are also some special ones, +like the injectors, that are needed for finetuning the final result. + +\stopsection + +\startsection[title={loading}] + +\startxmlcmd {\cmdbasicsetup{xmlloadfile}} + loads the file \cmdinternal {cd:file} and registers it under \cmdinternal + {cd:name} and applies either given or standard \cmdinternal + {cd:xmlsetup} (alias: \type {\xmlload}) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlloadbuffer}} + loads the buffer \cmdinternal {cd:buffer} and registers it under + \cmdinternal {cd:name} and applies either given or standard + \cmdinternal {cd:xmlsetup} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlloaddata}} + loads \cmdinternal {cd:text} and registers it under \cmdinternal + {cd:name} and applies either given or standard \cmdinternal + {cd:xmlsetup} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlloadonly}} + loads \cmdinternal {cd:text} and registers it under \cmdinternal + {cd:name} and applies either given or standard \cmdinternal + {cd:xmlsetup} but doesn't flush the content +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlinclude}} + includes the file specified by attribute \cmdinternal {cd:name} of the + element located by \cmdinternal {cd:lpath} at node \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlprocessfile}} + registers file \cmdinternal {cd:file} as \cmdinternal {cd:name} and + process the tree starting with \cmdinternal {cd:xmlsetup} (alias: + \type {\xmlprocess}) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlprocessbuffer}} + registers buffer \cmdinternal {cd:name} as \cmdinternal {cd:name} and process + the tree starting with \cmdinternal {cd:xmlsetup} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlprocessdata}} + registers \cmdinternal {cd:text} as \cmdinternal {cd:name} and process + the tree starting with \cmdinternal {cd:xmlsetup} +\stopxmlcmd + +The initial setup defaults to \type {xml:process} that is defined +as follows: + +\starttyping +\startsetups xml:process + \xmlregistereddocumentsetups\xmldocument + \xmlmain\xmldocument +\stopsetups +\stoptyping + +First we apply the setups associated with the document (including common setups) +and then we flush the whole document. The macro \type {\xmldocument} expands to +the current document id. There is also \type {\xmlself} which expands to the +current node number (\type {#1} in setups). + +\startxmlcmd {\cmdbasicsetup{xmlmain}} + returns the whole document +\stopxmlcmd + +Normally such a flush will trigger a chain reaction of setups associated with the +child elements. + +\stopsection + +\startsection[title={saving}] + +\startxmlcmd {\cmdbasicsetup{xmlsave}} + saves the given node \cmdinternal {cd:node} in the file \cmdinternal {cd:file} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmltofile}} + saves the match of \cmdinternal {cd:lpath} in the file \cmdinternal {cd:file} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmltobuffer}} + saves the match of \cmdinternal {cd:lpath} in the buffer \cmdinternal {cd:buffer} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmltobufferverbose}} + saves the match of \cmdinternal {cd:lpath} verbatim in the buffer \cmdinternal + {cd:buffer} +\stopxmlcmd + +% \startxmlcmd {\cmdbasicsetup{xmltoparameters}} +% converts the match of \cmdinternal {cd:lpath} to key|/|values (for tracing) +% \stopxmlcmd + +The next command is only needed when you have messed with the tree using +\LUA\ code. + +\startxmlcmd {\cmdbasicsetup{xmladdindex}} + (re)indexes a tree +\stopxmlcmd + +The following macros are only used in special situations and are not really meant +for users. + +\startxmlcmd {\cmdbasicsetup{xmlraw}} + flush the content if \cmdinternal {cd:node} with original entities +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{startxmlraw}} + flush the wrapped content with original entities +\stopxmlcmd + +\stopsection + +\startsection[title={flushing data}] + +When we flush an element, the associated \XML\ setups are expanded. The most +straightforward way to flush an element is the following. Keep in mind that the +returned values itself can trigger setups and therefore flushes. + +\startxmlcmd {\cmdbasicsetup{xmlflush}} + returns all nodes under \cmdinternal {cd:node} +\stopxmlcmd + +You can restrict flushing by using commands that accept a specification. + +\startxmlcmd {\cmdbasicsetup{xmltext}} + returns the text of the matching \cmdinternal {cd:lpath} under \cmdinternal + {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlpure}} + returns the text of the matching \cmdinternal {cd:lpath} under \cmdinternal + {cd:node} without \type {\Ux} escaped special \TEX\ characters +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlflushtext}} + returns the text of the \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlflushpure}} + returns the text of the \cmdinternal {cd:node} without \type {\Ux} escaped + special \TEX\ characters +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlnonspace}} + returns the text of the matching \cmdinternal {cd:lpath} under \cmdinternal + {cd:node} without embedded spaces +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlall}} + returns all nodes under \cmdinternal {cd:node} that matches \cmdinternal + {cd:lpath} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmllastmatch}} + returns all nodes found in the last match +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlfirst}} + returns the first node under \cmdinternal {cd:node} that matches \cmdinternal + {cd:lpath} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmllast}} + returns the last node under \cmdinternal {cd:node} that matches \cmdinternal + {cd:lpath} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlfilter}} + at a match of \cmdinternal {cd:lpath} a given filter \type {filter} is applied + and the result is returned +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlsnippet}} + returns the \cmdinternal {cd:number}\high{th} element under \cmdinternal + {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlposition}} + returns the \cmdinternal {cd:number}\high{th} match of \cmdinternal + {cd:lpath} at node \cmdinternal {cd:node}; a negative number starts at the + end (alias: \type {\xmlindex}) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlelement}} + returns the \cmdinternal {cd:number}\high{th} child of node \cmdinternal {cd:node}; + a negative number starts at the end +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlpos}} + returns the index (position) in the parent node of \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlconcat}} + returns the sequence of nodes that match \cmdinternal {cd:lpath} at + \cmdinternal {cd:node} whereby \cmdinternal {cd:text} is put between each + match +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlconcatrange}} + returns the \cmdinternal {cd:first}\high {th} upto \cmdinternal + {cd:last}\high {th} of nodes that match \cmdinternal {cd:lpath} at + \cmdinternal {cd:node} whereby \cmdinternal {cd:text} is put between each + match +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlcommand}} + apply the given \cmdinternal {cd:xmlsetup} to each match of \cmdinternal + {cd:lpath} at node \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlstrip}} + remove leading and trailing spaces from nodes under \cmdinternal {cd:node} + that match \cmdinternal {cd:lpath} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlstripped}} + remove leading and trailing spaces from nodes under \cmdinternal {cd:node} + that match \cmdinternal {cd:lpath} and return the content afterwards +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlstripnolines}} + remove leading and trailing spaces as well as collapse embedded spaces + from nodes under \cmdinternal {cd:node} that match \cmdinternal {cd:lpath} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlstrippednolines}} + remove leading and trailing spaces as well as collapse embedded spaces from + nodes under \cmdinternal {cd:node} that match \cmdinternal {cd:lpath} and + return the content afterwards +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlverbatim}} + flushes the content verbatim code (without any wrapping, i.e. no fonts + are selected and such) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlinlineverbatim}} + return the content of the node as inline verbatim code; no further + interpretation (expansion) takes place and spaces are honoured; it uses the + following wrapper +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{startxmlinlineverbatim}} + wraps inline verbatim mode using the environment specified (a prefix \type + {xml:} is added to the environment name) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldisplayverbatim}} + return the content of the node as display verbatim code; no further + interpretation (expansion) takes place and leading and trailing spaces and + newlines are treated special; it uses the following wrapper +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{startxmldisplayverbatim}} + wraps the content in display verbatim using the environment specified (a prefix + \type {xml:} is added to the environment name) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlprettyprint}} + pretty print (with colors) the node \cmdinternal {cd:node}; use the \CONTEXT\ + \SCITE\ lexers when available (\type {\usemodule [scite]}) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlflushspacewise}} + flush node \cmdinternal {cd:node} obeying spaces and newlines +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlflushlinewise}} + flush node \cmdinternal {cd:node} obeying newlines +\stopxmlcmd + +\stopsection + +\startsection[title={information}] + +The following commands return strings. Normally these are used in tests. + +\startxmlcmd {\cmdbasicsetup{xmlname}} + returns the complete name (including namespace prefix) of the + given \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlnamespace}} + returns the namespace of the given \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmltag}} + returns the tag of the element, without namespace prefix +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlcount}} + returns the number of matches of \cmdinternal {cd:lpath} at node \cmdinternal + {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlatt}} + returns the value of attribute \cmdinternal {cd:name} or empty if no such + attribute exists +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlattdef}} + returns the value of attribute \cmdinternal {cd:name} or \cmdinternal + {cd:string} if no such attribute exists +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlrefatt}} + returns the value of attribute \cmdinternal {cd:name} or empty if no such + attribute exists; a leading \type {#} is removed (nicer for tex) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlchainatt}} + returns the value of attribute \cmdinternal {cd:name} or empty if no such + attribute exists; backtracks till a match is found +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlchainattdef}} + returns the value of attribute \cmdinternal {cd:name} or \cmdinternal + {cd:string} if no such attribute exists; backtracks till a match is found +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlattribute}} + finds a first match for \cmdinternal {cd:lpath} at \cmdinternal {cd:node} and + returns the value of attribute \cmdinternal {cd:name} or empty if no such + attribute exists +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlattributedef}} + finds a first match for \cmdinternal {cd:lpath} at \cmdinternal {cd:node} and + returns the value of attribute \cmdinternal {cd:name} or \cmdinternal + {cd:text} if no such attribute exists +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmllastatt}} + returns the last attribute found (this avoids a lookup) +\stopxmlcmd + +\stopsection + +\startsection[title={manipulation}] + +You can use \LUA\ code to manipulate the tree and it makes no sense to duplicate +this in \TEX. In the future we might provide an interface to some of this +functionality. Keep in mind that manipuating the tree might have side effects as +we maintain several indices into the tree that also needs to be updated then. + +\stopsection + +\startsection[title={integration}] + +If you write a module that deals with \XML, for instance processing cals tables, +then you need ways to control specific behaviour. For instance, you might want to +add a background to the table. Such directives are collected in \XML\ files and +can be loaded on demand. + +\startxmlcmd {\cmdbasicsetup{xmlloaddirectives}} + loads \CONTEXT\ directives from \cmdinternal {cd:file} that will get + interpreted when processing documents +\stopxmlcmd + +A directives definition file looks as follows: + +\starttyping +<?xml version="1.0" standalone="yes"?> + +<directives> + <directive attribute='id' value="100" + setup="cdx:100"/> + <directive attribute='id' value="101" + setup="cdx:101"/> + <directive attribute='cdx' value="colors" element="cals:table" + setup="cdx:cals:table:colors"/> + <directive attribute='cdx' value="vertical" element="cals:table" + setup="cdx:cals:table:vertical"/> + <directive attribute='cdx' value="noframe" element="cals:table" + setup="cdx:cals:table:noframe"/> + <directive attribute='cdx' value="*" element="cals:table" + setup="cdx:cals:table:*"/> +</directives> +\stoptyping + +Examples of usage can be found in \type {x-cals.mkiv}. The directive is triggered +by an attribute. Instead of a setup you can specify a setup to be applied before +and after the node gets flushed. + +\startxmlcmd {\cmdbasicsetup{xmldirectives}} + apply the setups directive associated with the node +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldirectivesbefore}} + apply the before directives associated with the node +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldirectivesafter}} + apply the after directives associated with the node +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlinstalldirective}} + defines a directive that hooks into a handler +\stopxmlcmd + +Normally a directive will be put in the \XML\ file, for instance as: + +\starttyping +<?context-mathml-directive minus reduction yes ?> +\stoptyping + +Here the \type {mathml} is the general class of directives and \type {minus} a +subclass, in our case a specific element. + +\stopsection + +\startsection[title={setups}] + +The basic building blocks of \XML\ processing are setups. These are just +collections of macros that are expanded. These setups get one argument passed +(\type {#1}): + +\starttyping +\startxmlsetups somedoc:somesetup + \xmlflush{#1} +\stopxmlsetups +\stoptyping + +This argument is normally a number that internally refers to a specific node in +the \XML\ tree. The user should see it as an abstract reference and not depend on +its numeric property. Just think of it as \quote {the current node}. You can (and +probably will) call such setups using: + +\startxmlcmd {\cmdbasicsetup{xmlsetup}} + expands setup \cmdinternal {cd:setup} and pass \cmdinternal {cd:node} as + argument +\stopxmlcmd + +However, in most cases the setups are associated to specific elements, +something that users of \XSLT\ might recognize as templates. + +\startxmlcmd {\cmdbasicsetup{xmlsetfunction}} + associates function \cmdinternal {cd:luafunction} to the elements in + namespace \cmdinternal {cd:name} that match \cmdinternal {cd:lpath} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlsetsetup}} + associates setups \cmdinternal {cd:setup} (\TEX\ code) with the matching + nodes of \cmdinternal {cd:lpath} or root \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlprependsetup}} + pushes \cmdinternal {cd:setup} to the front of global list of setups +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlappendsetup}} + adds \cmdinternal {cd:setup} to the global list of setups to be applied + (alias: \type{\xmlregistersetup}) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlbeforesetup}} + pushes \cmdinternal {cd:setup} into the global list of setups; the + last setup is the position +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlaftersetup}} + adds \cmdinternal {cd:setup} to the global list of setups; the last setup + is the position +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlremovesetup}} + removes \cmdinternal {cd:setup} from the global list of setups +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlprependdocumentsetup}} + pushes \cmdinternal {cd:setup} to the front of list of setups to be applied + to \cmdinternal {cd:name} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlappenddocumentsetup}} + adds \cmdinternal {cd:setup} to the list of setups to be applied to + \cmdinternal {cd:name} (you can also use the alias: \type + {\xmlregisterdocumentsetup}) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlbeforedocumentsetup}} + pushes \cmdinternal {cd:setup} into the setups to be applied to \cmdinternal + {cd:name}; the last setup is the position +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlafterdocumentsetup}} + adds \cmdinternal {cd:setup} to the setups to be applied to \cmdinternal + {cd:name}; the last setup is the position +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlremovedocumentsetup}} + removes \cmdinternal {cd:setup} from the global list of setups to be applied + to \cmdinternal {cd:name} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlresetsetups}} + removes all global setups +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlresetdocumentsetups}} + removes all setups from the \cmdinternal {cd:name} specific list of setups to + be applied +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlflushdocumentsetups}{setup}} + applies \cmdinternal {cd:setup} (can be a list) to \cmdinternal {cd:name} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlregisteredsetups}} + applies all global setups to the current document +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlregistereddocumentsetups}} + applies all document specific \cmdinternal {cd:setup} to document + \cmdinternal {cd:name} +\stopxmlcmd + +\stopsection + +\startsection[title={testing}] + +The following test macros all take a \cmdinternal {cd:node} as first argument +and an \cmdinternal {cd:lpath} as second: + +\startxmlcmd {\cmdbasicsetup{xmldoif}} + expands to \cmdinternal {cd:true} when \cmdinternal {cd:lpath} matches at + node \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldoifnot}} + expands to \cmdinternal {cd:true} when \cmdinternal {cd:lpath} does not match + at node \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldoifelse}} + expands to \cmdinternal {cd:true} when \cmdinternal {cd:lpath} matches at + node \cmdinternal {cd:node} and to \cmdinternal {cd:false} otherwise +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldoiftext}} + expands to \cmdinternal {cd:true} when the node matching \cmdinternal + {cd:lpath} at node \cmdinternal {cd:node} has some content +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldoifnottext}} + expands to \cmdinternal {cd:true} when the node matching \cmdinternal + {cd:lpath} at node \cmdinternal {cd:node} has no content +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldoifelsetext}} + expands to \cmdinternal {cd:true} when the node matching \cmdinternal + {cd:lpath} at node \cmdinternal {cd:node} has content and to \cmdinternal + {cd:false} otherwise +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldoifelseempty}} + expands to \cmdinternal {cd:true} when the node matching \cmdinternal + {cd:lpath} at node \cmdinternal {cd:node} is empty and to \cmdinternal + {cd:false} otherwise +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldoifelseselfempty}} + expands to \cmdinternal {cd:true} when the node is empty and to \cmdinternal + {cd:false} otherwise +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldoifselfempty}} + expands to \cmdinternal {cd:true} when \cmdinternal {cd:node} is empty +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldoifnotselfempty}} + expands to \cmdinternal {cd:true} when \cmdinternal {cd:node} is not empty +\stopxmlcmd + +\stopsection + +\startsection[title={initialization}] + +The general setup command (not to be confused with setups) that deals with the +\MKIV\ tree handler is \type {\setupxml}. There are currently only a few options. + +\cmdfullsetup{setupxml} + +When you set \type {default} to \cmdinternal {cd:text} elements with no setup +assigned will end up as text. When set to \type {hidden} such elements will be +hidden. You can apply the default yourself using: + +\startxmlcmd {\cmdbasicsetup{xmldefaulttotext}} + presets the tree with root \cmdinternal {cd:node} to the handlers set up with + \type {\setupxml} option \cmdinternal{default} +\stopxmlcmd + +You can set \type {compress} to \type {yes} in which case comment is stripped +from the tree when the file is read. + +\startxmlcmd {\cmdbasicsetup{xmlregisterns}} + associates an internal namespace (like \type {mml}) with one given in the + document as \URL\ (like mathml) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlremapname}} + changes the namespace and tag of the matching elements +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlremapnamespace}} + replaces all references to the given namespace to a new one (applied + recursively) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlchecknamespace}} + sets the namespace of the matching elements unless a namespace is already set +\stopxmlcmd + +\stopsection + +\startsection[title={helpers}] + +Often an attribute will determine the rendering and this may result in many +tests. Especially when we have multiple attributes that control the output such +tests can become rather extensive and redundant because one gets $n\times m$ or +more such tests. + +Therefore we have a convenient way to map attributes onto for instance strings or +commands. + +\startxmlcmd {\cmdbasicsetup{xmlmapvalue}} + associate a \cmdinternal {cd:text} with a \cmdinternal {cd:category} and + \cmdinternal {cd:name} (alias: \type{\xmlmapval}) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlvalue}} + expand the value associated with a \cmdinternal {cd:category} and + \cmdinternal {cd:name} and if not resolved, expand to the \cmdinternal + {cd:text} (alias: \type{\xmlval}) +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmldoifelsevalue}} + associate a \cmdinternal {cd:text} with a \cmdinternal {cd:category} and + \cmdinternal {cd:name} +\stopxmlcmd + +This is used as follows. We define a couple of mappings in the same category: + +\starttyping +\xmlmapvalue{emph}{bold} {\bf} +\xmlmapvalue{emph}{italic}{\it} +\stoptyping + +Assuming that we have associated the following setup with the \type {emph} +element, we can say (with \type {#1} being the current element): + +\starttyping +\startxmlsetups demo:emph + \begingroup + \xmlvalue{emph}{\xmlatt{#1}{type}}{} + \endgroup +\stopxmlsetups +\stoptyping + +In this case we have no default. The \type {type} attribute triggers the actions, +as in: + +\starttyping +normal <emph type='bold'>bold</emph> normal +\stoptyping + +This mechanism is not really bound to elements and attributes so you can use this +mechanism for other purposes as well. + +\stopsection + +\stopchapter + +\startchapter[title={Expressions and filters}] + +\startsection[title={path expressions}] + +In the previous chapters we used \cmdinternal {cd:lpath} expressions, which are a variant +on \type {xpath} expressions as in \XSLT\ but in this case more geared towards +usage in \TEX. This mechanisms will be extended when demands are there. + +A path is a sequence of matches. A simple path expression is: + +\starttyping +a/b/c/d +\stoptyping + +Here each \type {/} goes one level deeper. We can go backwards in a lookup with +\type {..}: + +\starttyping +a/b/../d +\stoptyping + +We can also combine lookups, as in: + +\starttyping +a/(b|c)/d +\stoptyping + +A negated lookup is preceded by a \type {!}: + +\starttyping +a/(b|c)/!d +\stoptyping + +A wildcard is specified with a \type {*}: + +\starttyping +a/(b|c)/!d/e/*/f +\stoptyping + +In addition to these tag based lookups we can use attributes: + +\starttyping +a/(b|c)/!d/e/*/f[@type=whatever] +\stoptyping + +An \type {@} as first character means that we are dealing with an attribute. +Within the square brackets there can be boolean expressions: + +\starttyping +a/(b|c)/!d/e/*/f[@type=whatever and @id>100] +\stoptyping + +You can use functions as in: + +\starttyping +a/(b|c)/!d/e/*/f[something(text()) == "oeps"] +\stoptyping + +There are a couple of predefined functions: + +\starttabulate[|l|l|p|] +\NC \type{rootposition} \type{order} \NC number \NC the index of the matched root element (kind of special) \NC \NR +\NC \type{position} \NC number \NC the current index of the matched element in the match list \NC \NR +\NC \type{match} \NC number \NC the current index of the matched element sub list with the same parent \NC \NR +\NC \type{first} \NC number \NC \NC \NR +\NC \type{last} \NC number \NC \NC \NR +\NC \type{index} \NC number \NC the current index of the matched element in its parent list \NC \NR +\NC \type{firstindex} \NC number \NC \NC \NR +\NC \type{lastindex} \NC number \NC \NC \NR +\NC \type{element} \NC number \NC the element's index \NC \NR +\NC \type{firstelement} \NC number \NC \NC \NR +\NC \type{lastelement} \NC number \NC \NC \NR +\NC \type{text} \NC string \NC the textual representation of the matched element \NC \NR +\NC \type{content} \NC table \NC the node of the matched element \NC \NR +\NC \type{name} \NC string \NC the full name of the matched element: namespace and tag \NC \NR +\NC \type{namespace} \type{ns} \NC string \NC the namespace of the matched element \NC \NR +\NC \type{tag} \NC string \NC the tag of the matched element \NC \NR +\NC \type{attribute} \NC string \NC the value of the attribute with the given name of the matched element \NC \NR +\stoptabulate + +There are fundamental differences between \type {position}, \type {match} and +\type {index}. Each step results in a new list of matches. The \type {position} +is the index in this new (possibly intermediate) list. The \type {match} is also +an index in this list but related to the specific match of element names. The +\type {index} refers to the location in the parent element. + +Say that we have: + +\starttyping +<collection> + <resources> + <manual> + <screen>.1.</screen> + <paper>.1.</paper> + </manual> + <manual> + <paper>.2.</paper> + <screen>.2.</screen> + </manual> + <resources> + <resources> + <manual> + <screen>.3.</screen> + <paper>.3.</paper> + </manual> + <resources> +<collection> +\stoptyping + +The following then applies: + +\starttabulate[|l|l|] +\NC \type {collection/resources/manual[position()==1]/paper} \NC \type{.1.} \NC \NR +\NC \type {collection/resources/manual[match()==1]/paper} \NC \type{.1.} \type{.3.} \NC \NR +\NC \type {collection/resources/manual/paper[index()==1]} \NC \type{.2.} \NC \NR +\stoptabulate + +In most cases the \type {position} test is more restrictive than the \type +{match} test. + +You can pass your own functions too. Such functions are defined in the the \type +{xml.expressions} namespace. We have defined a few shortcuts: + +\starttabulate[|l|l|] +\NC \type {find(str,pattern)} \NC \type{string.find} \NC \NR +\NC \type {contains(str)} \NC \type{string.find} \NC \NR +\NC \type {oneof(str,...)} \NC is \type{str} in list \NC \NR +\NC \type {upper(str)} \NC \type{characters.upper} \NC \NR +\NC \type {lower(str)} \NC \type{characters.lower} \NC \NR +\NC \type {number(str)} \NC \type{tonumber} \NC \NR +\NC \type {boolean(str)} \NC \type{toboolean} \NC \NR +\NC \type {idstring(str)} \NC removes leading hash \NC \NR +\NC \type {name(index)} \NC full tag name \NC \NR +\NC \type {tag(index)} \NC tag name \NC \NR +\NC \type {namespace(index)} \NC namespace of tag \NC \NR +\NC \type {text(index)} \NC content \NC \NR +\NC \type {error(str)} \NC quit and show error \NC \NR +\NC \type {quit()} \NC quit \NC \NR +\NC \type {print()} \NC print message \NC \NR +\NC \type {count(pattern)} \NC number of matches \NC \NR +\NC \type {child(pattern)} \NC take child that matches \NC \NR +\stoptabulate + + +You can also use normal \LUA\ functions as long as you make sure that you pass +the right arguments. There are a few predefined variables available inside such +functions. + +\starttabulate[|Tl|l|p|] +\NC \type{list} \NC table \NC the list of matches \NC \NR +\NC \type{l} \NC number \NC the current index in the list of matches \NC \NR +\NC \type{ll} \NC element \NC the current element that matched \NC \NR +\NC \type{order} \NC number \NC the position of the root of the path \NC \NR +\stoptabulate + +The given expression between \type {[]} is converted to a \LUA\ expression so you +can use the usual operators: + +\starttyping +== ~= <= >= < > not and or () +\stoptyping + +In addition, \type {=} equals \type {==} and \type {!=} is the same as \type +{~=}. If you mess up the expression, you quite likely get a \LUA\ error message. + +\stopsection + +\startsection[title={functions as filters}] + +At the \LUA\ end a whole \cmdinternal {cd:lpath} expression results in a (set of) node(s) +with its environment, but that is hardly usable in \TEX. Think of code like: + +\starttyping +for e in xml.collected(xml.load('text.xml'),"title") do + -- e = the element that matched +end +\stoptyping + +The older variant is still supported but you can best use the previous variant. + +\starttyping +for r, d, k in xml.elements(xml.load('text.xml'),"title") do + -- r = root of the title element + -- d = data table + -- k = index in data table +end +\stoptyping + +Here \type {d[k]} points to the \type {title} element and in this case all titles +in the tree pass by. In practice this kind of code is encapsulated in function +calls, like those returning elements one by one, or returning the first or last +match. The result is then fed back into \TEX, possibly after being altered by an +associated setup. We've seen the wrappers to such functions already in a previous +chapter. + +In addition to the previously discussed expressions, one can add so called +filters to the expression, for instance: + +\starttyping +a/(b|c)/!d/e/text() +\stoptyping + +In a filter, the last part of the \cmdinternal {cd:lpath} expression is a +function call. The previous example returns the text of each element \type {e} +that results from matching the expression. When running \TEX\ the following +functions are available. Some are also available when using pure \LUA. In \TEX\ +you can often use one of the macros like \type {\xmlfirst} instead of a \type +{\xmlfilter} with finalizer \type {first()}. The filter can be somewhat faster +but that is hardly noticeable. + +\starttabulate[|l|l|p|] +\NC \type {context()} \NC string \NC the serialized text with \TEX\ catcode regime \NC \NR +%NC \type {ctxtext()} \NC string \NC \NC \NR +\NC \type {function()} \NC string \NC depends on the function \NC \NR +% +\NC \type {name()} \NC string \NC the (remapped) namespace \NC \NR +\NC \type {tag()} \NC string \NC the name of the element \NC \NR +\NC \type {tags()} \NC list \NC the names of the element \NC \NR +% +\NC \type {text()} \NC string \NC the serialized text \NC \NR +\NC \type {upper()} \NC string \NC the serialized text uppercased \NC \NR +\NC \type {lower()} \NC string \NC the serialized text lowercased \NC \NR +\NC \type {stripped()} \NC string \NC the serialized text stripped \NC \NR +\NC \type {lettered()} \NC string \NC the serialized text only letters (cf. \UNICODE) \NC \NR +% +\NC \type {count()} \NC number \NC the number of matches \NC \NR +\NC \type {index()} \NC number \NC the matched index in the current path \NC \NR +\NC \type {match()} \NC number \NC the matched index in the preceding path \NC \NR +% +%NC \type {lowerall()} \NC string \NC \NC \NR +%NC \type {upperall()} \NC string \NC \NC \NR +% +\NC \type {attribute(name)} \NC content \NC returns the attribute with the given name \NC \NR +\NC \type {chainattribute(name)} \NC content \NC sidem, but backtracks till one is found \NC \NR +\NC \type {command(name)} \NC content \NC expands the setup with the given name for each found element \NC \NR +\NC \type {position(n)} \NC content \NC processes the \type {n}\high{th} instance of the found element \NC \NR +\NC \type {all()} \NC content \NC processes all instances of the found element \NC \NR +%NC \type {default} \NC content \NC all \NC \NR +\NC \type {reverse()} \NC content \NC idem in reverse order \NC \NR +\NC \type {first()} \NC content \NC processes the first instance of the found element \NC \NR +\NC \type {last()} \NC content \NC processes the last instance of the found element \NC \NR +\NC \type {concat(...)} \NC content \NC concatinates the match \NC \NC \NR +\NC \type {concatrange(from,to,...)} \NC content \NC concatinates a range of matches \NC \NC \NR +\stoptabulate + +The extra arguments of the concatinators are: \type {separator} (string), \type +{lastseparator} (string) and \type {textonly} (a boolean). + +These filters are in fact \LUA\ functions which means that if needed more of them +can be added. Indeed this happens in some of the \XML\ related \MKIV\ modules, +for instance in the \MATHML\ processor. + +\stopsection + +\startsection[title={example}] + +The number of commands is rather large and if you want to avoid them this is +often possible. Take for instance: + +\starttyping +\xmlall{#1}{/a/b[position()>3]} +\stoptyping + +Alternatively you can use: + +\starttyping +\xmlfilter{#1}{/a/b[position()>3]/all()} +\stoptyping + +and actually this is also faster as internally it avoids a function call. Of +course in practice this is hardly measurable. + +In previous examples we've already seen quite some expressions, and it might be +good to point out that the syntax is modelled after \XSLT\ but is not quite the +same. The reason is that we started with a rather minimal system and have already +styles in use that depend on compatibility. + +\starttyping +namespace:// axis node(set) [expr 1]..[expr n] / ... / filter +\stoptyping + +When we are inside a \CONTEXT\ run, the namespace is \type {tex}. Hoewever, if +you want not to print back to \TEX\ you need to be more explicit. Say that we +typeset examns and have a (not that logical) structure like: + +\starttyping +<question> + <text>...</text> + <answer> + <item>one</item> + <item>two</item> + <item>three</item> + </answer> + <alternative> + <condition>true</condition> + <score>1</score> + </alternative> + <alternative> + <condition>false</condition> + <score>0</score> + </alternative> + <alternative> + <condition>true</condition> + <score>2</score> + </alternative> +</question> +\stoptyping + +Say that we typeset the questions with: + +\starttyping +\startxmlsetups question + \blank + score: \xmlfunction{#1}{totalscore} + \blank + \xmlfirst{#1}{text} + \startitemize + \xmlfilter{#1}{/answer/item/command(answer:item)} + \stopitemize + \endgraf + \blank +\stopxmlsetups +\stoptyping + +Each item in the answer results in a call to: + +\starttyping +\startxmlsetups answer:item + \startitem + \xmlflush{#1} + \endgraf + \xmlfilter{#1}{../../alternative[position()=rootposition()]/ + condition/command(answer:condition)} + \stopitem +\stopxmlsetups +\stoptyping + +\starttyping +\startxmlsetups answer:condition + \endgraf + condition: \xmlflush{#1} + \endgraf +\stopxmlsetups +\stoptyping + +Now, there are two rather special filters here. The first one involves +calculating the total score. As we look forward we use a function to deal with +this. + +\starttyping +\startluacode +function xml.functions.totalscore(root) + local score = 0 + for e in xml.collected(root,"/alternative") do + score = score + xml.filter(e,"xml:///score/number()") or 0 + end + tex.write(score) +end +\stopluacode +\stoptyping + +Watch how we use the namespace to keep the results at the \LUA\ end. + +The second special trick shown here is to limit a match using the current +position of the root (\type {#}) match. + +As you can see, a path expression can be more than just filtering a few nodes. At +the end of this manual you will find a bunch of examples. + +\stopsection + +\startsection[title={tables}] + +If you want to know how the internal \XML\ tables look you can print such a +table: + +\starttyping +print(table.serialize(e)) +\stoptyping + +This produces for instance: + +% s = xml.convert("<document><demo label='whatever'>some text</demo></document>") +% print(table.serialize(xml.filter(s,"demo")[1])) + +\starttyping +t={ + ["at"]={ + ["label"]="whatever", + }, + ["dt"]={ "some text" }, + ["ns"]="", + ["rn"]="", + ["tg"]="demo", +} +\stoptyping + +The \type {rn} entry is the renamed namespace (when renaming is applied). If you +see tags like \type {@pi@} this means that we don't have an element, but (in this +case) a processing instruction. + +\starttabulate[|l|p|] +\NC \type {@rt@} \NC the root element \NC \NR +\NC \type {@dd@} \NC document definition \NC \NR +\NC \type {@cm@} \NC comment, like \type {<!-- whatever -->} \NC \NR +\NC \type {@cd@} \NC so called \type {CDATA} \NC \NR +\NC \type {@pi@} \NC processing instruction, like \type {<?whatever we want ?>} \NC \NR +\stoptabulate + +There are many ways to deal with the content, but in the perspective of \TEX\ +only a few matter. + +\starttabulate[|l|p|] +\NC \type {xml.sprint(e)} \NC print the content to \TEX\ and apply setups if needed \NC \NR +\NC \type {xml.tprint(e)} \NC print the content to \TEX\ (serialize elements verbose) \NC \NR +\NC \type {xml.cprint(e)} \NC print the content to \TEX\ (used for special content) \NC \NR +\stoptabulate + +Keep in mind that anything low level that you uncover is not part of the official +interface unless mentioned in this manual. + +\stopsection + +\stopchapter + +\startchapter[title={Tips and tricks}] + +\startsection[title={tracing}] + +It can be hard to debug code as much happens kind of behind the screens. +Therefore we have a couple of tracing options. Of course you can typeset some +status information, using for instance: + +\startxmlcmd {\cmdbasicsetup{xmlshow}} + typeset the tree given by \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlinfo}} + typeset the name if the element given by \cmdinternal {cd:node} +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlpath}} + returns the complete path (including namespace prefix and index) of the + given \cmdinternal {cd:node} +\stopxmlcmd + +\startbuffer[demo] +<?xml version "1.0"?> +<document> + <section> + <content> + <p>first</p> + <p><b>second</b></p> + </content> + </section> + <section> + <content> + <p><b>third</b></p> + <p>fourth</p> + </content> + </section> +</document> +\stopbuffer + +Say that we have the following \XML: + +\typebuffer[demo] + +and the next definitions: + +\startbuffer +\startxmlsetups xml:demo:base + \xmlsetsetup{#1}{p|b}{xml:demo:*} +\stopxmlsetups + +\startxmlsetups xml:demo:p + \xmlflush{#1} + \par +\stopxmlsetups + +\startxmlsetups xml:demo:b + \par + \xmlpath{#1} : \xmlflush{#1} + \par +\stopxmlsetups + +\xmlregisterdocumentsetup{example-10}{xml:demo:base} + +\xmlprocessbuffer{example-10}{demo}{} +\stopbuffer + +\typebuffer + +This will give us: + +\blank \startpacked \getbuffer \stoppacked \blank + +If you use \type {\xmlshow} you will get a complete subtree which can +be handy for tracing but can also lead to large documents. + +We also have a bunch of trackers that can be enabled, like: + +\starttyping +\enabletrackers[xml.show,xml.parse] +\stoptyping + +The full list (currently) is: + +\starttabulate[|lT|p|] +\NC xml.entities \NC show what entities are seen and replaced \NC \NR +\NC xml.path \NC show the result of parsing an lpath expression \NC \NR +\NC xml.parse \NC show stepwise resolving of expressions \NC \NR +\NC xml.profile \NC report all parsed lpath expressions (in the log) \NC \NR +\NC xml.remap \NC show what namespaces are remapped \NC \NR +\NC lxml.access \NC report errors with respect to resolving (symbolic) nodes \NC \NR +\NC lxml.comments \NC show the comments that are encountered (if at all) \NC \NR +\NC lxml.loading \NC show what files are loaded and converted \NC \NR +\NC lxml.setups \NC show what setups are being associated to elements \NC \NR +\stoptabulate + +In one of our workflows we produce books from \XML\ where the (educational) +content is organized in many small files. Each book has about 5~chapters and each +chapter is made of sections that contain text, exercises, resources, etc.\ and so +the document is assembled from thousands of files (don't worry, runtime inclusion +is pretty fast). In order to see where in the sources content resides we can +trace the filename. + +\startxmlcmd {\cmdbasicsetup{xmlinclusion}} + returns the file where the node comes from +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlinclusions}} + returns the list of files where the node comes from +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlbadinclusions}} + returns a list of files that were not included due to some problem +\stopxmlcmd + +Of course you have to make sure that these names end up somewhere visible, for +instance in the margin. + +\stopsection + +\startsection[title={expansion}] + +For novice users the concept of expansion might sound frightening and to some +extend it is. However, it is important enough to spend some words on it here. + +It is good to realize that most setups are sort of immediate. When one setup is +issued, it can call another one and so on. Normally you won't notice that but +there are cases where that can be a problem. In \TEX\ you can define a macro, +take for instance: + +\starttyping +\startxmlsetups xml:foo + \def\foobar{\xmlfirst{#1}{/bar}} +\stopxmlsetups +\stoptyping + +you store the reference top node \type {bar} in \type {\foobar} maybe for later use. In +this case the content is not yet fetched, it will be done when \type {\foobar} is +called. + +\starttyping +\startxmlsetups xml:foo + \edef\foobar{\xmlfirst{#1}{/bar}} +\stopxmlsetups +\stoptyping + +Here the content of \type {bar} becomes the body of the macro. But what if +\type {bar} itself contains elements that also contain elements. When there +is a setup for \type {bar} it will be triggered and so on. + +When that setup looks like: + +\starttyping +\startxmlsetups xml:bar + \def\barfoo{\xmlflush{#1}} +\stopxmlsetups +\stoptyping + +Here we get something like: + +\starttyping +\foobar => {\def\barfoo{...}} +\stoptyping + +When \type {\barfoo} is not defined we get an error and when it is known and expands +to something weird we might also get an error. + +Especially when you don't know what content can show up, this can result in errors +when an expansion fails, for example because some macro being used is not defined. +To prevent this we can define a macro: + +\starttyping +\starttexdefinition unexpanded xml:bar:macro #1 + \def\barfoo{\xmlflush{#1}} +\stoptexdefinition + +\startxmlsetups xml:bar + \texdefinition{xml:bar:macro}{#1} +\stopxmlsetups +\stoptyping + +The setup \type {xml:bar} will still expand but the replacement text now is just the +call to the macro, think of: + +\starttyping +\foobar => {\texdefinition{xml:bar:macro}{#1}} +\stoptyping + +But this is often not needed, most \CONTEXT\ commands can handle the expansions +quite well but it's good to know that there is a way out. So, now to some +examples. Imagine that we have an \XML\ file that looks as follows: + +\starttyping +<?xml version='1.0' ?> +<demo> + <chapter> + <title>Some <em>short</em> title</title> + <content> + zeta + <index> + <key>zeta</key> + <content>zeta again</content> + </index> + alpha + <index> + <key>alpha</key> + <content>alpha <em>again</em></content> + </index> + gamma + <index> + <key>gamma</key> + <content>gamma</content> + </index> + beta + <index> + <key>beta</key> + <content>beta</content> + </index> + delta + <index> + <key>delta</key> + <content>delta</content> + </index> + done! + </content> + </chapter> +</demo> +\stoptyping + +There are a few structure related elements here: a chapter (with its list entry) +and some index entries. Both are multipass related and therefore travel around. +This means that when we let data end up in the auxiliary file, we need to make +sure that we end up with either expanded data (i.e.\ no references to the \XML\ +tree) or with robust forward and backward references to elements in the tree. + +Here we discuss three approaches (and more may show up later): pushing \XML\ into +the auxiliary file and using references to elements either or not with an +associated setup. We control the variants with a switch. + +\starttyping +\newcount\TestMode + +\TestMode=0 % expansion=xml +\TestMode=1 % expansion=yes, index, setup +\TestMode=2 % expansion=yes +\stoptyping + +We apply a couple of setups: + +\starttyping +\startxmlsetups xml:mysetups + \xmlsetsetup{\xmldocument}{demo|index|content|chapter|title|em}{xml:*} +\stopxmlsetups + +\xmlregistersetup{xml:mysetups} +\stoptyping + +The main document is processed with: + +\starttyping +\startxmlsetups xml:demo + \xmlflush{#1} + \subject{contents} + \placelist[chapter][criterium=all] + \subject{index} + \placeregister[index][criterium=all] + \page % else buffer is forgotten when placing header +\stopxmlsetups +\stoptyping + +First we show three alternative ways to deal with the chapter. The first case +expands the \XML\ reference so that we have an \XML\ stream in the auxiliary +file. This stream is processed as a small independent subfile when needed. The +second case registers a reference to the current element (\type {#1}). This means +that we have access to all data of this element, like attributes, title and +content. What happens depends on the given setup. The third variant does the same +but here the setup is part of the reference. + +\starttyping +\startxmlsetups xml:chapter + \ifcase \TestMode + % xml code travels around + \setuphead[chapter][expansion=xml] + \startchapter[title=eh: \xmltext{#1}{title}] + \xmlfirst{#1}{content} + \stopchapter + \or + % index is used for access via setup + \setuphead[chapter][expansion=yes,xmlsetup=xml:title:flush] + \startchapter[title=\xmlgetindex{#1}] + \xmlfirst{#1}{content} + \stopchapter + \or + % tex call to xml using index is used + \setuphead[chapter][expansion=yes] + \startchapter[title=hm: \xmlreference{#1}{xml:title:flush}] + \xmlfirst{#1}{content} + \stopchapter + \fi +\stopxmlsetups + +\startxmlsetups xml:title:flush + \xmltext{#1}{title} +\stopxmlsetups +\stoptyping + +We need to deal with emphasis and the content of the chapter. + +\starttyping +\startxmlsetups xml:em + \begingroup\em\xmlflush{#1}\endgroup +\stopxmlsetups + +\startxmlsetups xml:content + \xmlflush{#1} +\stopxmlsetups +\stoptyping + +A similar approach is followed with the index entries. Watch how we use the +numbered entries variant (in this case we could also have used just \type +{entries} and \type {keys}). + +\starttyping +\startxmlsetups xml:index + \ifcase \TestMode + \setupregister[index][expansion=xml,xmlsetup=] + \setstructurepageregister + [index] + [entries:1=\xmlfirst{#1}{content}, + keys:1=\xmltext{#1}{key}] + \or + \setupregister[index][expansion=yes,xmlsetup=xml:index:flush] + \setstructurepageregister + [index] + [entries:1=\xmlgetindex{#1}, + keys:1=\xmltext{#1}{key}] + \or + \setupregister[index][expansion=yes,xmlsetup=] + \setstructurepageregister + [index] + [entries:1=\xmlreference{#1}{xml:index:flush}, + keys:1=\xmltext{#1}{key}] + \fi +\stopxmlsetups + +\startxmlsetups xml:index:flush + \xmlfirst{#1}{content} +\stopxmlsetups +\stoptyping + +Instead of this flush, you can use the predefined setup \type {xml:flush} +unless it is overloaded by you. + +The file is processed by: + +\starttyping +\starttext + \xmlprocessfile{main}{test.xml}{} +\stoptext +\stoptyping + +We don't show the result here. If you're curious what the output is, you can test +it yourself. In that case it also makes sense to peek into the \type {test.tuc} +file to see how the information travels around. The \type {metadata} fields carry +information about how to process the data. + +The first case, the \XML\ expansion one, is somewhat special in the sense that +internally we use small pseudo files. You can control the rendering by tweaking +the following setups: + +\starttyping +\startxmlsetups xml:ctx:sectionentry + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:ctx:registerentry + \xmlflush{#1} +\stopxmlsetups +\stoptyping + +{\em When these methods work out okay the other structural elements will be +dealt with in a similar way.} + +\stopsection + +\startsection[title={special cases}] + +Normally the content will be flushed under a special (so called) catcode regime. +This means that characters that have a special meaning in \TEX\ will have no such +meaning in an \XML\ file. If you want content to be treated as \TEX\ code, you can +use one of the following: + +\startxmlcmd {\cmdbasicsetup{xmlflushcontext}} + flush the given \cmdinternal {cd:node} using the \TEX\ character + interpretation scheme +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlcontext}} + flush the match of \cmdinternal {cd:lpath} for the given \cmdinternal + {cd:node} using the \TEX\ character interpretation scheme +\stopxmlcmd + +We use this in cases like: + +\starttyping +.... + \xmlsetsetup {#1} { + tm|texformula| + } {xml:*} +.... + +\startxmlsetups xml:tm + \mathematics{\xmlflushcontext{#1}} +\stopxmlsetups + +\startxmlsetups xml:texformula + \placeformula\startformula\xmlflushcontext{#1}\stopformula +\stopxmlsetups +\stoptyping + +\stopsection + +\startsection[title={collecting}] + +Say that your document has + +\starttyping +<table> + <tr> + <td>foo</td> + <td>bar<td> + </tr> +</table> +\stoptyping + +And that you need to convert that to \TEX\ speak like: + +\starttyping +\bTABLE + \bTR + \bTD foo \eTD + \bTD bar \eTD + \eTR +\eTABLE +\stoptyping + +A simple mapping is: + +\starttyping +\startxmlsetups xml:table + \bTABLE \xmlflush{#1} \eTABLE +\stopxmlsetups +\startxmlsetups xml:tr + \bTR \xmlflush{#1} \eTR +\stopxmlsetups +\startxmlsetups xml:td + \bTD \xmlflush{#1} \eTD +\stopxmlsetups +\stoptyping + +The \type {\bTD} command is a so called delimited command which means that it +picks up its argument by looking for an \type {\eTD}. For the simple case here +this works quite well because the flush is inside the pair. This is not the case +in the following variant: + +\starttyping +\startxmlsetups xml:td:start + \bTD +\stopxmlsetups +\startxmlsetups xml:td:stop + \eTD +\stopxmlsetups +\startxmlsetups xml:td + \xmlsetup{#1}{xml:td:start} + \xmlflush{#1} + \xmlsetup{#1}{xml:td:stop} +\stopxmlsetups +\stoptyping + +When for some reason \TEX\ gets confused you can revert to a mechanism that +collects content. + +\starttyping +\startxmlsetups xml:td:start + \startcollect + \bTD + \stopcollect +\stopxmlsetups +\startxmlsetups xml:td:stop + \startcollect + \eTD + \stopcollect +\stopxmlsetups +\startxmlsetups xml:td + \startcollecting + \xmlsetup{#1}{xml:td:start} + \xmlflush{#1} + \xmlsetup{#1}{xml:td:stop} + \stopcollecting +\stopxmlsetups +\stoptyping + +You can even implement solutions that effectively do this: + +\starttyping +\startcollecting + \startcollect \bTABLE \stopcollect + \startcollect \bTR \stopcollect + \startcollect \bTD \stopcollect + \startcollect foo\stopcollect + \startcollect \eTD \stopcollect + \startcollect \bTD \stopcollect + \startcollect bar\stopcollect + \startcollect \eTD \stopcollect + \startcollect \eTR \stopcollect + \startcollect \eTABLE \stopcollect +\stopcollecting +\stoptyping + +Of course you only need to go that complex when the situation demands it. Here is +another weird one: + +\starttyping +\startcollecting + \startcollect \setupsomething[\stopcollect + \startcollect foo=\stopcollect + \startcollect FOO,\stopcollect + \startcollect bar=\stopcollect + \startcollect BAR,\stopcollect + \startcollect ]\stopcollect +\stopcollecting +\stoptyping + +\stopsection + +\startsection[title={selectors and injectors}] + +This section describes a bit special feature, one that we needed for a project +where we could not touch the original content but could add specific sections for +our own purpose. Hopefully the example demonstrates its useability. + +\enabletrackers[lxml.selectors] + +\startbuffer[foo] +<?xml version="1.0" encoding="UTF-8"?> + +<?context-directive message info 1: this is a demo file ?> +<?context-message-directive info 2: this is a demo file ?> + +<one> + <two> + <?context-select begin t1 t2 t3 ?> + <three> + t1 t2 t3 + <?context-directive injector crlf t1 ?> + t1 t2 t3 + </three> + <?context-select end ?> + <?context-select begin t4 ?> + <four> + t4 + </four> + <?context-select end ?> + <?context-select begin t8 ?> + <four> + t8.0 + t8.0 + </four> + <?context-select end ?> + <?context-include begin t4 ?> + <!-- + <three> + t4.t3 + <?context-directive injector crlf t1 ?> + t4.t3 + </three> + --> + <three> + t3 + <?context-directive injector crlf t1 ?> + t3 + </three> + <?context-include end ?> + <?context-select begin t8 ?> + <four> + t8.1 + t8.1 + </four> + <?context-select end ?> + <?context-select begin t8 ?> + <four> + t8.2 + t8.2 + </four> + <?context-select end ?> + <?context-select begin t4 ?> + <four> + t4 + t4 + </four> + <?context-select end ?> + <?context-directive injector page t7 t8 ?> + foo + <?context-directive injector blank t1 ?> + bar + <?context-directive injector page t7 t8 ?> + bar + </two> +</one> +\stopbuffer + +\typebuffer[foo] + +First we show how to plug in a directive. Processing instructions like the +following are normally ignored by an \XML\ processor, unless they make sense +to it. + +\starttyping +<?context-directive message info 1: this is a demo file ?> +<?context-message-directive info 2: this is a demo file ?> +\stoptyping + +We can define a message handler as follows: + +\startbuffer +\def\MyMessage#1#2#3{\writestatus{#1}{#2 #3}} + +\xmlinstalldirective{message}{MyMessage} +\stopbuffer + +\typebuffer \getbuffer + +When this file is processed you will see this on the console: + +\starttyping +info > 1: this is a demo file +info > 2: this is a demo file +\stoptyping + +The file has some sections that can be used or ignored. The recipe for +obeying \type {t1} and \type {t4} is the following: + +\startbuffer +\xmlsetinjectors[t1] +\xmlsetinjectors[t4] + +\startxmlsetups xml:initialize + \xmlapplyselectors{#1} + \xmlsetsetup {#1} { + one|two|three|four + } {xml:*} +\stopxmlsetups + +\xmlregistersetup{xml:initialize} + +\startxmlsetups xml:one + [ONE \xmlflush{#1} ONE] +\stopxmlsetups + +\startxmlsetups xml:two + [TWO \xmlflush{#1} TWO] +\stopxmlsetups + +\startxmlsetups xml:three + [THREE \xmlflush{#1} THREE] +\stopxmlsetups + +\startxmlsetups xml:four + [FOUR \xmlflush{#1} FOUR] +\stopxmlsetups +\stopbuffer + +\typebuffer \getbuffer + +This typesets: + +\startnarrower +\xmlprocessbuffer{main}{foo}{} +\stopnarrower + +The include coding is kind of special: it permits adding content (in a comment) +and ignoring the rest so that we indeed can add something without interfering +with the original. Of course in a normal workflow such messy solutions are +not needed, but alas, often workflows are not that clean, especially when one +has no real control over the source. + +\startxmlcmd {\cmdbasicsetup{xmlsetinjectors}} + enables a list of injectors that will be used +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlresetinjectors}} + resets the list of injectors +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlinjector}} + expands an injection (command); normally this one is only used + (in some setup) or for testing +\stopxmlcmd + +\startxmlcmd {\cmdbasicsetup{xmlapplyselectors}} + analyze the tree \cmdinternal {cd:node} for marked sections that + will be injected +\stopxmlcmd + +We have some injections predefined: + +\starttyping +\startsetups xml:directive:injector:page + \page +\stopsetups + +\startsetups xml:directive:injector:column + \column +\stopsetups + +\startsetups xml:directive:injector:blank + \blank +\stopsetups +\stoptyping + +In the example we see: + +\starttyping +<?context-directive injector page t7 t8 ?> +\stoptyping + +When we set \type {\xmlsetinjector[t7]} a pagebreak will injected in that spot. +Tags like \type {t7}, \type {t8} etc.\ can represent versions. + +\stopsection + +\startsection[title=preprocessing] + +% local match = lpeg.match +% local replacer = lpeg.replacer("BAD TITLE:","<bold>BAD TITLE:</bold>") +% +% function lxml.preprocessor(data,settings) +% return match(replacer,data) +% end + +\startbuffer[pre-code] +\startluacode + function lxml.preprocessor(data,settings) + return string.find(data,"BAD TITLE:") + and string.gsub(data,"BAD TITLE:","<bold>BAD TITLE:</bold>") + or data + end +\stopluacode +\stopbuffer + +\startbuffer[pre-xml] +\startxmlsetups pre:demo:initialize + \xmlsetsetup{#1}{*}{pre:demo:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{pre:demo}{pre:demo:initialize} + +\startxmlsetups pre:demo:root + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups pre:demo:bold + \begingroup\bf\xmlflush{#1}\endgroup +\stopxmlsetups + +\starttext + \xmlprocessbuffer{pre:demo}{demo}{} +\stoptext +\stopbuffer + +Say that you have the following \XML\ setup: + +\typebuffer[pre-xml] + +and that (such things happen) the input looks like this: + +\startbuffer[demo] +<root> +BAD TITLE: crap crap crap ... + +BAD TITLE: crap crap crap ... +</root> +\stopbuffer + +\typebuffer[demo] + +You can then clean up these \type {BAD TITLE}'s as follows: + +\typebuffer[pre-code] + +and get as result: + +\start \getbuffer[pre-code,pre-xml] \stop + +The preprocessor function gets as second argument the current settings, an d +the field \type {currentresource} can be used to limit the actions to +specific resources, in our case it's \type {buffer: demo}. Afterwards you can +reset the proprocessor with: + +\startluacode +lxml.preprocessor = nil +\stopluacode + +Future versions might give some more control over preprocessors. For now consider +it to be a quick hack. + +\stopsection + +\stopchapter + +\startchapter[title={Lookups using lpaths}] + +\startsection[title={introduction}] + +There is not that much system in the following examples. They resulted from tests +with different documents. The current implementation evolved out of the +experimental code. For instance, I decided to add the multiple expressions in row +handling after a few email exchanges with Jean|-|Michel Huffen. + +One of the main differences between the way \XSLT\ resolves a path and our way is +the anchor. Take: + +\starttyping +/something +something +\stoptyping + +The first one anchors in the current (!) element so it will only consider direct +children. The second one does a deep lookup and looks at the descendants as well. +Furthermore we have a few extra shortcuts like \type {**} in \type {a/**/b} which +represents all descendants. + +The expressions (between square brackets) has to be valid \LUA\ and some +preprocessing is done to resolve the built in functions. So, you might use code +like: + +\starttyping +my_lpeg_expression:match(text()) == "whatever" +\stoptyping + +given that \type {my_lpeg_expression} is known. In the examples below we use the +visualizer to show the steps. Some are shown more than once as part of a set. + +\stopsection + +\startsection[title={special cases}] + +\xmllshow{} +\xmllshow{*} +\xmllshow{.} +\xmllshow{/} + +\stopsection + +\startsection[title={wildcards}] + +\xmllshow{*} +\xmllshow{*:*} +\xmllshow{/*} +\xmllshow{/*:*} +\xmllshow{*/*} +\xmllshow{*:*/*:*} + +\xmllshow{a/*} +\xmllshow{a/*:*} +\xmllshow{/a/*} +\xmllshow{/a/*:*} + +\xmllshow{/*} +\xmllshow{/**} +\xmllshow{/***} + +\stopsection + +\startsection[title={multiple steps}] + +\xmllshow{answer} +\xmllshow{answer/test/*} +\xmllshow{answer/test/child::} +\xmllshow{answer/*} +\xmllshow{answer/*[tag()='p' and position()=1 and text()!='']} + +\stopsection + +\startsection[title={pitfals}] + +\xmllshow{[oneof(lower(@encoding),'tex','context','ctx')]} +\xmllshow{.[oneof(lower(@encoding),'tex','context','ctx')]} + +\stopsection + +\startsection[title={more special cases}] + +\xmllshow{**} +\xmllshow{*} +\xmllshow{..} +\xmllshow{.} +\xmllshow{//} +\xmllshow{/} + +\xmllshow{**/} +\xmllshow{**/*} +\xmllshow{**/.} +\xmllshow{**//} + +\xmllshow{*/} +\xmllshow{*/*} +\xmllshow{*/.} +\xmllshow{*//} + +\xmllshow{/**/} +\xmllshow{/**/*} +\xmllshow{/**/.} +\xmllshow{/**//} + +\xmllshow{/*/} +\xmllshow{/*/*} +\xmllshow{/*/.} +\xmllshow{/*//} + +\xmllshow{./} +\xmllshow{./*} +\xmllshow{./.} +\xmllshow{.//} + +\xmllshow{../} +\xmllshow{../*} +\xmllshow{../.} +\xmllshow{..//} + +\stopsection + +\startsection[title={more wildcards}] + +\xmllshow{one//two} +\xmllshow{one/*/two} +\xmllshow{one/**/two} +\xmllshow{one/***/two} +\xmllshow{one/x//two} +\xmllshow{one//x/two} +\xmllshow{//x/two} + +\stopsection + +\startsection[title={special axis}] + +\xmllshow{descendant::whocares/ancestor::whoknows} +\xmllshow{descendant::whocares/ancestor::whoknows/parent::} +\xmllshow{descendant::whocares/ancestor::} +\xmllshow{child::something/child::whatever/child::whocares} +\xmllshow{child::something/child::whatever/child::whocares|whoknows} +\xmllshow{child::something/child::whatever/child::(whocares|whoknows)} +\xmllshow{child::something/child::whatever/child::!(whocares|whoknows)} +\xmllshow{child::something/child::whatever/child::(whocares)} +\xmllshow{child::something/child::whatever/child::(whocares)[position()>2]} +\xmllshow{child::something/child::whatever[position()>2][position()=1]} +\xmllshow{child::something/child::whatever[whocares][whocaresnot]} +\xmllshow{child::something/child::whatever[whocares][not(whocaresnot)]} +\xmllshow{child::something/child::whatever/self::whatever} + +There is also \type {last-match::} that starts with the last found set of nodes. +This can save some runtime when you do lots of tests combined with a same check +afterwards. + +\stopsection + +\startsection[title={some more examples}] + +\xmllshow{/something/whatever} +\xmllshow{something/whatever} +\xmllshow{/**/whocares} +\xmllshow{whoknows/whocares} +\xmllshow{whoknows} +\xmllshow{whocares[contains(text(),'f') or contains(text(),'g')]} +\xmllshow{whocares/first()} +\xmllshow{whocares/last()} +\xmllshow{whatever/all()} +\xmllshow{whocares/position(2)} +\xmllshow{whocares/position(-2)} +\xmllshow{whocares[1]} +\xmllshow{whocares[-1]} +\xmllshow{whocares[2]} +\xmllshow{whocares[-2]} +\xmllshow{whatever[3]/attribute(id)} +\xmllshow{whatever[2]/attribute('id')} +\xmllshow{whatever[3]/text()} +\xmllshow{/whocares/first()} +\xmllshow{/whocares/last()} + +\xmllshow{xml://whatever/all()} +\xmllshow{whatever/all()} +\xmllshow{//whocares} +\xmllshow{..[2]} +\xmllshow{../*[2]} + +\xmllshow{/(whocares|whocaresnot)} +\xmllshow{/!(whocares|whocaresnot)} +\xmllshow{/!whocares} + +\xmllshow{/interface/command/command(xml:setups:register)} +\xmllshow{/interface/command[@name='xxx']/command(xml:setups:typeset)} +\xmllshow{/arguments/*} +\xmllshow{/sequence/first()} +\xmllshow{/arguments/text()} +\xmllshow{/sequence/variable/first()} +\xmllshow{/interface/define[@name='xxx']/first()} +\xmllshow{/parameter/command(xml:setups:parameter:measure)} + +\xmllshow{/(*:library|figurelibrary)/*:figure/*:label} +\xmllshow{/(*:library|figurelibrary)/figure/*:label} +\xmllshow{/(*:library|figurelibrary)/figure/label} +\xmllshow{/(*:library|figurelibrary)/figure:*/label} + +\xmlshow {whatever//br[tag(1)='br']} + +\stopsection + +\stopchapter + +\startchapter[title=Examples] + +\startsection[title=attribute chains] + +In \CSS, when an attribute is not present, the parent element is checked, and when +not found again, the lookup follows the chain till a match is found or the root is +reached. The following example demonstrates how such a chain lookup works. + +\startbuffer[test] +<something mine="1" test="one" more="alpha"> + <whatever mine="2" test="two"> + <whocares mine="3"> + <!-- this is a test --> + </whocares> + </whatever> +</something> +\stopbuffer + +\typebuffer[test] + +We apply the following setups to this tree: + +\startbuffer[setups] +\startxmlsetups xml:common + [ + \xmlchainatt{#1}{mine}, + \xmlchainatt{#1}{test}, + \xmlchainatt{#1}{more}, + \xmlchainatt{#1}{none} + ]\par +\stopxmlsetups + +\startxmlsetups xml:something + something: \xmlsetup{#1}{xml:common} + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:whatever + whatever: \xmlsetup{#1}{xml:common} + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:whocares + whocares: \xmlsetup{#1}{xml:common} + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:mysetups + \xmlsetsetup{#1}{something|whatever|whocares}{xml:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{example-1}{xml:mysetups} + +\xmlprocessbuffer{example-1}{test}{} +\stopbuffer + +\typebuffer[setups] + +This gives: + +\start + \getbuffer[setups] +\stop + +\stopsection + +\startsection[title=conditional setups] + +Say that we have this code: + +\starttyping +\xmldoifelse {#1} {/what[@a='1']} { + \xmlfilter {#1} {/what/command('xml:yes')} +} { + \xmlfilter {#1} {/what/command('xml:nop')} +} +\stoptyping + +Here we first determine if there is a child \type {what} with attribute \type {a} +set to \type {1}. Depending on the outcome again we check the child nodes for +being named \type {what}. A faster solution which also takes less code is this: + +\starttyping +\xmlfilter {#1} {/what[@a='1']/command('xml:yes','xml:nop')} +\stoptyping + +\stopsection + +\startsection[title=manipulating] + +Assume that we have the following \XML\ data: + +\startbuffer[test] +<A> + <B>right</B> + <B>wrong</B> +</A> +\stopbuffer + +\typebuffer[test] + +But, instead of \type {right} we want to see \type {okay}. We can do that with a +finalizer: + +\startbuffer +\startluacode +local rehash = { + ["right"] = "okay", +} + +function xml.finalizers.tex.Okayed(collected,what) + for i=1,#collected do + if what == "all" then + local str = xml.text(collected[i]) + context(rehash[str] or str) + else + context(str) + end + end +end +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startxmlsetups xml:A + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:B + (It's \xmlfilter{#1}{./Okayed("all")}) +\stopxmlsetups + +\startxmlsetups xml:testsetups + \xmlsetsetup{#1}{A|B}{xml:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{example-2}{xml:testsetups} +\xmlprocessbuffer{example-2}{test}{} +\stopbuffer + +\typebuffer + +The result is: \start \inlinebuffer \stop + +\stopsection + +\startsection[title=cross referencing] + +A rather common way to add cross references to \XML\ files is to borrow the +asymmetrical id's from \HTML. This means that one cannot simply use a value +of (say) \type {href} to locate an \type {id}. The next example came up on +the \CONTEXT\ mailing list. + +\startbuffer[test] +<doc> + <p>Text + <a href="#fn1" class="footnoteref" id="fnref1"><sup>1</sup></a> and + <a href="#fn2" class="footnoteref" id="fnref2"><sup>2</sup></a> + </p> + <div class="footnotes"> + <hr /> + <ol> + <li id="fn1"><p>A footnote.<a href="#fnref1">↩</a></p></li> + <li id="fn2"><p>A second footnote.<a href="#fnref2">↩</a></p></li> + </ol> + </div> +</doc> +\stopbuffer + +\typebuffer[test] + +We give two variants for dealing with such references. The first solution does +lookups and depending on the size of the file can be somewhat inefficient. + +\startbuffer +\startxmlsetups xml:doc + \blank + \xmlflush{#1} + \blank +\stopxmlsetups + +\startxmlsetups xml:p + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:footnote + (variant 1)\footnote + {\xmlfirst + {example-3-1} + {div[@class='footnotes']/ol/li[@id='\xmlrefatt{#1}{href}']}} +\stopxmlsetups + +\startxmlsetups xml:initialize + \xmlsetsetup{#1}{p|doc}{xml:*} + \xmlsetsetup{#1}{a[@class='footnoteref']}{xml:footnote} + \xmlsetsetup{#1}{div[@class='footnotes']}{xml:nothing} +\stopxmlsetups + +\xmlresetdocumentsetups{*} +\xmlregisterdocumentsetup{example-3-1}{xml:initialize} + +\xmlprocessbuffer{example-3-1}{test}{} +\stopbuffer + +\typebuffer + +This will typeset two footnotes. + +\getbuffer + +The second variant collects the references so that the time spend on lookups is +less. + +\startbuffer +\startxmlsetups xml:doc + \blank + \xmlflush{#1} + \blank +\stopxmlsetups + +\startxmlsetups xml:p + \xmlflush{#1} +\stopxmlsetups + +\startluacode + userdata.notes = {} +\stopluacode + +\startxmlsetups xml:collectnotes + \ctxlua{userdata.notes['\xmlrefatt{#1}{id}'] = '#1'} +\stopxmlsetups + +\startxmlsetups xml:footnote + (variant 2)\footnote + {\xmlflush + {\cldcontext{userdata.notes['\xmlrefatt{#1}{href}']}}} +\stopxmlsetups + +\startxmlsetups xml:initialize + \xmlsetsetup{#1}{p|doc}{xml:*} + \xmlsetsetup{#1}{a[@class='footnoteref']}{xml:footnote} + \xmlfilter{#1}{div[@class='footnotes']/ol/li/command(xml:collectnotes)} + \xmlsetsetup{#1}{div[@class='footnotes']}{} +\stopxmlsetups + +\xmlregisterdocumentsetup{example-3-2}{xml:initialize} + +\xmlprocessbuffer{example-3-2}{test}{} +\stopbuffer + +\typebuffer + +This will again typeset two footnotes: + +\getbuffer + +\stopsection + +\startsection[title=mapping values] + +One way to process options \type {frame} in the example below is to map the +values to values known by \CONTEXT. + +\startbuffer[test] +<a> + <nattable frame="on"> + <tr><td>#1</td><td>#2</td><td>#3</td><td>#4</td></tr> + <tr><td>#5</td><td>#6</td><td>#7</td><td>#8</td></tr> + </nattable> + <nattable frame="off"> + <tr><td>#1</td><td>#2</td><td>#3</td><td>#4</td></tr> + <tr><td>#5</td><td>#6</td><td>#7</td><td>#8</td></tr> + </nattable> + <nattable frame="no"> + <tr><td>#1</td><td>#2</td><td>#3</td><td>#4</td></tr> + <tr><td>#5</td><td>#6</td><td>#7</td><td>#8</td></tr> + </nattable> +</a> +\stopbuffer + +\typebuffer[test] + +\startbuffer +\startxmlsetups xml:a + \xmlflush{#1} +\stopxmlsetups + +\xmlmapvalue {nattable:frame} {on} {on} +\xmlmapvalue {nattable:frame} {yes} {on} +\xmlmapvalue {nattable:frame} {off} {off} +\xmlmapvalue {nattable:frame} {no} {off} + +\startxmlsetups xml:nattable + \startplacetable[title=#1] + \setupTABLE[frame=\xmlval{nattable:frame}{\xmlatt{#1}{frame}}{on}]% + \bTABLE + \xmlflush{#1} + \eTABLE + \stopplacetable +\stopxmlsetups + +\startxmlsetups xml:tr + \bTR + \xmlflush{#1} + \eTR +\stopxmlsetups + +\startxmlsetups xml:td + \bTD + \xmlflush{#1} + \eTD +\stopxmlsetups + +\startxmlsetups xml:testsetups + \xmlsetsetup{example-4}{a|nattable|tr|td|}{xml:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{example-4}{xml:testsetups} + +\xmlprocessbuffer{example-4}{test}{} +\stopbuffer + +The \type {\xmlmapvalue} mechanism is rather efficient and involves a minimum +of testing. + +\typebuffer + +We get: + +\getbuffer + +\stopsection + +\startsection[title=using \LUA] + +In this example we demonstrate how you can delegate rendering to \LUA. We +will construct a so called extreme table. The input is: + +\startbuffer[demo] +<?xml version="1.0" encoding="utf-8"?> + +<a> + <b> <c>1</c> <d>Text</d> </b> + <b> <c>2</c> <d>More text</d> </b> + <b> <c>2</c> <d>Even more text</d> </b> + <b> <c>2</c> <d>And more</d> </b> + <b> <c>3</c> <d>And even more</d> </b> + <b> <c>2</c> <d>The last text</d> </b> +</a> +\stopbuffer + +\typebuffer[demo] + +The processor code is: + +\startbuffer[process] +\startxmlsetups xml:test_setups + \xmlsetsetup{#1}{a|b|c|d}{xml:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{example-5}{xml:test_setups} + +\xmlprocessbuffer{example-5}{demo}{} +\stopbuffer + +\typebuffer + +We color a sequence of the same titles (numbers here) differently. The first +solution remembers the last title: + +\startbuffer +\startxmlsetups xml:a + \startembeddedxtable + \xmlflush{#1} + \stopembeddedxtable +\stopxmlsetups + +\startxmlsetups xml:b + \xmlfunction{#1}{test_ba} +\stopxmlsetups + +\startluacode +local lasttitle = nil + +function xml.functions.test_ba(t) + local title = xml.text(t, "/c") + local content = xml.text(t, "/d") + context.startxrow() + context.startxcell { + background = "color", + backgroundcolor = lasttitle == title and "colorone" or "colortwo", + foregroundstyle = "bold", + foregroundcolor = "white", + } + context(title) + lasttitle = title + context.stopxcell() + context.startxcell() + context(content) + context.stopxcell() + context.stopxrow() +end +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +The \type {embeddedxtable} environment is needed because the table is picked up +as argument. + +\startlinecorrection \getbuffer[process] \stoplinecorrection + +The second implemetation remembers what titles are already processed so here we +can color the last one too. + +\startbuffer +\startxmlsetups xml:a + \ctxlua{xml.functions.reset_bb()} + \startembeddedxtable + \xmlflush{#1} + \stopembeddedxtable +\stopxmlsetups + +\startxmlsetups xml:b + \xmlfunction{#1}{test_bb} +\stopxmlsetups + +\startluacode +local titles + +function xml.functions.reset_bb(t) + titles = { } +end + +function xml.functions.test_bb(t) + local title = xml.text(t, "/c") + local content = xml.text(t, "/d") + context.startxrow() + context.startxcell { + background = "color", + backgroundcolor = titles[title] and "colorone" or "colortwo", + foregroundstyle = "bold", + foregroundcolor = "white", + } + context(title) + titles[title] = true + context.stopxcell() + context.startxcell() + context(content) + context.stopxcell() + context.stopxrow() +end +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +\startlinecorrection \getbuffer[process] \stoplinecorrection + +A solution without any state variable is given below. + +\startbuffer +\startxmlsetups xml:a + \startembeddedxtable + \xmlflush{#1} + \stopembeddedxtable +\stopxmlsetups + +\startxmlsetups xml:b + \xmlfunction{#1}{test_bc} +\stopxmlsetups + +\startluacode +function xml.functions.test_bc(t) + local title = xml.text(t, "/c") + local content = xml.text(t, "/d") + context.startxrow() + local okay = xml.text(t,"./preceding-sibling::/[-1]") == title + context.startxcell { + background = "color", + backgroundcolor = okay and "colorone" or "colortwo", + foregroundstyle = "bold", + foregroundcolor = "white", + } + context(title) + context.stopxcell() + context.startxcell() + context(content) + context.stopxcell() + context.stopxrow() +end +\stopluacode +\stopbuffer + +\typebuffer \getbuffer + +\startlinecorrection \getbuffer[process] \stoplinecorrection + +Here is a solution that delegates even more to \LUA. The previous variants were +actually not that safe with repect to special characters and didn't handle +nested elements either but the next one does. + +\startbuffer[demo] +<?xml version="1.0" encoding="utf-8"?> + +<a> + <b> <c>#1</c> <d>Text</d> </b> + <b> <c>#2</c> <d>More text</d> </b> + <b> <c>#2</c> <d>Even more text</d> </b> + <b> <c>#2</c> <d>And more</d> </b> + <b> <c>#3</c> <d>And even more</d> </b> + <b> <c>#2</c> <d>Something <i>nested</i> </d> </b> +</a> +\stopbuffer + +\typebuffer[demo] + +We also need to map the \type {i} element. + +\startbuffer +\startxmlsetups xml:a + \starttexcode + \xmlfunction{#1}{test_a} + \stoptexcode +\stopxmlsetups + +\startxmlsetups xml:c + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:d + \xmlflush{#1} +\stopxmlsetups + +\startxmlsetups xml:i + {\em\xmlflush{#1}} +\stopxmlsetups + +\startluacode +function xml.functions.test_a(t) + context.startxtable() + local previous = false + for b in xml.collected(lxml.getid(t),"/b") do + context.startxrow() + local current = xml.text(b,"/c") + context.startxcell { + background = "color", + backgroundcolor = (previous == current) and "colorone" or "colortwo", + foregroundstyle = "bold", + foregroundcolor = "white", + } + lxml.first(b,"/c") + context.stopxcell() + context.startxcell() + lxml.first(b,"/d") + context.stopxcell() + previous = current + context.stopxrow() + end + context.stopxtable() +end +\stopluacode + +\startxmlsetups xml:test_setups + \xmlsetsetup{#1}{a|b|c|d|i}{xml:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{example-5}{xml:test_setups} + +\xmlprocessbuffer{example-5}{demo}{} +\stopbuffer + +\typebuffer + +\startlinecorrection \getbuffer \stoplinecorrection + +The question is, do we really need \LUA ? Often we don't, apart maybe from an +occasional special finalizer. A pure \TEX\ solution is given next: + +\startbuffer +\startxmlsetups xml:a + \glet\MyPreviousTitle\empty + \glet\MyCurrentTitle \empty + \startembeddedxtable + \xmlflush{#1} + \stopembeddedxtable +\stopxmlsetups + +\startxmlsetups xml:b + \startxrow + \xmlflush{#1} + \stopxrow +\stopxmlsetups + +\startxmlsetups xml:c + \xdef\MyCurrentTitle{\xmltext{#1}{.}} + \doifelse {\MyPreviousTitle} {\MyCurrentTitle} { + \startxcell + [background=color, + backgroundcolor=colorone, + foregroundstyle=bold, + foregroundcolor=white] + } { + \glet\MyPreviousTitle\MyCurrentTitle + \startxcell + [background=color, + backgroundcolor=colortwo, + foregroundstyle=bold, + foregroundcolor=white] + } + \xmlflush{#1} + \stopxcell +\stopxmlsetups + +\startxmlsetups xml:d + \startxcell + \xmlflush{#1} + \stopxcell +\stopxmlsetups + +\startxmlsetups xml:i + {\em\xmlflush{#1}} +\stopxmlsetups + +\startxmlsetups xml:test_setups + \xmlsetsetup{#1}{*}{xml:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{example-5}{xml:test_setups} + +\xmlprocessbuffer{example-5}{demo}{} +\stopbuffer + +\typebuffer + +\startlinecorrection \getbuffer \stoplinecorrection + +You can even save a few lines of code: + +\starttyping +\startxmlsetups xml:c + \xdef\MyCurrentTitle{\xmltext{#1}{.}} + \startxcell + [background=color, + backgroundcolor=color\ifx\MyPreviousTitle\MyCurrentTitle one\else two\fi, + foregroundstyle=bold, + foregroundcolor=white] + \xmlflush{#1} + \stopxcell + \glet\MyPreviousTitle\MyCurrentTitle +\stopxmlsetups +\stoptyping + +Or if you prefer: + +\starttyping +\startxmlsetups xml:c + \xdef\MyCurrentTitle{\xmltext{#1}{.}} + \doifelse {\MyPreviousTitle} {\MyCurrentTitle} { + \xmlsetup{#1}{xml:c:one} + } { + \xmlsetup{#1}{xml:c:two} + } +\stopxmlsetups + +\startxmlsetups xml:c:one + \startxcell + [background=color, + backgroundcolor=colorone, + foregroundstyle=bold, + foregroundcolor=white] + \xmlflush{#1} + \stopxcell +\stopxmlsetups + +\startxmlsetups xml:c:two + \startxcell + [background=color, + backgroundcolor=colortwo, + foregroundstyle=bold, + foregroundcolor=white] + \xmlflush{#1} + \stopxcell + \global\let\MyPreviousTitle\MyCurrentTitle +\stopxmlsetups +\stoptyping + +These examples demonstrate that it doesn't hurt to know a little bit of \TEX\ +programming: defining macros and basic comparisons can come in handy. There are +examples in the test suite, you can peek in the source code, you can consult +the wiki or you can just ask on the list. + +\stopsection + +\startsection[title=last match] + +For the next example we use the following \XML\ input: + +\startbuffer[demo] +<?xml version "1.0"?> +<document> + <section id="1"> + <content> + <p>first</p> + <p>second</p> + </content> + </section> + <section id="2"> + <content> + <p>third</p> + <p>fourth</p> + </content> + </section> +</document> +\stopbuffer + +\typebuffer[demo] + +If you check if some element is present and then act accordingly, you can +end up with doing the same lookup twice. Although it might sound inefficient, +in practice it's often not measureable. + +\startbuffer +\startxmlsetups xml:demo:document + \type{\xmlall{#1}{/section[@id='2']/content/p}}\par + \xmldoif{#1}{/section[@id='2']/content/p} { + \xmlall{#1}{/section[@id='2']/content/p} + } + \type{\xmllastmatch}\par + \xmldoif{#1}{/section[@id='2']/content/p} { + \xmllastmatch + } + \type{\xmlall{#1}{last-match::}}\par + \xmldoif{#1}{/section[@id='2']/content/p} { + \xmlall{#1}{last-match::} + } + \type{\xmlfilter{#1}{last-match::/command(xml:demo:p)}}\par + \xmldoif{#1}{/section[@id='2']/content/p} { + \xmlfilter{#1}{last-match::/command(xml:demo:p)} + } +\stopxmlsetups + +\startxmlsetups xml:demo:p + \quad\xmlflush{#1}\endgraf +\stopxmlsetups + +\startxmlsetups xml:demo:base + \xmlsetsetup{#1}{document|p}{xml:demo:*} +\stopxmlsetups + +\xmlregisterdocumentsetup{example-6}{xml:demo:base} + +\xmlprocessbuffer{example-6}{demo}{} +\stopbuffer + +\typebuffer + +In the second check we just flush the last match, so effective we do an \type +{\xmlall} here. The third and fourth alternatives demonstrate how we can use +\type {last-match} as axis. The gain is 10\% or more on the lookup but of course +typesetting often takes relatively more time than the lookup. + +\startpacked +\getbuffer +\stoppacked + +\stopsection + +\stopchapter + +\stopbodymatter + +\stoptext diff --git a/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex b/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex new file mode 100644 index 000000000..a41282622 --- /dev/null +++ b/doc/context/sources/general/manuals/xtables/xtables-mkiv.tex @@ -0,0 +1,1235 @@ +% language=uk + +% author : Hans Hagen +% copyright : PRAGMA ADE & ConTeXt Development Team +% license : Creative Commons Attribution ShareAlike 4.0 International +% reference : pragma-ade.nl | contextgarden.net | texlive (related) distributions +% origin : the ConTeXt distribution +% +% comment : Because this manual is distributed with TeX distributions it comes with a rather +% liberal license. We try to adapt these documents to upgrades in the (sub)systems +% that they describe. Using parts of the content otherwise can therefore conflict +% with existing functionality and we cannot be held responsible for that. Many of +% the manuals contain characteristic graphics and personal notes or examples that +% make no sense when used out-of-context. + +\usemodule[art-01,abr-02] + +\definecolor[red] [darkred] +\definecolor[green] [darkgreen] +\definecolor[blue] [darkblue] +\definecolor[yellow] [darkyellow] +\definecolor[magenta][darkmagenta] +\definecolor[cyan] [darkcyan] + +\setupexternalfigures + [location={local,default}] + +\setupbodyfont + [10pt] + +\setuptyping + [color=darkyellow] + +\setuptype + [color=darkcyan] + +% \setupnumbering +% [alternative=doublesided] + +\setuphead + [section] + [color=darkmagenta] + +\setupinteraction + [hidden] + +\startdocument + [metadata:author=Hans Hagen, + metadata:title=Extreme Tables, + author=Hans Hagen, + affiliation=PRAGMA ADE, + location=Hasselt NL, + title=Extreme Tables, + extra=ConTeXt MkIV, + support=www.contextgarden.net, + website=www.pragma-ade.nl] + +\startMPpage + + StartPage ; + fill Page enlarged 2mm withcolor magenta/4 ; + pickup pencircle scaled 2mm ; + numeric n ; n := bbheight Page ; + forever : + n := n / 1.5 ; + draw bottomboundary Page shifted (0, n) withcolor 2yellow/3 withtransparency (1,0.5) ; + draw topboundary Page shifted (0,-n) withcolor 2yellow/3 withtransparency (1,0.5) ; + exitif n < 2cm ; + endfor ; + numeric n ; n := bbheight Page ; + forever : + n := n / 1.5 ; + draw leftboundary Page shifted ( n,0) withcolor 2cyan/3 withtransparency (1,0.5) ; + draw rightboundary Page shifted (-n,0) withcolor 2cyan/3 withtransparency (1,0.5) ; + exitif n < 2cm ; + endfor ; + picture p, q, r ; + p := textext("\ssbf\WORD{\documentvariable{title}}") xsized (bbheight Page - 2cm) rotated 90 ; + q := textext("\ssbf\WORD{\documentvariable{author}}") ysized 1cm ; + r := textext("\ssbf\WORD{\documentvariable{extra}}") xsized bbwidth q ; + draw anchored.rt (p, center rightboundary Page shifted (-1cm,0cm)) withcolor white ; + draw anchored.bot(q, center bottomboundary Page shifted ( 1cm,4.4cm)) withcolor white ; + draw anchored.bot(r, center bottomboundary Page shifted ( 1cm,2.8cm)) withcolor white ; + StopPage ; + +\stopMPpage + +% \page[empty] \setuppagenumber[start=1] + +\startsubject[title={Contents}] + +\placelist[section][criterium=all,interaction=all] + +\stopsubject + +\startsection[title={Introduction}] + +This is a short introduction to yet another table mechanism built in \CONTEXT. It +is a variant of the so called natural tables but it has a different +configuration. Also, the implementation is completely different. The reason for +writing it is that in one of our projects we had to write styles for documents +that had tables spanning 30 or more pages and apart from memory constraints this +is quite a challenge for the other mechanisms, if only because splitting them +into successive floats is not possible due to limitations of \TEX. The extreme +table mechanism can handle pretty large tables and split them too. As each cell +is basically a \type {\framed} and as we need to do two passes over the table, +this mechanism is not the fastest but it is some two times faster than the +natural tables mechanism, and in most cases can be used instead. + +\stopsection + +\startsection[title={The structure}] + +The structure of the tables is summarized here. There can be the usual head, body +and foot specifications and we also support the optional header in following +pages. + +\starttyping +\definextable [tag] | [tag][parent] +\setupxtable [settings] | [tag][settings] + +\startxtable[tag|settings] + \startxtablehead|next|body|foot[tag|settings] + \startxrowgroup[tag|settings] + \startxrow[settings] + \startxcellgroup[tag|settings] + \startxcell[settings] ... \stopxcell + \stopxcellgroup + \stopxrow + \startxrowgroup + \stopxtablehead|next|body|foot +\stopxtable +\stoptyping + +Contrary to what you might expect, the definition command defines a new set of +command. You don't need to use this in order to set up a new settings +environment. Settings and definitions can inherit so you can build a chain of +parent|-|child settings. The grouping is nothing more than a switch to a new set +of settings. + +\stopsection + +\startsection[title={Direct control}] + +A simple table with just frames is defined as follows: + +\startbuffer +\startxtable + \startxrow + \startxcell one \stopxcell + \startxcell two \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +You can pass parameters for tuning the table: + +\startbuffer +\startxtable[offset=1cm] + \startxrow + \startxcell one \stopxcell + \startxcell two \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +You can (for as much as they make sense) use the same settings as the \type +{\framed} command, as long as you keep in mind that messing with the frame +related offsets can have side effects. + +\stopsection + +\startsection[title={Sets of settings}] + +Instead of directly passing settings you can use a predefined set. Of course you +can also combine these methods. + +\startbuffer +\definextable + [myxtable] + +\definextable + [myxtable:important] + [myxtable] + +\setupxtable + [myxtable] + [width=4cm, + foregroundcolor=red] + +\setupxtable + [myxtable:important] + [background=color, + backgroundcolor=red, + foregroundcolor=white] +\stopbuffer + +\typebuffer \getbuffer + +We can use these settings in table. Although it is not really needed to define a +set beforehand (i.e.\ you can just use the setup command) it is cleaner and more +efficient too. + +\startbuffer +\startxtable[myxtable] + \startxrow[foregroundcolor=green] + \startxcell one \stopxcell + \startxcell two \stopxcell + \startxcellgroup[foregroundcolor=blue] + \startxcell tree \stopxcell + \startxcell four \stopxcell + \stopxcellgroup + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \startxcellgroup[myxtable:important] + \startxcell gamma \stopxcell + \startxcell delta \stopxcell + \stopxcellgroup + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +The overhead of (chained) settings is quite acceptable and it helps to keep the +source of the table uncluttered from specific settings. + +\stopsection + +\startsection[title={Defining}] + +If needed you can define your own encapsulating commands. The following example +demonstrates this: + +\startbuffer +\definextable[mytable] +\stopbuffer + +\getbuffer \typebuffer + +We now can use the \type{mytable} wrapper: + +\startbuffer +\startmytable[height=4cm,width=8cm,align={middle,lohi}] + \startxrow + \startxcell test \stopxcell + \stopxrow +\stopmytable +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +One drawback of using buffers is that they don't play well in macro definitions. +In that case you need to use the following wrapper: + +\startbuffer +\starttexdefinition MyTable #1#2#3#4 + \startembeddedxtable + \startxrow + \startxcell #1 \stopxcell + \startxcell #2 \stopxcell + \stopxrow + \startxrow + \startxcell #3 \stopxcell + \startxcell #4 \stopxcell + \stopxrow + \stopembeddedxtable +\stoptexdefinition +\stopbuffer + +\typebuffer \getbuffer + +This macro is used as any other macro with arguments: + +\startbuffer +\MyTable{one}{two}{three}{four} +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +\stopsection + +\startsection[title={Stretching}] + +If you don't give the width of a cell, the widest natural size will be taken. +Otherwise the given width applies to the whole column. + +\startbuffer +\startxtable + \startxrow + \startxcell[width=1cm] one \stopxcell + \startxcell[width=2cm] two \stopxcell + \startxcell[width=3cm] tree \stopxcell + \startxcell[width=4cm] four \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \startxcell gamma \stopxcell + \startxcell delta \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +You can let the cells stretch so that the whole width of the text area is taken. + +\startbuffer[one] +\startxtable[option=stretch] + \startxrow + \startxcell[width=1cm] one \stopxcell + \startxcell[width=2cm] two \stopxcell + \startxcell[width=3cm] tree \stopxcell + \startxcell[width=4cm] four \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \startxcell gamma \stopxcell + \startxcell delta \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer[one] + +The available left over space is equally distributed among the cells. + +\startlinecorrection[blank] \getbuffer[one] \stoplinecorrection + +\startbuffer[two] +\startxtable[option={stretch,width}] + \startxrow + \startxcell[width=1cm] one \stopxcell + \startxcell[width=2cm] two \stopxcell + \startxcell[width=3cm] tree \stopxcell + \startxcell[width=4cm] four \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \startxcell gamma \stopxcell + \startxcell delta \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +An alternative is to distribute the space proportionally: + +\typebuffer[two] + +\startlinecorrection[blank] \getbuffer[two] \stoplinecorrection + +Just to stress the difference we show both alongside now: + +\startlinecorrection[blank] + \getbuffer[one] + \blank + \getbuffer[two] +\stoplinecorrection + +You can specify the width of a cell with each cell but need to keep into mind +that that value is then used for the whole column: + +\startbuffer +\startxtable + \startxrow + \startxcell[width=1em] one \stopxcell + \startxcell[width=2em] two \stopxcell + \startxcell[width=3em] tree \stopxcell + \startxcell[width=4em] four \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \startxcell gamma \stopxcell + \startxcell delta \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +You can enforce that larger columns win via the \type {option} parameter: + +\startbuffer +\startxtable[option=max] + \startxrow + \startxcell[width=1em] one \stopxcell + \startxcell[width=2em] two \stopxcell + \startxcell[width=3em] tree \stopxcell + \startxcell[width=4em] four \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \startxcell gamma \stopxcell + \startxcell delta \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +\stopsection + +\startsection[title={Spacing}] + +It is possible to separate the cells by horizontal and/or vertical space. As an +example we create a setup. + +\startbuffer +\setupxtable + [myztable] + [option=stretch, + foregroundcolor=blue, + columndistance=10pt, + leftmargindistance=20pt, + rightmargindistance=30pt] +\stopbuffer + +\typebuffer \getbuffer + +You can use the \type {textwidth} parameter to set a specific maximum width. We +now apply the previous settings to an extreme table: + +\startbuffer +\startxtable[myztable] + \startxrow + \startxcell[width=1cm] one \stopxcell + \startxcell[width=2cm,distance=5pt] two \stopxcell + \startxcell[width=3cm] tree \stopxcell + \startxcell[width=4cm] four \stopxcell + \stopxrow + \startxrow + \startxcell[width=1cm] alpha \stopxcell + \startxcell[width=2cm] beta \stopxcell + \startxcell[width=3cm] gamma \stopxcell + \startxcell[width=4cm] delta \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +As you can see here, we can still locally overload the settings but keep in mind +that these apply to the whole column then, not to the specific cell. + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +Vertical spacing is (currently) setup differently, i.e.\ as an argument to the +\type {\blank} command. + +\startbuffer +\startxtable[spaceinbetween=medium] + \startxrow + \startxcell one \stopxcell + \startxcell two \stopxcell + \startxcell tree \stopxcell + \startxcell four \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \startxcell gamma \stopxcell + \startxcell delta \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +Specifying spacing this way improves consistency with the rest of the document +spacing. + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +\stopsection + +\startsection[title={Spanning}] + +Of course we can span cells horizontally as well as vertically. Future versions +might provide more advanced options but the basics work okay. + +\startbuffer +\startxtable + \startxrow + \startxcell one \stopxcell + \startxcell[nx=2] two + three \stopxcell + \startxcell four \stopxcell + \startxcell five \stopxcell + \stopxrow + \startxrow + \startxcell[nx=3] alpha + beta + gamma \stopxcell + \startxcell[nx=2] delta + epsilon \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +This spans a few cells horizontally: + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +The next example gives a span in two directions: + +\startbuffer +\startxtable + \startxrow + \startxcell alpha 1 \stopxcell + \startxcell beta 1 \stopxcell + \startxcell gamma 1 \stopxcell + \startxcell delta 1 \stopxcell + \stopxrow + \startxrow + \startxcell alpha 2 \stopxcell + \startxcell[nx=2,ny=2] whatever \stopxcell + \startxcell delta 2 \stopxcell + \stopxrow + \startxrow + \startxcell alpha 3 \stopxcell + \startxcell delta 3 \stopxcell + \stopxrow + \startxrow + \startxcell alpha 4 \stopxcell + \startxcell beta 4 \stopxcell + \startxcell gamma 4 \stopxcell + \startxcell delta 4 \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +Of course, spanning is always a compromise but the best fit found by this +mechanism takes natural width, given width and available space into account. + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +\stopsection + +\startsection[title={Partitioning}] + +You can partition a table as follows: + +\startbuffer +\startxtable + \startxtablehead + \startxrow + \startxcell head one \stopxcell + \startxcell head two \stopxcell + \startxcell head tree \stopxcell + \startxcell head four \stopxcell + \stopxrow + \stopxtablehead + \startxtablenext + \startxrow + \startxcell next one \stopxcell + \startxcell next two \stopxcell + \startxcell next tree \stopxcell + \startxcell next four \stopxcell + \stopxrow + \stopxtablenext + \startxtablebody + \startxrow + \startxcell body one \stopxcell + \startxcell body two \stopxcell + \startxcell body tree \stopxcell + \startxcell body four \stopxcell + \stopxrow + \stopxtablebody + \startxtablefoot + \startxrow + \startxcell foot one \stopxcell + \startxcell foot two \stopxcell + \startxcell foot tree \stopxcell + \startxcell foot four \stopxcell + \stopxrow + \stopxtablefoot +\stopxtable +\stopbuffer + +\typebuffer + +There can be multiple such partitions and they are collected in head, next, body +and foot groups. Normally the header ends up at the beginning and the footer at +the end. When a table is split, the first page gets the header and the following +pages the next one. + +You can let headers and footers be repeated by setting the \type {header} +and|/|or \type {footer} parameters to \type {repeat}. + +\starttyping +\setupxtable + [split=yes, + header=repeat, + footer=repeat] +\stoptyping + +The table can be flushed in the running text but also in successive +floats. Given that the table is in a buffer: + +\starttyping +\placetable[here,split]{A big table.}{\getbuffer} +\stoptyping + +When you specify \type {split} as \type {yes} the caption is taken into account +when calculating the available space. + +There are actually three different split methods. The \type {yes} option works in +text mode as well as in floats, but in text mode no headers and footers get +repeated. If you want that feature in a text flush you have to set \type {split} +to \type {repeat} as well. + +You can keep rows together by passing a \type {samepage} directive. This +parameter can get the values \type {before}, \type {after} and \type {both}. + +\starttyping +\startxtable[split=yes] + \startxrow \startxcell \tttf .01. \stopxcell \stopxrow + \startxrow \startxcell \tttf .... \stopxcell \stopxrow + \startxrow \startxcell \tttf \red .21. \stopxcell \stopxrow + \startxrow[samepage=both] \startxcell \tttf \red .22. \stopxcell \stopxrow + \startxrow[samepage=both] \startxcell \tttf \red .23. \stopxcell \stopxrow + \startxrow \startxcell \tttf .... \stopxcell \stopxrow + \startxrow \startxcell \tttf .99. \stopxcell \stopxrow +\stopxtable +\stoptyping + +\stopsection + +\startsection[title={Options}] + +On the average a table will come out okay but you need to keep in mind that when +(complex) spans are used the results can be less that optimal. However, as +normally one pays attention to creating tables, the amount of control provided +often makes it possible to get what you want. + +In the following situations, the first cell width is determined by the span. It +is possible to make a more clever analyzer but we need to keep in mind that in +the same column there can be entries that span a different amount of columns. Not +only would that be inefficient but it would also be rather unpredictable unless +you know exactly what happens deep down. The following two examples demonstrate +default behaviour. + +\startbuffer +\startxtable + \startxrow + \startxcell[nx=3] + 1/2/3 + \stopxcell + \stopxrow + \startxrow + \startxcell 1 \stopxcell + \startxcell 2 \stopxcell + \startxcell 3 \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startxtable + \startxrow + \startxcell[nx=3] + 1 / 2 / 3 + \stopxcell + \stopxrow + \startxrow + \startxcell 1 \stopxcell + \startxcell 2 \stopxcell + \startxcell 3 \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +In practice you will set the width of the columns, as in: + +\startbuffer +\startxtable + \startxrow + \startxcell[nx=3] + 1/2/3 + \stopxcell + \stopxrow + \startxrow + \startxcell[width=\dimexpr\textwidth/3] 1 \stopxcell + \startxcell[width=\dimexpr\textwidth/3] 2 \stopxcell + \startxcell[width=\dimexpr\textwidth/3] 3 \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +But, if you want you can control the enforced width by setting an option: + +\startbuffer +\startxtable + \startxrow + \startxcell[nx=3,option=tight] + 1/2/3 + \stopxcell + \stopxrow + \startxrow + \startxcell 1 \stopxcell + \startxcell 2 \stopxcell + \startxcell 3 \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startxtable + \startxrow + \startxcell[nx=3,option=tight] + 1 / 2 / 3 + \stopxcell + \stopxrow + \startxrow + \startxcell 1 \stopxcell + \startxcell 2 \stopxcell + \startxcell 3 \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +There is also a global setting: + +\startbuffer +\startxtable[option=tight] + \startxrow + \startxcell[nx=3] + 1/2/3 + \stopxcell + \stopxrow + \startxrow + \startxcell 1 \stopxcell + \startxcell 2 \stopxcell + \startxcell 3 \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\stopsection + +\startsection[title={Nesting}] + +Extreme tables can be nested but you need to keep an eye on inheritance here as +the inner table uses the settings from the encapsulating cell. The widths and +heights of the inner table default to \type {fit}. We could cook up a more +complex nesting model but this one is easy to follow. + +\startbuffer +\startxtable + \startxrow + \startxcell[offset=0pt] + \startxtable[background=color,backgroundcolor=green, + foregroundcolor=white,offset=1ex] + \startxrow + \startxcell[width=1cm] one \stopxcell + \startxcell[width=2cm] two \stopxcell + \stopxrow + \startxrow + \startxcell[width=3cm] alpha \stopxcell + \startxcell[width=4cm] beta \stopxcell + \stopxrow + \stopxtable + \stopxcell + \startxcell two \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell + \startxtable[background=color,backgroundcolor=red, + foregroundcolor=white] + \startxrow + \startxcell one \stopxcell + \startxcell two \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \stopxrow + \stopxtable + \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer + +Here we just manipulate the offset a bit. + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +\stopsection + +\startsection[title={Buffers}] + +When you don't want to clutter your document source too much buffers can be if +help: + +\startbuffer +\startbuffer[test] +\startxtable + \startxrow + \startxcell[width=1cm] one \stopxcell + \startxcell[width=2cm] two \stopxcell + \stopxrow + \startxrow + \startxcell alpha \stopxcell + \startxcell beta \stopxcell + \stopxrow +\stopxtable +\stopbuffer +\stopbuffer + +\typebuffer \getbuffer + +One way of getting this table typeset is to say: + +\starttyping +\getbuffer[test] +\stoptyping + +Normally this is quite okay. However, internally extreme tables become also +buffers. If you don't like the overhead of this double buffering you can use the +following command: + +\starttyping +\processxtablebuffer[test] +\stoptyping + +This can save you some memory and runtime, but don't expect miracles. Also, this +way of processing does not support nested tables (unless \type {{}} is used). + +\stopsection + +\startsection[title={XML}] + +The following example demonstrates that we can use this mechanism in \XML\ too. +The example was provided by Thomas Schmitz. First we show how a table looks like +in \XML: + +\startbuffer[test] +<table> + <tablerow> + <tablecell> + One + </tablecell> + <tablecell> + Two + </tablecell> + </tablerow> + <tablerow> + <tablecell> + <b>Three</b> + </tablecell> + <tablecell> + Four + </tablecell> + </tablerow> +</table> +\stopbuffer + +\typebuffer[test] + +We need to map these elements to setups: + +\startbuffer +\startxmlsetups xml:testsetups + \xmlsetsetup{main}{b|table|tablerow|tablecell}{xml:*} +\stopxmlsetups + +\xmlregistersetup{xml:testsetups} +\stopbuffer + +\typebuffer \getbuffer + +The setups themselves are rather simple as we don't capture any attributes. + +\startbuffer +\startxmlsetups xml:b + \bold{\xmlflush{#1}} +\stopxmlsetups + +\startxmlsetups xml:table + \startembeddedxtable + \xmlflush{#1} + \stopembeddedxtable +\stopxmlsetups + +\startxmlsetups xml:tablerow + \startxrow + \xmlflush{#1} + \stopxrow +\stopxmlsetups + +\startxmlsetups xml:tablecell + \startxcell + \xmlflush{#1} + \stopxcell +\stopxmlsetups +\stopbuffer + +\typebuffer \getbuffer + +We now process the example. Of course it will also work for files. + +\startbuffer + \xmlprocessbuffer{main}{test}{} +\stopbuffer + +\typebuffer + +The result is: + +\startlinecorrection[blank] \getbuffer \stoplinecorrection + +\stopsection + +\startsection[title={Natural tables}] + +For the impatient a small additional module is provided that remaps the natural +table commands onto extreme tables: + +\startbuffer +\usemodule[ntb-to-xtb] +\stopbuffer + +\typebuffer \getbuffer + +After that: + +\startbuffer +\bTABLE + \bTR + \bTD[background=color,backgroundcolor=red] one \eTD + \bTD[width=2cm] two \eTD + \eTR + \bTR + \bTD[width=5cm] alpha \eTD + \bTD[background=color,backgroundcolor=yellow] beta \eTD + \eTR +\eTABLE +\stopbuffer +\stopbuffer + +\typebuffer + +Will come out as: + +\startlinecorrection[blank] +\getbuffer +\stoplinecorrection + +You can restore and remap the commands with the following helpers: + +\starttyping +\restoreTABLEfromxtable +\mapTABLEtoxtable +\stoptyping + +Of course not all functionality of the natural tables maps onto similar +functionality of extreme tables, but on the average the result will look rather +similar. + +\stopsection + +\startsection[title={Colofon}] + +\starttabulate[|B|p|] +\NC author \NC \getvariable{document}{author}, \getvariable{document}{affiliation}, \getvariable{document}{location} \NC \NR +\NC version \NC \currentdate \NC \NR +\NC website \NC \getvariable{document}{website} \endash\ \getvariable{document}{support} \NC \NR +\NC copyright \NC \symbol[cc][cc-by-sa-nc] \NC \NR +\stoptabulate + +\stopsection + +\startsection[title={Examples}] + +On the following pages we show some examples of (experimental) features. For this +we will use the usual quotes from Ward, Tufte and Davis etc.\ that you can find +in the distribution. + +\page + +\startbuffer +\startxtable[bodyfont=6pt] + \startxrow + \startxcell \input ward \stopxcell + \startxcell \input tufte \stopxcell + \startxcell \input davis \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startxtable[bodyfont=6pt,option=width] + \startxrow + \startxcell \input ward \stopxcell + \startxcell \input tufte \stopxcell + \startxcell \input davis \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\page + +\startbuffer +\startxtable[bodyfont=6pt] + \startxrow + \startxcell \externalfigure[cow.pdf][width=3cm] \stopxcell + \startxcell \input tufte \stopxcell + \startxcell \input davis \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startxtable[bodyfont=6pt,option=width] + \startxrow + \startxcell \externalfigure[cow.pdf][width=3cm] \stopxcell + \startxcell \input tufte \stopxcell + \startxcell \input davis \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\page + +\startbuffer +\startxtable[option=stretch] + \startxrow + \startxcell bla \stopxcell + \startxcell bla bla \stopxcell + \startxcell bla bla bla \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\startbuffer +\startxtable[option={stretch,width}] + \startxrow + \startxcell bla \stopxcell + \startxcell bla bla \stopxcell + \startxcell bla bla bla \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \getbuffer + +\page + +\startbuffer +\setupxtable[suffix][align=middle,foregroundcolor=red] +\setupxtable[blabla][foregroundstyle=slanted] +\setupxtable[crap] [foregroundcolor=blue] +\setupxtable[bold] [crap][foregroundstyle=bold] + +\startxtable % [frame=off] + \startxtablehead + \startxrow[bold] + \startxcell[suffix] head a \stopxcell + \startxcell[blabla] head b \stopxcell + \startxcell head c \stopxcell + \stopxrow + \stopxtablehead + \startxtablebody + \startxrow + \startxcell[suffix][ny=2] cell a 1 \stopxcell + \startxcell cell b 1 \stopxcell + \startxcell cell c 1 \stopxcell + \stopxrow + \startxrow + \startxcell cell b 2 \stopxcell + \startxcell cell c 2 \stopxcell + \stopxrow + \startxrow + \startxcell[suffix] cell a 3 \stopxcell + \startxcell cell b 3 \stopxcell + \startxcell cell c 3 \stopxcell + \stopxrow + \startxrow + \startxcell[suffix] cell a 4 \stopxcell + \startxcell cell b 4 \stopxcell + \startxcell cell c 4 \stopxcell + \stopxrow + \startxrow + \startxcell[suffix] cell a 5 \stopxcell + \startxcell cell b 5 \stopxcell + \startxcell cell c 5 \stopxcell + \stopxrow + \stopxtablebody +\stopxtable +\stopbuffer + +\typebuffer \start \getbuffer \stop + +\page + +\startbuffer +\startxtable[option=stretch] + \startxrow + \startxcell[option=fixed] first cell \stopxcell + \startxcell 101 \stopxcell + \startxcell 102 \stopxcell + \startxcell 103 \stopxcell + \stopxrow + \startxrow + \startxcell 2\high{nd} cell \stopxcell + \startxcell a \stopxcell + \startxcell b \stopxcell + \startxcell c \stopxcell + \stopxrow +\stopxtable +\stopbuffer + +\typebuffer \start \getbuffer \stop + +\page + +\startbuffer[demo] +\startxtable +\startxrow + \startxcell[demo][nx=4] 1 / 2 / 3 / 4 \stopxcell +\stopxrow +\startxrow + \startxcell[demo][nx=3] 1 / 2 / 3 \stopxcell + \startxcell 4 \stopxcell +\stopxrow +\startxrow + \startxcell 1 \stopxcell + \startxcell[demo][nx=3] 2 / 3 / 4 \stopxcell +\stopxrow +\startxrow + \startxcell[demo][nx=2] 1 / 2 \stopxcell + \startxcell 3 \stopxcell + \startxcell 4 \stopxcell +\stopxrow +\startxrow + \startxcell 1 \stopxcell + \startxcell[demo][nx=2] 2 / 3 \stopxcell + \startxcell 4 \stopxcell +\stopxrow +\startxrow + \startxcell 1 \stopxcell + \startxcell 2 \stopxcell + \startxcell[demo][nx=2] 3 / 4 \stopxcell +\stopxrow +\startxrow + \startxcell[demo][nx=2] 1 / 2 \stopxcell + \startxcell[demo][nx=2] 3 / 4 \stopxcell +\stopxrow +\startxrow + \startxcell 1 \stopxcell + \startxcell 2 \stopxcell + \startxcell 3 \stopxcell + \startxcell 4 \stopxcell +\stopxrow +\stopxtable +\stopbuffer + +\startbuffer[tight] +\setupxtable[demo][option=tight] +\stopbuffer + +\startbuffer[normal] +\setupxtable[demo][option=] +\stopbuffer + +\typebuffer[demo] + +\page + +\typebuffer[tight] \start \getbuffer[tight,demo] \stop +\typebuffer[normal] \start \getbuffer[normal,demo] \stop + +% \ruledhbox{\getbuffer[normal,demo]} + +\stopdocument |