summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx')
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx2108
1 files changed, 2108 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx b/Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx
new file mode 100644
index 00000000000..89ecfa1f99e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx
@@ -0,0 +1,2108 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2005, 2006 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+%
+% 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 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Heiko Oberdiek.
+%
+% This work consists of the main source file attachfile2.dtx
+% and the derived files
+% attachfile2.sty, attachfile2.pdf, attachfile2.ins, attachfile2.drv,
+% atfidvips.def, atfipdftex.def, pdfatfi.pl.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/oberdiek/attachfile2.dtx
+% CTAN:macros/latex/contrib/oberdiek/attachfile2.pdf
+%
+% Unpacking:
+% (a) If attachfile2.ins is present:
+% tex attachfile2.ins
+% (b) Without attachfile2.ins:
+% tex attachfile2.dtx
+% (c) If you insist on using LaTeX
+% latex \let\install=y\input{attachfile2.dtx}
+% (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+% (a) If attachfile2.drv is present:
+% latex attachfile2.drv
+% (b) Without attachfile2.drv:
+% latex attachfile2.dtx; ...
+% The class ltxdoc loads the configuration file ltxdoc.cfg
+% if available. Here you can specify further options, e.g.
+% use A4 as paper format:
+% \PassOptionsToClass{a4paper}{article}
+%
+% Programm calls to get the documentation (example):
+% pdflatex attachfile2.dtx
+% makeindex -s gind.ist attachfile2.idx
+% pdflatex attachfile2.dtx
+% makeindex -s gind.ist attachfile2.idx
+% pdflatex attachfile2.dtx
+%
+% Installation:
+% TDS:tex/latex/oberdiek/attachfile2.sty
+% TDS:tex/latex/oberdiek/atfidvips.def
+% TDS:tex/latex/oberdiek/atfipdftex.def
+% TDS:doc/latex/oberdiek/attachfile2.pdf
+% TDS:source/latex/oberdiek/attachfile2.dtx
+% TDS:scripts/oberdiek/pdfatfi.pl
+%
+%<*ignore>
+\begingroup
+ \def\x{LaTeX2e}
+\expandafter\endgroup
+\ifcase 0\ifx\install y1\fi\expandafter
+ \ifx\csname processbatchFile\endcsname\relax\else1\fi
+ \ifx\fmtname\x\else 1\fi\relax
+\else\csname fi\endcsname
+%</ignore>
+%<*install>
+\input docstrip.tex
+\Msg{************************************************************************}
+\Msg{* Installation}
+\Msg{* Package: attachfile2 2006/08/16 v2.2 attach files into PDF (HO)}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2005, 2006 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+
+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 2005/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+This Current Maintainer of this work is Heiko Oberdiek.
+
+This work consists of the main source file attachfile2.dtx
+and the derived files
+ attachfile2.sty, attachfile2.pdf, attachfile2.ins, attachfile2.drv,
+ atfidvips.def, atfipdftex.def, pdfatfi.pl.
+
+\endpreamble
+
+\generate{%
+ \file{attachfile2.ins}{\from{attachfile2.dtx}{install}}%
+ \file{attachfile2.drv}{\from{attachfile2.dtx}{driver}}%
+ \usedir{tex/latex/oberdiek}%
+ \file{attachfile2.sty}{\from{attachfile2.dtx}{package}}%
+ \file{atfidvips.def}{\from{attachfile2.dtx}{dvips}}%
+ \file{atfipdftex.def}{\from{attachfile2.dtx}{pdftex}}%
+ \usedir{scripts/oberdiek}%
+ \nopreamble
+ \nopostamble
+ \csname execfiletrue\endcsname
+ \file{pdfatfi.pl}{\from{attachfile2.dtx}{pdfatfi}}%
+}
+
+\obeyspaces
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* attachfile2.sty, atfidvips.def, atfipdftex.def}
+\Msg{*}
+\Msg{* To produce the documentation run the file `attachfile2.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{attachfile2.drv}%
+ [2006/08/16 v2.2 attach files into PDF (HO)]
+\documentclass{ltxdoc}
+\usepackage{holtxdoc}
+\AtBeginDocument{%
+ \csname @ifpackageloaded\endcsname{dtx-attach}{%
+ \embedfile[
+ stringmethod=escape,
+ mimetype=text/plain,
+ desc={Helper Perl script for package `attachfile2'}
+ ]{pdfatfi.pl}%
+ }{}%
+}
+\begin{document}
+ \DocInput{attachfile2.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{1382}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \GetFileInfo{attachfile2.drv}
+%
+% \title{The \xpackage{attachfile2} package}
+% \date{2006/08/16 v2.2}
+% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package can be used to attach files to a PDF document.
+% It is a further development of Scott Pakin's package
+% \xpackage{attachfile} for \pdfTeX. Apart from bug fixes,
+% package \xpackage{attachfile2} adds support for \xoption{dvips},
+% some new options, gets and writes meta information data about
+% the attached files.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Documentation}
+%
+% \subsection{Introduction}
+%
+% The PDF format (\cite{pdfspec}) allows the inclusion of files
+% inside the PDF document. The included files can be bound to an
+% annotation on a page. Or they can be recorded in a sorted
+% list of embedded files. The packages \xpackage{attachfile}
+% or \xpackage{attachfile2} follow the first approach,
+% package \xpackage{embedfile} uses the latter method.
+%
+% \subsubsection{Future development}
+%
+% My dream is a large package that merges the features of
+% all these packages meantioned before:
+% \begin{itemize}
+% \item Files can be attached to a page.
+% \item Files can be attached to the document.
+% \item An easy user interface for simple, common tasks and
+% beginners.
+% \item An interface for the advanced users that want to setup
+% every detail.
+% \item Support of many drivers (pdftex, dvips, dvipdfm, \dots).
+% \item \dots
+% \end{itemize}
+% However, I have not managed to take the time for this project.
+% Instead:
+% \begin{itemize}
+% \item First I experimented with package \xpackage{attachfile},
+% adding driver support, fixing bugs, \dots. The result is
+% currently named as \xpackage{attachfile2}. It uses an external
+% script to get file properties (size, date, checksum, \dots).
+% \item In order to avoid an external program for getting basic
+% file properties I provided a patch ``EscapeAndOther'' for
+% pdfTeX that was accepted for version 1.30.
+% \item Package \xpackage{embedfile} closes a gap left by the
+% packages for attaching
+% files and allows the embedding of files to the document.
+% Also it makes use of the new primitives of \pdfTeX.
+% \end{itemize}
+% Until this future becomes true, I provide the intermediate
+% step \xpackage{attachfile2} at its current state.
+% There are many things to do:
+% \begin{itemize}
+% \item Documentation, documentation, \dots
+% \item Improving portability of the Perl script \xfile{pdfatfi.pl}
+% (Windows, non-GNU, \dots).
+% \item Comfortable program for extracting embeddd files.
+% \item Embedding files to the document, see package \xpackage{embedfile}.
+% \item Additionally use featurs of \pdfTeX\ 1.30. With a recent
+% \pdfTeX\ the Perl script step is then obsolete.
+% \item GoToE links.
+% \item Layout of PinPush, especially the tip does not scale well.
+% \item Driver for \xoption{dvipsone}, similar to \xoption{dvips}, changes:
+% \begin{itemize}
+% \item coordinate transformation need to be fixed here,
+% \xfile{hdvipson.def} contains:
+% \begin{quote}
+%\begin{verbatim}
+%/DvipsToPDF { 65781 div } def
+%/PDFToDvips { 65781 mul } def
+%\end{verbatim}
+% \end{quote}
+% \item Syntax for \cs{special}: \xfile{hdvipson.def} contains
+% both \verb|\special{! #1}| and
+% \verb|\special{headertext= #1}|. Are bothe the same?
+% \end{itemize}
+% \item File name conversion, see PDF specification:
+% \begin{quote}
+% \verb|c:\somewhere\foobar.txt| $\rightarrow$
+% \verb|/c/somewhere/foobar.txt|
+% \end{quote}
+% \item Option \xoption{scale} for icons?
+% \item Compatibility for \plainTeX.
+% \item ToDos for \xfile{atfidvips.def}.
+% \end{itemize}
+%
+% \subsection{User interface}
+%
+% Basically this package \xpackage{attachfile2} follows the
+% user interface of package \xpackage{attachfile},
+% look into its documentation (\cite{attachfile}).
+%
+% \subsubsection{New options}
+% \begin{itemize}
+% \item Driver options \xoption{dvips} and \xoption{pdftex}.
+% \item New options \xoption{final} and \xoption{draft}.
+% \item New option \xoption{scale} for scaling the annotation rectangle.
+% \item Options \xoption{file} and \xoption{nofile} for controlling
+% the generation of the auxiliary file \xfile{.atfi}.
+% \end{itemize}
+%
+% \subsubsection{Perl script \xfile{pdfatfi.pl}}
+%
+% This package also tries to get and add meta information data,
+% such as file size, file date, checksum, \dots.
+% As package \xpackage{embedfile} shows the new features
+% of \pdfTeX\ 1.30 are very useful for getting this kind of
+% data. However the main development preceded this \pdfTeX\ version.
+% Thus the Perl script \xfile{pdfatfi.pl} is used to provide this data.
+% The use of the Perl script is not mandatory. This data can be shown
+% by PDF viewers, but they are not a requirement of the PDF specification.
+%
+% Package \xpackage{attachfile2} and the Perl script communicate
+% via an auxiliary file with file extension \xfile{.atfi}. The script
+% is used between two \LaTeX\ runs and updates the auxiliary file,
+% example for \xoption{dvips}:
+% \begin{quote}
+%\begin{verbatim}
+%latex test
+%pdfatfi test
+%latex test
+%dvips test
+%ps2pdf test.ps test.pdf
+%\end{verbatim}
+% \end{quote}
+%
+% \subsection{Changes to \xpackage{attachfile}}
+%
+% Some of the changes I can remember:
+% \begin{itemize}
+% \item Support for dvips.
+% \item Setting and filling the /Param entry for files
+% (file date, file size, \dots).
+% \item Perl script \xfile{pdfatfi.pl}.
+% \item New options.
+% \item Bug fixes.
+% \item \dots
+% \end{itemize}
+%
+% \StopEventually{
+% }
+%
+% \section{Implementation}
+%
+% \subsection{Package}
+%
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{attachfile2}%
+ [2006/08/16 v2.2 attach files into PDF (HO)]
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{ifpdf}
+\RequirePackage{keyval}
+\RequirePackage{color}
+\RequirePackage{kvoptions}[2006/08/17]
+
+% --- hyperref ---
+
+\RequirePackage{hyperref}
+% because of \pdfstringdef
+
+\def\atfi@pdfstringdef#1#2{%
+ \pdfstringdef\atfi@temp@string{#2}%
+ \edef#1{\atfi@temp@string}%
+}
+
+% --- convert to hex ---
+
+\def\atfi@hexdigit#1{%
+ \ifcase#1%
+ 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or 9\or
+ a\or b\or c\or d\or e\or f%
+ \fi
+}
+% detour via \dimexpr to avoid eTeX's nasty expression rounding
+\def\atfi@hexchar#1{%
+ \atfi@hexdigit{\numexpr\dimexpr.0625\dimexpr`#1sp\relax\relax\relax}%
+ \atfi@hexdigit{%
+ \numexpr`#1-16*\dimexpr.0625\dimexpr`#1sp\relax\relax\relax
+ }%
+}
+\def\atfi@tohex#1{%
+ \ifx\relax#1%
+ \else
+ \atfi@hexchar{#1}%
+ \expandafter\atfi@tohex
+ \fi
+}
+
+% --- convert to name ---
+
+\def\atfi@converttoname#1#2{%
+ \edef#1{#2}%
+ \@onelevel@sanitize#1%
+ \edef#1{\expandafter\atfi@spacetoother#1 \relax}%
+ \edef#1{\expandafter\atfi@converttokens#1\relax}%
+}
+
+\edef\atfi@hash{\string#}%
+\catcode`\ =12\relax%
+\def\atfi@space{ }%
+\catcode`\ =10\relax%
+
+\def\atfi@spacetoother#1 #2\relax{%
+ #1%
+ \ifx\\#2\\%
+ \else
+ \atfi@space
+ \@ReturnAfterFi{%
+ \atfi@spacetoother #2\relax
+ }%
+ \fi
+}
+\long\def\@ReturnAfterFi#1\fi{\fi#1}
+
+\def\atfi@converttokens#1{%
+ \ifx\relax#1%
+ \else
+ \ifnum`#1<33 %
+ \ifcase`#1%
+ % drop illegal zero
+ \else
+ \atfi@hash\atfi@hexchar#1%
+ \fi
+ \else
+ \ifnum`#1>126 %
+ \atfi@hash\atfi@hexchar#1%
+ \else
+ \ifnum`#1=40 % (
+ \atfi@hash 28%
+ \else\ifnum`#1=41 % )
+ \atfi@hash 29%
+ \else\ifnum`#1=60 % <
+ \atfi@hash 3c%
+ \else\ifnum`#1=62 % >
+ \atfi@hash 3e%
+ \else\ifnum`#1=91 % [
+ \atfi@hash 5b%
+ \else\ifnum`#1=93 % ]
+ \atfi@hash 5d%
+ \else\ifnum`#1=123 % {
+ \atfi@hash 7b%
+ \else\ifnum`#1=125 % }
+ \atfi@hash 7d%
+ \else\ifnum`#1=47 % /
+ \atfi@hash 2f%
+ \else\ifnum`#1=37 % %
+ \atfi@hash 25%
+ \else
+ #1%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi
+ \fi
+ \expandafter\atfi@converttokens
+ \fi
+}
+
+
+% --- options ---
+
+% options "draft" and "final"
+\newif\ifatfi@draft
+\let\atfi@finaltrue\atfi@draftfalse
+\let\atfi@finalfalse\atfi@drafttrue
+\define@key{AtFi}{final}[true]{%
+ \csname atfi@final#1\endcsname
+}
+\define@key{AtFi}{draft}[true]{%
+ \csname atfi@draft#1\endcsname
+}
+
+% option mimetype
+\def\atfi@mimetype{}
+\define@key{AtFi}{mimetype}{%
+ \atfi@converttoname\atfi@mimetype{#1}%
+ \edef\atfi@mimetype{/Subtype/\atfi@mimetype}%
+}
+
+% option icon
+\define@key{AtFi}{icon}{%
+ \def\atfi@icon{/Name/#1}%
+ \def\atfi@icon@icon{#1}%
+}
+\setkeys{AtFi}{icon=PushPin}
+
+% option color
+\define@key{AtFi}{color}{%
+ \def\atfi@color{/C[#1]}%
+ \def\atfi@color@rgb{#1}%
+}
+\setkeys{AtFi}{color=1 0.9255 0.7765}
+
+% time options timezone and date
+\def\atfi@pad@ii#1{%
+ \ifnum#1>9
+ \number#1%
+ \else
+ 0\number#1%
+ \fi%
+}
+\let\atfi@timezone\@empty
+\define@key{AtFi}{timezone}{\def\atfi@timezone{#1}}
+\edef\atfi@time{\the\time}
+\def\atfi@hours{%
+ \numexpr\dimexpr0.01667\dimexpr\atfi@time sp\relax\relax\relax
+}
+\def\atfi@minutes{%
+ \numexpr\atfi@time-60*\atfi@hours\relax
+}
+\def\atfi@seconds{0}
+\def\atfi@date{%
+ /M(D:\the\year
+ \atfi@pad@ii\month
+ \atfi@pad@ii\day
+ \atfi@pad@ii\atfi@hours
+ \atfi@pad@ii\atfi@minutes
+ \atfi@pad@ii\atfi@seconds
+ \atfi@timezone)%
+}
+\define@key{AtFi}{date}{%
+ \atfi@pdfstringdef\atfi@date{#1}%
+ \edef\atfi@date{/M(\atfi@date)}%
+}
+
+% name for annotation to be used in GoToE actions
+\let\atfi@annotname\@empty
+\define@key{AtFi}{annotname}{%
+ \atfi@pdfstringdef\atfi@annotname{#1}%
+ \edef\atfi@annotname{/NM(\atfi@annotname)}%
+}
+
+% text options author, description, and subject
+\DeclareRobustCommand{\atfi@pdfstringdef}[2]{%
+ \pdfstringdef\atfi@temp@string{#2}%
+ \edef#1{\atfi@temp@string}%
+}
+
+% option author
+\def\atfi@author{}
+\define@key{AtFi}{author}{%
+ \atfi@pdfstringdef\atfi@author{#1}%
+ \edef\atfi@author{/T(\atfi@author)}%
+}
+
+% option description
+\def\atfi@description{}
+\define@key{AtFi}{description}{%
+ \atfi@pdfstringdef\atfi@description{#1}%
+ \edef\atfi@description{/Contents(\atfi@description)}%
+}
+
+% option subject
+\def\atfi@subject{}
+\define@key{AtFi}{subject}{%
+ \atfi@pdfstringdef\atfi@subject{#1}%
+ \edef\atfi@subject{/Subj(\atfi@subject)}%
+}
+
+% option print
+\newif\ifatfi@print
+\atfi@printtrue
+\define@key{AtFi}{print}[true]{\csname atfi@print#1\endcsname}
+
+% option zoom
+\newif\ifatfi@zoom
+\atfi@zoomtrue
+\define@key{AtFi}{zoom}[true]{\csname atfi@zoom#1\endcsname}
+
+% option appearance
+\newif\ifatfi@appearance
+\atfi@appearancetrue
+\define@key{AtFi}{appearance}[true]{%
+ \csname atfi@appearance#1\endcsname
+}
+
+% option scale
+\def\atfi@scale{1}
+\define@key{AtFi}{scale}[1]{%
+ \def\atfi@scale{#1}%
+}
+
+% option nofiles
+\newif\ifatfi@nofiles
+\atfi@nofilesfalse
+\define@key{AtFi}{nofiles}[true]{%
+ \csname atfi@nofiles#1\endcsname
+}
+
+% driver options
+\let\atfi@driver\@empty
+\def\atfi@driver@pdftex{pdftex}
+\def\atfi@driver@dvips{dvips}
+
+\define@key{AtFi}{pdftex}[true]{%
+ \let\atfi@driver\atfi@driver@pdftex
+}
+\define@key{AtFi}{dvips}[true]{%
+ \let\atfi@driver\atfi@driver@dvips
+}
+
+\DeclareRobustCommand{\attachfilesetup}[1]{\setkeys{AtFi}{#1}}
+
+% timezone setting, ...
+\InputIfFileExists{attachfile.cfg}{}{}
+
+\ProcessKeyvalOptions{AtFi}
+
+% --- evaluate driver options ---
+
+\ifpdf
+ % ignoring other driver options
+ \let\atfi@driver\atfi@driver@pdftex
+\else
+ \ifx\atfi@driver\@empty
+ \PackageWarningNoLine{attachfile2}{%
+ Driver is not specified,\MessageBreak
+ enforce draft settings%
+ }%
+ \atfi@drafttrue
+ \fi
+\fi
+
+% --- evaluate draft/final options ---
+
+\DeclareRobustCommand{\notextattachfile}[2][]{%
+ \begingroup
+ \setkeys{AtFi}{#1}%
+ \ifatfi@print
+ \def\atfi@textcolor(##1 ##2 ##3)##4{%
+ \textcolor[rgb]{##1,##2,##3}{##4}}%
+ \expandafter\atfi@textcolor\expandafter
+ (\atfi@color@rgb){#2\strut}%
+ \else
+ \setbox0=\hbox{#2\strut}%
+ \makebox[\wd0]{}%
+ \fi
+ \endgroup
+}
+
+\ifatfi@draft
+ \def\atfi@dummy@pushpin{%
+ \raisebox{-1.25bp}{\parbox[b][14bp]{24bp}{}}%
+ }
+ \DeclareRobustCommand{\textattachfile}[3][]{%
+ \notextattachfile[#1]{#3}%
+ }
+ \DeclareRobustCommand{\noattachfile}[1][]{%
+ \notextattachfile[#1]{\atfi@dummy@pushpin}%
+ }
+ \DeclareRobustCommand{\attachfile}[2][]{%
+ \noattachfile[#1]%
+ }
+ \expandafter\endinput
+\fi
+
+% --- load driver file ---
+
+\input{atfi\atfi@driver.def}
+
+% --- graphics ---
+
+\def\atfi@acroGraph@data{%
+ \atfi@GSAVE
+ 0.5 \atfi@SETGRAYFILL
+ 1.1133 0 20.7202 18.2754 \atfi@RECTFILL
+ 0 \atfi@SETFLAT
+ 0.5 \atfi@SETLINEWIDTH
+ 4 \atfi@SETMITERLIMIT
+ \atfi@RECTSTROKEFILL{%
+ 1 \atfi@SETGRAYFILL
+ }{%
+ 0 \atfi@SETGRAYSTROKE
+ }{%
+ 0.25 1.6453 20.145 17.7715 %
+ }%
+ 0 \atfi@SETGRAYFILL
+ 2.7319 4.1367 3.9571 13.8867 \atfi@RECTFILL
+ 8.7031 4.1367 3.9571 9.8867 \atfi@RECTFILL
+ 14.7471 4.1367 3.9571 11.8867 \atfi@RECTFILL
+ \atfi@color@rgb\space \atfi@SETRGBCOLORFILL
+ 1.689 3.0938 3.9571 13.8867 \atfi@RECTFILL
+ 7.6602 3.0938 3.9571 9.8867 \atfi@RECTFILL
+ 13.7041 3.0938 3.9571 11.8867 \atfi@RECTFILL
+ \atfi@GRESTORE
+}
+\def\atfi@acroGraph{%
+ \raisebox{-1.5bp}{\parbox[b][20bp]{22bp}{%
+ \rule{0pt}{0pt}\atfi@literal{\atfi@acroGraph@data}}%
+ }%
+}
+\newcommand{\atfi@acroPaperclip@data}{%
+ \atfi@GSAVE
+ 0.75 \atfi@SETGRAYSTROKE
+ 0 \atfi@SETFLAT
+ 2.5 \atfi@SETLINEWIDTH
+ 1 \atfi@SETLINECAP
+ 4 \atfi@SETMITERLIMIT
+ 1.9619 11.7559 \atfi@MOVETO
+ 1.9619 3.3037 1.9619 2.5059 \atfi@CURVETOV
+ 1.9619 1.707 4.0947 1.25 \atfi@CURVETOY
+ 7.4141 1.25 \atfi@LINETO
+ 9.4292 1.8223 9.4292 3.3066 \atfi@CURVETOV
+ 9.4292 4.79 9.4292 16.8945 \atfi@CURVETOY
+ 9.7852 18.1514 8.481 18.1514 \atfi@CURVETOV
+ 7.1768 18.1514 5.1616 18.1514 \atfi@CURVETOY
+ 3.8574 17.9209 3.8574 16.8945 \atfi@CURVETOV
+ 3.8574 15.8652 3.8574 6.6172 \atfi@CURVETOY
+ 4.3325 5.418 5.1025 5.418 \atfi@CURVETOV
+ 5.8726 5.418 6.5845 5.418 \atfi@CURVETOY
+ 7.6812 5.6455 7.6812 6.4736 \atfi@CURVETOV
+ 7.6812 7.3027 7.6812 11.5264 \atfi@CURVETOY
+ \atfi@STROKE
+ 0 \atfi@SETGRAYSTROKE
+ 1.2495 12.4404 \atfi@MOVETO
+ 1.2495 3.9883 1.2495 3.1895 \atfi@CURVETOV
+ 1.2495 2.3906 3.3833 1.9326 \atfi@CURVETOY
+ 6.7026 1.9326 \atfi@LINETO
+ 8.7178 2.5068 8.7178 3.9902 \atfi@CURVETOV
+ 8.7178 5.4736 8.7178 17.5781 \atfi@CURVETOY
+ 9.0732 18.834 7.769 18.834 \atfi@CURVETOV
+ 6.4653 18.834 4.4497 18.834 \atfi@CURVETOY
+ 3.146 18.6055 3.146 17.5781 \atfi@CURVETOV
+ 3.146 16.5498 3.146 7.3018 \atfi@CURVETOY
+ 3.6201 6.1016 4.3911 6.1016 \atfi@CURVETOV
+ 5.1611 6.1016 5.873 6.1016 \atfi@CURVETOY
+ 6.9692 6.3301 6.9692 7.1572 \atfi@CURVETOV
+ 6.9692 7.9863 6.9692 12.21 \atfi@CURVETOY
+ \atfi@STROKE
+ \atfi@color@rgb\space \atfi@SETRGBCOLORSTROKE
+ 1 \atfi@SETLINEWIDTH
+ 1.2495 12.4404 \atfi@MOVETO
+ 1.2495 3.9883 1.2495 3.1895 \atfi@CURVETOV
+ 1.2495 2.3906 3.3833 1.9326 \atfi@CURVETOY
+ 6.7026 1.9326 \atfi@LINETO
+ 8.7178 2.5068 8.7178 3.9902 \atfi@CURVETOV
+ 8.7178 5.4736 8.7178 17.5781 \atfi@CURVETOY
+ 9.0732 18.834 7.769 18.834 \atfi@CURVETOV
+ 6.4653 18.834 4.4497 18.834 \atfi@CURVETOY
+ 3.146 18.6055 3.146 17.5781 \atfi@CURVETOV
+ 3.146 16.5498 3.146 7.3018 \atfi@CURVETOY
+ 3.6201 6.1016 4.3911 6.1016 \atfi@CURVETOV
+ 5.1611 6.1016 5.873 6.1016 \atfi@CURVETOY
+ 6.9692 6.3301 6.9692 7.1572 \atfi@CURVETOV
+ 6.9692 7.9863 6.9692 12.21 \atfi@CURVETOY
+ \atfi@STROKE
+ \atfi@GRESTORE
+}
+\def\atfi@acroPaperclip{%
+ \raisebox{-1.25bp}{\parbox[b][21bp]{12bp}{%
+ \rule{0pt}{0pt}\atfi@literal{\atfi@acroPaperclip@data}}%
+ }%
+}
+\def\atfi@acroPushPin@data{%
+ \atfi@GSAVE
+ 1 \atfi@SETLINEWIDTH
+ 1 6 \atfi@MOVETO
+ 11 6 \atfi@LINETO
+ 11 13 \atfi@LINETO
+ 12 13 \atfi@LINETO
+ 14 11 \atfi@LINETO
+ 21 11 \atfi@LINETO
+ 22 12 \atfi@LINETO
+ 23 12 \atfi@LINETO
+ 23 2 \atfi@LINETO
+ 22 2 \atfi@LINETO
+ 21 3 \atfi@LINETO
+ 14 3 \atfi@LINETO
+ 12 1 \atfi@LINETO
+ 11 1 \atfi@LINETO
+ 11 6 \atfi@LINETO
+ \atfi@FILLSTROKE{%
+ \atfi@color@rgb\space\atfi@SETRGBCOLORFILL
+ }{%
+ 0 \atfi@SETGRAYSTROKE
+ }%
+ 0.5 \atfi@SETGRAYSTROKE
+ 0 7 \atfi@MOVETO
+ 10 7 \atfi@LINETO
+ 10 8 \atfi@LINETO
+ 1 8 \atfi@LINETO
+ \atfi@STROKE
+ 1 \atfi@SETGRAYSTROKE
+ 12 12 \atfi@MOVETO
+ 14 10 \atfi@LINETO
+ 22 10 \atfi@LINETO
+ 22 11 \atfi@LINETO
+ \atfi@STROKE
+ \atfi@GRESTORE
+}
+\def\atfi@acroPushPin{%
+ \raisebox{-1.25bp}{\parbox[b][14bp]{24bp}{%
+ \rule{0pt}{0pt}\atfi@literal{\atfi@acroPushPin@data}}%
+ }%
+}
+\def\atfi@acroTag@data{%
+ \atfi@GSAVE
+ 0.5 \atfi@SETGRAYFILL
+ 10.0542 14.9873 \atfi@MOVETO
+ 24.27 14.9873 \atfi@LINETO
+ 25.252 14.0059 \atfi@LINETO
+ 25.252 1.1455 \atfi@LINETO
+ 24.1064 0 \atfi@LINETO
+ 9.9609 0 \atfi@LINETO
+ 6.0327 6.0088 \atfi@LINETO
+ 6.0327 9.002 \atfi@LINETO
+ 10.0542 14.9873 \atfi@LINETO
+ 9.3994 9.376 \atfi@MOVETO
+ 8.5215 9.376 7.8096 8.5596 7.8096 7.5527 \atfi@CURVETO
+ 7.8096 6.5449 8.5215 5.7285 9.3994 5.7285 \atfi@CURVETO
+ 10.2778 5.7285 10.9897 6.5449 10.9897 7.5527 \atfi@CURVETO
+ 10.9897 8.5596 10.2778 9.376 9.3994 9.376 \atfi@CURVETO
+ \atfi@CLOSEPATH
+ \atfi@FILL
+ 0 \atfi@SETFLAT
+ 0.5 \atfi@SETLINEWIDTH
+ 4 \atfi@SETMITERLIMIT
+ 1 \atfi@SETLINEJOIN
+ 8.5107 16.5313 \atfi@MOVETO
+ 22.7266 16.5313 \atfi@LINETO
+ 23.7085 15.5488 \atfi@LINETO
+ 23.7085 2.6895 \atfi@LINETO
+ 22.563 1.543 \atfi@LINETO
+ 8.4175 1.543 \atfi@LINETO
+ 4.4893 7.5527 \atfi@LINETO
+ 4.4893 10.5449 \atfi@LINETO
+ 8.5107 16.5313 \atfi@LINETO
+ 7.856 10.9199 \atfi@MOVETO
+ 6.978 10.9199 6.2661 10.1035 6.2661 9.0957 \atfi@CURVETO
+ 6.2661 8.0879 6.978 7.2715 7.856 7.2715 \atfi@CURVETO
+ 8.7344 7.2715 9.4463 8.0879 9.4463 9.0957 \atfi@CURVETO
+ 9.4463 10.1035 8.7344 10.9199 7.856 10.9199 \atfi@CURVETO
+ \atfi@CLOSEPATH
+ \atfi@FILLSTROKE{%
+ \atfi@color@rgb\space\atfi@SETRGBCOLORFILL
+ }{%
+ 0 \atfi@SETGRAYSTROKE
+ }%
+ 1 \atfi@SETLINEWIDTH
+ 12.3291 12.2656 \atfi@MOVETO
+ 21.1206 12.2656 \atfi@LINETO
+ \atfi@STROKE
+ 12.3291 9.1797 \atfi@MOVETO
+ 21.1206 9.1797 \atfi@LINETO
+ \atfi@STROKE
+ 12.3291 6.1875 \atfi@MOVETO
+ 21.1206 6.1875 \atfi@LINETO
+ \atfi@STROKE
+ % 0 \atfi@SETGRAYSTROKE % redundant?
+ 0.5 \atfi@SETLINEWIDTH
+ 0 9.0488 \atfi@MOVETO
+ 6.2661 9.0957 \atfi@LINETO
+ \atfi@STROKE
+ 1.4028 5.2148 \atfi@MOVETO
+ 1.4028 9.6094 \atfi@LINETO
+ 1.6831 10.6387 2.4316 10.6387 \atfi@CURVETOV
+ 3.6475 10.6387 3.5542 9.0488 \atfi@CURVETOY
+ \atfi@STROKE
+ \atfi@GRESTORE
+}
+\DeclareRobustCommand{\atfi@acroTag}{%
+ \raisebox{-1.6bp}{\parbox[b][17bp]{25bp}{%
+ \rule{0pt}{0pt}\atfi@literal{\atfi@acroTag@data}}%
+ }%
+}
+
+% --- .atfi file reading support ---
+
+% commands used in \jobname.atfi:
+% * \attachfile@timezone{<timezone in PDF format>}
+% * \attachfile@file[
+% Size=<size>,
+% CreationDate=<date>, % <date> local time without "D:" and timezone
+% ModDate=<date>,
+% CheckSum=<checksum>
+% ]{<filename as hex string>}
+%
+\def\attachfile@timezone#1{%
+ \ifx\\#1\\%
+ % no timezone information given
+ \else
+ \def\atfi@timezone{#1}%
+ \fi
+}
+\newcommand*{\attachfile@file}[2][]{%
+ \ifx\\#2\\%
+ \PackageError{attachfile2}{Empty file name}\@ehc
+ \else
+ \edef\atfi@restore{\uccode0=\the\uccode0 \relax}%
+ \let\atfi@filename\@empty
+ \atfi@getfilename#2\relax\relax
+ \atfi@restore
+ \@namedef{atfi@file@\atfi@filename}{#1}%
+ \fi
+}
+% convert file name from hex string
+\begingroup
+ \catcode0=12 %
+ \gdef\atfi@getfilename#1#2{%
+ \ifx\relax#1%
+ \else
+ \uccode0=\numexpr 16*\atfi@hexnum{#1} + \atfi@hexnum{#2}\relax
+ \uppercase{%
+ \edef\atfi@filename{%
+ \atfi@filename^^@%
+ }%
+ }%
+ \expandafter\atfi@getfilename
+ \fi
+ }%
+\endgroup
+\def\atfi@hexnum#1{%
+ \ifnum`#1<58 %
+ \numexpr `#1-48\relax
+ \else
+ \numexpr `#1-87\relax
+ \fi
+}
+
+\InputIfFileExists{\jobname.atfi}{}{}%
+
+\newif\ifatfi@checksum
+\define@key{AtFi@file}{CheckSum}{%
+ \atfi@checksumtrue
+ \edef\atfi@params{\atfi@params/CheckSum<#1>}%
+}
+\newif\ifatfi@creationdate
+\define@key{AtFi@file}{CreationDate}{%
+ \atfi@creationdatetrue
+ \edef\atfi@params{\atfi@params/CreationDate(D:#1\atfi@timezone)}%
+}
+\newif\ifatfi@moddate
+\define@key{AtFi@file}{ModDate}{%
+ \atfi@moddatetrue
+ \edef\atfi@params{\atfi@params/ModDate(D:#1\atfi@timezone)}%
+}
+
+% --- .atfi file writing support ---
+
+% respect \nofiles and option nofiles
+% \nofiles has more weight than option nofiles
+\if@filesw
+\else
+ \atfi@nofilestrue
+\fi
+\ifatfi@nofiles
+ \PackageInfo{attachfile2}{%
+ File `\jobname.atfi' will not be written because of\MessageBreak
+ \string\nofiles\space or option `nofiles'%
+ }%
+ \let\atfi@writefile\@gobble
+\else
+ \newwrite\atfi@stream
+ \immediate\openout\atfi@stream=\jobname.atfi
+ \immediate\write\atfi@stream{%
+ \string\attachfile@timezone{\atfi@timezone}%
+ }%
+ \def\atfi@writefile#1{%
+ \begingroup
+ \def\file{#1}%
+ \@onelevel@sanitize\file
+ \edef\file{\@firstofone{\expandafter\atfi@replace\file} \@nil}%
+ \edef\file{\expandafter\atfi@tohex\file\relax}%
+ \immediate\write\atfi@stream{%
+ \string\attachfile@file[%
+ \@ifundefined{atfi@file@#1}{}{\@nameuse{atfi@file@#1}}%
+ ]{\file}%
+ }%
+ \endgroup
+ }%
+\fi
+
+\def\atfi@attachfile#1#2{%
+ \@ifundefined{atfi@fileobj@#2}{%
+ \atfi@writefile{#2}%
+ }{%
+ % don't need duplicates
+ }%
+ \setkeys{AtFi}{#1}%
+ \atfi@embedfile{#2}%
+ \atfi@set@appearance@icon
+ \atfi@flags@to@int
+ \atfi@insert@file@annot{#2}%
+ \endgroup
+}
+
+% convert to hex string
+
+\def\atfi@replace#1 #2\@nil{%
+ #1%
+ \ifx\\#2\\%
+ \else
+ \atfi@space
+ \@ReturnAfterFi{%
+ \atfi@replace#2\@nil
+ }%
+ \fi
+}%
+
+\long\def\@ReturnAfterFi#1\fi{\fi#1}
+
+% ---
+
+\newlength{\atfi@appearancewidth}
+\newlength{\atfi@appearanceheight}
+\newlength{\atfi@appearancedepth}
+\newsavebox{\atfi@appearancebox}
+
+\def\atfi@set@appearance@icon{%
+ \@ifundefined{atfi@appobj@\atfi@icon@icon}{%
+ \savebox{\atfi@appearancebox}{\@nameuse{atfi@acro\atfi@icon@icon}}%
+ \expandafter\xdef\csname atfi@appwidth@\atfi@icon@icon\endcsname{%
+ \the\wd\atfi@appearancebox
+ }%
+ \expandafter\xdef\csname atfi@appheight@\atfi@icon@icon\endcsname{%
+ \the\ht\atfi@appearancebox
+ }%
+ \expandafter\xdef\csname atfi@appdepth@\atfi@icon@icon\endcsname{%
+ \the\dp\atfi@appearancebox
+ }%
+ \atfi@xform@icon
+ \global\expandafter\let\csname atfi@appobj@\atfi@icon@icon\endcsname
+ \atfi@appearanceobj
+ }{%
+ }%
+ % optimization: \setlength dropped
+ \atfi@appearancewidth=\@nameuse{atfi@appwidth@\atfi@icon@icon}\relax
+ \atfi@appearanceheight=\@nameuse{atfi@appheight@\atfi@icon@icon}\relax
+ \atfi@appearancedepth=\@nameuse{atfi@appdepth@\atfi@icon@icon}\relax
+ \expandafter\let\expandafter\atfi@appearanceobj
+ \csname atfi@appobj@\atfi@icon@icon\endcsname
+}
+
+\def\atfi@set@appearance#1{%
+ \savebox{\atfi@appearancebox}{#1}%
+ \atfi@appearancewidth=\wd\atfi@appearancebox
+ \atfi@appearanceheight=\ht\atfi@appearancebox
+ \atfi@appearancedepth=\dp\atfi@appearancebox
+ \atfi@xform
+}
+
+\newcounter{atfi@flags}
+\DeclareRobustCommand{\atfi@flags@to@int}{%
+ \setcounter{atfi@flags}{0}%
+ \ifatfi@print
+ \addtocounter{atfi@flags}{4}%
+ \fi%
+ \ifatfi@zoom
+ \else
+ \addtocounter{atfi@flags}{8}%
+ \fi%
+}
+
+\def\atfi@textattachfile#1#2{%
+ \endgroup
+ \atfi@textattachfile@i{#1}{#2}%
+}
+\def\atfi@textattachfile@i#1#2#3{%
+ \setkeys{AtFi}{#1}%
+ \atfi@embedfile{#2}%
+ \def\atfi@textcolor(##1 ##2 ##3)##4{%
+ \textcolor[rgb]{##1,##2,##3}{##4}}%
+ \atfi@set@appearance{%
+ \expandafter\atfi@textcolor\expandafter
+ (\atfi@color@rgb){#3\strut}}%
+ \atfi@flags@to@int
+ \atfi@insert@file@annot{#2}%
+ \endgroup
+}
+
+\DeclareRobustCommand{\attachfile}[1][]{%
+ \begingroup
+ \let\do\@makeother
+ \dospecials
+ \catcode`\{=1\relax
+ \catcode`\}=2\relax
+ \atfi@attachfile{#1}%
+}
+\DeclareRobustCommand{\textattachfile}[1][]{%
+ \begingroup
+ \begingroup
+ \let\do\@makeother
+ \dospecials
+ \catcode`\{=1\relax
+ \catcode`\}=2\relax
+ \atfi@textattachfile{#1}%
+}
+\DeclareRobustCommand{\noattachfile}[1][]{%
+ \begingroup
+ \setkeys{AtFi}{#1}%
+ \atfi@set@appearance@icon
+ \ifatfi@print
+ \expandafter\atfi@refxform\csname atfi@appobj@\atfi@icon@icon\endcsname
+ \else
+ \makebox[\atfi@appearancewidth]{}%
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \subsection{Drivers}
+%
+% \subsubsection{\pdfTeX}
+%
+% \begin{macrocode}
+%<*pdftex>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{atfipdftex.def}%
+ [2006/08/16 v2.2 attachfile2 driver for pdfTeX (HO)]
+% \end{macrocode}
+% \begin{macrocode}
+\let\atfi@literal\pdfliteral
+
+% --- macros for graphics data ---
+
+\def\atfi@GSAVE{q }
+\def\atfi@GRESTORE{Q }
+\def\atfi@SETLINEWIDTH{w }
+\def\atfi@LINETO{l }
+\def\atfi@MOVETO{m }
+\def\atfi@STROKE{S }
+\def\atfi@FILL{f }
+% \atfi@FILLSTROKE{<fill color>}{<stroke color>}
+\def\atfi@FILLSTROKE#1#2{#1#2B }
+% color: uppercase are stroke colors, lowercase non-stroke (fill) colors
+% PS, however, does not different between stroke and not-stroke colors
+\def\atfi@SETRGBCOLORSTROKE{RG }
+\def\atfi@SETRGBCOLORFILL{rg }
+\def\atfi@SETGRAYSTROKE{G }
+\def\atfi@SETGRAYFILL{g }
+\def\atfi@RECTFILL{re f }
+\def\atfi@RECTSTROKEFILL#1#2#3{#1#2#3re B }
+\def\atfi@SETMITERLIMIT{M }
+\def\atfi@SETFLAT{i }
+\def\atfi@SETLINECAP{J }
+\def\atfi@CURVETO{c }
+\def\atfi@CURVETOV{v }
+\def\atfi@CURVETOY{y }
+\def\atfi@CLOSEPATH{h }
+\def\atfi@SETLINEJOIN{j }
+
+% ---
+
+\define@key{AtFi@file}{Size}{%
+ \edef\atfi@params{\atfi@params/Size #1}%
+}
+
+\def\atfi@embedfile#1{%
+ \@ifundefined{atfi@fileobj@#1}{%
+ \begingroup
+ \let\atfi@params\@empty
+ \@ifundefined{atfi@file@#1}{}{%
+ \edef\x{\noexpand\setkeys{AtFi@file}{\@nameuse{atfi@file@#1}}}%
+ \x
+ }%
+ \ifx\atfi@params\@empty
+ \else
+ \edef\atfi@params{/Params<<\atfi@params>>}%
+ \fi
+ \immediate\pdfobj stream attr {%
+ /Type/EmbeddedFile%
+ \atfi@mimetype
+ \atfi@params
+ } file {#1}%
+ \expandafter\xdef\csname atfi@fileobj@#1\endcsname{\the\pdflastobj}%
+ \endgroup
+ }{%
+ % file already embedded
+ }%
+}
+
+% ---
+
+% input: \atfi@appearancebox, output: \atfi@appearanceobj
+\def\atfi@xform{%
+ \immediate\pdfxform\atfi@appearancebox
+ \edef\atfi@appearanceobj{\the\pdflastxform}%
+}
+\let\atfi@xform@icon\atfi@xform
+
+\def\atfi@refxform#1{%
+ \pdfrefxform#1\relax
+}
+
+% ---
+
+\def\atfi@insert@file@annot#1{%
+ \rule{0pt}{0pt}%
+ \ifatfi@appearance
+ \def\atfi@appearance@dict{%
+ /AP<<%
+ /N \atfi@appearanceobj\space 0 R%
+ /R \atfi@appearanceobj\space 0 R%
+ /D \atfi@appearanceobj\space 0 R%
+ >>%
+ }%
+ \else
+ \let\atfi@appearance@dict\@empty
+ \fi
+ \@ifundefined{atfi@fsobj@#1}{%
+ \atfi@pdfstringdef\atfi@file{#1}%
+ \immediate\pdfobj{%
+ <<%
+ /Type/Filespec%
+ /F(\atfi@file)%
+ /EF<<%
+ /F \@nameuse{atfi@fileobj@#1} 0 R%
+ >>%
+ >>%
+ }%
+ \expandafter\xdef\csname atfi@fsobj@#1\endcsname{%
+ \the\pdflastobj
+ }%
+ }{%
+ }%
+ \pdfannot width \atfi@scale\atfi@appearancewidth
+ height \atfi@scale\atfi@appearanceheight
+ depth \atfi@scale\atfi@appearancedepth {%
+ /Subtype/FileAttachment%
+ \atfi@icon
+ \atfi@color
+ \atfi@author
+ \atfi@date
+ \atfi@annotname
+ \atfi@description
+ \atfi@subject
+ \atfi@appearance@dict
+ /F \theatfi@flags
+ /FS \@nameuse{atfi@fsobj@#1} 0 R%
+ }%
+ \rule{0pt}{\atfi@appearanceheight}%
+ \rule[-\atfi@appearancedepth]{0pt}{\atfi@appearancedepth}%
+ \rule{\atfi@appearancewidth}{0pt}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</pdftex>
+% \end{macrocode}
+%
+% \subsubsection{dvips}
+%
+% \begin{macrocode}
+%<*dvips>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{atfipdftex.def}%
+ [2006/08/16 v2.2 attachfile2 driver for dvips (HO)]
+% \end{macrocode}
+% \begin{macrocode}
+\def\atfi@literal#1{%
+ \special{ps:atfi_dict begin{#1}atfi_?pdfmark end}%
+}
+
+\def\atfi@header#1{%
+ \special{! #1}%
+}
+
+% --- macros for graphics data ---
+
+\atfi@header{%
+ userdict begin 20 dict dup /atfi_dict exch def end begin
+ /atfi_?pdfmark systemdict
+ dup /pdfmark known
+ {
+ /exec get def
+ }{
+ /pop get def
+ } ifelse
+ {
+ %
+ % x y width height atfi_re ->
+ languagelevel 2 ge {
+ /atfi_rectfill { rectfill } bind def
+ /atfi_rectstroke { rectstroke } bind def
+ }{%
+ /atfi_rect {
+ /atfi_height exch def
+ /atfi_width exch def
+ /atfi_x exch def
+ /atfi_y exch def
+ newpath
+ atfi_x atfi_y moveto
+ atfi_x atfi_width add atfi_y lineto
+ atfi_x atfi_width add atfi_y atfi_height add lineto
+ atfi_x atfi_y atfi_height add lineto
+ closepath
+ } bind def
+ /atfi_rectfill {
+ atfi_rect fill
+ } bind def
+ /atfi_rectstroke {
+ atfi_rect stroke
+ } bind def
+ } ifelse
+ /atfi_curveto_v {
+ currentpoint 6 2 roll curveto
+ } bind def
+ /atfi_curveto_y {
+ 2 copy curveto
+ } bind def
+ %
+ % help macro for atfi_convert_date
+ /atfi_two {
+ dup 10 lt
+ {
+ 1 string cvs
+ exch 1 add exch
+ }{
+ 2 string cvs
+ } ifelse
+ putinterval
+ } bind def
+ %
+ % <seconds since 1970-01-01> atfi_convert_date -> (D:...Z)
+ /atfi_convert_date {
+ dup
+ /atfi_days exch 3600 idiv 24 idiv def
+ % calc date part
+ /atfi_year 1970 def
+ {
+ atfi_year 400 mod 0 eq
+ atfi_year 100 mod 0 ne
+ atfi_year 4 mod 0 eq
+ and or
+ { 366 } { 365 } ifelse
+ dup atfi_days lt
+ {
+ atfi_days exch sub /atfi_days exch def
+ /atfi_year atfi_year 1 add def
+ }{
+ exit
+ } ifelse
+ } loop
+ /atfi_month 1 def
+ /atfi_days atfi_days 1 add def
+ 31 atfi_days lt
+ {
+ atfi_days 31 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 366 eq { 29 } { 28 } ifelse dup atfi_days lt
+ {
+ atfi_days exch sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 31 atfi_days lt
+ {
+ atfi_days 31 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 30 atfi_days lt
+ {
+ atfi_days 30 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 31 atfi_days lt
+ {
+ atfi_days 31 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 30 atfi_days lt
+ {
+ atfi_days 30 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 31 atfi_days lt
+ {
+ atfi_days 31 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 31 atfi_days lt
+ {
+ atfi_days 31 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 30 atfi_days lt
+ {
+ atfi_days 30 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 31 atfi_days lt
+ {
+ atfi_days 31 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 30 atfi_days lt
+ {
+ atfi_days 30 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ 31 atfi_days lt
+ {
+ atfi_days 31 sub /atfi_days exch def
+ /atfi_month atfi_month 1 add def
+ } if
+ } if
+ } if
+ } if
+ } if
+ } if
+ } if
+ } if
+ } if
+ } if
+ } { pop } ifelse
+ }{ pop } ifelse
+ % calc time part
+ 3600 24 mul mod
+ dup 3600 idiv dup /atfi_hour exch def
+ 3600 mul sub
+ dup 60 idiv dup /atfi_min exch def
+ 60 mul sub
+ /atfi_sec exch def
+ (D:19700101000000Z)
+ dup 2 atfi_year 4 string cvs putinterval
+ dup 6 atfi_month atfi_two
+ dup 8 atfi_days atfi_two
+ dup 10 atfi_hour atfi_two
+ dup 12 atfi_min atfi_two
+ dup 14 atfi_sec atfi_two
+ } bind def
+ %
+ % <filename> atfi_calc_checksum -> /CheckSum <checksum>
+ % or returns nothing, if MD5Encode is not given
+ false
+ languagelevel 2 ge {
+ (MD5Encode)
+ { pop true or }
+ (MD5Encode) length string
+ /Filter
+ resourceforall
+ } if
+ {
+ /atfi_calc_checksum {
+ /atfi_checksum 16 string def
+ /atfi_file exch (r) file def
+ /atfi_md5sum atfi_checksum /MD5Encode filter def
+ % not too efficient to read and write byte by byte,
+ % using a buffer is probably faster
+ atfi_size {
+ atfi_file read
+ {
+ atfi_md5sum exch write
+ } if
+ } repeat
+ atfi_md5sum closefile
+ atfi_file closefile
+ /CheckSum atfi_checksum
+ } bind def
+ }{
+ /atfi_calc_checksum { pop } bind def
+ } ifelse
+ %
+ /atfi_pttobp { 72.27 div 72 mul } bind def
+ /atfi_pdftodvipsx { 72.27 div Resolution mul } bind def
+ /atfi_pdftodvipsy { 72.27 div VResolution mul } bind def
+ %
+ } atfi_?pdfmark
+ end
+}
+
+\def\atfi@GSAVE{gsave }
+\def\atfi@GRESTORE{grestore }
+\def\atfi@SETLINEWIDTH{setlinewidth }
+\def\atfi@LINETO{lineto }
+\def\atfi@MOVETO{moveto }
+\def\atfi@STROKE{stroke }
+\def\atfi@FILL{fill }
+\def\atfi@FILLSTROKE#1#2{gsave #1 fill grestore #2 stroke }
+\def\atfi@SETRGBCOLORSTROKE{setrgbcolor }
+\def\atfi@SETRGBCOLORFILL{setrgbcolor }
+\def\atfi@SETGRAYSTROKE{setgray }
+\def\atfi@SETGRAYFILL{setgray }
+\def\atfi@RECTFILL{atfi_rectfill }
+\def\atfi@RECTSTROKEFILL#1#2#3{%
+ #3%
+ #1%
+ gsave atfi_rectfill grestore
+ #2%
+ #3%
+ atfi_rectstroke
+ #1%
+}
+\def\atfi@SETMITERLIMIT{setmiterlimit }
+\def\atfi@SETFLAT{setflat }
+\def\atfi@SETLINECAP{setlinecap }
+\def\atfi@CURVETO{curveto }
+\def\atfi@CURVETOV{atfi_curveto_v }
+\def\atfi@CURVETOY{atfi_curveto_y }
+\def\atfi@CLOSEPATH{closepath }
+\def\atfi@SETLINEJOIN{setlinejoin }
+
+% ---
+
+\newcounter{atfi@obj}
+\renewcommand*{\theatfi@obj}{%
+ {atfi_obj_\number\c@atfi@obj}%
+}
+
+
+% most values for Params dictionary found in the .atfi file have
+% priority:
+% * Recalculation (md5sum, ...) is avoided.
+% * An external script has more possibilities than programming
+% at PostScript level (operating system, getting the date and
+% time values of the file with correct interpretation.
+% * Exception: status is called to test file existence, thus
+% we get the value of size for free
+
+\define@key{AtFi@file}{Size}{}
+
+\def\atfi@embedfile#1{%
+ \@ifundefined{atfi@fileobj@#1}{%
+ \atfi@pdfstringdef\atfi@psfilename{#1}%
+ \stepcounter{atfi@obj}%
+ \expandafter\xdef\csname atfi@fileobj@#1\endcsname{\theatfi@obj}%
+ \begingroup
+ \let\atfi@params\@empty
+ \@ifundefined{atfi@file@#1}{}{%
+ \edef\x{\noexpand\setkeys{AtFi@file}{\@nameuse{atfi@file@#1}}}%
+ \x
+ }%
+ \atfi@literal{%
+ /atfi_filename (\atfi@psfilename) def
+ atfi_filename status
+ {
+ % ok: file found
+ % save parameters of status command
+ /atfi_created exch def
+ /atfi_referenced exch def
+ /atfi_size exch def
+ pop % drop parameter "pages" (storage space), never needed
+ % ghostscript:
+ % created: stat.st_ctime
+ % referenced: stat.st_mtime
+ % stat.st_ctime: interpretion depends on operating system:
+ % * unix: inode change time (not interesting)
+ % * win32: probably creation time
+ % --> /CreationDate
+ % stat.st_mtime: modification time --> /ModDate
+ % time values are seconds since 1970-01-01, GMT
+ % TODO: ghostscript offers "getenv" for getting the value
+ % of an environment variable. That could be used to
+ % to detect windows and settingthe /CreationDate entry.
+ % TODO: how are these values interpreted by other distiller
+ % programs?
+ %
+ [
+ /_objdef \theatfi@obj
+ /type /stream
+ /OBJ pdfmark
+ [
+ \theatfi@obj
+ <<
+ /Type /EmbeddedFile
+ \atfi@mimetype
+ /Params
+ <<
+ \atfi@params
+ %
+ /Size atfi_size
+ %
+ /product where
+ {
+ pop
+ % check for ghostscript
+ product (Ghostscript) search
+ {
+ pop pop pop
+ % ghostscript is running
+ %
+ \ifatfi@creationdate
+ \else
+ false % TODO: test for windows
+ {
+ /CreationDate atfi_created atfi_convert_date
+ } if
+ \fi
+ \ifatfi@moddate
+ \else
+ /ModDate atfi_referenced atfi_convert_date
+ \fi
+ } if
+ %
+ % look for MD5Encode filter and calculate CheckSum
+ } if
+ \ifatfi@checksum
+ \else
+ atfi_filename atfi_calc_checksum
+ \fi
+ >>
+ >>
+ /PUT pdfmark
+ [
+ \theatfi@obj
+ atfi_filename (r) file
+ /PUT pdfmark
+ [
+ \theatfi@obj
+ /CLOSE pdfmark
+ }{
+ % error: file not found
+ % currently nothing is done
+ } ifelse
+ }%
+ \endgroup
+ }{%
+ % file already embedded
+ }%
+}
+
+% ---
+
+% output: \atfi@appearanceobj
+% input: \atfi@appearancebox, \atfi@icon@icon
+\def\atfi@xform@icon{%
+ \stepcounter{atfi@obj}%
+ \edef\atfi@appearanceobj{\theatfi@obj}%
+ \atfi@literal{%
+ [
+ /_objdef \atfi@appearanceobj
+ /BBox [
+ 0
+ 0
+ \strip@pt\wd\atfi@appearancebox\space atfi_pttobp
+ \strip@pt\dimexpr\dp\atfi@appearancebox
+ +\ht\atfi@appearancebox\relax\space atfi_pttobp
+ ]
+ /BP pdfmark
+ \csname atfi@acro\atfi@icon@icon @data\endcsname
+ [
+ /EP pdfmark
+ }%
+}
+% output: \atfi@appearanceobj
+% input: \atfi@appearancebox
+\def\atfi@xform{%
+ \stepcounter{atfi@obj}%
+ \edef\atfi@appearanceobj{\theatfi@obj}%
+ \begingroup
+ \setbox0=\hbox{%
+ \atfi@literal{%
+ [
+ /_objdef \atfi@appearanceobj
+ /BBox [
+ currentpoint
+ \strip@pt\dp\atfi@appearancebox\space sub
+ currentpoint
+ exch \strip@pt\wd\atfi@appearancebox\space add
+ exch \strip@pt\ht\atfi@appearancebox\space add
+ ]
+ /BP pdfmark
+ gsave
+ currentpoint
+ 2 copy translate
+ 72.27 Resolution div 72.27 VResolution div neg scale
+ exch neg exch neg translate
+ }%
+ \usebox{\atfi@appearancebox}%
+ \atfi@literal{%
+ grestore
+ [
+ /EP pdfmark
+ }%
+ }%
+ % do not allocate any space for xobject definition
+ \dp0=\z@
+ \ht0=\z@
+ \wd0=\z@
+ \mbox{\usebox0}%
+ \endgroup
+}
+
+\def\atfi@refxform#1{%
+ \raisebox{-\atfi@appearancedepth}{%
+ \atfi@literal{%
+ gsave
+ currentpoint translate
+ Resolution 72 div VResolution neg 72 div scale
+ [ #1 /SP pdfmark
+ grestore
+ }%
+ \makebox[\atfi@appearancewidth]{}%
+ }%
+ \rule{0pt}{\atfi@appearanceheight}%
+}
+
+% ---
+
+\def\atfi@insert@file@annot#1{%
+ \rule{0pt}{0pt}%
+ \ifatfi@appearance
+ \def\atfi@appearance@dict{%
+ /AP<<%
+ /N \atfi@appearanceobj
+ /R \atfi@appearanceobj
+ /D \atfi@appearanceobj
+ >>%
+ }%
+ \else
+ \let\atfi@appearance@dict\@empty
+ \fi
+ \@ifundefined{atfi@fsobj@#1}{%
+ \stepcounter{atfi@obj}%
+ \expandafter\xdef\csname atfi@fsobj@#1\endcsname{\theatfi@obj}%
+ \atfi@pdfstringdef\atfi@file{#1}%
+ \atfi@literal{%
+ [
+ /_objdef \theatfi@obj
+ /type /dict
+ /OBJ pdfmark
+ [
+ \theatfi@obj
+ <<
+ /Type /Filespec
+ /F (\atfi@file)
+ /EF <<
+ /F \csname atfi@fileobj@#1\endcsname
+ >>
+ >>
+ /PUT pdfmark
+ }%
+ }{%
+ }%
+ \atfi@literal{%
+ [
+ /Subtype/FileAttachment%
+ \atfi@icon
+ \atfi@color
+ \atfi@author
+ \atfi@date
+ \atfi@annotname
+ \atfi@description
+ \atfi@subject
+ \atfi@appearance@dict
+ /F \theatfi@flags
+ /FS \csname atfi@fsobj@#1\endcsname
+ /Rect [
+ currentpoint
+ \strip@pt\dimexpr\atfi@scale\atfi@appearancedepth\relax
+ \space atfi_pdftodvipsy add
+ currentpoint
+ exch \strip@pt\dimexpr\atfi@scale\atfi@appearancewidth\relax
+ \space atfi_pdftodvipsx add
+ exch \strip@pt\dimexpr\atfi@scale\atfi@appearanceheight\relax
+ \space atfi_pdftodvipsy sub
+ ]
+ /ANN pdfmark
+ }%
+ \rule{0pt}{\atfi@appearanceheight}%
+ \rule[-\atfi@appearancedepth]{0pt}{\atfi@appearancedepth}%
+ \rule{\atfi@appearancewidth}{0pt}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</dvips>
+% \end{macrocode}
+%
+% \subsection{Perl script \xfile{pdfatfi.pl}}
+%
+% \begin{macrocode}
+%<*pdfatfi>
+% \end{macrocode}
+% \begin{macrocode}
+eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $argv:q'
+ if 0;
+use strict;
+$^W=1; # turn warning on
+#
+# pdfatfi.pl
+#
+# Copyright (C) 2005, 2006 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 2005/12/01 or later.
+#
+# This work has the LPPL maintenance status "maintained".
+#
+# This Current Maintainer of this work is Heiko Oberdiek.
+#
+# See file "attachfile2.pdf" for a list of files that belong to this project.
+#
+# This file "pdfatfi.pl" may be renamed to "pdfatfi"
+# for installation purposes.
+#
+my $file = "pdfatfi.pl";
+my $program = uc($&) if $file =~ /^\w+/;
+my $version = "2.2";
+my $date = "2006/08/16";
+my $author = "Heiko Oberdiek";
+my $copyright = "Copyright (c) 2005, 2006 by $author.";
+#
+# History:
+# 2005/05/21 v1.0: First release.
+# 2006/08/16 v2.2: Included in DTX file of attachfile2.dtx.
+#
+
+use POSIX qw(strftime); # %z is used (GNU)
+use Digest::MD5;
+
+### program identification
+my $title = "$program $version, $date - $copyright\n";
+
+### error strings
+my $Error = "!!! Error:"; # error prefix
+
+### variables
+my $atfifile;
+
+### option variables
+my @bool = ("false", "true");
+$::opt_help = 0;
+$::opt_quiet = 0;
+$::opt_debug = 0;
+$::opt_verbose = 0;
+
+my $usage = <<"END_OF_USAGE";
+${title}Syntax: \L$program\E [options] <file[.atfi]>
+Function: Help program for LaTeX package "attachfile2".
+Options: (defaults:)
+ --help print usage
+ --(no)quiet suppress messages ($bool[$::opt_quiet])
+ --(no)verbose verbose printing ($bool[$::opt_verbose])
+ --(no)debug debug informations ($bool[$::opt_debug])
+END_OF_USAGE
+
+### process options
+my @OrgArgv = @ARGV;
+use Getopt::Long;
+GetOptions(
+ "help!",
+ "quiet!",
+ "debug!",
+ "verbose!",
+) or die $usage;
+!$::opt_help or die $usage;
+@ARGV == 1 or die "$usage$Error Missing jobname!\n";
+
+$::opt_quiet = 0 if $::opt_verbose;
+
+print $title unless $::opt_quiet;
+
+### get jobname
+$atfifile = $ARGV[0];
+if (!-f $atfifile && -f "$atfifile.atfi") {
+ $atfifile .= ".atfi";
+}
+-f $atfifile or die "$Error File `$atfifile' not found!\n";
+
+print "* job file = $atfifile\n" if $::opt_verbose;
+
+if ($::opt_debug) {
+ print <<"END_DEB";
+* OSNAME: $^O
+* PERL_VERSION: $]
+* ARGV: @OrgArgv
+END_DEB
+}
+
+my $tmpfile = $atfifile . ".tmp";
+
+my $timezone = strftime "%z", localtime;
+$timezone =~ s/^([+\-]\d\d)(\d\d)$/$1'$2'/;
+
+open(IN, $atfifile) or die "$Error Cannot open `$atfifile'!\n";
+open(OUT, ">$tmpfile") or die "$Error Cannot write `$tmpfile'!\n";
+
+while(<IN>) {
+ # timezone
+ if (s/^(\\attachfile\@timezone\{).*(\})$/$1$timezone$2/) {
+ print "* timezone = $timezone\n" if $::opt_verbose;
+ }
+
+ # file entry
+ if (/^\\attachfile\@file\[[^\]]*\]\{(.*)\}$/) {
+ my $hexfile = $1;
+ my $file = pack('H*', $hexfile);
+ my @s = stat($file);
+ if (@s == 0) {
+ print "!!! Warning: File `$file' not found!\n";
+ }
+ else {
+ my $size = @s[7];
+ my $mtime = @s[9];
+ my $ctime = @s[10]; # inode change time
+
+ my ($sec, $min, $hour, $mday, $mon, $year) = localtime($mtime);
+ my $moddate = sprintf("%04d%02d%02d%02d%02d%02d",
+ $year + 1900, $mon + 1, $mday,
+ $hour, $min, $sec);
+
+ # Manual page "perlport" says that "ctime" is creation
+ # time instead of inode change time for "Win32" and
+ # "Mac OS", but it is unsupported for "Mac OS X".
+ my $creationdate = "";
+ if ($^O eq 'MSWin32') { # cygwin?
+ ($sec, $min, $hour, $mday, $mon, $year) = localtime($ctime);
+ $creationdate = sprintf("%04d%02d%02d%02d%02d%02d",
+ $year + 1900, $mon + 1, $mday,
+ $hour, $min, $sec);
+ }
+
+ # md5 checksum
+ my $checksum = "";
+ my $ctx = Digest::MD5->new;
+ if (open(FILE, $file)) {
+ $ctx->addfile(*FILE);
+ $checksum = $ctx->hexdigest;
+ close(FILE);
+ }
+ else {
+ print "!!! Warning: File `$file' cannot be read,"
+ . " dropping checksum!\n";
+ }
+
+ $_ = "\\attachfile\@file["
+ . "ModDate=$moddate,Size=$size"
+ . (($checksum) ? ",CheckSum=$checksum" : "")
+ . (($creationdate) ? ",CreationDate=$creationdate" : "")
+ . "]{$hexfile}\n";
+ if ($::opt_verbose) {
+ print "* file entry = $file\n";
+ print " size = $size\n";
+ print " moddate = $moddate\n";
+ print " creationdate = $creationdate\n" if $creationdate;
+ print " checksum = $checksum\n" if $checksum;
+ }
+ }
+ }
+
+ print OUT $_;
+}
+
+close(IN);
+close(OUT);
+
+unlink($atfifile) or die "$Error Cannot delete old `$atfifile'!\n";
+rename $tmpfile, $atfifile
+ or die "$Error Cannot move `$tmpfile' to `$atfifile'!\n";
+
+print "*** ready. ***\n" unless $::opt_quiet;
+
+__END__
+% \end{macrocode}
+% \begin{macrocode}
+%</pdfatfi>
+% \end{macrocode}
+%
+% \section{Installation}
+%
+% \paragraph{CTAN.} This package is available on
+% CTAN\footnote{\url{ftp://ftp.ctan.org/tex-archive/}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/oberdiek/attachfile2.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/oberdiek/attachfile2.pdf}] Documentation.
+% \item[\CTAN{macros/latex/contrib/oberdiek/pdfatfi.pl}] Script.
+% \end{description}
+%
+% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting
+% \docstrip\ archive. The files are extracted by running the
+% \xfile{.dtx} through \plainTeX:
+% \begin{quote}
+% \verb|tex attachfile2.dtx|
+% \end{quote}
+%
+% \paragraph{TDS.} Now the different files must be moved into
+% the different directories in your installation TDS tree
+% (also known as \xfile{texmf} tree):
+% \begin{quote}
+% \sbox0{^^A
+% \begin{tabular}{@{}>{\ttfamily}l@{$\quad\rightarrow\quad$}>{\ttfamily}l@{}}
+% attachfile2.sty & tex/latex/oberdiek/attachfile2.sty\\
+% atfidvips.def & tex/latex/oberdiek/atfidvips.def\\
+% atfipdftex.def & tex/latex/oberdiek/atfipdftex.def\\
+% attachfile2.pdf & doc/latex/oberdiek/attachfile2.pdf\\
+% attachfile2.dtx & source/latex/oberdiek/attachfile2.dtx\\
+% pdfatfi.pl & scripts/oberdiek/pdfatfi.pl\\
+% \end{tabular}^^A
+% }%
+% \ifdim\wd0>\linewidth
+% \mbox{}\nobreak\hskip0pt minus\leftmargin
+% \usebox0
+% \nobreak\hskip0pt minus\rightmargin
+% \else
+% \usebox0
+% \fi
+% \end{quote}
+% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's
+% TDS installing feature, then some files can already be in the right
+% place, see the documentation of \docstrip.
+%
+% \paragraph{Refresh file databases.} If your \TeX~distribution
+% (\teTeX, \mikTeX, \dots) rely on file databases, you must refresh
+% these. For example, \teTeX\ users run \verb|texhash| or
+% \verb|mktexlsr|.
+%
+% \paragraph{Script install.}
+% This package comes with a Perl script \xfile{pdfatfi.pl}.
+% Install it somewhere so that it is executed, when it is called
+% as \verb|pdfatfi| on the command line. Example for
+% installing it under Linux:
+% \begin{quote}
+%\begin{verbatim}
+%cp pdfatfi.pl /usr/local/bin/pdfatfi
+%chmod +x /usr/local/bin/pdfatfi
+%\end{verbatim}
+% \end{quote}
+%
+
+%
+% \subsection{Some details for the interested}
+%
+% \paragraph{Attached source.}
+%
+% The PDF documentation on CTAN also includes the
+% \xfile{.dtx} source file. It can be extracted by
+% AcrobatReader 6 or higher. Another option is \textsf{pdftk},
+% e.g. unpack the file into the current directory:
+% \begin{quote}
+% \verb|pdftk attachfile2.pdf unpack_files output .|
+% \end{quote}
+%
+% \paragraph{Unpacking with \LaTeX.}
+% The \xfile{.dtx} chooses its action depending on the format:
+% \begin{description}
+% \item[\plainTeX:] Run \docstrip\ and extract the files.
+% \item[\LaTeX:] Generate the documentation.
+% \end{description}
+% If you insist on using \LaTeX\ for \docstrip\ (really,
+% \docstrip\ does not need \LaTeX), then inform the autodetect routine
+% about your intension:
+% \begin{quote}
+% \verb|latex \install=y\input{attachfile2.dtx}|
+% \end{quote}
+% Do not forget to quote the argument according to the demands
+% of your shell.
+%
+% \paragraph{Generating the documentation.}
+% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate
+% the documentation. The process can be configured by the
+% configuration file \xfile{ltxdoc.cfg}. For instance, put this
+% line into this file, if you want to have A4 as paper format:
+% \begin{quote}
+% \verb|\PassOptionsToClass{a4paper}{article}|
+% \end{quote}
+% An example follows how to generate the
+% documentation with pdf\LaTeX:
+% \begin{quote}
+%\begin{verbatim}
+%pdflatex attachfile2.dtx
+%makeindex -s gind.ist attachfile2.idx
+%pdflatex attachfile2.dtx
+%makeindex -s gind.ist attachfile2.idx
+%pdflatex attachfile2.dtx
+%\end{verbatim}
+% \end{quote}
+%
+% \begin{thebibliography}{9}
+% \bibitem{attachfile}
+% Scott Pakin: \textit{The \xpackage{attachfile} package};
+% 2005/02/20 v1.2;
+% \CTAN{macros/latex/contrib/attachfile/}.
+%
+% \bibitem{embedfile}
+% Heiko Oberdiek: \textit{The \xpackage{embedfile} package};
+% 2006/08/16 v1.0;
+% \CTAN{macros/latex/contrib/oberdiek/embedfile.pdf}.
+%
+% \bibitem{pdfspec}
+% Adobe Systems Incorporated:
+% \href{http://partners.adobe.com/public/developer/en/pdf/PDFReference16.pdf}%
+% {\textit{PDF Reference, Fifth Edition, Version 1.6}},%
+% November 2004;
+% \url{http://partners.adobe.com/public/developer/pdf/index_reference.html}.
+%
+% \bibitem{mime}
+% Network Working Group: RFC 2046, \textit{Multipurpose Internet Mail Extensions (MIME) Part Two:
+% Media Types}, November 1996; \url{http://www.rfc-editor.org/}.
+%
+% \bibitem{types}
+% IANA (Internet Assigned Numbers Authority):
+% \textit{MIME Media Types}, May 2006;
+% \url{http://www.iana.org/assignments/media-types/}.
+%
+% \end{thebibliography}
+%
+% \begin{History}
+% \begin{Version}{2005/02/23 v2.0}
+% \item
+% New options: \xoption{draft}/\xoption{final}.
+% \item
+% New option scale for scaling the annotation rectangle.
+% \item
+% Supported driver options: \xoption{pdftex}, \xoption{dvips}.
+% \item
+% Configuration file `attachfile.cfg' supported.
+% \item
+% Dependency of package calc dropped.
+% \item
+% \eTeX\ (\cs{numexpr}, \cs{dimexpr}) used.
+% \item
+% New auxiliary file \cs{jobname.atfi} to get data unavailable
+% by (pdf)\TeX, controlled by \cs{nofiles} and option nofiles.
+% \item
+% Use of package \xpackage{prokvopt} (never released).
+% \end{Version}
+% \begin{Version}{2005/10/07 v2.1}
+% \item
+% Option \xoption{annotname} for naming annotations
+% (this name can be used for embedded go-to actions).
+% \end{Version}
+% \begin{Version}{2006/08/17 v2.2}
+% \item
+% Use of package \xpackage{kvoptions} instead of \xpackage{prokvopt}.
+% \item
+% DTX framework.
+% \item
+% A little documentation.
+% \end{Version}
+% \end{History}
+%
+% \PrintIndex
+%
+% \Finale
+\endinput