diff options
Diffstat (limited to 'tex/context/base/core-obj.tex')
-rw-r--r-- | tex/context/base/core-obj.tex | 339 |
1 files changed, 233 insertions, 106 deletions
diff --git a/tex/context/base/core-obj.tex b/tex/context/base/core-obj.tex index 73902f265..4b01f9aa3 100644 --- a/tex/context/base/core-obj.tex +++ b/tex/context/base/core-obj.tex @@ -1,106 +1,233 @@ -%D \module
-%D [ file=core-obj,
-%D version=1998.01.15,
-%D title=\CONTEXT\ Core Macros,
-%D subtitle=Object Handling,
-%D author=Hans Hagen,
-%D date=\currentdate,
-%D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
-%C
-%C This module is part of the \CONTEXT\ macro||package and is
-%C therefore copyrighted by \PRAGMA. Non||commercial use is
-%C granted.
-
-\writestatus{loading}{Context Core Macros / Object Handling}
-
-\unprotect
-
-\startmessages dutch library: references
- 30: onbekend object --
-\stopmessages
-
-\startmessages english library: references
- 30: unknown object --
-\stopmessages
-
-\startmessages german library: references
- 30: unbekanntes Object --
-\stopmessages
-
-%D Boxes can be considered reuable objects. Unfortunaltely once
-%D passed to the \DVI\ file, such objects cannot be reused. In
-%D \PDF\ however, reusing is possible and sometimes even a
-%D necessity. Therefore, \CONTEXT\ supports reusable objects.
-%D
-%D During the \TEX\ processing run, boxes can serve the purpose
-%D of objects, and the \DVI\ driver module implements objects
-%D using boxes. Only when \ETEX\ is widespread, and therefore
-%D the limit on 256 boxes is removed, this becomes useful.
-%D
-%D The \PDF\ and \PDFTEX\ driver modules implement objects
-%D using \PDF\ forms. There is no (real) restriction on the
-%D number of objects there.
-%D
-%D The first application of objects in \CONTEXT\ concerned
-%D \METAPOST\ graphics and fill||in form fields. The first
-%D application can save lots of bytes, while the latter use is
-%D more a necessity than byte saving.
-%D
-%D \starttypen
-%D \setobject{name}=\somebox{}
-%D \getobject{name}
-%D \stoptypen
-%D
-%D Here \type{\somebox} can be whatever box specification
-%D suits \TEX.
-
-\def\setobject#1%
- {\dosetuppaper{\papierformaat}{\the\papierbreedte}{\the\papierhoogte}%
- \dowithnextbox
- {\setxvalue{\r!object#1}%
- {\noexpand\dogetobject{#1}
- {\ifhbox\nextbox\hbox\else\vbox\fi}
- {\the\wd\nextbox}{\the\ht\nextbox}{\the\dp\nextbox}}%
- \dostartobject{#1}%
- {\number\wd\nextbox}{\number\ht\nextbox}{\number\dp\nextbox}%
- \box\nextbox
- \dostopobject}}
-
-\def\dogetobject#1#2#3#4#5%
- {\dosetuppaper{\papierformaat}{\the\papierbreedte}{\the\papierhoogte}%
- \bgroup
- \setbox0=\vbox to #4{\vfill\doinsertobject{#1}}%
- \setbox0=#2{\box0}%
- \wd0=#3\ht0=#4\dp0=#5\relax
- \box0
- \egroup}
-
-\def\getobject#1%
- {\getvalue{\r!object#1}}
-
-%D We keep track of object references by means of the cross
-%D reference mechanism. Normally, objects are defined before
-%D they are used, but forward referencing sometimes occurs.
-%D
-%D \starttypen
-%D \dosetobjectreference {identifier} {reference value}
-%D \dogetobjectreference {identifier} \csname
-%D \stoptypen
-
-\def\dosetobjectreference#1#2%
- {\checkreferences
- \bgroup
- \locationfalse % we don't want this to be a location
- \textreference[\r!driver#1]{#2}%
- \egroup
- \setxvalue{\r!cross\r!driver#1}{\rt!cross{}{0}{#2}{0}}}
-
-\def\dogetobjectreference#1#2%
- {\doifrawreferencefoundelse{\r!driver#1}
- {\global\let#2=\currenttextreference}
- {\showmessage{\m!references}{30}{[#1]}%
- \global\def#2{0}}}
-
-\protect
-
-\endinput
+%D \module +%D [ file=core-obj, +%D version=1998.01.15, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Object Handling, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. Non||commercial use is +%C granted. + +\writestatus{loading}{Context Core Macros / Object Handling} + +\unprotect + +\startmessages dutch library: references + 30: onbekend object -- + 31: dubbel object -- +\stopmessages + +\startmessages english library: references + 30: unknown object -- + 31: duplicate object -- +\stopmessages + +\startmessages german library: references + 30: unbekanntes Object -- + 31: doppeltes Object -- +\stopmessages + +%D Boxes can be considered reuable objects. Unfortunaltely once +%D passed to the \DVI\ file, such objects cannot be reused. In +%D \PDF\ however, reusing is possible and sometimes even a +%D necessity. Therefore, \CONTEXT\ supports reusable objects. +%D +%D During the \TEX\ processing run, boxes can serve the purpose +%D of objects, and the \DVI\ driver module implements objects +%D using boxes. Only when \ETEX\ is widespread, and therefore +%D the limit on 256 boxes is removed, this becomes useful. +%D +%D The \PDF\ and \PDFTEX\ driver modules implement objects +%D using \PDF\ forms. There is no (real) restriction on the +%D number of objects there. +%D +%D The first application of objects in \CONTEXT\ concerned +%D \METAPOST\ graphics and fill||in form fields. The first +%D application can save lots of bytes, while the latter use is +%D more a necessity than byte saving. +%D +%D \starttypen +%D \setobject{class}{name}\somebox{} +%D \getobject{class}{name} +%D \stoptypen +%D +%D Here \type{\somebox} can be whatever box specification +%D suits \TEX. + +\def\presetobject#1#2% + {\doifundefined{\r!object#1::#2} + {\setxvalue{\r!object#1::#2}{NOT YET FLUSHED}}} + +\def\setobject#1#2% evt \initializepaper naar \everyshipout + {\initializepaper + \ifundefined{\r!object#1::#2}% + \expandafter\dosetobject + \else + \expandafter\gobblefourarguments + \fi + {#1}{#2}} + +\def\dosetobject#1#2% + {\dowithnextbox + {\bgroup + \dontshowcomposition % rather fuzzy in \setxvalue ... \hbox + \setxvalue{\r!object#1::#2}% + {\noexpand\dohandleobject{#1}{#2} + {\ifhbox\nextbox\hbox\else\vbox\fi} + {\the\wd\nextbox}{\the\ht\nextbox}{\the\dp\nextbox}}% + \dostartobject{#1}{#2} + {\number\wd\nextbox}{\number\ht\nextbox}{\number\dp\nextbox}% + \box\nextbox + \dostopobject + \egroup}} + +\def\dogetobject#1#2#3#4#5#6% + {\initializepaper + \bgroup + \dontshowcomposition + \setbox0=\vbox to #5{\vfill\doinsertobject{#1}{#2}}% + \setbox0=#3{\box0}% + \wd0=#4\ht0=#5\dp0=#6\relax + \box0 + \egroup} + +\def\getobject#1#2% + {\let\dohandleobject\dogetobject + \getvalue{\r!object#1::#2}} + +%D If needed one can ask for the dimensions of an object with: +%D +%D \starttypen +%D \getobjectdimensions{class}{name} +%D \stoptypen +%D +%D The results are reproted in \type {\objectwidth}, \type +%D {\objectheight} and \type {\objectdepth}. + +\def\dogetobjectdimensions#1#2#3#4#5#6% + {\def\objectwidth {#4}% + \def\objectheight{#5}% + \def\objectdepth {#6}} + +\def\getobjectdimensions#1#2% + {\let\dohandleobject\dogetobjectdimensions + \let\objectwidth \!!zeropoint + \let\objectheight\!!zeropoint + \let\objectdepth \!!zeropoint + \getvalue{\r!object#1::#2}} + +%D We keep track of object references by means of the cross +%D reference mechanism. Normally, objects are defined before +%D they are used, but forward referencing sometimes occurs. +%D +%D \starttypen +%D \dosetobjectreference {class} {identifier} {reference value} +%D \dogetobjectreference {class} {identifier} \csname +%D \stoptypen +%D +%D These commands are to be called by the \type{\startobject}, +%D \type{\stopobject} and \type{\insertobject} specials. + +\newif\ifobjectreferencing \objectreferencingtrue + +\def\checkobjectreferences% + {\bgroup + \setbox0=\hbox + {\doutilities{objectreferences}{\jobname}{}{}{}}% + \global\let\checkobjectreferences=\relax + \egroup} + +\def\setobjectreferences% + {\def\objectreference##1##2##3% + {\doifundefinedelse{\r!driver##1::##2} + {\setxvalue{\r!driver##1::##2}{##3}} + {\showmessage{\m!references}{31}{[##1 ##2=>##3]}}}} + +\def\resetobjectreferences% + {\let\objectreference=\gobblethreearguments} + +\resetobjectreferences + +\def\dosetobjectreference#1#2#3% + {\checkobjectreferences + \ifobjectreferencing + \bgroup + \edef\dowritereference% + {\writeutilitycommand{\objectreference{#1}{#2}{#3}}}% + \dowritereference + \egroup + \else + \global\objectreferencingtrue + \fi + \setxvalue{\r!driver#1::#2}{#3}} + +\def\defaultobjectreference#1#2{0} + +\def\dogetobjectreference#1#2#3% + {\checkobjectreferences + \doifdefinedelse{\r!driver#1::#2} + {\@EA\xdef\@EA#3\@EA{\csname\r!driver#1::#2\endcsname}} + {\showmessage{\m!references}{30}{[#1 #2=>\defaultobjectreference{#1}{#2}]}% + \xdef#3{\defaultobjectreference{#1}{#2}}}} + +\let\normalsetobject=\setobject + +\def\setobject% + {\global\objectreferencingfalse\normalsetobject} + +\def\setreferenceobject% + {\global\objectreferencingtrue\normalsetobject} + +%D \macro +%D {doifobjectfoundelse,doifobjectreferencefoundelse} +%D +%D To prevent redundant definition of objects, one can use +%D the next tests: +%D +%D \starttypen +%D \doifobjectfoundelse{class}{object}{do then}{do else} +%D \doifobjectreferencefoundelse{class}{object}{do then}{do else} +%D \stoptypen + +\def\doifobjectfoundelse#1#2#3#4% + {\doifundefinedelse{\r!object#1::#2}{#4}{#3}} + +\def\doifobjectreferencefoundelse#1#2#3#4% + {\checkobjectreferences + \doifundefinedelse{\r!driver#1::#2}{#4}{#3}} + +%D \macro +%D {doifobjectssupportedelse} +%D +%D Starting with reuse of graphics, we will implement object +%D reuse when possible. To enable mechanisms to determine +%D what method to use, we provide: +%D +%D \starttypen +%D \doifobjectssupportedelse{true action}{false action} +%D \stoptypen +%D +%D As we can see, currently objects depend on the special +%D driver. + +\newif\ifobjectssupported \objectssupportedtrue + +\def\doifobjectssupportedelse#1#2% + {\ifobjectssupported + \doifspecialavailableelse\doinsertobject{#1}{#2}% + \else + #2% + \fi} + +%D There is a conceptual problem here. Objects are not possible +%D in \DVI, unless faked like in \type {spec-dvi}. This means +%D that we must be careful in loading special drivers that do +%D support objects while we still want to be able to use the +%D \DVI\ output. + +\protect + +\endinput |