pack-obj.mkxl /size: 7239 b    last modification: 2025-02-21 11:03
1%D \module
2%D   [       file=pack-obj,
3%D        version=1998.01.15,
4%D          title=\CONTEXT\ Packaging Macros,
5%D       subtitle=Objects,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14\writestatus{loading}{ConTeXt Packaging Macros / Objects}
15
16\unprotect
17
18\registerctxluafile{pack-obj}{autosuffix}
19
20%D \macros
21%D   {setobject,getobject,ifinobject}
22%D
23%D Boxes can be considered reuable objects. Traditionally once passed to the \DVI\
24%D file, such objects cannot be reused. In \PDF\ however, reusing is possible and
25%D sometimes even a necessity. Therefore, \CONTEXT\ supports reusable objects and
26%D \LUATEX\ has native support for so called box resources.
27%D
28%D The first application of objects in \CONTEXT\ concerned \METAPOST\ graphics and
29%D fill||in form fields. Reusing resources can save lots of bytes and sometimes also
30%D runtime.
31%D
32%D \starttyping
33%D \setobject{class}{name}\somebox{}
34%D \getobject{class}{name}
35%D \stoptyping
36%D
37%D Here \type {\somebox} can be whatever box specification suits \TEX. Although the
38%D implementation in \MKIV\ is somewhat different the principles have not changed.
39
40\installcorenamespace {objects}
41
42\mutable\def\objectoffset{1cm} % Still public but use with care!
43
44\newif       \ifinobject
45\newbox      \b_pack_objects
46\newdimension\d_pack_objects_offset \permanent\def\objectmargin{\the\d_pack_objects_offset}
47\newdimension\d_pack_objects_width  \permanent\def\objectwidth {\the\d_pack_objects_width}
48\newdimension\d_pack_objects_height \permanent\def\objectheight{\the\d_pack_objects_height}
49\newdimension\d_pack_objects_depth  \permanent\def\objectdepth {\the\d_pack_objects_depth}
50
51%D If I have time I will use the unreferenced variant for e.g. mp reuse. This can be
52%D rewritten in \LUA\ anyway.
53
54%D Tagging doesn't provide a local structure for an xform so if tagging is needed than one
55%D should not use object reuse with content that demands it. Figuring out a work around is
56%D not worth the trouble.
57
58\permanent\protected\def\setreferencedobject       #1#2{\begingroup\taggingpause\synctexpause\d_pack_objects_offset\objectoffset\inobjecttrue\dowithnextbox{\pack_objects_set_yes{#1}{#2}}}
59\permanent\protected\def\settightreferencedobject  #1#2{\begingroup\taggingpause\synctexpause\d_pack_objects_offset\zeropoint   \inobjecttrue\dowithnextbox{\pack_objects_set_yes{#1}{#2}}}
60\permanent\protected\def\setunreferencedobject     #1#2{\begingroup\taggingpause\synctexpause\d_pack_objects_offset\objectoffset\inobjecttrue\dowithnextbox{\pack_objects_set_nop{#1}{#2}}}
61\permanent\protected\def\settightunreferencedobject#1#2{\begingroup\taggingpause\synctexpause\d_pack_objects_offset\zeropoint   \inobjecttrue\dowithnextbox{\pack_objects_set_nop{#1}{#2}}}
62
63\aliased\let\setobject     \setreferencedobject
64\aliased\let\settightobject\settightreferencedobject
65
66%D We can get subtle differences in boundingboxes but both methods work ok.
67
68% How useful is this ... delayed but refered objects .. messy concept.
69%
70% \def\InitIt{%
71%     \c_pack_objects_delay\plusone
72%     \setobject{test}{1}\hbox{test me 1}
73%     \c_pack_objects_delay\zerocount
74% }
75%
76% \def\GetIt{%
77%     \c_pack_objects_delay\plusone
78%     \getobject{test}{1}
79%     \c_pack_objects_delay\zerocount
80% }
81%
82% \def\SetIt{%
83%     \c_pack_objects_delay\plustwo
84%     \setobject{test}{1}\hbox{\bf HERE}% we cannot have interactivity in xforms
85%     \c_pack_objects_delay\zerocount
86% }
87
88\newconstant\c_pack_objects_offset_mode % 0=tex 1=box
89\newconstant\c_pack_objects_delay       % 0=immediate 1=delay
90
91\protected\def\pack_objects_set_yes#1#2%
92  {\ifcase\c_pack_objects_offset_mode
93     \ifzeropt\d_pack_objects_offset
94       \pack_objects_package_nop\nextbox
95     \else
96       \pack_objects_package_yes\nextbox
97     \fi
98   \else
99     \pack_objects_package_nop\nextbox
100   \fi
101   \clf_registerreferencedobject
102     {#1}{#2}%
103     \b_pack_objects
104     \d_pack_objects_offset
105     \c_pack_objects_offset_mode
106     \c_pack_objects_delay
107   \synctexresume
108   \endgroup}
109
110\protected\def\pack_objects_set_nop#1#2%
111  {\ifcase\c_pack_objects_offset_mode
112     \ifzeropt\d_pack_objects_offset
113       \pack_objects_package_nop\nextbox
114     \else
115       \pack_objects_package_yes\nextbox
116     \fi
117   \else
118     \pack_objects_package_nop\nextbox
119   \fi
120   \clf_registerobject
121     {#1}{#2}%
122     \b_pack_objects
123     \d_pack_objects_offset
124     \c_pack_objects_offset_mode
125     \c_pack_objects_delay
126   \synctexresume
127   \endgroup}
128
129\def\pack_objects_package_nop#1% we pack because otherwise \ruledhbox is still tight
130  {\setbox\b_pack_objects\hpack{\box#1}}
131
132\def\pack_objects_package_yes#1%
133  {\d_pack_objects_width {\wd#1+2\d_pack_objects_offset}%
134   \d_pack_objects_height{\ht#1+ \d_pack_objects_offset}%
135   \d_pack_objects_depth {\dp#1+ \d_pack_objects_offset}%
136   \setbox\b_pack_objects\hpack{\hskip\d_pack_objects_offset\box#1}%
137   \wd\b_pack_objects\d_pack_objects_width
138   \ht\b_pack_objects\d_pack_objects_height
139   \dp\b_pack_objects\d_pack_objects_depth}
140
141\permanent\protected\def\getobject#1#2%
142  {\begingroup
143   \synctexpause
144   \clf_restoreobject{#1}{#2}%
145   \ifzeropt\d_pack_objects_offset\else
146     \d_pack_objects_offset-\d_pack_objects_offset
147     \pack_objects_package_yes\b_pack_objects
148   \fi
149   \box\b_pack_objects
150   \synctexresume
151   \endgroup}
152
153%D If needed one can ask for the dimensions of an object with:
154%D
155%D \starttyping
156%D \getobjectdimensions{class}{name}
157%D \stoptyping
158%D
159%D The results are reported in \type {\objectwidth}, \type {\objectheight} and \type
160%D {\objectdepth} as well as \type {\objectoffset}.
161
162% \getobjectdimensions #1#2 % defined at the lua end
163
164%D \macros
165%D   {doifobjectfoundelse,doifobjectreferencefoundelse}
166%D
167%D To prevent redundant definition of objects, one can use the next tests:
168%D
169%D \starttyping
170%D \doifobjectfoundelse{class}{object}{do then}{do else}
171%D \doifobjectreferencefoundelse{class}{object}{do then}{do else}
172%D \stoptyping
173
174\immutable\def\defaultobjectreference{0}
175\immutable\def\defaultobjectpage     {\realfolio}
176
177% \getobjectreference           {#1}{#2\csname % define at the lua end
178% \getobjectreferencepage       {#1}{#2\csname % define at the lua end
179% \doifelseobjectfound          {#1}{#2}       % defined atthe lua end
180% \doifelseobjectreferencefound {#1}{#2}       % defined atthe lua end
181
182\aliased\let\dogetobjectreference    \getobjectreference     % for now, will go away
183\aliased\let\dogetobjectreferencepage\getobjectreferencepage % for now, will go away
184
185\aliased\let\doifobjectfoundelse         \doifelseobjectfound
186\aliased\let\doifobjectreferencefoundelse\doifelseobjectreferencefound
187
188%D For the moment here:
189
190\mutable\lettonothing\lastpredefinedsymbol % some day we can do more at the lua end
191
192\permanent\protected\def\predefinesymbol[#1]%
193  {\begingroup
194   \xdef\lastpredefinedsymbol{#1}%
195   \settightobject{SYM}{#1}\hbox{\symbol[#1]}% to be checked ... maybe only fitting
196   \getobjectreference{SYM}{#1}\m_back_object_reference
197   \clf_registerbackendsymbol{#1}\m_back_object_reference\relax
198   \endgroup}
199
200\protect \endinput
201