summaryrefslogtreecommitdiff
path: root/macros/latex/exptl/graphicp/pts_img.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/exptl/graphicp/pts_img.sty')
-rw-r--r--macros/latex/exptl/graphicp/pts_img.sty801
1 files changed, 801 insertions, 0 deletions
diff --git a/macros/latex/exptl/graphicp/pts_img.sty b/macros/latex/exptl/graphicp/pts_img.sty
new file mode 100644
index 0000000000..75d123cc6a
--- /dev/null
+++ b/macros/latex/exptl/graphicp/pts_img.sty
@@ -0,0 +1,801 @@
+%
+% pts_img.sty -- better include image files (EPS or PDF) into TeX documents
+% by pts@fazekas.hu at Wed Jan 8 16:12:53 CET 2003
+%
+% pdftex at Fri Jan 10 02:21:17 CET 2003
+% laemu.sty at Fri Jan 24 13:19:59 CET 2003
+% at Sun Jan 26 20:44:09 CET 2003
+%
+% The routines in this file don't need the image to be present.
+%
+
+\expandafter\ifx\csname ifLaTeX\endcsname\relax\input laemu.sty\relax\fi%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{pts_img}[2003/01/24 v0.0 include images]
+\RequirePackage{div16b}
+%\input div16b.tex
+%\catcode`\@=11 % \makeatletter
+
+% --- utilities
+
+% by pts@fazekas.hu at Fri Jan 10 00:38:14 CET 2003
+%
+%** Places a box of width #1, height #2, depth #3. A rectangular dot of size
+%** `1sp' will be placed to the llx and ury corners. The reference point is
+%** not moved. The dots will have white color.
+%** Don't pass \dimen0 as arguments!
+\def\@@spbox#1#2#3{\hbox to0sp{%
+ \@@img@push@white%\special{color push White}%
+ \dimen0=#3 \relax\dimen0-\dimen0\advance\dimen0 1sp%
+ \vrule width1sp height\dimen0 depth#3%
+ \kern#1 \kern-2sp%
+ \dimen0=#2 \relax\dimen0-\dimen0\advance\dimen0 2sp%
+ \vrule width1sp height#2 depth\dimen0%
+ \@@img@pop%\special{color pop}%
+ \hss%
+}}%
+
+% \def\@empty{}% not needed for LaTeX, needed for plain TeX
+
+\def\@@one{1}% must be a macro
+
+{\catcode`p=12\catcode`t=12\gdef\@@mkb#1pt{#1}}% no p,t in @@mkb
+{\catcode`p=12\catcode`t=12\gdef\@@mkbi#1.#2pt{#1}}% no p,t in @@mkb
+
+%** by pts@fazekas.hu at Fri Jan 10 01:14:31 CET 2003
+%** Expands to the result of the division #1/100.
+%** @param #1 a possibly negative decimal integer (-12) or real number
+%** (34.56), or a possibly negated \count register specification (-\count5)
+\def\@@divhundred#1{%
+ \expandafter\@@divhundred@c\number#1..\end%
+}%
+\def\@@divhundred@c#1{%
+ % Dat: \number will gobble extra leading zeroes after expansion
+ \if#1-%
+ -\number\expandafter\@@divhundred@d%
+ \else%
+ \number\expandafter\@@divhundred@e%
+ \fi%
+ #1%
+}%
+\def\@@divhundred@d#1{\@@divhundred@a00}%
+\def\@@divhundred@e{\@@divhundred@a00}%
+\def\@@divhundred@a#1#2#3{%
+ \if#3.%
+ .#1#2\expandafter\@@divhundred@b%
+ \else%
+ #1\expandafter\@@divhundred@a%
+ \fi%
+ #2#3%
+}%
+\def\@@divhundred@b#1#2#3.#4\end{#3}% Dat: gobble #1 and #2
+
+% Regression test:
+%\count0=42
+%\count1=-7
+%%\@@divhundred\alma{123}%
+%\message{\@@divhundred{1.45}}%
+%\message{\@@divhundred{12.45}}%
+%\message{\@@divhundred{123.45}}%
+%\message{\@@divhundred{1234.5}}%
+%\message{\@@divhundred{12345.}}%
+%\message{\@@divhundred{-\count0}}%
+%\message{\@@divhundred{-0137}}%
+%\message{\@@divhundred{-\count1}}%
+%\message{\@@divhundred{100}}% 1.00
+
+%** `\@@img@pdfsq#\@empty' expands to #, but `\' changed to `\\', `\(' changed
+%** to `\(' and `)' changed to '\)'. This is suitable for encoding something
+%** inside a PDF string. Discards space tokens, so the user should call
+%** \@@quotespace first.
+\def\@@img@pdfsq#1{%
+ \ifx\@empty#1%
+ \else
+ %\ifx\space#1\noexpand\space\else% would preserve \space
+ \if(\noexpand#1\@@img@pdfsq@bs\fi
+ \if)\noexpand#1\@@img@pdfsq@bs\fi
+ \if\@@img@pdfsq@bs\noexpand#1\@@img@pdfsq@bs\fi
+ #1%
+ %\fi
+ \expandafter\@@img@pdfsq
+ \fi
+}%
+\edef\@@img@pdfsq@bs{\expandafter\@gobble\string\\}% a backslash
+
+%** Expands to #1, but all space tokens are replaced by the `\space' control
+%** sequence.
+%** Doesn't work if the space is inside curly braces, but this condition can
+%** never happen, because beginning-of-group tokens are prohibited in #1.
+%** @param #1 must not contain characters of category beginning-of-group,
+%** end-of-group, active-chararacter or control-sequence (not even \space)
+\def\@@quotespace#1{%
+ \@@quotespace@lowa#1 \hsize\@gobble: %
+ % ^^^ \hsize is an arbitrary non-character token for which \ifx\hsize\hsize is true
+}%
+\def\@@quotespace@lowa#1 {%
+ \ifx\hsize#1\@empty%
+ \else%
+ #1% gobble the very first space (to balance the extra space added to the end by \@@quotespace)
+ \expandafter\@@quotespace@lowb
+ \fi
+}%
+\def\@@quotespace@lowb#1 {%
+ \ifx\hsize#1\@empty%
+ % ^^^ doesn't matter if #1 is more than one token unless \ifx is true
+ % ^^^ \@empty is there in case #1 is empty, so `\ifx\hsize\@empty' will be called
+ \else%
+ \noexpand\space#1%
+ \expandafter\@@quotespace@lowb
+ \fi
+}%
+
+% Regression test:
+%\message{s[\@@quotespace{}]}% s[]
+%\message{s[\@@quotespace{ }]}% s[\space ]
+%\message{s[\@@quotespace{a }]}% s[a\space ] % Note that ` ' is a single space token!
+%\message{s[\@@quotespace{ b}]}% s[\space b]
+%\message{s[\@@quotespace{\space b}]}% s[ b] % arument of \@@quotespace must not contain any control sequence
+%\message{s[\@@quotespace{aa bb}]}% s[aa\space bb]
+%\edef\@tempa{{a\space\space bc }}%
+%\message{s[\expandafter\@@quotespace\@tempa]}% s[a\space \space bc\space ]
+
+
+%\message{(\@@img@pdfsq a)l(ma\\;}%
+
+%** \edef#1{} if #1 == expand(#2)
+%** @param #1 must not be \@tempa
+\def\@@img@supportsit#1#2{%
+ \begingroup%
+ \edef\@tempa{#2}%
+ \ifx#1\@tempa%
+ \edef\@tempa{\noexpand\def\noexpand#1{}}%
+ \expandafter\endgroup\@tempa
+ \else
+ \endgroup
+ \fi
+}%
+%\def\@tempb{EPS}%
+%\@@img@supportsit\@tempb{EPST}
+%\message{(\@tempb)}
+
+% --- driver selection
+
+\def\@@img@driver{}%
+
+\expandafter\ifx\csname pdfoutput\endcsname\relax \chardef\pdfoutput=0 \fi
+\expandafter\ifx\csname pdftexversion\endcsname\relax \chardef\pdftexversion=0 \fi
+
+%** @param #1 desired driver name; examples:
+\def\@@img@setdriver#1{%
+ %\message{setdriver}%
+ \ifx\@@img@driver\@empty%
+ \edef\@@img@driver{#1}%
+ \ifx\@@img@driver\@empty% empty arg
+ \expandafter\ifx\csname graphicPdriver\endcsname\relax% guess the driver
+ \def\@@img@driver{dvi}% compatible with dvipdfm, dvips and xdvi
+ % \expandafter\ifx\csname pdfoutput\endcsname\relax\else% we have already defined it
+ \ifnum\pdfoutput>0 %
+ \def\@@img@driver{pdftex}%
+ \fi%
+ \else% Example: latex '\def\graphicPdriver{dvipdfm}\input laltest.tex'
+ \edef\@@img@driver{\graphicPdriver}%
+ \fi%
+ \fi%
+ %\errmessage{\@@img@driver}%
+ % vvv do driver intitializations
+ % vvv Imp: meaningful error if not found
+ \expandafter\ifx\csname @@imgdriver@\@@img@driver\endcsname\relax%
+ %\errmessage{img driver unknown: "#1"}%
+ \@@img@warnerr0{driver unknown: `\@@img@driver'}\@ehc%
+ \def\@@img@driver{dvi}% fallback
+ \fi
+ \csname @@imgdriver@\@@img@driver\endcsname% c@r@y@p@t@i@c, eh?
+ \else%
+ \edef\@tempa{#1}%
+ \ifx\@tempa\@@img@driver\else
+ \errmessage{cannot override img driver: `\@@img@driver' -> `#1'}%
+ \fi
+ \fi%
+}%
+
+%
+% The Driver interface expects the following macros from the driver:
+%
+%** Divides by 65536
+%** @param #1 \cs to be defined
+%** @param #2 number to be divided
+%\def\@@img@divword#1#2{...}
+%\def\@@img@div#1#2#3{...}
+%** Obsolete.
+%\def\@@img@mul#1#2#3{...}
+%** @deprecated
+%** @param #1 key
+%** @param #2 value
+%\def\@@img@kv#1#2{...}
+%** @param #1 expands to filename
+%** @param #2 xscale (number in percent, 100 == no scale)
+%** @param #3 yscale (number in percent, 100 == no scale)
+%** @param #4 expands to FileFormat (not in \@@img@ff)
+%\def\@@img@special#1#2#3{...}#4
+%** \edef#1{} iff the FileFormat specified in the contents of #1 is supported
+%** by the driver.
+%** @param #1 a macro \cs
+%\def\@@img@supported##1
+%** "eps", "pdf" etc.
+%\def\@@img@defext{...}
+%** Does the driver translate the image automatically as if bbox.llx==0 &&
+%** bbox.lly=0? "1" or "0"
+%\def\@@img@zeroll{...}
+
+% --- Implementations of the Driver interface
+
+\def\@@imgdriver@dvips{% dvips, xdvi
+ \def\@@img@supported##1{%
+ \@@img@supportsit##1{EPS}%
+ \@@img@supportsit##1{MPS}%
+ }%
+ \def\@@img@zeroll{0}%
+ \def\@@img@defext{eps}%
+ \def\@@img@push@white{\special{color push White}}%
+ \def\@@img@pop{\special{color pop}}%
+ \def\@@img@divword##1##2{%
+ \edef##1{##2\space 65536 div}%
+ }%
+ \def\@@img@div##1##2##3{%
+ \edef\@@img@tmp{##3}%
+ \ifx\@@img@tmp\@@one% do not divide by 1
+ \edef##1{##2}%
+ \else%
+ \edef##1{##2\space ##3\space div}%
+ \fi%
+ }%
+ %\def\@@img@kv##1##2{##2\space @##1}%
+ \def\@@img@special##1##2##3##4{{%
+ \def\@@tmp@c{100}%
+ \edef\@@tmp@x{##2}%
+ \edef\@@tmp@y{##3}%
+ \special{ps: @beginspecial %
+ \ifx\@@tmp@c\@@tmp@x\else##2 @hscale \fi% Imp: cmp w/o limits
+ \ifx\@@tmp@c\@@tmp@y\else##3 @vscale \fi% Imp: cmp w/o limits
+ @setspecial%
+ }%
+ \special{ps: plotfile "##1"}%
+ \special{ps: @endspecial}%
+ }}%
+}% </driver dvips}
+
+\def\@@imgdriver@dvipdfm{%
+ \def\@@img@MPS{MPS}% helper for \ifx
+ \def\@@img@EPS{EPS}% helper for \ifx
+ \def\@@img@PDF{PDF}% helper for \ifx
+ \def\@@img@supported##1{% v0.13.2b
+ \@@img@supportsit##1{EPS}% via the command in -D in dvipdfm/config
+ \@@img@supportsit##1{MPS}% natively (without HiReSB*), even with .ps extension
+ \@@img@supportsit##1{PDF}%
+ \@@img@supportsit##1{JPEG}%
+ \@@img@supportsit##1{PNG}%
+ }%
+ \def\@@img@zeroll{0}%
+ \def\@@img@defext{pdf}%
+ \def\@@img@push@white{\special{color push White}}%
+ \def\@@img@pop{\special{color pop}}%
+ \def\@@img@divword##1##2{{%
+ \dimen0 ##2 sp%
+ \edef##1{\expandafter\@@mkb\the\dimen0}%
+ \@@keepdefaftergroup##1%
+ }}%
+ %\def\@@img@kv##1##2{##1=##2}%
+ \def\@@img@suppCount{0}%
+ \def\@@img@special##1##2##3##4{{%
+ % This could be easy, but we do the hard way because
+ % -- PNG and JPEG images have to be scaled up by a factor of 100/72. This
+ % seems to be an intentional misfeature of dvipdfm, because the ebb(1)
+ % utility outputs bounding boxes scaled down by 72/100.
+ % -- for PNG and JPEG images \special{pdf: usexobj @N} doesn't work
+ % properly if N represents an Image XObject. (it outputs a
+ % scaled-down, square-shaped image) So we create a Form XObject.
+ % -- a Form XObject crops the negative left sidebearing of its contents,
+ % so we must not use it for MPS, EPS and PDF images. We use an Image
+ % XObject then.
+ % -- MPS seems to work fine, nothing is cropped by PSfile=... (it is
+ % obviously not an Image XObject, as defined by PDFRef.pdf)
+ \def\@@tmp@c{1.00}% 100 --\@@divhundred--> 1.00
+ \edef\@@tmp@x{\@@divhundred##2}%
+ \edef\@@tmp@y{\@@divhundred##3}%
+ \edef\@@tmp@ff{##4}%
+ \edef\@@tmp@ff{%
+ \ifx\@@tmp@ff\@@img@MPS 1\else%
+ \ifx\@@tmp@ff\@@img@EPS 1\else%
+ \ifx\@@tmp@ff\@@img@PDF 1\else%
+ \ifx\@@tmp@ff\@empty 1\else%
+ 0\fi\fi\fi\fi
+ }%
+ % vvv need additional scaling for non-MPS, non-EPS, non-PDF images
+ \if0\@@tmp@ff% not a scalable format (PNG or JPEG)
+ % stupid dvipdfm 0.13.2b: PNG and JPEG images must be upscaled 100/72
+ % Do an equivalent of \special{pdf: bt scale 1.38888888}
+ \begingroup
+ \dimen0=\@@tmp@x pt \dimen0=1.3888888\dimen0 % Imp: more accurate??
+ \dimen1=\@@tmp@y pt \dimen1=1.3888888\dimen1 %
+ %\message{##4;}%
+ \edef\@@tmp@x{\noexpand\def\noexpand\@@tmp@x{\expandafter\@@mkb\the\dimen0}%
+ \noexpand\def\noexpand\@@tmp@y{\expandafter\@@mkb\the\dimen1}}%
+ \expandafter\endgroup\@@tmp@x
+ \def\@@tmp@c{1.0}% 1 --\the--> 1.0pt
+ \fi%
+ % vvv define \special{pdf: bt ...} and \special{pdf: et}
+ \edef\@@tmp@xy{%
+ \ifx\@@tmp@c\@@tmp@x\else\space xscale \@@tmp@x\fi%
+ \ifx\@@tmp@c\@@tmp@y\else\space yscale \@@tmp@y\fi%
+ }%
+ \ifx\@@tmp@xy\@empty%
+ \let\@@tmp@xy\@empty
+ \let\@@tmp@et\@empty
+ \else
+ \edef\@@tmp@xy{\noexpand\special{pdf: bt\@@tmp@xy}}%
+ \def\@@tmp@et{\special{pdf: et}}%
+ \fi
+ %\message{[\@@tmp@xy]}%
+ %
+ \edef\@@img@cs{@@xi@##1}% remember only the filename, because of the bug
+ \@@tmp@xy
+ \expandafter\ifx\csname\@@img@cs\endcsname\relax%
+ \count0=\@@img@suppCount\relax%
+ %\message{tc0=\the\count0;\@@img@suppCount}%
+ \advance\count0 1%
+ %\edef\@@img@suppCount{\noexpand\def\noexpand\@@img@suppCount{\the\count0}}%
+ \global\edef\@@img@suppCount{\the\count0}%
+ \global\expandafter\edef\csname\@@img@cs\endcsname{\@@img@suppCount}%
+ %\message{alloced(\csname\@@img@cs\endcsname)}%
+ \if0\@@tmp@ff% not a scalable format (PNG or JPEG)
+ % vvv crops if bbox.llx is negative
+ \special{pdf: bxobj @p_i\@@img@suppCount\space width 16383pt height 16383pt depth 16383pt}%
+ \special{PSfile="##1"}% safely omit \@@img@pdfsq
+ \special{pdf: exobj}%
+ \special{pdf: uxobj @p_i\csname\@@img@cs\endcsname}%
+ \else
+ %\edef\@@tmp@ff{\expandafter\string\csname\@@img@cs\endcsname}% do the expansion before \@@img@pdfsq
+ %\chardef\space=0 %
+ \edef\@@tmp@ff{##1}% must be fully expanded before \@@tmp@ff. Imp: \string
+ \edef\@@tmp@ff{\expandafter\@@quotespace\expandafter{\@@tmp@ff}}% do the expansion before \@@img@pdfsq
+ %\def\space{ }%
+ %\show\@@tmp@ff%
+ %\message{pdf: image @p_i\@@img@suppCount(\expandafter\@@img@pdfsq\@@tmp@ff\@empty)}%
+ \special{pdf: image @p_i\@@img@suppCount(\expandafter\@@img@pdfsq\@@tmp@ff\@empty)}%
+ \fi
+ \else%
+ \special{pdf: uxobj @p_i\csname\@@img@cs\endcsname}%
+ \fi%
+ \@@tmp@et
+ %\if0\@@tmp@ff% not a scalable format (PNG or JPEG)
+ % \special{pdf: et}%
+ %\fi
+ }}%
+}% </driver dvipdfm>
+
+\def\@@imgdriver@dvi{%
+ \@@imgdriver@dvipdfm%
+ \def\@@img@defext{eps}%
+ \def\@@img@supported##1{% v0.13.2b
+ \@@img@supportsit##1{EPS}%
+ \@@img@supportsit##1{MPS}%
+ }%
+ \def\@@img@special##1##2##3##4{{% works for both dvips and dvipdfm
+ \def\@@tmp@c{100}%
+ \edef\@@tmp@x{##2}%
+ \edef\@@tmp@y{##3}%
+ \edef\@@tmp@ff{##4}%
+ \special{PSfile="##1"%
+ \ifx\@@tmp@c\@@tmp@x\else\space hscale=##2\fi% Imp: cmp w/o limits
+ \ifx\@@tmp@c\@@tmp@y\else\space vscale=##3\fi% Imp: cmp w/o limits
+ }%
+ }}%
+}%
+\def\@@imgdriver@invisible{%
+ \def\@@img@push@white{}%
+ \def\@@img@pop{}%
+ \def\@@img@divword##1##2{{%
+ \dimen0 ##2 sp%
+ \edef##1{\expandafter\@@mkb\the\dimen0}%
+ \@@keepdefaftergroup##1%
+ }}%
+ \def\@@img@zeroll{1}%
+ \def\@@img@defext{eps}%
+ \def\@@img@supported##1{%
+ \let##1\@empty% supports all file formats
+ }%
+ \def\@@img@special##1##2##3##4{}% works for all dvips, dvipdfm and pdftex :-)
+}%
+\def\@@imgdriver@blackbox{%
+ \@@imgdriver@invisible% inherit
+ \def\@@img@special##1##2##3##4{% works for all dvips, dvipdfm and pdftex :-)
+ %\vrule width\DW sp height\URY sp depth\DP sp % if not lowered
+ \vrule width\DW sp height\DH sp % if already lowered
+ }
+}%
+\def\@@imgdriver@frame{%
+ \@@imgdriver@invisible% inherit
+ \def\@@img@special##1##2##3##4{% works for all dvips, dvipdfm and pdftex :-)
+ %\vrule width\DW sp height\URY sp depth\DP sp % if not lowered
+ \hbox to0sp{\vrule height\@@img@framewidth width\DW sp\hss}% bottom
+ \raise\DH sp\hbox to0sp{\vrule height0sp depth\@@img@framewidth width\DW sp\hss}% top
+ \hbox to\DW sp{%
+ \vrule height\DH sp width\@@img@framewidth \hss% left
+ \vrule height\DH sp width\@@img@framewidth% right
+ }%
+ %\vrule width\DW sp height\DH sp % if already lowered
+ }
+}%
+\def\@@imgdriver@namedframe{%
+ \@@imgdriver@invisible% inherit
+ \def\@@img@special##1##2##3##4{% works for all dvips, dvipdfm and pdftex :-)
+ %\vrule width\DW sp height\URY sp depth\DP sp % if not lowered
+ \hbox to0sp{\vrule height\@@img@framewidth width\DW sp\hss}% bottom
+ \raise\DH sp\hbox to0sp{\vrule height0sp depth\@@img@framewidth width\DW sp\hss}% top
+ \hbox to\DW sp{%
+ \vrule height\DH sp width\@@img@framewidth \hss% left
+ \vrule height\DH sp width\@@img@framewidth% right
+ }%
+ \kern-\DW sp%
+ % vvv Imp: use \textascii to typeset \textbar etc. in the filename
+ \setbox0=\hbox{\@@img@framefont\raise1ex\hbox{\expandafter\expandafter\expandafter\@gobble\expandafter\string\csname##1\endcsname}}%
+ \wd0=0sp \ht0=0sp \dp0=0sp \copy0%
+ %\vrule width\DW sp height\DH sp % if already lowered
+ }
+}%
+\def\@@img@framewidth{.4pt}% used by the frameonly and namedframe drivers
+\def\@@img@framefont{\ttfamily\space}% Dat: \space: don't overwrite the frame
+
+\def\@@imgdriver@pdftex{%
+ \expandafter\ifx\csname graphicPnopdftexmpost\endcsname\relax%
+ % Don't load \convertMPtoPDF support in ConTeXt supp-pdf.tex if
+ % \usepackage[nopdftexmpost]{graphicP} was specified, because supp-pdf
+ % uses plenty of TeX resources.
+ \edef\@tempa{% Imp: allow user not load this
+ \catcode`\noexpand\!\the\catcode`\!
+ \catcode`\noexpand\@\the\catcode`\@
+ \catcode`\noexpand\?\the\catcode`\?
+ \catcode`\noexpand\`\the\catcode`\`
+ \catcode`\noexpand\"\the\catcode`\"
+ }%
+ % Dat: \unprotect is the macro that fails without \catcode96=12
+ \catcode96=12% ` is active in Babel magyar.ldf; does many harm on supp-pdf
+ \catcode34=12% " is active in Babel germanb.ldf; no harm on supp-pdf, but play it safe
+ \LaemuInputQuiet{supp-pdf}%
+ \@tempa%
+ \fi%
+ \@@imgdriver@@pdftexlow
+ % ^^^ must be a separate macro, otherwise supp-pdf won't load (limit exceeded)
+}%
+
+\def\@@imgdriver@@pdftexlow{%
+ \def\@@img@MPS{MPS}% helper for \ifx
+ \expandafter\ifx\csname convertMPtoPDF\endcsname\relax%
+ \def\@@img@suppMPS##1{}%
+ \else
+ \def\@@img@suppMPS##1{%
+ \ifx##1\@@img@MPS%
+ \def\@@img@zeroll{1}% \convertMPtoPDF assumes it, overrides when \pdftexversion<13
+ \let##1\@empty%
+ \fi%
+ }%
+ \fi
+ \def\@@img@supported##1{%
+ \@@img@supportsit##1{PDF}%
+ \@@img@supportsit##1{PNG}%
+ \@@img@supportsit##1{TIFF}%
+ \@@img@supportsit##1{JPEG}%
+ \@@img@suppMPS##1%
+ }%
+ \def\@@img@zeroll{1}%
+ \def\@@img@defext{pdf}%
+ % Imp: implement a real color _stack_
+ \def\@@img@@curcolor{0 g}% Dat: pdftex.def sets `0 g 0 G'
+ \def\@@img@push@white{\pdfliteral {1 g}}%
+ \def\@@img@pop{\pdfliteral {\@@img@@curcolor}}%
+ \def\@@img@divword##1##2{{%
+ \dimen0 ##2 sp%
+ \edef##1{\expandafter\@@mkb\the\dimen0}%
+ \@@keepdefaftergroup##1%
+ }}%
+ %\def\@@img@tobp##1##2{{%
+ % \dimen0 ##2 sp%
+ % \dimen0 0.996264\dimen0% pt -> bp
+ % \edef##1{\expandafter\@@mkb\the\dimen0}%
+ % \@@keepdefaftergroup##1%
+ %}}%
+ \def\@@img@kv##1##2{##1=##2}%
+ \def\@@img@special##1##2##3##4{{%
+ \def\@@tmp@c{1.00}%
+ \edef\@@tmp@x{\@@divhundred##2}%
+ \edef\@@tmp@y{\@@divhundred##3}%
+ \edef\@@tmp@ff{##4}%
+ %\message{\@@tmp@x*\@@tmp@y}%
+ \ifx\@@tmp@ff\@@img@MPS%
+ %\errmessage{embedding MetaPost to PDF}%
+ % vvv Use ConTeXt supp-pdf.tex
+ \convertMPtoPDF{##1}{\@@tmp@x}{\@@tmp@y}% Dat: fine, does --below margins right
+ \else%
+ \pdfliteral{ q \@@tmp@x\space 0 0 \@@tmp@y\space 0 0 cm}%
+ \hbox to0sp{%
+ \@@pdfimagecompat{}{##1}%
+ \hss}%
+ %\pdfliteral direct{q h 0 0 m 0 1 l h W* Q}% SUXX: cannot set clipping path :-(
+ \pdfliteral{ Q}%
+ \fi%
+ %\special{PSfile="##1"%
+ % \ifx\@@tmp@c\@@tmp@x\else\space hscale=##2\fi% Imp: cmp w/o limits
+ % \ifx\@@tmp@c\@@tmp@y\else\space vscale=##3\fi% Imp: cmp w/o limits
+ %}%
+ }}%
+ %
+ % This is how pdftex.def detects pdftex version:
+ %\ifx\pdftexversion\@undefined
+ % \def\@@pdftex@release{1}%
+ %\else
+ % \ifnum\pdftexversion<12
+ % \def\@@pdftex@release{2}%
+ % \else
+ % \ifnum\pdftexversion<13
+ % \ifnum \expandafter `\pdftexrevision < `n
+ % \def\@@pdftex@release{3}%
+ % \else
+ % \def\@@pdftex@release{4}%
+ % \fi
+ % \else
+ % \ifnum\pdftexversion=13
+ % \def\@@pdftex@release{5}%
+ % \else
+ % \ifnum\pdftexversion=14
+ % \def\@@pdftex@release{6}%
+ % \else
+ % \def\@@pdftex@release{7}%
+ % \fi
+ % \fi
+ % \fi
+ % \fi
+ %\fi
+ %
+ %\ifnum\pdftexversion<13% older, Debian Slink
+ %\else\ifnum\pdftexversion<15% newer, SuSE 6.2 and Debian Potato
+ %\else\ifnum\pdftexversion>99% newest, Debian Woody
+ %
+ % vvv before Sun Feb 9 20:06:01 CET 2003
+ %\ifnum\pdftexversion<13% older, Debian Slink
+ % \def\@@img@zeroll{0}%
+ % \def\@@pdfimagecompat##1##2{\pdfimage##1\noexpand\noexpand\noexpand\@empty ##2 \relax}%
+ % % Note the magic in front of the file name after \pdfimage, to
+ % % prevent it fouling up with file names starting with "depth".
+ %\else%
+ % \ifnum\pdftexversion<15% newer, SuSE 6.2 and Debian Potato
+ % \def\@@pdfimagecompat##1##2{\pdfimage##1 {##2}}%
+ % \else% newest, Debian Woody
+ % \def\@@pdfimagecompat##1##2{%
+ % \edef\@@img@cs{@@xi@##2}% remember only the filename, because of the bug
+ % \expandafter\ifx\csname\@@img@cs\endcsname\relax%
+ % \immediate\pdfximage##1{##2}% Dat: \immediate\pdfteximage solved a bug in pdftex_bug.tex
+ % \global\expandafter\edef\csname\@@img@cs\endcsname{\the\pdflastximage}%
+ % \fi%
+ % %\expandafter\expandafter\expandafter\pdfrefximage%
+ % \expandafter\pdfrefximage\csname\@@img@cs\endcsname%
+ % }%
+ % \fi%
+ %\fi%
+ % I have evaluated the use of \pdfxform / \pdfform instead of \pdfximage
+ % on older pdfTeXes (Debian Slink), and I got terrible results. pdfTeX
+ % insists on cropping the image to the size of the \hbox, and there are
+ % also other strange, excess cropping effects (especially on
+ % f2mletter.pdf), so I gave up and reverted to \pdfimage. Currently I
+ % don't know of any solution that uses \pdfxform, and doesn't embed the
+ % same image multiple times.
+ \expandafter\ifx\csname pdfximage\endcsname\relax
+ \expandafter\ifx\csname pdfimage\endcsname\relax
+ \@@img@warnerr0{Need either \string\pdfximage or \string\pdfimage.}\@ehc
+ \fi
+ \ifnum\pdftexversion<13% older, Debian Slink
+ \def\@@img@zeroll{0}%
+ \def\@@pdfimagecompat##1##2{\pdfimage##1\noexpand\noexpand\noexpand\@empty ##2 \relax}%
+ \else
+ \def\@@pdfimagecompat##1##2{\pdfimage##1 {##2}}%
+ \fi
+ \else
+ %** param ##1 attrs "width ... height ... depth ..."
+ %** param ##2 expands to filename
+ \def\@@pdfimagecompat##1##2{%
+ % pdfTeX, Version 3.14159-1.00a-pretest-20011114-ojmw (Web2C 7.3.7)
+ % has a bug that prevents including the same image with different
+ % /XObject numbers. (Actually, \immediate\pdfximage also solves the
+ % problem.
+ % So we cache /XObject numbers already allocated.
+ % Caching is a good idea anyway, so the output PDF file will be
+ % smaller.
+ \edef\@@img@cs{@@xi@##2}% remember only the filename, because of the bug
+ \expandafter\ifx\csname\@@img@cs\endcsname\relax%
+ \immediate\pdfximage##1{##2}% Dat: \immediate\pdfteximage solved a bug in pdftex_bug.tex
+ \global\expandafter\edef\csname\@@img@cs\endcsname{\the\pdflastximage}%
+ \fi%
+ %\expandafter\expandafter\expandafter\pdfrefximage%
+ \expandafter\pdfrefximage\csname\@@img@cs\endcsname%
+ }%
+ \fi
+}% </driver pdftex>
+
+% ---- main PutImage code
+
+\expandafter\ifx\csname @@img@forceunknown\endcsname\relax
+ %** What to do if the FileFormat is unknown/unsupported by the driver?
+ %** 0: PackageError, skip
+ %** 1: PackageWarning, skip
+ %** 2: PackageWarning, include the image
+ \def\@@img@forceunknown{0}% \let and \chardef are not good (both \if and \ifnum)
+\fi
+
+%** @param #1 error if 0; warning otherwise
+\def\@@img@warnerr#1#2#3{%
+ \if0#1%
+ \PackageError{pts_img}{#2}{#3}%
+ \else
+ \PackageWarning{pts_img}{#2}%
+ \fi
+}%
+
+%** @param #1..#4 \count register spec
+%** @param #5..#8 dimensions
+\def\@@img@letbbox#1#2#3#4#5#6#7#8{%
+ \@@letdimcountany{#1}{#5}{bp}%
+ \@@letdimcountany{#2}{#6}{bp}%
+ \@@letdimcountany{#3}{#7}{bp}%
+ \@@letdimcountany{#4}{#8}{bp}%
+}%
+
+%\def\@@gobblecomma#1,#2\end{}%
+\def\@@img@minus{-}%
+
+%** Puts a \hbox containing the specified image. Doesn't open the image file.
+%** New arguments may be added in subsequent versions
+%** @param #1 dimension (in image pixels or image bp) to raise above the
+%** baseline. May contain a double minus sign. Default metric unit is `bp'.
+%** If omitted, then negative bbox.lly will be converted to a lowering.
+%** @param #2 empty or overrides \@@img@forceunknown
+%** @param #3 ignored
+%** @param #4 {llx}{lly}{urx}{ury}
+%** @param #5 desired width, or 0pt
+%** @param #6 desired height+depth, or 0pt
+%** @param #7 0 if noclip, 1 if clip [ignored]
+%** @param #8 filename
+%** @param #9 FileFormat
+\def\@@PutImage#1#2#3#4#5#6#7#8#9{%
+ \ifx\@@img@driver\@empty%
+ \@@img@setdriver{}% guess a resonable default
+ \fi%
+ {%
+ \def\@tempa{#2}%
+ \ifx\@tempa\@empty\else \edef\@@img@forceunknown{#2}\fi%
+ \countdef\LLX1 \countdef\LLY2 \countdef\URX3 \countdef\URY4 %
+ \@@img@letbbox\LLX\LLY\URX\URY#4%
+ %\countdef\LLX1 \@@letdimcount\LLX{#1}% old default: sp
+ \countdef\DW 5 \@@letdimcount\DW {#5}%
+ \countdef\DH 6 \@@letdimcount\DH {#6}%
+ \countdef\WD 7 \WD\URX \advance\WD-\LLX%
+ % Imp: check for \ifnum\WD<0, the same for height
+ \countdef\UP 8 \UP0%
+ \edef\@tempa{#1}%
+ \ifx\@tempa\@@img@minus \let\@tempa\@empty\fi
+ \ifx\@tempa\@empty% calculate lowering from the image
+ \ifnum0<\LLY \UP-\LLY \advance\URY-\LLY \LLY0 \fi
+ % ^^^ Dat: LLY<0 and LLY>=0 are treated quite differently
+ % ^^^ -\LLY BUGFIX at Sun Feb 9 21:50:23 CET 2003
+ \else
+ \UP-\LLY \advance\URY-\LLY %
+ \@@letdimcountany\LLY{#1}{bp}%
+ \advance\URY\LLY%
+ \advance\UP\LLY%
+ \fi
+ \countdef\DP 9 \DP-\LLY%
+ \countdef\MLX10 \MLX-\LLX%
+ \countdef\TC 11% temporary count register
+ \countdef\TH 12 \TH\URY \advance\TH\DP% total height+depth
+ \countdef\SW 13 % width scale facter
+ \countdef\SH 14 % height scale factor
+ % Now: LLY=-depth URY=height
+ \def\DOhscale{100}% horizontal scale
+ \def\DOvscale{100}% vertical scale
+ \ifnum0>\DW
+ \PackageError{pts_img}{Desired width must be positive}\@ehc
+ \DW0%
+ \fi%
+ \ifnum0>\DH
+ \PackageError{pts_img}{Desired height must be positive}\@ehc
+ \DH0%
+ \fi%
+ \ifnum\DH>0%
+ \@@muldivletposdim\SH{100pt}\DH\TH%
+ \ifnum\DW>0% both \DW and \DH are given
+ \@@muldivletposdim\SW{100pt}\DW\WD%
+ %\message{100pt*\the\DH/\the\TH=\the\SH;100pt*\the\DW/\the\WD:\the\SW}%
+ % ^^^ 100*5594039/1973452=18577140;100*3729359/1315635:18577134
+ % I've verified that \@@muldivletposdim works accurately, but the input
+ % values are inaccurate!
+ \@@muldivletposdim\MLX\MLX\DW\WD%
+ \else% \DH given, calculate \DW from it
+ \@@muldivletposdim\DW\DH\WD\TH%
+ % if initially DW==0: TC:=(DH*WD/TH)/WD; should be: TC:=DH/TH
+ \SW\SH%
+ \@@muldivletposdim\MLX\MLX\DH\TH%
+ \fi%
+ \@@muldivletposdim\UP\UP\DH\TH%
+ \ifnum\DP=0% \DP=0 <=> \URY=\TH
+ \URY=\DH%
+ \else%
+ \@@muldivletposdim\URY\URY\DH\TH%
+ \@@muldivletposdim\DP\DP\DH\TH%
+ \fi%
+ \else%
+ \ifnum\DW>0% \DW given, calculate \DH from it
+ \@@muldivletposdim\SW{100pt}\DW\WD%
+ \SH\SW%
+ \@@muldivletposdim\DH\TH\DW\WD%
+ \@@muldivletposdim\UP\UP\DW\WD%
+ \ifnum\DP=0% \DP=0 <=> \URY=\TH
+ \URY=\DW%
+ \else%
+ \@@muldivletposdim\URY\URY\DW\WD%
+ \@@muldivletposdim\DP\DP\DW\WD%
+ \fi%
+ \@@muldivletposdim\MLX\MLX\DH\TH%
+ \else% \DW and \DH are not given
+ \DW=\WD \DH=\TH%
+ \fi%
+ \fi%
+ %
+ \ifnum\DW=\WD\else% vvv scale width
+ \@@img@divword\DOhscale{\the\SW}%
+ %\edef\DOhscale{\@@img@kv{hscale}{\DOhscale} }%
+ \fi%
+ \ifnum\DH=\TH\else% vvv scale height
+ \@@img@divword\DOvscale{\the\SH}%
+ %\edef\DOvscale{\@@img@kv{vscale}{\DOvscale} }%
+ \fi%
+ % Dat: we replace `@beginspecial @hoffset' with \raise...\hbox{\kern...}',
+ % because dvipdfm version 0.13.2b ignores @hoffset and @voffset
+ %\ifnum\MLX=0\else%
+ % %\@@img@div\TMP{\the\MLX}{65781.76}% Dat: 65781.76 == 65536/72*72.27
+ % % Dat: dvipdfm doesn't support @hoffset
+ %\fi%
+ %\ifnum\UP=0\else% Imp: create test case
+ %\fi%
+ %
+ % vvv aid `dvips -E' bbox calculation
+ \@@spbox{\DW sp}{\URY sp}{\DP sp}%
+ % vvv Dat: \special{PSfile=...} calculates bbox incorrectly with
+ % dvips 5.86e, and xdvi the bbox even if it shouldn't. So I decided to
+ % use \special{ps: plotfile}, which is understood by both dvips and
+ % xdvi.
+ % ^^^ is this still true? (test it!) (how is a bbox calculated)
+ \edef\@@img@ff{#9}% FileFormat
+ \@@img@supported\@@img@ff% driver sets it to empty if supported
+ %\message{ffsupp=(\@@img@ff)}%
+ \ifx\@@img@ff\@empty\else%
+ % Only a warning, because further implementations may support it in fact.
+ %\message{\@@img@forceunknown!}%
+ \@@img@warnerr\@@img@forceunknown{Unsupported FileFormat `#9' for driver `\@@img@driver'\MessageBreak in image file `#8'}\@ehc%
+ \expandafter\ifnum\@@img@forceunknown>1 \let\@@img@ff\@empty\fi
+ \fi%
+ \ifx\@@img@ff\@empty% include the image only if FileFormat is known
+ %\edef\@@img@ff{#9}%
+ \ifnum\@@img@zeroll=1 %
+ \vrule width0pt % leave vertical mode
+ \lower\DP sp\hbox to0pt{\@@img@special{#8}\DOhscale\DOvscale{#9}\hss}%
+ \else%
+ %\message{#8:::\the\UP;;; }%
+ \setbox1=\hbox{\raise\UP sp\hbox to0pt{\kern\MLX sp
+ \@@img@special{#8}\DOhscale\DOvscale{#9}%
+ \hss}}%
+ \dp1=0sp \ht1=0sp \copy1% TeX overestimates box size because of \raise
+ \fi%
+ \fi
+ % vvv Really put the \hbox there
+ \hbox to\DW sp{\vrule width0sp height\URY sp depth\DP sp\hss}%
+}}%
+
+%\@@imgdriver@pdftex