summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/oberdiek/embedfile.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/oberdiek/embedfile.dtx')
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/embedfile.dtx940
1 files changed, 825 insertions, 115 deletions
diff --git a/Master/texmf-dist/source/latex/oberdiek/embedfile.dtx b/Master/texmf-dist/source/latex/oberdiek/embedfile.dtx
index 2d29417de97..3e0236455e8 100644
--- a/Master/texmf-dist/source/latex/oberdiek/embedfile.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/embedfile.dtx
@@ -18,8 +18,8 @@
% and the derived files
% embedfile.sty, embedfile.pdf, embedfile.ins, embedfile.drv,
% dtx-attach.sty, embedfile-example-plain.tex,
-% embedfile-test1.tex, embedfile-test2.tex,
-% embedfile-test3.tex.
+% embedfile-example-collection.tex, embedfile-test1.tex,
+% embedfile-test2.tex, embedfile-test3.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/embedfile.dtx
@@ -56,6 +56,7 @@
% TDS:tex/latex/oberdiek/dtx-attach.sty
% TDS:doc/latex/oberdiek/embedfile.pdf
% TDS:doc/latex/oberdiek/embedfile-example-plain.tex
+% TDS:doc/latex/oberdiek/embedfile-example-collection.tex
% TDS:doc/latex/oberdiek/test/embedfile-test1.tex
% TDS:doc/latex/oberdiek/test/embedfile-test2.tex
% TDS:doc/latex/oberdiek/test/embedfile-test3.tex
@@ -74,7 +75,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: embedfile 2007/09/09 v1.2 embed files into PDF (HO)}
+\Msg{* Package: embedfile 2007/10/28 v2.0 embed files into PDF (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -102,8 +103,8 @@ This work consists of the main source file embedfile.dtx
and the derived files
embedfile.sty, embedfile.pdf, embedfile.ins, embedfile.drv,
dtx-attach.sty, embedfile-example-plain.tex,
- embedfile-test1.tex, embedfile-test2.tex,
- embedfile-test3.tex.
+ embedfile-example-collection.tex, embedfile-test1.tex,
+ embedfile-test2.tex, embedfile-test3.tex.
\endpreamble
@@ -115,6 +116,7 @@ and the derived files
\file{dtx-attach.sty}{\from{embedfile.dtx}{dtxattach}}%
\usedir{doc/latex/oberdiek}%
\file{embedfile-example-plain.tex}{\from{embedfile.dtx}{exampleplain}}%
+ \file{embedfile-example-collection.tex}{\from{embedfile.dtx}{examplecollection}}%
\usedir{doc/latex/oberdiek/test}%
\file{embedfile-test1.tex}{\from{embedfile.dtx}{test1}}%
\file{embedfile-test2.tex}{\from{embedfile.dtx}{test2}}%
@@ -144,7 +146,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{embedfile.drv}%
- [2007/09/09 v1.2 embed files into PDF (HO)]%
+ [2007/10/28 v2.0 embed files into PDF (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2007/10/21]
\begin{document}
@@ -153,7 +155,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{637}
+% \CheckSum{1223}
%
% \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
@@ -174,7 +176,7 @@ and the derived files
% \GetFileInfo{embedfile.drv}
%
% \title{The \xpackage{embedfile} package}
-% \date{2007/09/09 v1.2}
+% \date{2007/10/28 v2.0}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -275,6 +277,11 @@ and the derived files
% \pdfTeX's \cs{pdfescapestring} is used. Value \verb|psd|
% forces the use of \cs{pdfstringdef}, value \verb|escape|
% the use of \cs{pdfescapestring}.
+% \item[\xoption{\meta{key}.value}] Sets the value of a collection
+% item property, see section \ref{sec:collection}.
+% \item[\xoption{\meta{key}.prefix}]
+% Sets the prefix of a collection item property,
+% see section \ref{sec:collection}.
% \end{description}
%
% \begin{declcs}{embedfilefinish}
@@ -287,9 +294,119 @@ and the derived files
% \cs{embedfilefinish} at the end of the document
% after the last file is embedded.
%
+% \begin{declcs}{embedfilesetup} \M{options}
+% \end{declcs}
+% Options for \cs{embedfile} and collection support
+% can be set in \cs{embedfilesetup}.
+%
+% \subsection{Collection support (PDF 1.7)}
+% \label{sec:collection}
+%
+% Since PDF 1.7 the embedded files can form a \emph{collection}
+% (sometimes referred as \emph{package}), the main document
+% is called \emph{cover sheet}. See PDF specification
+% 8.2.4 ``Collections'' and 3.10.5 ``Collection items'' \cite{pdfspec}.
+%
+% Usually Acrobat Reader 7 or 8 shows the
+% embedded files in a table at the bottom with the following columns:
+% \begin{quote}
+% \begin{tabular}{@{}l|l|l|l@{}}
+% Name & Description & Modified & Size\\
+% \hline
+% \dots & \dots & \dots & \dots\\
+% \end{tabular}
+% \end{quote}
+% If the files form a collection, then they are displayed
+% in a table left or top (depending on option \xoption{view},
+% see \cs{embedfilesetup}).
+%
+% Collection support is enabled automatically, if
+% it is used.
+%
+% \begin{declcs}{embedfilesetup} \M{options}
+% \end{declcs}
+% The following options are supported in addition
+% to options for \cs{embedfile}:
+% \begin{description}
+% \item[\xoption{view}]
+% If the PDF file contains a collection, then Acrobat Reader 8
+% shows a line at the top below the menu bar and the toolbar.
+% It shows the current selected file, icons for changing the
+% view mode, an options menu.
+% The initial mode how the collection is presented is
+% set by this option \xoption{view}.
+% The following modes/values are supported, the default is |details|:
+% \begin{description}
+% \item[\texttt{details}] The full collection table is displayed
+% at the top below the collection bar.
+% \item[\texttt{tile}] The files of the collection are shown
+% in tile mode on the left.
+% \item[\texttt{hidden}] The collection table is not shown.
+% \end{description}
+% \item[\xoption{initialfile}]
+% Selects the file that is initially presented. Especially
+% useful for an embedded PDF file that is then shown instead
+% of the cover document.
+% \end{description}
+%
+% \begin{declcs}{embedfilefield} \M{key} \M{options}
+% \end{declcs}
+% Macro \cs{embedfilefield} defines a column/field in the collection table.
+% The name of the field is \meta{key}.
+% \begin{description}
+% \item[\xoption{type}]
+% sets the type of the field. The supported values are:
+% \begin{description}
+% \item[\texttt{text}] A text field. Its value is set in
+% \cs{embedfile} by option \xoption{\meta{key}.value}.
+% \item[\texttt{date}] A date field. Its value is set in
+% \cs{embedfile} by option \xoption{\meta{key}.value}.
+% A special format is required, see ``3.8.3 Dates'' \cite{pdfspec}.
+% \item[\texttt{number}] A field with an integer or float number.
+% Its value is set in \cs{embedfile} by option
+% \xoption{\meta{key}.value}.
+% \item[\texttt{file}] The file name of the embedded file.
+% \item[\texttt{desc}] The description text of the embedded file. It is
+% set in \cs{embedfile} by option \xoption{desc}.
+% \item[\texttt{moddate}] The modification date of the embedded file.
+% \item[\texttt{size}] The size of the embedded file.
+% \end{description}
+% All types allow the use of a prefix that is disregarded by
+% sorting. The prefix for this field is set in \cs{embedfile} by
+% option \xoption{\meta{key}.prefix}.
+% \item[\xoption{title}] sets the column title.
+% \item[\xoption{visible}] controls whether the column is presented:
+% \begin{description}
+% \item[\texttt{true}] shows the column.
+% \item[\texttt{false}] hides the column.
+% \end{description}
+% Default: \texttt{true}
+% \item[\xoption{edit}]
+% Allows the editing of field values. Does not seem to have an
+% effect for Acrobat Reader.
+% \begin{description}
+% \item[\texttt{true}] enables the feature, if available (depends
+% on the PDF viewer).
+% \item[\texttt{false}] disables the feature.
+% \end{description}
+% Default: \texttt{false}
+% \end{description}
+% The order of \cs{embedfilefield} statements defines the order
+% of the columns.
+%
+% \begin{declcs}{embedfilesort} \M{key-sort-list}
+% \end{declcs}
+% The sort order of the embedded files are controlled by
+% macro \cs{embedfilesort}. \meta{key-sort-list} defines
+% the sort order. The key is a field name defined by \cs{embedfilefield}.
+% Its value is either \texttt{ascending} or \texttt{descending}.
+% The default is \texttt{ascending}.
+%
% \subsection{Examples}
+% \label{sec:examples}
%
-% \subsubsection{\plainTeX}\label{sec:plain}
+% \subsubsection{\plainTeX}
+% \label{sec:plain}
%
% The package can be used with \plainTeX. It can be used
% with or without help from \xfile{miniltx.tex}.
@@ -339,6 +456,72 @@ This example document contains three embedded files.
%</exampleplain>
% \end{macrocode}
%
+% \subsubsection{Collection example}
+%
+% \begin{macrocode}
+%<*examplecollection>
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{article}
+\usepackage[bookmarks=false]{hyperref}
+ % provides \pdfstringdef that is then used by `title' and
+ % other keys.
+\usepackage{embedfile}[2007/10/28]
+\embedfilesetup{
+ view=details,
+ initialfile=embedfile.pdf
+}
+\embedfilefield{file}{
+ type=file,
+ title={File name}
+}
+\embedfilefield{description}{
+ type=desc,
+ title={Description}
+}
+\embedfilefield{date}{
+ type=moddate,
+ title={Date}
+}
+\embedfilefield{size}{
+ type=size,
+ title={Size}
+}
+\embedfilefield{type}{
+ type=text,
+ title={Type},
+ visible=false
+}
+\embedfilesort{
+ type,
+ date=descending
+}
+\begin{document}
+An example for embedded files as collection.
+You need Acrobat Reader 8 or higher.
+
+\embedfile[
+ desc={Source file of package `embedfile'},
+ description.prefix={Package: },
+ type.value={DTX}
+]{embedfile.dtx}
+
+\embedfile[
+ desc={Documentation of package `embedfile'},
+ description.prefix={Package: },
+ type.value={PDF}
+]{embedfile.pdf}
+
+\embedfile[
+ desc={The source for this example},
+ description.prefix={Example: },
+ type.value={TEX}
+]{\jobname.tex}
+
+\end{document}
+%
+%</examplecollection>
+% \end{macrocode}
+%
% \subsection{Package \xpackage{dtx-attach}}
%
% Package \xpackage{dtx-attach} is just a small application of
@@ -350,8 +533,8 @@ This example document contains three embedded files.
%<*dtxattach>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{dtx-attach}
- [2007/09/09 v1.2 Embed \string\jobname.dtx (HO)]%
-\RequirePackage{embedfile}[2007/09/09]
+ [2007/10/28 v2.0 Embed \string\jobname.dtx (HO)]%
+\RequirePackage{embedfile}[2007/10/28]
\embedfile[%
stringmethod=escape,%
mimetype=plain/text,%
@@ -427,19 +610,19 @@ This example document contains three embedded files.
\fi
\expandafter\x\csname ver@embedfile.sty\endcsname
\ProvidesPackage{embedfile}%
- [2007/09/09 v1.2 embed files into PDF (HO)]
+ [2007/10/28 v2.0 embed files into PDF (HO)]
% \end{macrocode}
%
% \subsection{Catcodes}
%
% \begin{macrocode}
-\expandafter\edef\csname EmbedFile@AtEnd\endcsname{%
+\expandafter\edef\csname EmFi@AtEnd\endcsname{%
\catcode64 \the\catcode64\relax
}
\catcode64 11 % @
\def\TMP@EnsureCode#1#2{%
- \edef\EmbedFile@AtEnd{%
- \EmbedFile@AtEnd
+ \edef\EmFi@AtEnd{%
+ \EmFi@AtEnd
\catcode#1 \the\catcode#1\relax
}%
\catcode#1 #2\relax
@@ -461,23 +644,23 @@ This example document contains three embedded files.
%
% \subsection{Tools}
%
-% \begin{macro}{\EmbedFile@RequirePackage}
+% \begin{macro}{\EmFi@RequirePackage}
% \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname RequirePackage\endcsname\relax
- \def\EmbedFile@RequirePackage#1[#2]{%
+ \def\EmFi@RequirePackage#1[#2]{%
\input #1.sty\relax
}%
\else
- \let\EmbedFile@RequirePackage\RequirePackage
+ \let\EmFi@RequirePackage\RequirePackage
\fi
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\EmbedFile@PackageError}
+% \begin{macro}{\EmFi@Error}
% \begin{macrocode}
-\EmbedFile@RequirePackage{infwarerr}[2007/09/09]%
-\def\EmbedFile@PackageError{%
+\EmFi@RequirePackage{infwarerr}[2007/09/09]%
+\def\EmFi@Error{%
\@PackageError{embedfile}%
}
% \end{macrocode}
@@ -487,16 +670,16 @@ This example document contains three embedded files.
%
% Load package \xpackage{ifpdf} and check mode.
% \begin{macrocode}
-\EmbedFile@RequirePackage{ifpdf}[2007/09/09]
+\EmFi@RequirePackage{ifpdf}[2007/09/09]
\ifpdf
\else
- \EmbedFile@PackageError{%
+ \EmFi@Error{%
Missing pdfTeX in PDF mode%
}{%
Currently other drivers are not supported. %
Package loading is aborted.%
}%
- \EmbedFile@AtEnd
+ \EmFi@AtEnd
\expandafter\endinput
\fi
% \end{macrocode}
@@ -504,43 +687,170 @@ This example document contains three embedded files.
% \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname pdffilesize\endcsname\relax
- \EmbedFile@PackageError{%
+ \EmFi@Error{%
Unsupported pdfTeX version%
}{%
At least version 1.30 is necessary. Package loading is aborted.%
}%
- \EmbedFile@AtEnd
+ \EmFi@AtEnd
\expandafter\endinput
\fi
% \end{macrocode}
%
+% \subsection{Strings}
+%
+% Minimal version of package \xpackage{pdfescape} is 2007/08/27 v1.5
+% because of \cs{EdefSanitize}.
+% \begin{macrocode}
+\EmFi@RequirePackage{pdfescape}[2007/10/27]
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\EmFi@temp#1{%
+ \expandafter\EdefSanitize\csname EmFi@S@#1\endcsname{#1}%
+}
+% \end{macrocode}
+% \begin{macro}{\EmFi@details}
+% \begin{macrocode}
+\EmFi@temp{details}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@tile}
+% \begin{macrocode}
+\EmFi@temp{tile}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@hidden}
+% \begin{macrocode}
+\EmFi@temp{hidden}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@text}
+% \begin{macrocode}
+\EmFi@temp{text}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@date}
+% \begin{macrocode}
+\EmFi@temp{date}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@number}
+% \begin{macrocode}
+\EmFi@temp{number}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@file}
+% \begin{macrocode}
+\EmFi@temp{file}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@desc}
+% \begin{macrocode}
+\EmFi@temp{desc}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@moddate}
+% \begin{macrocode}
+\EmFi@temp{moddate}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@creationdate}
+% \begin{macrocode}
+\EmFi@temp{creationdate}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@size}
+% \begin{macrocode}
+\EmFi@temp{size}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@ascending}
+% \begin{macrocode}
+\EmFi@temp{ascending}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@descending}
+% \begin{macrocode}
+\EmFi@temp{descending}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@true}
+% \begin{macrocode}
+\EmFi@temp{true}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@S@false}
+% \begin{macrocode}
+\EmFi@temp{false}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Switches}
+%
+% \begin{macro}{\ifEmFi@collection}
+% \begin{macrocode}
+\newif\ifEmFi@collection
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ifEmFi@initialfile}
+% \begin{macrocode}
+\newif\ifEmFi@initialfile
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ifEmFi@sort}
+% \begin{macrocode}
+\newif\ifEmFi@sort
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ifEmFi@visible}
+% \begin{macrocode}
+\newif\ifEmFi@visible
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ifEmFi@edit}
+% \begin{macrocode}
+\newif\ifEmFi@edit
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ifEmFi@item}
+% \begin{macrocode}
+\newif\ifEmFi@item
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ifEmFi@finished}
+% \begin{macrocode}
+\newif\ifEmFi@finished
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Key value definitions}
%
% \begin{macrocode}
\expandafter\ifx\csname define@key\endcsname\relax
- \chardef\EmbedFile@plain=\z@
- \def\EmbedFile@temp#1{%
+ \chardef\EmFi@plain=\z@
+ \def\EmFi@temp#1{%
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname#1\endcsname\relax
- \chardef\EmbedFile@plain=\@ne
+ \chardef\EmFi@plain=\@ne
\fi
}%
- \EmbedFile@temp{NeedsTeXFormat}%
- \EmbedFile@temp{ProvidesPackage}%
- \EmbedFile@temp{DeclareOption}%
- \EmbedFile@temp{ExecuteOptions}%
- \EmbedFile@temp{ProcessOptions}%
- \ifnum\EmbedFile@plain=\@ne
- \def\EmbedFile@temp#1{%
- \expandafter\let\csname EmbedFile@Org#1\expandafter\endcsname
+ \EmFi@temp{NeedsTeXFormat}%
+ \EmFi@temp{ProvidesPackage}%
+ \EmFi@temp{DeclareOption}%
+ \EmFi@temp{ExecuteOptions}%
+ \EmFi@temp{ProcessOptions}%
+ \ifnum\EmFi@plain=\@ne
+ \def\EmFi@temp#1{%
+ \expandafter\let\csname EmFi@Org#1\expandafter\endcsname
\csname#1\endcsname
\expandafter\def\csname#1\endcsname
}%
- \EmbedFile@temp{NeedsTeXFormat}#1{}%
- \EmbedFile@temp{ProvidesPackage}#1[#2]{}% hash-ok
- \EmbedFile@temp{DeclareOption}#1{}%
- \EmbedFile@temp{ExecuteOptions}#1{}%
- \EmbedFile@temp{ProcessOptions}{}%
+ \EmFi@temp{NeedsTeXFormat}#1{}%
+ \EmFi@temp{ProvidesPackage}#1[#2]{}% hash-ok
+ \EmFi@temp{DeclareOption}#1{}%
+ \EmFi@temp{ExecuteOptions}#1{}%
+ \EmFi@temp{ProcessOptions}{}%
% \end{macrocode}
% \begin{macro}{\KV@errx}
% \LaTeX's option processing is not available with
@@ -598,48 +908,69 @@ This example document contains three embedded files.
% \end{macro}
% \begin{macrocode}
\fi
- \EmbedFile@RequirePackage{keyval}[1999/03/16]%
- \ifnum\EmbedFile@plain=\@ne
- \def\EmbedFile@temp#1{%
+ \EmFi@RequirePackage{keyval}[1999/03/16]%
+ \ifnum\EmFi@plain=\@ne
+ \def\EmFi@temp#1{%
\expandafter\let\csname#1\expandafter\endcsname
- \csname EmbedFile@Org#1\endcsname
+ \csname EmFi@Org#1\endcsname
}%
- \EmbedFile@temp{NeedsTeXFormat}%
- \EmbedFile@temp{ProvidesPackage}%
- \EmbedFile@temp{DeclareOption}%
- \EmbedFile@temp{ExecuteOptions}%
- \EmbedFile@temp{ProcessOptions}%
+ \EmFi@temp{NeedsTeXFormat}%
+ \EmFi@temp{ProvidesPackage}%
+ \EmFi@temp{DeclareOption}%
+ \EmFi@temp{ExecuteOptions}%
+ \EmFi@temp{ProcessOptions}%
\fi
\fi
% \end{macrocode}
%
+% \begin{macro}{\EmFi@GlobalKey}
% \begin{macrocode}
-\def\EmbedFile@DefineKey#1#2{%
- \define@key{EmbedFile}{#1}{%
- \expandafter\def\csname EmbedFile@#1\endcsname{##1}%
+\def\EmFi@GlobalKey#1#2{%
+ \global\expandafter\let\csname KV@#1@#2\expandafter\endcsname
+ \csname KV@#1@#2\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@GlobalDefaultKey}
+% \begin{macrocode}
+\def\EmFi@GlobalDefaultKey#1#2{%
+ \EmFi@GlobalKey{#1}{#2}%
+ \global\expandafter\let
+ \csname KV@#1@#2@default\expandafter\endcsname
+ \csname KV@#1@#2@default\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\EmFi@DefineKey}
+% \begin{macrocode}
+\def\EmFi@DefineKey#1#2{%
+ \define@key{EmFi}{#1}{%
+ \expandafter\def\csname EmFi@#1\endcsname{##1}%
}%
- \expandafter\def\csname EmbedFile@#1\endcsname{#2}%
+ \expandafter\def\csname EmFi@#1\endcsname{#2}%
}
% \end{macrocode}
+% \end{macro}
% Subtype of the embedded file (optional).
% \begin{macrocode}
-\EmbedFile@DefineKey{mimetype}{}
+\EmFi@DefineKey{mimetype}{}
% \end{macrocode}
% File specification string.
% \begin{macrocode}
-\EmbedFile@DefineKey{filespec}{\EmbedFile@file}
+\EmFi@DefineKey{filespec}{\EmFi@file}
% \end{macrocode}
% File system (optional).
% \begin{macrocode}
-\EmbedFile@DefineKey{filesystem}{}
+\EmFi@DefineKey{filesystem}{}
% \end{macrocode}
% Description (optional).
% \begin{macrocode}
-\EmbedFile@DefineKey{desc}{}
+\EmFi@DefineKey{desc}{}
% \end{macrocode}
% Method for converting text to PDF strings.
% \begin{macrocode}
-\EmbedFile@DefineKey{stringmethod}{%
+\EmFi@DefineKey{stringmethod}{%
\ifx\pdfstringdef\@undefined
escape%
\else
@@ -652,10 +983,287 @@ This example document contains three embedded files.
}
% \end{macrocode}
%
+% Initial view of the collection.
+% \begin{macrocode}
+\define@key{EmFi}{view}[]{%
+ \EdefSanitize\EmFi@temp{#1}%
+ \def\EmFi@next{%
+ \global\EmFi@collectiontrue
+ }%
+ \ifx\EmFi@temp\empty
+ \let\EmFi@view\EmFi@S@details
+ \else\ifx\EmFi@temp\EmFi@S@details
+ \let\EmFi@view\EmFi@S@details
+ \else\ifx\EmFi@temp\EmFi@S@tile
+ \let\EmFi@view\EmFi@S@tile
+ \else\ifx\EmFi@temp\EmFi@S@hidden
+ \let\EmFi@view\EmFi@S@hidden
+ \else
+ \let\EmFi@next\relax
+ \EmFi@Error{%
+ Unknown value `\EmFi@temp' for key `view'.\MessageBreak
+ Supported values: `details', `tile', `hidden'.%
+ }\@ehc
+ \fi\fi\fi\fi
+ \EmFi@next
+}
+% \end{macrocode}
+% \begin{macrocode}
+\EmFi@DefineKey{initialfile}{}
+% \end{macrocode}
+%
% \begin{macro}{\embedfilesetup}
% \begin{macrocode}
\def\embedfilesetup{%
- \setkeys{EmbedFile}%
+ \ifEmFi@finished
+ \def\EmFi@next##1{}%
+ \EmFi@Error{%
+ \string\embedfilefield\space after \string\embedfilefinish
+ }{%
+ The list of embedded files is already written.%
+ }%
+ \else
+ \def\EmFi@next{%
+ \setkeys{EmFi}%
+ }%
+ \fi
+ \EmFi@next
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\EmFi@schema}
+% \begin{macrocode}
+\def\EmFi@schema{}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@order}
+% \begin{macrocode}
+\gdef\EmFi@order{0}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@@order}
+% \begin{macrocode}
+\let\EmFi@@order\relax
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@fieldlist}
+% \begin{macrocode}
+\def\EmFi@fieldlist{}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@sortcase}
+% \begin{macrocode}
+\def\EmFi@sortcase{0}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\embedfilefield}
+% \begin{macrocode}
+\def\embedfilefield#1#2{%
+ \ifEmFi@finished
+ \EmFi@Error{%
+ \string\embedfilefield\space after \string\embedfilefinish
+ }{%
+ The list of embedded files is already written.%
+ }%
+ \else
+ \global\EmFi@collectiontrue
+ \EdefSanitize\EmFi@key{#1}%
+ \expandafter\ifx\csname KV@EmFi@\EmFi@key.prefix\endcsname\relax
+ \begingroup
+ \count@=\EmFi@order
+ \advance\count@ 1 %
+ \xdef\EmFi@order{\the\count@}%
+ \let\EmFi@title\EmFi@key
+ \let\EmFi@type\EmFi@S@text
+ \EmFi@visibletrue
+ \EmFi@editfalse
+ \setkeys{EmFiFi}{#2}%
+ \EmFi@convert\EmFi@title\EmFi@title
+ \xdef\EmFi@schema{%
+ \EmFi@schema
+ /\pdfescapename{\EmFi@key}<<%
+ /Subtype/%
+ \ifx\EmFi@type\EmFi@S@date D%
+ \else\ifx\EmFi@type\EmFi@S@number N%
+ \else\ifx\EmFi@type\EmFi@S@file F%
+ \else\ifx\EmFi@type\EmFi@S@desc Desc%
+ \else\ifx\EmFi@type\EmFi@S@moddate ModDate%
+ \else\ifx\EmFi@type\EmFi@S@creationdate CreationDate%
+ \else\ifx\EmFi@type\EmFi@S@size Size%
+ \else S%
+ \fi\fi\fi\fi\fi\fi\fi
+ /N(\EmFi@title)%
+ \EmFi@@order{\EmFi@order}%
+ \ifEmFi@visible
+ \else
+ /V false%
+ \fi
+ \ifEmFi@edit
+ /E true%
+ \fi
+ >>%
+ }%
+ \let\do\relax
+ \xdef\EmFi@fieldlist{%
+ \EmFi@fieldlist
+ \do{\EmFi@key}%
+ }%
+ \ifx\EmFi@type\EmFi@S@text
+ \define@key{EmFi}{\EmFi@key.value}{%
+ \EmFi@itemtrue
+ \def\EmFi@temp{##1}%
+ \EmFi@convert\EmFi@temp\EmFi@temp
+ \expandafter\def\csname EmFi@V@#1%
+ \expandafter\endcsname\expandafter{%
+ \expandafter(\EmFi@temp)%
+ }%
+ }%
+ \EmFi@GlobalKey{EmFi}{\EmFi@key.value}%
+ \else\ifx\EmFi@type\EmFi@S@date
+ \define@key{EmFi}{\EmFi@key.value}{%
+ \EmFi@itemtrue
+ \def\EmFi@temp{##1}%
+ \EmFi@convert\EmFi@temp\EmFi@temp
+ \expandafter\def\csname EmFi@V@#1%
+ \expandafter\endcsname\expandafter{%
+ \expandafter(\EmFi@temp)%
+ }%
+ }%
+ \EmFi@GlobalKey{EmFi}{\EmFi@key.value}%
+ \else\ifx\EmFi@type\EmFi@S@number
+ \define@key{EmFi}{\EmFi@key.value}{%
+ \EmFi@itemtrue
+ \expandafter\EdefSanitize\csname EmFi@V@#1\endcsname{ ##1}%
+ }%
+ \EmFi@GlobalKey{EmFi}{\EmFi@key.value}%
+ \fi\fi\fi
+ \define@key{EmFi}{\EmFi@key.prefix}{%
+ \EmFi@itemtrue
+ \expandafter\def\csname EmFi@P@#1\endcsname{##1}%
+ }%
+ \EmFi@GlobalKey{EmFi}{\EmFi@key.prefix}%
+ \define@key{EmFiSo}{\EmFi@key}[ascending]{%
+ \EdefSanitize\EmFi@temp{##1}%
+ \ifx\EmFi@temp\EmFi@S@ascending
+ \def\EmFi@temp{true}%
+ \else\ifx\EmFi@temp\EmFi@S@descending
+ \def\EmFi@temp{false}%
+ \else
+ \def\EmFi@temp{}%
+ \EmFi@Error{%
+ Unknown sort order `\EmFi@temp'.\MessageBreak
+ Supported values: `\EmFi@S@ascending', %
+ `\EmFi@S@descending
+ }\@ehc
+ \fi\fi
+ \ifx\EmFi@temp\empty
+ \else
+ \xdef\EmFi@sortkeys{%
+ \EmFi@sortkeys
+ /\pdfescapename{#1}%
+ }%
+ \ifx\EmFi@sortorders\empty
+ \global\let\EmFi@sortorders\EmFi@temp
+ \gdef\EmFi@sortcase{1}%
+ \else
+ \xdef\EmFi@sortorders{%
+ \EmFi@sortorders
+ \space
+ \EmFi@temp
+ }%
+ \xdef\EmFi@sortcase{2}%
+ \fi
+ \fi
+ }%
+ \EmFi@GlobalDefaultKey{EmFiSo}\EmFi@key
+ \endgroup
+ \else
+ \EmFi@Error{%
+ Field `\EmFi@key' is already defined%
+ }\@ehc
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\define@key{EmFiFi}{type}{%
+ \EdefSanitize\EmFi@temp{#1}%
+ \ifx\EmFi@temp\EmFi@S@text
+ \let\EmFi@type\EmFi@temp
+ \else\ifx\EmFi@temp\EmFi@S@date
+ \let\EmFi@type\EmFi@temp
+ \else\ifx\EmFi@temp\EmFi@S@number
+ \let\EmFi@type\EmFi@temp
+ \else\ifx\EmFi@temp\EmFi@S@file
+ \let\EmFi@type\EmFi@temp
+ \else\ifx\EmFi@temp\EmFi@S@desc
+ \let\EmFi@type\EmFi@temp
+ \else\ifx\EmFi@temp\EmFi@S@moddate
+ \let\EmFi@type\EmFi@temp
+ \else\ifx\EmFi@temp\EmFi@S@creationdate
+ \let\EmFi@type\EmFi@temp
+ \else\ifx\EmFi@temp\EmFi@S@size
+ \let\EmFi@type\EmFi@temp
+ \else
+ \EmFi@Error{%
+ Unknown type `\EmFi@temp'.\MessageBreak
+ Supported types: `text', `date', `number', `file',\MessageBreak
+ `desc', `moddate', `creationdate', `size'%
+ }%
+ \fi\fi\fi\fi\fi\fi\fi\fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\define@key{EmFiFi}{title}{%
+ \def\EmFi@title{#1}%
+}
+% \end{macrocode}
+% \begin{macro}{\EmFi@setboolean}
+% \begin{macrocode}
+\def\EmFi@setboolean#1#2{%
+ \EdefSanitize\EmFi@temp{#2}%
+ \ifx\EmFi@temp\EmFi@S@true
+ \csname EmFi@#1true\endcsname
+ \else
+ \ifx\EmFi@temp\EmFi@S@false
+ \csname EmFi@#1false\endcsname
+ \else
+ \EmFi@Error{%
+ Unknown value `\EmFi@temp' for key `#1'.\MessageBreak
+ Supported values: `true', `false'%
+ }\@ehc
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\define@key{EmFiFi}{visible}[true]{%
+ \EmFi@setboolean{visible}{#1}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+\define@key{EmFiFi}{edit}[true]{%
+ \EmFi@setboolean{edit}{#1}%
+}
+% \end{macrocode}
+%
+% \begin{macro}{\EmFi@sortkeys}
+% \begin{macrocode}
+\def\EmFi@sortkeys{}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@sortorders}
+% \begin{macrocode}
+\def\EmFi@sortorders{}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\embedfilesort}
+% \begin{macrocode}
+\def\embedfilesort{%
+ \setkeys{EmFiSo}%
}
% \end{macrocode}
% \end{macro}
@@ -665,67 +1273,82 @@ This example document contains three embedded files.
% \begin{macro}{\embedfile}
% \begin{macrocode}
\def\embedfile{%
- \@ifnextchar[\EmbedFile@embedfile{\EmbedFile@embedfile[]}%
+ \@ifnextchar[\EmFi@embedfile{\EmFi@embedfile[]}%
}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\EmbedFile@embedfile}
+% \begin{macro}{\EmFi@embedfile}
% \begin{macrocode}
-\def\EmbedFile@embedfile[#1]#2{%
- \ifEmbedFile@finished
- \EmbedFile@PackageError{%
+\def\EmFi@embedfile[#1]#2{%
+ \ifEmFi@finished
+ \EmFi@Error{%
\string\embedfile\space after \string\embedfilefinish
}{%
The list of embedded files is already written.%
}%
\else
\begingroup
- \def\EmbedFile@file{#2}%
- \setkeys{EmbedFile}{#1}%
- \expandafter\ifx\expandafter\\\pdffilesize{\EmbedFile@file}\\%
- \EmbedFile@PackageError{%
- File `\EmbedFile@file' not found%
+ \def\EmFi@file{#2}%
+ \ifx\EmFi@file\EmFi@initialfile
+ \global\EmFi@initialfiletrue
+ \fi
+ \setkeys{EmFi}{#1}%
+ \expandafter\ifx\expandafter\\\pdffilesize{\EmFi@file}\\%
+ \EmFi@Error{%
+ File `\EmFi@file' not found%
}{%
The unknown file is not embedded.%
}%
\else
- \EmbedFile@convert\EmbedFile@filespec\EmbedFile@@filespec
- \ifx\EmbedFile@desc\empty
- \let\EmbedFile@@desc\empty
+ \EmFi@convert\EmFi@filespec\EmFi@@filespec
+ \ifx\EmFi@desc\empty
+ \let\EmFi@@desc\empty
\else
- \EmbedFile@convert\EmbedFile@desc\EmbedFile@@desc
+ \EmFi@convert\EmFi@desc\EmFi@@desc
+ \fi
+ \ifEmFi@item
+ \let\do\EmFi@do
+ \immediate\pdfobj{%
+ <<%
+ \EmFi@fieldlist
+ >>%
+ }%
+ \edef\EmFi@ci{\the\pdflastobj}%
\fi
\immediate\pdfobj stream attr{%
/Type/EmbeddedFile%
- \ifx\EmbedFile@mimetype\empty
+ \ifx\EmFi@mimetype\empty
\else
- /Subtype/\pdfescapename{\EmbedFile@mimetype}%
+ /Subtype/\pdfescapename{\EmFi@mimetype}%
\fi
/Params<<%
- /ModDate(\pdffilemoddate{\EmbedFile@file})%
- /Size \pdffilesize{\EmbedFile@file}%
- /CheckSum<\pdfmdfivesum file{\EmbedFile@file}>%
+ /ModDate(\pdffilemoddate{\EmFi@file})%
+ /Size \pdffilesize{\EmFi@file}%
+ /CheckSum<\pdfmdfivesum file{\EmFi@file}>%
>>%
- }file{\EmbedFile@file}\relax
+ }file{\EmFi@file}\relax
\immediate\pdfobj{%
<<%
/Type/Filespec%
- \ifx\EmbedFile@filesystem\empty
+ \ifx\EmFi@filesystem\empty
\else
- /FS/\pdfescapename{\EmbedFile@filesystem}%
+ /FS/\pdfescapename{\EmFi@filesystem}%
\fi
- /F(\EmbedFile@@filespec)%
- \ifx\EmbedFile@@desc\empty
+ /F(\EmFi@@filespec)%
+ \ifx\EmFi@@desc\empty
\else
- /Desc(\EmbedFile@@desc)%
+ /Desc(\EmFi@@desc)%
\fi
/EF<<%
/F \the\pdflastobj\space 0 R%
>>%
+ \ifEmFi@item
+ /CI \EmFi@ci\space 0 R%
+ \fi
>>%
}%
- \EmbedFile@add{%
- \EmbedFile@@filespec
+ \EmFi@add{%
+ \EmFi@@filespec
}{\the\pdflastobj\space 0 R}%
\fi
\endgroup
@@ -733,12 +1356,32 @@ This example document contains three embedded files.
}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\EmbedFile@convert}
+% \begin{macro}{\EmFi@do}
% \begin{macrocode}
-\def\EmbedFile@convert#1#2{%
- \ifnum\pdfstrcmp{\EmbedFile@stringmethod}{psd}=0 %
- \pdfstringdef\EmbedFile@temp{#1}%
- \let#2\EmbedFile@temp
+\def\EmFi@do#1{%
+ \expandafter\ifx\csname EmFi@P@#1\endcsname\relax
+ \expandafter\ifx\csname EmFi@V@#1\endcsname\relax
+ \else
+ /\pdfescapename{#1}\csname EmFi@V@#1\endcsname
+ \fi
+ \else
+ /\pdfescapename{#1}<<%
+ \expandafter\ifx\csname EmFi@V@#1\endcsname\relax
+ \else
+ /D\csname EmFi@V@#1\endcsname
+ \fi
+ /P(\csname EmFi@P@#1\endcsname)%
+ >>%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\EmFi@convert}
+% \begin{macrocode}
+\def\EmFi@convert#1#2{%
+ \ifnum\pdfstrcmp{\EmFi@stringmethod}{psd}=0 %
+ \pdfstringdef\EmFi@temp{#1}%
+ \let#2\EmFi@temp
\else
\edef#2{\pdfescapestring{#1}}%
\fi
@@ -746,20 +1389,20 @@ This example document contains three embedded files.
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
-\global\let\EmbedFile@list\empty
+\global\let\EmFi@list\empty
% \end{macrocode}
-% \begin{macro}{\EmbedFile@add}
+% \begin{macro}{\EmFi@add}
% Sorting is done by the insertion sort algorithm.
% Probably the sorting could be done more reliable.
% However, the PDF specification is not too clear to me
% regarding precise sorting rules (how to deal with
% different encodings, escaped characters, \dots).
% \begin{macrocode}
-\def\EmbedFile@add#1#2{%
+\def\EmFi@add#1#2{%
\begingroup
\edef\key{\pdfescapehex{#1}}%
- \ifx\EmbedFile@list\empty
- \xdef\EmbedFile@list{\noexpand\do{\key}{#2}}%
+ \ifx\EmFi@list\empty
+ \xdef\EmFi@list{\noexpand\do{\key}{#2}}%
\else
\def\do##1##2{%
\ifnum\pdfstrcmp{##1}{\key}>0 %
@@ -775,51 +1418,113 @@ This example document contains three embedded files.
\toks@\expandafter{\the\toks@\do{####1}{####2}}%
}%
\def\stop{%
- \xdef\EmbedFile@list{\the\toks@}%
+ \xdef\EmFi@list{\the\toks@}%
}%
\else
\toks@\expandafter{\the\toks@\do{##1}{##2}}%
\fi
}%
\def\stop{%
- \xdef\EmbedFile@list{\the\toks@\noexpand\do{\key}{#2}}%
+ \xdef\EmFi@list{\the\toks@\noexpand\do{\key}{#2}}%
}%
\toks@{}%
- \EmbedFile@list\stop
+ \EmFi@list\stop
\fi
\endgroup
}
% \end{macrocode}
% \end{macro}
-% \begin{macrocode}
-\newif\ifEmbedFile@finished
-% \end{macrocode}
% \begin{macro}{\embedfilefinish}
% \begin{macrocode}
\def\embedfilefinish{%
- \ifEmbedFile@finished
- \EmbedFile@PackageError{%
+ \ifEmFi@finished
+ \EmFi@Error{%
Too many invocations of \string\embedfilefinish
}{%
The list of embedded files is already written.%
}%
\else
- \ifx\EmbedFile@list\empty
+ \ifx\EmFi@list\empty
\else
- \global\EmbedFile@finishedtrue
+% \end{macrocode}
+% Write |/EmbeddedFiles| entry.
+% \begin{macrocode}
+ \global\EmFi@finishedtrue
\begingroup
\def\do##1##2{%
<##1>##2%
}%
\immediate\pdfobj{%
<<%
- /Names[\EmbedFile@list]%
+ /Names[\EmFi@list]%
>>%
}%
\pdfnames{%
/EmbeddedFiles \the\pdflastobj\space 0 R%
}%
\endgroup
+% \end{macrocode}
+% Write collection objects.
+% \begin{macrocode}
+ \ifEmFi@initialfile
+ \EmFi@collectiontrue
+ \fi
+ \ifEmFi@collection
+ \ifEmFi@initialfile
+ \else
+ \ifx\EmFi@initialfile\empty
+ \EmFi@convert\EmFi@initialfile\EmFi@initialfile
+ \else
+ \@PackageWarningNoLine{embedfile}{%
+ Missing initial file `\EmFi@initialfile'\MessageBreak
+ among the embedded files%
+ }%
+ \EmFi@initialfilefalse
+ \fi
+ \fi
+ \ifcase\EmFi@sortcase
+ \def\EmFi@temp{}%
+ \or
+ \def\EmFi@temp{%
+ /S\EmFi@sortkeys
+ /A \EmFi@sortorders
+ }%
+ \else
+ \def\EmFi@temp{%
+ /S[\EmFi@sortkeys]%
+ /A[\EmFi@sortorders]%
+ }%
+ \fi
+ \def\EmFi@@order##1{%
+ \ifnum\EmFi@order>1 %
+ /O ##1%
+ \fi
+ }%
+ \immediate\pdfobj{%
+ <<%
+ \ifx\EmFi@schema\empty
+ \else
+ /Schema<<\EmFi@schema>>%
+ \fi
+ \ifEmFi@initialfile
+ /D(\EmFi@initialfile)%
+ \fi
+ \ifx\EmFi@view\EmFi@S@tile
+ /View/T%
+ \else\ifx\EmFi@view\EmFi@S@hidden
+ /View/H%
+ \fi\fi
+ \ifx\EmFi@temp\empty
+ \EmFi@temp
+ \else
+ /Sort<<\EmFi@temp>>%
+ \fi
+ >>%
+ }%
+ \pdfcatalog{%
+ /Collection \the\pdflastobj\space0 R%
+ }%
+ \fi
\fi
\fi
}
@@ -834,7 +1539,7 @@ This example document contains three embedded files.
% \end{macrocode}
%
% \begin{macrocode}
-\EmbedFile@AtEnd
+\EmFi@AtEnd
%</package>
% \end{macrocode}
%
@@ -913,7 +1618,7 @@ Test (plain-\TeX): {\tt embedfile.dtx} should be embedded.%
\NeedsTeXFormat{LaTeX2e}
\let\SavedJobname\jobname
\def\jobname{embedfile}
-\RequirePackage{dtx-attach}[2007/09/09]
+\RequirePackage{dtx-attach}[2007/10/28]
\let\jobname\SavedJobname
\documentclass{minimal}
\begin{document}
@@ -985,6 +1690,7 @@ Test (plain-\TeX): {\tt embedfile.dtx} should be embedded.%
% dtx-attach.sty & tex/latex/oberdiek/dtx-attach.sty\\
% embedfile.pdf & doc/latex/oberdiek/embedfile.pdf\\
% embedfile-example-plain.tex & doc/latex/oberdiek/embedfile-example-plain.tex\\
+% embedfile-example-collection.tex & doc/latex/oberdiek/embedfile-example-collection.tex\\
% test/embedfile-test1.tex & doc/latex/oberdiek/test/embedfile-test1.tex\\
% test/embedfile-test2.tex & doc/latex/oberdiek/test/embedfile-test2.tex\\
% test/embedfile-test3.tex & doc/latex/oberdiek/test/embedfile-test3.tex\\
@@ -1121,10 +1827,10 @@ Test (plain-\TeX): {\tt embedfile.dtx} should be embedded.%
%
% \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}.
+% \href{http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference.pdf}%
+% {\textit{PDF Reference, Sixth Edition, Version 1.7}},%
+% Oktober 2006;
+% \url{http://www.adobe.com/devnet/pdf/pdf_reference.html}.
%
% \bibitem{mime}
% Network Working Group: RFC 2046, \textit{Multipurpose Internet Mail Extensions (MIME) Part Two:
@@ -1152,6 +1858,10 @@ Test (plain-\TeX): {\tt embedfile.dtx} should be embedded.%
% \item
% Catcode section rewritten.
% \end{Version}
+% \begin{Version}{2007/10/28 v2.0}
+% \item
+% Collection support added (PDF 1.7).
+% \end{Version}
% \end{History}
%
% \PrintIndex