1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21\writestatus{loading}{ConTeXt Graphic Macros Figure Inclusion}
22
23\registerctxluafile{grphimg}{}
24\registerctxluafile{grphinc}{autosuffix}
25\registerctxluafile{grphbmp}{}
26\registerctxluafile{grphchk}{}
27\registerctxluafile{grphcon}{}
28\registerctxluafile{grphfil}{}
29
30\registerctxluafile{grphu3d}{}
31
32
33\unprotect
34
35
36
37
38
39
40
41
42
43\ifdefined\dotagfigure \else \aliased\let\dotagfigure\relax \fi
44
45\installcorenamespace{externalfigure}
46\installcorenamespace{externalfigureinstance}
47\installcorenamespace{externalfigurecollection}
48
49\installframedcommandhandler \??externalfigure {externalfigure} \??externalfigure
50
51\aliased\let\setupexternalfigures\setupexternalfigure
52
53\setupexternalfigures[
54 \c!method =,
55 \c!label =,
56 \c!size =,
57 \c!conversion =,
58 \c!resolution =,
59 \c!prefix =,
60 \c!cache =,
61 \c!page =\zerocount,
62 \c!file =,
63 \c!display =,
64 \c!mask =,
65 \c!range =,
66 \c!preset =\v!yes,
67 \c!split =,
68 \c!color =,
69 \c!arguments =,
70 \c!symbol =\v!no,
71 \c!controls =\v!no,
72 \c!resources =,
73 \c!preview =\v!no,
74 \c!repeat =\v!no,
75 \c!foregroundcolor=,
76 \c!interaction =\v!none,
77 \c!hfactor =,
78 \c!wfactor =,
79 \c!factor =,
80 \c!defaultwidth =8\lineheight,
81 \c!defaultheight =6\lineheight,
82 \c!maxwidth =\externalfigureparameter\c!width,
83 \c!maxheight =\externalfigureparameter\c!height,
84 \c!xscale =,
85 \c!yscale =,
86 \c!scale =,
87 \c!sx =\externalfigureparameter\c!s,
88 \c!sy =\externalfigureparameter\c!s,
89 \c!s =1,
90 \c!width =,
91 \c!height =,
92 \c!lines =,
93 \c!grid =,
94 \c!bodyfont =\bodyfontsize,
95 \c!object =\v!yes,
96 \c!corner =\v!rectangular,
97 \c!frame =\v!off,
98 \c!option =,
99 \c!reset =\v!no,
100 \c!directory =,
101 \c!radius =.5\bodyfontsize,
102 \c!background =,
103 \c!splitcolor =\s!white,
104 \c!order =,
105 \c!equalwidth =,
106 \c!equalheight =,
107 \c!location ={\v!local,\v!global},
108 \c!frames =\v!off,
109 \c!ymax =24,
110 \c!xmax =,
111 \c!align =\v!none,
112 \c!crossreference =\v!no,
113 \c!transform =\v!auto,
114 \c!userpassword =,
115 \c!ownerpassword =,
116 \c!compact =preset:\s!default,
117 \c!metadata =\v!page,
118 \c!cmyk =,
119 \c!crop =\v!yes,
120 ]
121
122
123
124\newinteger\c_grph_include_nesting
125
126\newtoks \everyexternalfigureresets
127\newtoks \everyexternalfigurechecks
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177\newconditional\c_grph_include_trace_inheritance
178
179\installtextracker
180 {graphics.inheritance}
181 {\c_grph_include_trace_inheritance\conditionaltrue}
182 {\c_grph_include_trace_inheritance\conditionalfalse}
183
184\installcorenamespace{externalfiguredefinition}
185
186\aliased\let\defineexternalfigures\defineexternalfigure
187
188
189
190
191
192\permanent\tolerant\protected\def\useexternalfigure[#1]#*[#2]#*[#S#3]#*[#S#4]
193 {\ifempty{#1}
194 \ifempty{#2}\else
195 \ifhastok={#3}
196 \grph_include_use_indeed{#2}{#2}{#3}{#4}
197 \else
198 \grph_include_use_indeed{#2}{#2}\empty{#4}
199 \fi
200 \fi
201 \orelse\ifempty{#2}
202 \ifhastok={#3}
203 \grph_include_use_indeed{#1}{#1}\empty{#3}
204 \else
205 \grph_include_use_indeed{#1}{#1}{#3}{#4}
206 \fi
207 \else
208 \ifhastok={#3}
209 \grph_include_use_indeed{#1}{#2}\empty{#3}
210 \else
211 \grph_include_use_indeed{#1}{#2}{#3}{#4}
212 \fi
213 \fi}
214
215\def\grph_include_use_indeed#1#2#3#4
216 {\gdefcsname\??externalfigureinstance#1\endcsname{\grph_include_setup{#2}{#3}{#4}}
217 \grph_include_analyze_collection[#2][#4]}
218
219
220
221\permanent\tolerant\protected\def\externalfigure[#1]#,[#2]#,[#S#3]
222 {\ifhastok={#2}
223 \grph_include_place[#1][][#2]
224 \else
225 \grph_include_place[#1][#2][#3]
226 \fi}
227
228
229
230\def\grph_include_setup#1#2#3
231 {\cdef\m_grph_include_name {#1}
232 \cdef\m_grph_include_parent{#2}
233 \ifempty\m_grph_include_name \else
234 \let\p_grph_include_name\m_grph_include_name
235 \fi
236 \ifempty\m_grph_include_parent \else
237 \grph_include_inherit_from_parent\m_grph_include_parent
238 \fi
239 \setupcurrentexternalfigure[#3]}
240
241\def\grph_include_inherit_from_parent#1
242 {\ifcsname\??externalfigure#1:\s!parent\endcsname
243 \let\currentexternalfigure#1
244 \fi
245 \ifcsname\??externalfigureinstance#1\endcsname
246 \ifconditional\c_grph_include_trace_inheritance\writestatus\m!figures{inheriting from instance: #1}\fi
247 \csname\??externalfigureinstance#1\endcsname
248 \fi}
249
250\newtoks\t_grph_include_local_settings
251
252\appendtoks
253 \enforced\let\textunderscore\letterunderscore
254
255 \dontcomplain
256 \restorecatcodes
257 \forgetall
258\to \t_grph_include_local_settings
259
260\def\grph_include_place_inherit
261 {\ifconditional\c_grph_include_trace_inheritance
262 \writestatus\m!figures{label: \p_grph_include_label, name: \p_grph_include_name, parent: \p_grph_include_parent}
263 \fi
264 \ifempty\p_grph_include_parent
265
266 \orelse\ifx\p_grph_include_parent\p_grph_include_label
267
268 \else
269 \grph_include_inherit_from_parent\p_grph_include_parent
270 \fi
271 \ifempty\p_grph_include_label
272
273 \else
274 \grph_include_inherit_from_parent\p_grph_include_label
275 \fi}
276
277\def\grph_include_place[#1][#S#2][#S#3]
278 {\bgroup
279 \advanceby\c_grph_include_nesting\plusone
280 \cdef\currentexternalfigure{\the\c_grph_include_nesting}
281 \checkexternalfigureparent
282
283 \expand\everyexternalfigureresets
284
285 \edef\p_grph_include_label{#1}
286 \let\p_grph_include_name\p_grph_include_label
287 \ifhastok={#2}
288
289 \let\p_grph_include_parent\p_grph_include_label
290 \grph_include_place_inherit
291 \setupcurrentexternalfigure[#2]
292 \else
293
294 \edef\p_grph_include_parent{#2}
295 \ifempty\p_grph_include_parent
296 \let\p_grph_include_parent\p_grph_include_label
297 \fi
298 \grph_include_place_inherit
299 \setupcurrentexternalfigure[#3]
300 \fi
301
302 \expand\everyexternalfigurechecks
303
304 \expand\t_grph_include_local_settings
305
306
307
308 \dostarttaggednodetail\t!image
309 \clf_figure_push {
310 name {\p_grph_include_name}
311
312 label {\ifempty{\externalfigureparameter\c!label}\p_grph_include_label\else\lastnamedcs\fi}
313 page {\externalfigureparameter\c!page}
314 file {\externalfigureparameter\c!file}
315 size {\externalfigureparameter\c!size}
316 object {\externalfigureparameter\c!object}
317 prefix {\externalfigureparameter\c!prefix}
318 cache {\externalfigureparameter\c!cache}
319 format {\externalfigureparameter\c!method}
320 preset {\externalfigureparameter\c!prefix}
321 controls {\externalfigureparameter\c!controls}
322 resources {\externalfigureparameter\c!resources}
323 preview {\externalfigureparameter\c!preview}
324 display {\externalfigureparameter\c!display}
325 mask {\externalfigureparameter\c!mask}
326 range {\externalfigureparameter\c!range}
327 conversion {\externalfigureparameter\c!conversion}
328 resolution {\externalfigureparameter\c!resolution}
329 color {\externalfigureparameter\c!color}
330 cmyk {\externalfigureparameter\c!cmyk}
331 arguments {\externalfigureparameter\c!arguments}
332 repeat {\externalfigureparameter\c!repeat}
333 transform {\externalfigureparameter\c!transform}
334 compact {\externalfigureparameter\c!compact}
335 metadata {\externalfigureparameter\c!metadata}
336 userpassword {\externalfigureparameter\c!userpassword}
337 ownerpassword{\externalfigureparameter\c!ownerpassword}
338 crop {\externalfigureparameter\c!crop}
339 \ifchkdimexpr\externalfigureparameter\c!width\or
340 width \lastchkdimension
341 \fi
342 \ifchkdimexpr\externalfigureparameter\c!height\or
343 height \lastchkdimension
344 \fi
345 }
346 \clf_figure_identify
347 \relax
348 \ifconditional\c_grph_include_test_only
349 \ifcase\figurestatus \else
350 \clf_figure_check
351 \clf_figure_dummy
352 \clf_figure_scale
353 \clf_figure_done
354 \fi
355 \grph_include_set_mode
356 \else
357 \ifcase\figurestatus
358 \clf_figure_dummy
359 \clf_figure_scale
360 \else
361 \clf_figure_check
362 \clf_figure_include
363 \clf_figure_scale
364 \fi
365 \clf_figure_done
366 \grph_include_set_mode
367 \grph_include_finalize
368 \fi
369 \clf_figure_pop
370 \dotagfigure
371
372 \scratchcounter\zerocount
373 \edef\p_crossreference{\externalfigureparameter\c!crossreference}
374 \iflocation\iftrialtypesetting\else
375 \ifempty\p_crossreference
376
377 \orelse\ifx\p_crossreference\v!no
378
379 \orelse\ifx\p_crossreference\v!yes
380 \ifhastok={#2}
381 \scratchcounter\clf_figure_register_page{#1}{}{#2}\relax
382 \else
383 \scratchcounter\clf_figure_register_page{#1}{#2}{#3}\relax
384 \fi
385 \else
386 \scratchcounter\p_crossreference
387 \fi
388 \fi\fi
389 \naturalvpack
390 attr \imageattribute \plustwo
391 \ifnum\scratchcounter>\zerocount
392 {\strc_references_cross_forward {ex:\number \scratchcounter}{\box\foundexternalfigure}}
393 \orelse\ifnum\scratchcounter<\zerocount
394 {\strc_references_cross_backward{ex:\number\scratchcounter}{\box\foundexternalfigure}}
395 \else
396 {\box\foundexternalfigure}
397 \fi
398
399
400
401
402
403
404
405
406
407
408
409 \dostoptagged
410 \egroup}
411
412\permanent\protected\def\setfigureconversion[#1]#*[#2]
413 {\clf_setfigureconversion{#1}{#2}}
414
415
416
417\def\strc_references_cross_forward#1#2
418 {\begingroup
419 \strc_references_set_simple_internal_reference{cross:b:#1}
420 \naturalhpack
421 attr \destinationattribute\number\lastdestinationattribute
422 {\naturalhpack{\strc_references_flush_destination_nodes\directgotodumbbox{#2}[cross:f:#1]}}
423 \endgroup}
424
425\def\strc_references_cross_backward#1#2
426 {\begingroup
427 \strc_references_set_simple_internal_reference{cross:f:#1}
428 \naturalhpack
429 attr \destinationattribute\number\lastdestinationattribute
430 {\naturalhpack{\strc_references_flush_destination_nodes\directgotodumbbox{#2}[cross:b:#1]}}
431 \endgroup}
432
433\aliased\let\doexternalfigurerepeat\gobblefourarguments
434
435\permanent\tolerant\protected\def\placeregisteredexternalfigures[#1]
436 {\page
437 \begingroup
438 \enforced\protected\def\doexternalfigurerepeat{\grph_include_place_registered_indeed{#1}}
439 \dorecurse\clf_figure_nof_registered_pages
440 {\page
441 \clf_figure_flush_registered_pages\recurselevel
442 \page}
443 \endgroup
444 \page}
445
446\protected\def\grph_include_place_registered_indeed#1#2#3#4#5
447 {\grph_include_place[#2][#3][#4,
448 \c!hfactor=,\c!wfactor=,\c!factor=,
449 \c!maxwidth=,\c!maxheight=,
450 \c!xscale=,\c!yscale=,\c!scale=,
451 \c!sx=,\c!sy=,\c!s=,
452 \c!width=,\c!height=,
453 \c!crossreference=#5,
454 #1]}
455
456
457
458\mutable\let\dowithfigure\relax
459
460\permanent\protected\def\doscalefigure
461 {\global\setbox\foundexternalfigure\vpack{\scale[\v!figure]{\dowithfigure{\box\foundexternalfigure}}}}
462
463\definescale
464 [\v!figure]
465 [\c!hfactor =\externalfigureparameter\c!hfactor,
466 \c!wfactor =\externalfigureparameter\c!wfactor,
467 \c!factor =\externalfigureparameter\c!factor,
468 \c!maxwidth =\externalfigureparameter\c!maxwidth,
469 \c!maxheight =\externalfigureparameter\c!maxheight,
470 \c!equalwidth =\externalfigureparameter\c!equalwidth,
471 \c!equalheight=\externalfigureparameter\c!equalheight,
472 \c!xscale =\externalfigureparameter\c!xscale,
473 \c!yscale =\externalfigureparameter\c!yscale,
474 \c!scale =\externalfigureparameter\c!scale,
475 \c!sx =\externalfigureparameter\c!sx,
476 \c!sy =\externalfigureparameter\c!sy,
477 \c!s =\externalfigureparameter\c!s,
478 \c!width =\externalfigureparameter\c!width,
479 \c!height =\externalfigureparameter\c!height,
480 \c!lines =\externalfigureparameter\c!lines]
481
482
483
484
485
486
487
488
489
490\permanent\tolerant\protected\def\definegraphictypesynonym[#1]#*[#2]
491 {\clf_registerfiguresuffix{#1}{#2}}
492
493
494
495
496\permanent\protected\def\setfigurepathlist
497 {\clf_setfigurepaths{\externalfigureparameter\c!location}{\externalfigureparameter\c!directory}}
498
499
500
501\newbox \foundexternalfigure
502\newtoks\externalfigurepostprocessors
503
504\permanent\untraced\def\figurestatus {\numexpr\clf_figurestatus{status}{0}\relax}
505\permanent\untraced\def\figurewidth {\clf_figurestatus{width}{0}sp}
506\permanent\untraced\def\figureheight {\clf_figurestatus{height}{0}sp}
507\permanent\untraced\def\figuredepth {\clf_figurestatus{depth}{0}sp}
508\permanent\untraced\def\figurexscale {\clf_figurestatus{xscale}{1}}
509\permanent\untraced\def\figureyscale {\clf_figurestatus{yscale}{1}}
510\permanent\untraced\def\figurereference {\clf_figurestatus{reference}{}}
511
512\permanent\untraced\def\figuresize {\clf_figurerequest{size}{}}
513\permanent\untraced\def\figurelabel {\clf_figurerequest{label}{}}
514\permanent\untraced\def\figurefileoriginal {\clf_figurerequest{name}{}}
515\permanent\untraced\def\figurefilepage {\clf_figurerequest{page}{1}}
516\permanent\untraced\def\figurefileoptions {\clf_figurerequest{options}{}}
517\permanent\untraced\def\figurefileconversion{\clf_figurerequest{conversion}{}}
518\permanent\untraced\def\figurefileresolution{\clf_figurerequest{resolution}{}}
519\permanent\untraced\def\figurefilecolor {\clf_figurerequest{color}{}}
520\permanent\untraced\def\figurefilearguments {\clf_figurerequest{arguments}{}}
521\permanent\untraced\def\figurefilecache {\clf_figurerequest{cache}{}}
522\permanent\untraced\def\figurefileprefix {\clf_figurerequest{prefix}{}}
523
524\permanent\untraced\def\figurenaturalwidth {\clf_figureused{width}{\number\dimexpr\externalfigureparameter\c!defaultwidth\relax}sp}
525\permanent\untraced\def\figurenaturalheight {\clf_figureused{height}{\number\dimexpr\externalfigureparameter\c!defaultheight\relax}sp}
526\permanent\untraced\def\figurexresolution {\clf_figureused{xresolution}{0}}
527\permanent\untraced\def\figureyresolution {\clf_figureused{yresolution}{0}}
528\permanent\untraced\def\figureorientation {\clf_figureused{orientation}{1}}
529\permanent\untraced\def\figurerotation {\clf_figureused{rotation}{0}}
530\permanent\untraced\def\figurexsize {\clf_figureused{xsize}{0}}
531\permanent\untraced\def\figureysize {\clf_figureused{ysize}{0}}
532\permanent\untraced\def\figurecolordepth {\clf_figureused{colordepth}{0}}
533
534\permanent\untraced\def\figurefullname {\clf_figureused{fullname}{}}
535\permanent\untraced\def\noffigurepages {\clf_figureused{pages}{0}}
536
537
538
539
540
541\permanent\let\naturalfigurewidth \figurenaturalwidth
542\permanent\let\naturalfigureheight \figurenaturalheight
543
544\aliased\let\figurescalewidth \figurewidth
545\aliased\let\figurescaleheight \figureheight
546\aliased\let\figurescalexscale \figurexscale
547\aliased\let\figurescaleyscale \figureyscale
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563\newconditional\c_grph_include_skip
564\newconditional\c_grph_include_test_only
565\newconditional\c_grph_include_level \c_grph_include_level\conditionalfalse
566\newconditional\c_grph_include_flush \c_grph_include_flush\conditionaltrue
567
568\newsystemmode\v!figure
569
570\def\grph_include_set_mode
571 {\ifcase\figurestatus
572 \globalresetsystemmode\v!figure
573 \else
574 \globalsetsystemmode \v!figure
575 \fi}
576
577\appendtoks
578 \clf_setfigurepaths
579 {\externalfigureparameter\c!location}
580 {\externalfigureparameter\c!directory}
581 \clf_figurereset
582 \foundexternalfigure
583 {\externalfigureparameter\c!defaultwidth}
584 {\externalfigureparameter\c!defaultheight}
585 \relax
586\to \everyexternalfigureresets
587
588\appendtoks
589 \edef\p_option{\externalfigureparameter\c!option}
590 \ifx\p_option\v!frame
591 \c_grph_include_skip\conditionalfalse
592 \letexternalfigureparameter\c!frame\v!on
593 \orelse\ifx\p_option\v!empty
594 \c_grph_include_skip\conditionaltrue
595 \letexternalfigureparameter\c!frame\v!off
596 \else
597 \c_grph_include_skip\conditionalfalse
598 \fi
599
600
601 \edef\p_foregroundcolor{\externalfigureparameter\c!foregroundcolor}
602 \ifempty\p_foregroundcolor \else
603 \setexternalfigureparameter\c!background{\v!foreground,\v!color}
604 \letexternalfigureparameter\c!backgroundcolor\p_foregroundcolor
605 \fi
606\to \everyexternalfigurechecks
607
608
609
610
611
612
613\def\grph_include_process_tex#1
614 {\framed
615 [\c!strut=\v!none,\c!align=\v!normal,\c!frame=\v!off,
616 \c!offset=\v!overlay,\c!width=\v!fit,\c!height=\v!fit]
617 {\blank[\v!disable]
618 #1\endgraf
619 \removelastskip}}
620
621
622
623
624\permanent\protected\def\docheckfigurebuffer #1{\global\setbox\foundexternalfigure\vpack{\grph_include_process_tex{\getbuffer[#1]}}}
625\permanent\protected\def\docheckfiguretex #1{\global\setbox\foundexternalfigure\vpack{\grph_include_process_tex{\input{#1}}}}
626\permanent\protected\def\docheckfigurecld #1{\global\setbox\foundexternalfigure\vbox {\cldprocessfile{#1}}}
627\permanent\protected\def\docheckfiguremps #1{\global\setbox\foundexternalfigure\vpack{\convertMPtoPDF{#1}11}}
628\permanent\protected\def\docheckfiguremprun #1#2{\global\setbox\foundexternalfigure\vpack{\useMPrun{#1}{#2}}}
629
630\permanent\protected\def\relocateexternalfigure
631 {\global\setbox\foundexternalfigure\vpack to \ht\foundexternalfigure\bgroup
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650 \vkern\ht\foundexternalfigure
651
652 \ht\foundexternalfigure\zeropoint
653 \dp\foundexternalfigure\zeropoint
654 \hpack to \wd\foundexternalfigure\bgroup
655 \box\foundexternalfigure
656 \hss
657 \egroup
658 \egroup}
659
660\permanent\protected\def\startfoundexternalfigure#1#2
661 {\global\setbox\foundexternalfigure\vbox to #2\bgroup\vss\hbox to #1\bgroup}
662
663\permanent\protected\def\stopfoundexternalfigure
664 {\hss\egroup\egroup}
665
666\permanent\protected\def\emptyfoundexternalfigure
667 {\startfoundexternalfigure{\externalfigureparameter\c!defaultwidth}{\externalfigureparameter\c!defaultheight}
668 \stopfoundexternalfigure}
669
670
671
672
673
674\def\grph_include_finalize
675 {\global\setbox\foundexternalfigure\vbox
676 {\ifcase\figurestatus
677 \letexternalfigureparameter\c!frame\v!on
678 \fi
679 \ifconditional\c_grph_include_flush
680 \ifconditional\c_grph_include_level
681 \ifconditional\c_grph_include_skip
682
683 \fakebox\foundexternalfigure
684 \orelse\ifcase\figurestatus
685
686 \else
687 \expand\externalfigurepostprocessors
688 \box\foundexternalfigure
689 \fi
690 \else
691 \iftrialtypesetting \else \feedbackexternalfigure \fi
692 \c_grph_include_level\conditionaltrue
693 \ifconditional\c_grph_include_skip
694 \ifcase\figurestatus
695 \grph_include_replacement\figurelabel\figurefileoriginal{unknown}
696 \else
697 \grph_include_replacement\figurelabel\figurefullname{skipped}
698 \fi
699 \orelse\ifcase\figurestatus
700 \grph_include_replacement\figurelabel\figurefileoriginal{unknown}
701 \else
702 \expand\externalfigurepostprocessors
703 \edef\p_reset{\externalfigureparameter\c!reset}
704 \ifx\p_reset\v!yes
705 \wd\foundexternalfigure\figurewidth
706 \ht\foundexternalfigure\figureheight
707 \dp\foundexternalfigure\zeropoint
708 \box\foundexternalfigure
709 \else
710 \letexternalfigureparameter\c!offset\v!overlay
711 \letexternalfigureparameter\c!width \figurewidth
712 \letexternalfigureparameter\c!height\figureheight
713 \inheritedexternalfigureframed{\box\foundexternalfigure}
714 \fi
715 \fi
716 \fi
717 \else
718
719 \iftrialtypesetting \else \feedbackexternalfigure \fi
720 \fi}}
721
722\mutable\let\feedbackexternalfigure\relax
723
724\permanent\tolerant\protected\def\getfiguredimensions[#1]#*[#S#2]
725 {\startnointerference
726 \c_grph_include_test_only\conditionaltrue
727 \externalfigure[#1][#2,\c!display=,\c!mask=,\c!object=\v!no]
728 \stopnointerference}
729
730\permanent\protected\def\doifelsefigure#1
731 {\getfiguredimensions[#1]
732 \ifcase\figurestatus
733 \expandafter\secondoftwoarguments
734 \else
735 \expandafter\firstoftwoarguments
736 \fi}
737
738\aliased\let\doiffigureelse\doifelsefigure
739
740
741
742\permanent\tolerant\protected\def\registerexternalfigure[#1]#*[#S#2]#*[#S#3]
743 {\startnointerference
744 \c_grph_include_test_only
745 \c_grph_include_flush\conditionalfalse
746 \externalfigure[#1][#2][#3]
747 \externalfigure[#1][#2,\c!display=,\c!mask=,\c!object=\v!no]
748 \stopnointerference}
749
750
751
752
753\permanent\protected\def\dosetfigureobject#1#2
754 {\setobject{#1}{#2}\vpack{\box\foundexternalfigure}}
755
756\permanent\protected\def\doboxfigureobject#1#2
757 {\global\setbox\foundexternalfigure\vpack{\getobject{#1}{#2}}}
758
759
760
761\permanent\protected\def\usefigurebase[#1]
762 {\clf_usefigurebase{#1}}
763
764\appendtoks
765 \setfigurepathlist
766\to \everysetupexternalfigure
767
768\appendtoks
769 \clf_setfigurelookuporder{\externalfigureparameter\c!order}
770\to \everysetupexternalfigure
771
772\definecolor[missingfigurecolor][s=.8]
773
774\def\grph_include_replacement#1#2#3
775 {\bgroup
776 \letexternalfigureparameter\c!width\figurewidth
777 \letexternalfigureparameter\c!height\figureheight
778 \letexternalfigureparameter\c!background\v!color
779 \setexternalfigureparameter\c!backgroundcolor{missingfigurecolor}
780 \setexternalfigureparameter\c!align{\v!middle,\v!lohi}
781 \inheritedexternalfigureframed
782 {\ttxx \nohyphens
783
784
785 name: \expandeddetokenize{#1}\crlf
786 file: \expandeddetokenize{#2}\crlf
787 state: #3
788 }
789 \egroup}
790
791
792
793\newconditional\c_grph_include_in_collection
794
795\newdimension \d_grph_include_collection_minwidth
796\newdimension \d_grph_include_collection_maxwidth
797\newdimension \d_grph_include_collection_minheight
798\newdimension \d_grph_include_collection_maxheight
799
800\def\grph_include_analyze_collection[#1][#S#2]
801 {\ifconditional\c_grph_include_in_collection
802 \c_grph_include_in_collection\conditionalfalse
803 \getfiguredimensions[#1][#2]
804 \c_grph_include_in_collection\conditionaltrue
805 \scratchdimen\naturalfigurewidth
806 \ifdim\scratchdimen>\d_grph_include_collection_maxwidth \d_grph_include_collection_maxwidth \scratchdimen \fi
807 \ifdim\scratchdimen<\d_grph_include_collection_minwidth \d_grph_include_collection_minwidth \scratchdimen \fi
808 \scratchdimen\naturalfigureheight
809 \ifdim\scratchdimen>\d_grph_include_collection_maxheight \d_grph_include_collection_maxheight\scratchdimen \fi
810 \ifdim\scratchdimen<\d_grph_include_collection_minheight \d_grph_include_collection_minheight\scratchdimen \fi
811 \fi}
812
813\mutable\lettonothing\currentexternalfigurecollection
814
815\permanent\protected\def\startexternalfigurecollection[#1]
816 {\begingroup
817 \cdef\currentexternalfigurecollection{#1}
818 \c_grph_include_in_collection\conditionaltrue
819 \d_grph_include_collection_minwidth \maxdimen
820 \d_grph_include_collection_maxwidth \zeropoint
821 \d_grph_include_collection_minheight\maxdimen
822 \d_grph_include_collection_maxheight\zeropoint}
823
824\permanent\protected\def\stopexternalfigurecollection
825 {\xdefcsname\??externalfigurecollection\currentexternalfigurecollection:\c!minwidth \endcsname{\the\d_grph_include_collection_minwidth }
826 \xdefcsname\??externalfigurecollection\currentexternalfigurecollection:\c!maxwidth \endcsname{\the\d_grph_include_collection_maxwidth }
827 \xdefcsname\??externalfigurecollection\currentexternalfigurecollection:\c!minheight\endcsname{\the\d_grph_include_collection_minheight}
828 \xdefcsname\??externalfigurecollection\currentexternalfigurecollection:\c!maxheight\endcsname{\the\d_grph_include_collection_maxheight}
829 \endgroup}
830
831\permanent\def\externalfigurecollectionparameter#1#2
832 {\csname
833 \ifcsname\??externalfigurecollection#1:#2\endcsname
834 \??externalfigurecollection#1:#2
835 \else
836 \s!empty
837 \fi
838 \endcsname}
839
840\permanent\def\externalfigurecollectionminwidth #1{\externalfigurecollectionparameter{#1}\c!minwidth }
841\permanent\def\externalfigurecollectionmaxwidth #1{\externalfigurecollectionparameter{#1}\c!maxwidth }
842\permanent\def\externalfigurecollectionminheight#1{\externalfigurecollectionparameter{#1}\c!minheight}
843\permanent\def\externalfigurecollectionmaxheight#1{\externalfigurecollectionparameter{#1}\c!maxheight}
844
845\aliased\let\efcparameter\externalfigurecollectionparameter
846\aliased\let\efcminwidth \externalfigurecollectionminwidth
847\aliased\let\efcmaxwidth \externalfigurecollectionmaxwidth
848\aliased\let\efcminheight\externalfigurecollectionminheight
849\aliased\let\efcmaxheight\externalfigurecollectionmaxheight
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864\permanent\protected\def\overlayfigure#1
865 {\externalfigure[#1][\c!width=\d_overlay_width,\c!height=\d_overlay_height]}
866
867
868
869\permanent\tolerant\protected\def\includesvgfile[#1]#*[#S#2]
870 {\hbox\bgroup
871 \getdummyparameters[\c!offset=\zeropoint,#2]
872 \clf_includesvgfile{#1}{\dummyparameter\c!offset}
873 \egroup}
874
875\permanent\tolerant\protected\def\includesvgbuffer[#1]#*[#S#2]
876 {\hbox\bgroup
877 \getdummyparameters[\c!offset=\zeropoint,#2]
878 \clf_includesvgbuffer{#1}{\dummyparameter\c!offset}
879 \egroup}
880
881
882
883\useexternalfigure
884 [\v!buffer]
885 [\jobname.buffer]
886 [\c!object=\v!no]
887
888
889
890\defineexternalfigure
891 [\v!inline]
892 [\c!height=\lineheight]
893
894\permanent\untraced\protected\def\combinationwidth
895 {\dimexpr
896 (\textwidth\effectiveleftskip\effectiverightskip
897 \numexpr(\combinationparameter\c!nx)\plusone\relax\dimexpr\combinationparameter\c!distance\relax
898 )(\combinationparameter\c!nx)
899 \relax}
900
901\pushoverloadmode
902 \newuserunit \combinationwidth cx
903\popoverloadmode
904
905\definemeasure
906 [\v!combination]
907 [\combinationwidth]
908
909\defineexternalfigure
910 [\v!combination]
911 [\c!width=\combinationwidth]
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943\permanent\protected\def\inlinefigure[#1]
944 {\dontleavehmode
945 \sbox{\externalfigure[#1][\v!inline]}}
946
947
948
949\definelayer[epdfcontent]
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970\protect \endinput
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112 |