我正在使用pdflatex
(Windows 7 上的 MiKTeX 2.9 便携版),并使用\pdfximage
和\pdfrefximage
来包含图形。
在我看来,使用具有透明背景的 PNG 会产生意外的行为。
似乎生成的索引\pdfximage
已损坏 - 这使得“下一个图形”无法使用。但下一个图形能使用。
我希望下面的例子能够说明我的机器上发生的情况:
这是正确的用法吗,还是我没有pdflatex
正确使用原语?
% SAMPLE
\pdfoutput=1
\documentclass[german]{article}
\usepackage[a4paper]{geometry}
\usepackage{babel}
% ------------------------------------------
% When the following line is used, \LOGOiii yields 'my_other_pic.jpg' - which is not correct.
\pdfximage width 20.0mm height 8.0mm {png_transparent_bg.png}
% When replacing the above with either of the following lines, \LOGOiii yields 'my_cool_pic.jpg' - which is correct
% (but then I don't have my logo with transparent background)
%\pdfximage width 20.0mm height 8.0mm {my_pic.png} % png without transparent background
%\pdfximage width 20.0mm height 8.0mm {png_transparent_bg.jpg} % jpg - no transparent background
\newcommand{\LOGOi}{\pdfrefximage1}
% If png_transparent_bg.png is used, attempting to reference this image results the error:
% ! pdfTeX error (ext1): cannot find referenced object. (but pdfrefximage3 works!)
\pdfximage height 28.0mm {my_other_pic.png}
\newcommand{\LOGOii}{\pdfrefximage2}
\pdfximage height 20.0mm {my_cool_pic.png}
\newcommand{\LOGOiii}{\pdfrefximage3} %
\begin{document}
\noindent This pdf illustrates behavior diferences between 'loading' a png graphic with transparent background as first graphic - via pdfximage.
{\LOGOiii}
{\LOGOii} % comment to remove compile error
\rule{-15mm}{0mm}
{\LOGOi}
\end{document}
\endinput
控制台输出(尝试引用第二个图形对象) - 错误:
>h:\MikTeXTest\MikTeX.2.9p\texmf\miktex\bin\pdflatex -aux-directory=h:\temp\pdflatex --enable-write18 test_pdfxrefimage.tex
This is pdfTeX, Version 3.1415926-2.3-1.40.12 (MiKTeX 2.9)
entering extended mode
(Q:\TA ... \TST\test_pdfxrefimage\test_pdfxrefimage.tex
LaTeX2e <2011/06/27>
... console output deleted ...
)) (h:\temp\pdflatex\test_pdfxrefimage.aux)
*geometry* driver: auto-detecting
*geometry* detected driver: pdftex
! pdfTeX error (ext1): cannot find referenced object.
<to be read again>
}
l.27 {\LOGOii}
% uncomment for error
! ==> Fatal error occurred, no output PDF file produced!
Transcript written on h:/temp/pdflatex/test_pdfxrefimage.log.
>Exit code: 1
下面是包含上述代码的 pdflatex 的控制台输出,但有注释行:
%{\LOGOii} % comment to remove compile error
编译成功-但引用了错误的图形:
>h:\MikTeXTest\MikTeX.2.9p\texmf\miktex\bin\pdflatex -aux-directory=h:\temp\pdflatex --enable-write18 test_pdfxrefimage.tex
This is pdfTeX, Version 3.1415926-2.3-1.40.12 (MiKTeX 2.9)
entering extended mode
(Q:\TA ... \TST\test_pdfxrefimage\test_pdfxrefimage.tex
LaTeX2e <2011/06/27>
... console output deleted ...
)) (h:\temp\pdflatex\test_pdfxrefimage.aux)
*geometry* driver: auto-detecting
*geometry* detected driver: pdftex
Overfull \hbox (11.66379pt too wide) in paragraph at lines 24--28
\OT1/cmr/m/n/10 This pdf illustrates behavior diferences between 'loading' a pn
g graphic with transparent background
[1{h:/MikTeXTest/MikTeX.2.9p/localtexmf/fonts/map/pdftex/pdftex.map} <Q:/TA.../TST/test_pdfxrefimage/my_other_pic.png (PNG copy)> <Q:/TA.../TST/test_pdfxrefimage/png_transparent_bg.png>]
(h:\temp\pdflatex\test_pdfxrefimage.aux) )
(see the transcript file for additional information)<h:/MikTeXTest/MikTeX.2.9p/
texmf/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on test_pdfxrefimage.pdf (1 page, 33610 bytes).
Transcript written on h:/temp/pdflatex/test_pdfxrefimage.log.
>Exit code: 0
引用“my_other_pic.png”但实际上应该使用“my_cool_pic.png”。
答案1
明显的问题是生成的数字是不是2 对于第二幅图像,作为一个简单的
\showthe\pdflastximage
放在后面
\pdfximage height 28.0mm {my_other_pic.png}
将会呈现:
> 3.
l.18 \showthe\pdflastximage
这可能是因为包含了另一个图片对象来“掩盖”具有透明背景的图片对象。
还有另一个原语,\pdflastximage
可以(并且应该)用于这些情况:它是一个只读整数,其中加载了分配给最后一个对象的数字\pdfximage
。但是你不能说
\newcommand{\LOGOi}{\pdfrefximage\pdflastximage}
因为这会总是参考最后一张图片。需要一些低级技巧:
\pdfximage width 20.0mm height 8.0mm {png_transparent_bg.png}
\edef\LOGOi{\pdfrefximage\the\pdflastximage\relax}
\pdfximage height 28.0mm {my_other_pic.png}
\edef\LOGOii{\pdfrefximage\the\pdflastximage\relax}
\pdfximage height 20.0mm {my_cool_pic.png}
\edef\LOGOiii{\pdfrefximage\the\pdflastximage\relax}
每个都\edef
将扩展到当前值;在你的情况下,和的\the\pdflastximage
扩展将是\LOGOi
\LOGOii
\LOGOiii
> \LOGOi=macro:
->\pdfrefximage 1\relax .
> \LOGOii=macro:
->\pdfrefximage 3\relax .
> \LOGOiii=macro:
->\pdfrefximage 4\relax .
以便以后正确使用图像。
不太清楚为什么你不想\includegraphics
为此使用更高级别。如果你担心多次使用的图片会多次包含在 PDF 文件中,请不要担心。
如果你继承了一些使用这些低级技巧的文档,只需注释掉这些行并根据此模型进行更改
%\pdfximage width 20.0mm height 8.0mm {png_transparent_bg.png}
%\edef\LOGOi{\pdfrefximage\the\pdflastximage\relax}
%\pdfximage height 28.0mm {my_other_pic.png}
%\edef\LOGOii{\pdfrefximage\the\pdflastximage\relax}
%\pdfximage height 20.0mm {my_cool_pic.png}
%\edef\LOGOiii{\pdfrefximage\the\pdflastximage\relax}
\usepackage{graphicx}
\newcommand\LOGOi{\includegraphics[width 20.0mm, height 8.0mm]{png_transparent_bg.png}}
\newcommand{\LOGOii}{\includegraphics[height 28.0mm]{my_other_pic.png}}
\newcommand{\LOGOiii}{\includegraphics[height 20.0mm]{my_cool_pic.png}}
答案2
切勿使用\pdfrefximage
硬编码的 PDF 对象编号。正确的语法是:
\pdfrefximage\pdflastximage
当然,你可以将生成的 PDF 对象编号存储\pdfximage
在宏中以供以后使用。但是你不能不使用\newcommand
,因为\pdflastximage
必须在宏定义期间进行扩展:
\edef\LOGOobjI{\the\pdflastximage}
或(全局宏定义,组外可见)
\xdef\LOGOobjI{\the\pdflastximage}
以后的使用如下所示:
\pdfrefximage\LOGOobjI
看埃格尔\LOGOi
在下面评论。他提出了一个完全符合您期望的 宏。