% File:        thumbpdf.tex
% Project:     thumbpdf
% Version:     2008/14/16 v3.10
% Author:      Heiko Oberdiek
%
% Copyright:   Copyright (C) 1999-2008 Heiko Oberdiek.
%
%              This work may be distributed and/or modified under
%              the conditions of the LaTeX Project Public License,
%              either version 1.3 of this license or (at your option)
%              any later version. The latest version of this license
%              is in
%                http://www.latex-project.org/lppl.txt
%              and version 1.3 or later is part of all distributions
%              of LaTeX version 2003/12/01 or later.
%
%              This work has the LPPL maintenance status "maintained".
%
%              This Current Maintainer of this work is Heiko Oberdiek.
%
%              See file "readme.txt" for a list of files that
%              belong to this project.
%
% Function:    Program to include thumbnails as images.
%              It looks for thumbnail files `thb*.png' and
%              includes them as images in the output pdf file
%              `thumbpdf.pdf'. The perl script `thumbpdf(.pl)'
%              automatically calls pdftex with this file to
%              generate `thumbpdf.pdf' and produces the data
%              files, that contains the necessary pdf image objects
%              for package `thumbpdf.sty'.
%
% Requirement: * pdftex
%              * thumbnails `thb*.png'
%
% Use:         * Syntax: pdftex thumbpdf
%              * \thumbmax:
%                Because it takes some time to look for 1000 thumbnail
%                files, a maximum number can be specified:
%                  pdftex \def\thumbmax{20}\input thumbpdf
%              * \thumbjob:
%                This macro contains the name of the user's TeX file
%                without extension (`<jobname>'). It is needed to build
%                the name of the optional file `<jobname>.tno', that
%                contains extra thumbnail declarations:
%                  pdftex \def\thumbjob{example}\input thumbpdf
%                Then `example.tno' are read to get additional
%                thumbnails.
%
% History:     1999/02/14 v1.0:  first public release
%              1999/02/23 v1.1
%              1999/03/01 v1.2
%              1999/03/12 v1.3:  Copyright: LPPL
%              1999/05/05 v1.4
%              1999/06/13 v1.5
%              1999/07/27 v1.6
%              1999/08/08 v1.7:  pdfTeX 0.14a
%              1999/09/09 v1.8
%              1999/09/16 v1.9
%              2000/01/11 v1.10: \immediate before \pdfximage removed,
%                because it is obsolete and because of a problem with
%                a pre-release version of pdfTeX 0.14d.
%              2000/01/19 v1.11
%              2000/02/11 v1.12: \thumbjob added.
%              2000/02/22 v2.0:  Looking for `\thumbjob.tno' only, the
%                file name `thumbopt.tex' is not supported anymore.
%              2000/02/28 v2.1
%              2000/03/07 v2.2
%              2000/03/22 v2.3
%              2000/04/10 v2.4: Version is also printed on screen.
%              2000/07/29 v2.5
%              2000/09/27 v2.6
%              2000/10/27 v2.7
%              2001/01/12 v2.8
%              2001/03/29 v2.9
%              2001/04/02 v2.10
%              2001/04/26 v2.11
%              2002/01/11 v3.0
%              2002/05/26 v3.1
%              2002/05/26 v3.2
%              2003/03/19 v3.3
%              2003/06/06 v3.4
%              2004/10/24 v3.5: LPPL 1.3.
%              2004/11/19 v3.6
%              2004/11/19 v3.7: For easier debugging, the special
%                thumbpdf objects are now valid PDF objects that
%                are referenced in the Catalog.
%              2005/07/06 v3.8
%              2007/11/07 v3.9
%              2008/04/16 v3.10

\immediate\write16{%
  File: thumbpdf.tex 2008/04/16 v3.10 %
  Including thumbnails as images (HO)%
}
\immediate\write16{%
****************************************************************}
\immediate\write16{%
* Generating `thumbpdf.pdf', each page with a found thumbnail. *}
\immediate\write16{%
****************************************************************}

\def\END{\csname @@end\endcsname\end}

% Check, if LaTeX format
\ifx\mbox\undefined
\else
  \immediate\write16{%
    !!! Process this file `\jobname.tex' with pdf(e)tex %
    (plain format) !!!%
  }%
  \expandafter\END
\fi

