% Copyright 2003 by Rolf Niepraschk ([email protected]).
% This software is released under the terms of the LaTeX Project Public
% License  (ftp://dante.ctan.org/tex-archive/macros/latex/base/lppl.txt).
% (Essentially: Free to use, copy, distribute (sell) and change, but, if
% changed, the name must be changed.)

\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesPackage{ps4pdf}[2005/02/11 v0.6i PS code for pdfTeX (RN/HO)]

\newcommand*\PfP@mode{0} \newcommand*\PfP@draft@global{false}
\newcommand*\PfP@llx{-0.50001bp}
\newcommand*\PfP@lly{-0.50001bp}
\newcommand*\PfP@urx{0.50001bp}
\newcommand*\PfP@ury{0.50001bp}% Prevents rounding errors.
\newcommand*\PfP@tempa{} \newcommand*\PfP@tempb{}

\newif\ifPfP@draft \newif\ifPfPinside \PfPinsidefalse
\newif\ifPfP@graphics
\newif\ifPfP@notightpage \PfP@notightpagefalse

\DeclareOption{active}{\def\PfP@mode{0}}
\DeclareOption{inactive}{\def\PfP@mode{9}}
\DeclareOption{draft}{\def\PfP@draft@global{true}}
\DeclareOption{final}{\def\PfP@draft@global{false}}
\DeclareOption{graphics}{\PfP@graphicstrue}
\DeclareOption{nographics}{\PfP@graphicsfalse}
\DeclareOption{notightpage}{\PfP@notightpagetrue}

\ExecuteOptions{graphics}
\ProcessOptions\relax

\RequirePackage{keyval,ifpdf,ifvtex}

\newcounter{PSforPDF}

\newcommand*\PfP@container{}
\edef\PfP@container{\jobname-pics.pdf}
\newcommand*\containerName[1]{\def\PfP@container{#1}}

\ifnum\PfP@mode>0\relax\else
 \ifvtex
   \def\PfP@mode{9}
 \else
   \ifpdf
     \def\PfP@mode{1}
   \fi
 \fi
\fi

\ifnum\PfP@mode=0\relax\else

 \RequirePackage{calc}

 \define@key{PfP}{trim}{%
   \begingroup
     \Gread@parse@vp#1 \\%
     \edef\x{\endgroup%
       \def\noexpand\PfP@llx{\Gin@vllx bp}%
       \def\noexpand\PfP@lly{\Gin@vlly bp}%
       \def\noexpand\PfP@urx{\Gin@vurx bp}%
       \def\noexpand\PfP@ury{\Gin@vury bp}}\x%
%     Like "\xdef\PfP@llx{\Gin@vllx bp}..." but only for one group level.
 }

 \define@key{PfP}{draft}[true]{\csname PfP@draft#1\endcsname}

 \newcommand\PfP@adjustBox[3]{%
%   #1=width of the main box, #2=height of the main box,
%   #3=raw material
   \begingroup
     \edef\PfP@tempa{#1}\edef\PfP@tempb{#2}%
     \setbox\@tempboxa=\hbox{#3}%
     \ifdim\wd\@tempboxa>\ht\@tempboxa\relax%
       \setbox\@tempboxa=\hbox{\resizebox{\PfP@tempa}{!}{#3}}%
     \else%
       \setbox\@tempboxa=\hbox{\resizebox{!}{\PfP@tempb}{#3}}%
     \fi
     \box\@tempboxa%
   \endgroup
 }

 \newcommand\PfP@framedInfoBox[3]{%
%   #1=width, #2=height, #3=info text
   \begingroup
     \fboxsep=3pt\fboxrule=.4pt%
     \edef\PfP@tempa{#1-2\fboxsep-2\fboxrule}%
     \ifx#2\height%
       \fbox{\parbox[b]{\PfP@tempa}{\vfill\mbox{}#3\vfill}}%
     \else%
       \edef\PfP@tempb{#2-2\fboxsep-2\fboxrule}%
       \fbox{\parbox[b][\PfP@tempb]{\PfP@tempa}{\vfill\mbox{}#3\vfill}}%
     \fi
   \endgroup
 }

\fi

\ifcase\PfP@mode%      == dvi (extraction mode) ==
%% "AtBeginDocument" is necessary because `preview' called `\nofiles'.
%% After this call `\makeindex' is `\relax' and can't be redefined with
%% `\renewcommand'.
 \AtBeginDocument{%
   \ifPfP@notightpage%
     \RequirePackage[active,dvips]{preview}[2003/01/20]%
   \else%
     \RequirePackage[active,dvips,tightpage]{preview}[2003/01/20]%
   \fi%
 }

 \define@key{PfP}{trim}{\xdef\PreviewBbAdjust{#1}}%
 \define@key{PfP}{draft}[true]{}% Not used in this mode.

 \newcommand\PSforPDF[2][]{#2}

 \newcommand\PfP@relax@commands{%
%% To prevent tabularx from execute each \cmd{\PSforPDF} more than once.
   \@ifundefined{tabularx}{}{%
     \def\tabularx##1##2{\tabular{##2}}%
     \newcolumntype{X}{c}%
     \let\endtabularx=\endtabular}%
 }

 \AtBeginDocument{%
   \@ifpackageloaded{graphicx}{}{\RequirePackage{graphicx}}%
   \let\PfP@includegraphics=\includegraphics%
   \renewcommand\includegraphics[2][]{%
     \ifPfPinside\PfP@includegraphics[#1]{#2}\else~\fi}%
   % Outside of `\PSforPDF' `\includegraphics' must do nothing
   % because we can't handle pdfTeX graphics (.pdf, .jpg,...)
   % in this mode. `~' is a non-zero size dummy.
   \renewcommand\PSforPDF[2][]%
   {%
     \setkeys{PfP}{trim=\PfP@llx\space\PfP@lly\space%
       \PfP@urx\space\PfP@ury,#1}\stepcounter{PSforPDF}%
     \PfPinsidetrue#2\PfPinsidefalse%
   }
   \PreviewMacro[{[]{}}]{\PSforPDF}%
   \PfP@relax@commands%
 }

 \AtEndDocument{%
   \ifnum\value{PSforPDF}=0\relax
     \PSforPDF{\mbox{}}%
     % Prevents not writing a dvi file if the document contains
     % no \PSforPDF commands (e.g. suppressed by \includeonly)
   \fi}

\or%                   == pdfTeX ==

 \newcommand*\PfP@lastpage{\maxdimen}

 \newcommand\PSforPDF[2][]{}% Do nothing before `\begin{document}'
 % The definition for the "page" key can only be executed
 % at `\begin{document}' if `keyval' is present!
 \AtBeginDocument{%
   \ifPfP@graphics\else
     \let\PfP@Ginclude@graphics\Ginclude@graphics
     \def\Ginclude@graphics#1{\phantom{\PfP@Ginclude@graphics{#1}}}%
   \fi
   \IfFileExists{\PfP@container}%
   {%
     \@ifpackageloaded{graphicx}{}{\RequirePackage[pdftex]{graphicx}}%
     \renewcommand\PSforPDF[2][]{%
       \setkeys{PfP}{trim=\PfP@llx{} \PfP@lly{} \PfP@urx{} \PfP@ury}%
       \setkeys{PfP}{draft=\PfP@draft@global,##1}%
       \stepcounter{PSforPDF}%
       \ifnum\PfP@lastpage<\value{PSforPDF}\relax
         \PfP@framedInfoBox{\linewidth}{\height}{%
            \centering Can't show picture~\#\thePSforPDF\ because it
            does not exist in \texttt{\PfP@container}. Recreate
            \texttt{\PfP@container}!}%
       \else%
         \setbox\@tempboxa=\hbox{%
           \includegraphics[page=\the\value{PSforPDF},draft=false]%
             {\PfP@container}}%
         \setlength\@tempdima{\wd\@tempboxa-\PfP@urx+\PfP@llx}%
         \setlength\@tempdimb{\ht\@tempboxa-\PfP@ury+\PfP@lly}%
         % recalculate the original size.
         \setbox\@tempboxa=\hbox{%
           \PfP@adjustBox{\the\@tempdima}{\the\@tempdimb}{\box\@tempboxa}}%
         \ifPfP@draft%
           \PfP@framedInfoBox{\the\wd\@tempboxa}{\the\ht\@tempboxa}%
             {\rlap{~\texttt{\PfP@container~(\#\the\value{PSforPDF})}}}%
         \else%
           \mbox{\box\@tempboxa}%
         \fi
         \xdef\PfP@lastpage{\the\pdflastximagepages}%
       \fi
     }
   }
   {%
     \PackageWarningNoLine{ps4pdf}{%
       Graphic container `\PfP@container' not found}%
     \renewcommand\PSforPDF[2][]{%
       \stepcounter{PSforPDF}%
       \noindent\PfP@framedInfoBox{\linewidth}{\height}{%
         \centering Can't show picture~\#\thePSforPDF\ because
          \texttt{\PfP@container} not found. Create it from
          \texttt{\jobname.dvi} using \texttt{dvips} and \texttt{ps2pdf}!}}
   }%
 }%

 \AtEndDocument{%
   \ifnum\PfP@lastpage=\value{PSforPDF}\relax\else
     \PackageWarningNoLine{ps4pdf}{`\PfP@container' is no more valid}%
   \fi}

\else%                == inactive (latex/dvips, VTeX) ==

 \RequirePackage{graphicx}

 \newcommand\PfP@trimmBox[7]{%
%   #1=width of the main box, #2=height of the main box,
%   #3=trim left, #4=trim right, #5=trim top, #6=trim bottom
%   #7=raw material
   \begingroup
     \edef\PfP@tempa{#1}\edef\PfP@tempb{#2}%
     \setbox\@tempboxa=\hbox{%
       \makebox[\width-#3][r]{% extends at left
         \makebox[\width+#4][l]{% extends at right
           \raisebox{\dp\@tempboxa-#6}% extends at top and bottom
             [\ht\@tempboxa+\dp\@tempboxa+#5-#6][0pt]{#7}}}}%
     \PfP@adjustBox{\PfP@tempa}{\PfP@tempb}{\box\@tempboxa}%
   \endgroup
 }

 \newcommand\PSforPDF[2][]{#2}%

 \AtBeginDocument{%
   \renewcommand\PSforPDF[2][]{%
     \begingroup
       \setkeys{PfP}{draft=\PfP@draft@global,#1}%
       \setbox\@tempboxa=\hbox{#2}%
       \@tempdima=\ht\@tempboxa\advance\@tempdima\dp\@tempboxa%
       \edef\PfP@tempb{\the\@tempdima}\edef\PfP@tempa{\the\wd\@tempboxa}%
       \setbox\@tempboxa=\hbox{%
         \PfP@trimmBox{\PfP@tempa}{\PfP@tempb}%
           {\PfP@llx}{\PfP@urx}{\PfP@ury}{\PfP@lly}{\box\@tempboxa}}%
       \ifPfP@draft%
         \PfP@framedInfoBox{\the\wd\@tempboxa}{\the\ht\@tempboxa}{}%
       \else%
         \mbox{\box\@tempboxa}%
       \fi
     \endgroup
   }%
 }

\fi

\InputIfFileExists{ps4pdf.cfg}{%
   \PackageInfo{ps4pdf}{Local config file ps4pdf.cfg used}
}{}

\endinput

\changes{v0.3g (RN)}{2003/02/12}{First public version.}
\changes{v0.3h (RN)}{2003/02/11}{Optional parameter for Trimming.}
\changes{v0.4a (RN)}{2003/02/13}{key-value syntax.}
\changes{v0.5  (RN)}{2003/05/17}{trim parameter: Scaling was wrong, corrected.
 New options draft/final. Code cleanup. Improved test file.}
\changes{v0.5a (RN)}{2003/05/19}{Option "inactive" works now.}
\changes{v0.5b (RN)}{2003/05/21}{Mode detection changed. Code cleanup.}
\changes{v0.5c (RN)}{2003/05/26}{New Parameters "hpos" and "vpos".}
\changes{v0.6  (RN)}{2003/05/30}{trim parameter and draft option can be used
 with the "inactive" option}
\changes{v0.6a (RN)}{2003/06/03}{Size and alignment after trimming changed.
 Parameter "hpos" and "vpos" removed.}
\changes{v0.6b (RN)}{2003/06/09}{Simplified definition for trim key.}
\changes{v0.6c (RN)}{2003/06/19}{The name of the graphics container can now be
 changed with \cmd{\containerName}. A document without any \cmd{\PSforPDF}
 commands creates now an empty container file.}
\changes{v0.6d (RN)}{2003/08/17}{Inputting a config file added.}
\changes{v0.6e (RN)}{2003/09/03}{Works now with `tabularx'. Thanks to
 Herbert Voss.}
\changes{v0.6f (RN)}{2003/09/05}{bug in extraction mode corrected (`graphicx'
 is required). Thanks to Jose Carlos Santos.}
\changes{v0.6g (RN)}{2003/11/22}{New package options `graphics/nographics'
 similar to package `crop' (suppresses the graphics output;
 suggested by Markus Kohm).}
\changes{v0.6h (RN)}{2004/07/15}{In dvi extraction mode the `preview' package
 should be loaded ``AtBeginDocument'' to prevent problems with `natbib'; bug
 reported from ???.}
\changes{v0.6i (RN)}{2005/02/11}{Option "notightpage" added.}