diff options
Diffstat (limited to 'macros/latex/exptl/graphicp/pts_img.sty')
-rw-r--r-- | macros/latex/exptl/graphicp/pts_img.sty | 801 |
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 |