% Check if pdfTeX
\ifx\pdfoutput\undefined
  \immediate\write16{%
    !!! Process this file `\jobname.tex' with pdf(e)tex %
    (NOT tex) !!!%
  }%
  \expandafter\END
\fi

\pdfoutput=1

% this file is tested with pdfTeX 0.13a
% but for downward compatibilty a trick from Hans Hagen:
\ifnum\pdftexversion<13 \ifnum\expandafter `\pdftexrevision<`s
  \let\normalpdfimage\pdfimage
  \def\grabpdfimage#1#2{\normalpdfimage#1 #2\relax}
  \def\pdfimage#1#{\grabpdfimage{#1}}
\fi\fi

% syntax has changed with pdfTeX 0.14a:
\ifnum\pdftexversion>13
  \def\pdfimage#1#{\grabpdfimage{#1}}
  \def\grabpdfimage#1#2{%
    \pdfximage#1{#2}\pdfrefximage\pdflastximage
  }
\fi

% max. 106x106 / 72 dpi
\hsize 1.5in
\vsize 1.5in

\nopagenumbers

\newcount\thumbcount
\def\thumbcountstep{\advance\thumbcount by 1 }

\def\thumbfilename{thb\the\thumbcount.png}

\newread\thumbread
\def\ifthumbexists{%
  \openin\thumbread=\thumbfilename\relax
  \ifeof\thumbread
    \expandafter\noneofone
  \else
    \closein\thumbread
    \expandafter\firstofone
  \fi
}
\def\noneofone#1{}
\def\firstofone#1{#1}

\def\iffileexists#1{%
  \openin\thumbread=#1\relax
  \ifeof\thumbread
    \expandafter\secondoftwo
  \else
    \closein\thumbread
    \expandafter\firstoftwo
  \fi
}
\long\def\firstoftwo#1#2{#1}
\long\def\secondoftwo#1#2{#2}

\let\listthumbs\empty

\def\printthumbfile{%
  \vfill\eject
  \centerline{%
    \pdfimage height \vsize {\thumbfilename}%
  }%
}

\newcount\thumbfound
\thumbfound=0
\def\processthumb{%
  \edef\listthumbs{\listthumbs\space\the\thumbcount}%
  \printthumbfile
  \pageno=\thumbcount
  \advance\thumbfound by 1
}

\expandafter\ifx\csname thumbmax\endcsname\relax
  \def\thumbmax{999}%
\fi

\immediate\write16{* Looking for thumbnails 0..\thumbmax:}

\thumbcount=\thumbmax\relax
\advance\thumbcount by 1
\edef\thumbmax{\the\thumbcount}%
\thumbcount=0
\loop
\ifnum\thumbcount<\thumbmax\relax
  \ifthumbexists\processthumb
  \thumbcountstep
\repeat

\break
\immediate\write16{==> \the\thumbfound\space thumbnail(s) found.}
\immediate\pdfobj{<</MaxThumbNumber \the\thumbfound>>}
\edef\CatalogHook{\the\pdflastobj\space 0 R}%
\immediate\write16{* Looking for extra thumbnails:}

\def\END{%
  \ifx\allthumbs\empty
  \else
    \immediate\pdfobj{<</ListThumbs\listthumbs>>}%
    \edef\CatalogHook{\CatalogHook\space\the\pdflastobj\space 0 R}%
  \fi
  \pdfcatalog{/ThumbpdfHook [\CatalogHook]}%
  \vfill\eject
  \csname bye\endcsname % \bye is \outer
}

% <jobname>.tno
\ifx\thumbjob\UnDeFiNeD
  \immediate\write16{!!! Warning: \string\thumbjob\space undefined,
    search for extra thumbnails skipped!%
  }
  \expandafter\END
\fi
\def\optfile{\thumbjob.tno}%
\iffileexists{\optfile}{}{%
  \immediate\write16{==> No optional thumbnail file.}%
  \END
}%
\thumbfound=0

\def\thumb{\futurelet\nexttoken\thumbA}
\let\braceleft=[
\def\thumbA{%
  \if\nexttoken\braceleft
    \expandafter\thumbB
  \else
    \expandafter\thumbC
  \fi
}
\def\thumbC#1{\thumbB[#1]{#1}}
\def\thumbB[#1]#2{% #1: label, #2: file[.png]
  \iffileexists{#2.png}{%
    \def\thumbfilename{#2.png}%
  }{%
    \iffileexists{#2}{%
      \def\thumbfilename{#2}%
    }{%
      \let\thumbfilename\empty
    }%
  }%
  \ifx\thumbfilename\empty
    \immediate\write16{%
      !!! Warning: Thumbnail `#2' does not exist!"}%
  \else
    \edef\listthumbs{\listthumbs\space{#1}}%
    \printthumbfile
    \advance\thumbcount by -1
    \pageno=\thumbcount
    \advance\thumbfound by 1
  \fi
}

\thumbcount=0
\input \optfile
\break
\immediate\write16{==> \the\thumbfound\space extra thumbnail(s) found.}%

\END
