summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/hyperxmp
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-11-03 03:02:09 +0000
committerNorbert Preining <norbert@preining.info>2020-11-03 03:02:09 +0000
commit7d12aa3abfed48004f4fb8fa84ee757b6f900726 (patch)
tree684cb1d606f8571edf8bb93cb53b4952f6835bee /macros/latex/contrib/hyperxmp
parentede2cee3dfac406ff8defae5014e86c839b852ca (diff)
CTAN sync 202011030302
Diffstat (limited to 'macros/latex/contrib/hyperxmp')
-rw-r--r--macros/latex/contrib/hyperxmp/hyperxmp.dtx135
-rw-r--r--macros/latex/contrib/hyperxmp/hyperxmp.pdfbin1525551 -> 1549965 bytes
2 files changed, 123 insertions, 12 deletions
diff --git a/macros/latex/contrib/hyperxmp/hyperxmp.dtx b/macros/latex/contrib/hyperxmp/hyperxmp.dtx
index eab2cc3940..a6dd612e77 100644
--- a/macros/latex/contrib/hyperxmp/hyperxmp.dtx
+++ b/macros/latex/contrib/hyperxmp/hyperxmp.dtx
@@ -22,7 +22,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{hyperxmp}
%<*package>
- [2020/10/05 v5.6 Store hyperref metadata in XMP format]
+ [2020/11/01 v5.7 Store hyperref metadata in XMP format]
%</package>
%
%<*driver>
@@ -264,6 +264,8 @@
% \newcounter{note}
% \newcommand{\usagenote}[1]{^^A
% \refstepcounter{note}^^A
+% \Needspace{\baselineskip}^^A
+% \belowpdfbookmark{Note \thenote: #1}{note.\thenote}^^A
% \paragraph{Note~\thenote: #1}%
% }
%
@@ -302,6 +304,9 @@
% \DeclareRobustCommand{\Dvips}{^^A
% \texorpdfstring{Dvips\SortIndex{dvips}{\texttt{dvips}}}{Dvips}^^A
% }
+% \DeclareRobustCommand{\progname}[1]{^^A
+% \texttt{#1}\SortIndex{#1}{\texttt{#1}}^^A
+% }
% \DeclareRobustCommand{\Lua}{^^A
% Lua\index{Lua}^^A
% }
@@ -1338,8 +1343,8 @@
% via the \Koma\ letter classes (e.g.,~\clsname{scrlttr2}) and the
% \ACMclass\ article class (\clsname{acmart}).
%
-% If a document uses either or \pkgname{babel} or \pkgname{polyglossia}
-% package, it is recommended that it \emph{not} explicitly set
+% If a document uses either the \pkgname{babel} or \pkgname{polyglossia}
+% packages it is recommended that it \emph{not} explicitly set
% \optname{pdflang}. \optname{pdflang} accepts only a single language
% name while \pkgname{hyperxmp} can automatically query \pkgname{babel}
% and \pkgname{polyglossia} for a list of all languages used in the
@@ -1430,6 +1435,7 @@
% \pkgname{totpages} package help generate \optname{pdfpagerange}. For
% documents numbered from~1 to~$n$, a simple
%
+% \Needspace{3\baselineskip}
% \begin{verbatim}
% \hypersetup{%
% pdfpagerange={1-\ref*{TotPages}}
@@ -1475,6 +1481,77 @@
% }
% \end{verbatim}
%
+% \usagenote{Automatic computation of the PDF byte count}
+% \label{note:auto-byte-count}
+%
+% The \schema[PRISM Basic Metadata]{\protect\acro{PRISM} Basic Metadata}
+% schema~\cite{PRISM2012:basic-meta} defines a \xmpprop{prism:byteCount}
+% property that indicates the \acro{PDF} file size in bytes.
+% \pkgname{hyperxmp} computes this value automatically when the document
+% is built using \LuaLaTeX\ but not when using any other \TeX\ engine.
+% (Note that \pkgname{hyperxmp} uses the file size from the
+% \emph{previous} run of \LuaLaTeX\ because the new \acro{PDF} file is
+% not yet complete.)
+%
+% The \progname{latexmk} build tool can be configured to automatically
+% append a line of the form ``|\hypersetup{pdfbytes=|\meta{number}|}|''
+% to the generated |.aux| file. The subsequent build of the document
+% will read the |.aux| file at the end of the preamble and set
+% \optname{pdfbytes} accordingly. The Perl code shown in
+% Figure~\ref{fig:latexmkrc}, derived from code posted by Nelson Posse
+% Lago and John Collins on
+% \url{https://github.com/borisveytsman/acmart/issues/413}, can be
+% included in a \progname{latexmk} configuration file to set
+% \optname{pdfbytes} automatically whenever \progname{latexmk} builds a
+% \pkgname{hyperxmp}-based document using
+% \pdfLaTeX\ (\progname{latexmk}'s |--pdf| option). The code can be
+% adapted, \textit{mutatis mutandis}, to work with \XeLaTeX\ builds
+% (\progname{latexmk}'s |--pdfxe| or |--xelatex| option).
+%
+% \iffalse
+%<*listings>
+% \fi
+\begin{figure}
+ \begin{lstlisting}[
+ language=perl,
+ columns=fullflexible,
+ frame=single,
+ basicstyle=\footnotesize,
+ showstringspaces=false
+ ]
+$pdflatex = 'internal mylatex %O %S';
+
+sub mylatex {
+ my @args = @_;
+ $retval = system 'pdflatex', @args;
+ get_pdf_size();
+ return $retval;
+}
+
+sub get_pdf_size {
+ my $size = (stat($out_dir1 . $root_filename . ".pdf"))[7];
+ open(AUX, '>>', $aux_dir1 . $root_filename . ".aux")
+ || die "Can't open file " . $aux_dir1 . $root_filename . ".aux: $!";
+ if (defined($size)) {
+ print AUX "\\\@ifpackageloaded{hyperxmp}{\\hypersetup{pdfbytes=$size}}{}\n";
+ }
+ close(AUX);
+}
+ \end{lstlisting}
+ \caption{Code to include in a \progname{latexmk} configuration file
+ to automate the assignment of \pkgname{hyperxmp}'s
+ \optname{pdfbytes} option when building with \pdfLaTeX}
+ \label{fig:latexmkrc}
+\end{figure}
+% \iffalse
+%</listings>
+% \fi
+%
+% See \href{http://mirrors.ctan.org/support/latexmk/latexmk.pdf}{the
+% \progname{latexmk} manual} for information on configuration-file
+% naming on different operating systems and explanations of the hooks
+% used in the Figure~\ref{fig:latexmkrc} code.
+%
%
% \StopEventually{^^A
% \section{Help Wanted}
@@ -2653,6 +2730,7 @@
% \end{macro}
%
% \begin{macro}{\hyxmp@concated@metadata}
+% \begin{macro}{\hyxmp@aep@toks}
% Assume that if the document loaded either \pkgname{babel} or
% \pkgname{polyglossia} it will eventually define one or more languages
% that \pkgname{hyperxmp} can list within a \xmpprop{dc:language}
@@ -2675,6 +2753,7 @@
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\hyxmp@warn@if@no@metadata}
% \begin{macro}{\hyxmp@concated@metadata}
@@ -2792,6 +2871,7 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\hyxmp@aep@toks}
% Right before we reach the |\begin{document}| we check if
% \pkgname{hyperref} was loaded. In normal usage, the document will
% already have done a |\usepackage{hyperref}| because otherwise,
@@ -2857,6 +2937,7 @@
}%
}
% \end{macrocode}
+% \end{macro}
%
% When we reach the |\end{document}| we need to gather up the metadata
% specified explicitly by the user, infer additional metadata where
@@ -3094,11 +3175,25 @@
% \end{macrocode}
%
% Determine the size of the output file from the \emph{previous} run of
-% \LuaLaTeX\ or \pdfLaTeX\@. This action has to be performed before the
+% \LuaLaTeX\@. This action has to be performed before the
% |\begin{document}| because at that point the size of the output file
% is reset to zero. We use |\jobname.pdf| as the name of the output
-% file even in the \LuaLaTeX\ case because |status.output_file_name| is
-% not defined at this point.
+% file because |status.output_file_name| is not defined at this point.
+%
+% It's possible to use \pdfLaTeX's \cs{pdffilesize} primitive to query
+% the size of |\jobname.pdf| under \pdfLaTeX\@. Unfortunately, doing so
+% has a side effect of making \progname{latexmk} view the
+% \acro{PDF} file as an input file, which puts \progname{latexmk} in an
+% infinite build loop. (This was the case for \pkgname{hyperxmp} v5.5
+% and v5.6.) See the discussion at
+% \url{https://github.com/borisveytsman/acmart/issues/413} for more
+% information.
+% \changes{v5.7}{2020/11/01}{Do not automatically compute the
+% \protect\acro{PDF} file size under \protect\pdfLaTeX\ because this confuses
+% \protect\progname{latexmk}. Thanks to John Collins, Nelson Posse Lago,
+% Derek Dreyer, and the other contributors to
+% \protect\href{https://github.com/borisveytsman/acmart/issues/413}{\protect\pkgname{acmart} issue \#413},
+% ``Latexmk goes into an infinite loop even on sample files from ACM''}
% \begin{macrocode}
\ifLuaTeX
\edef\hyxmp@prev@pdf@size{%
@@ -3109,10 +3204,6 @@ if nbytes then
end
}%
}%
-\else
- \ifPDFTeX
- \edef\hyxmp@prev@pdf@size{\pdffilesize{\hyxmp@jobname.pdf}}%
- \fi
\fi
% \end{macrocode}
%
@@ -5609,6 +5700,28 @@ ______</dc:#2>^^J%
%
% \begin{schemadesc}[XMP Media Management]{\protect\acro{XMP} Media Management}
%
+% \begin{macro}{\hyxmp@aep@toks}
+% Once we reach the end of the preamble and know that \cs{@pdftitle} and
+% \cs{@pdfauthor} are no longer expected to change we use those macros
+% (and others) to define one \acro{UUID} for the document
+% (\cs{hyxmp@DocumentID}) and one for the document instance
+% (\cs{hyxmp@InstanceID}). As explained in
+% Section~\ref{sec:initial-prep}, we defer the invocation of
+% \cs{AtEndPreamble} to the end of the file.
+% \changes{v5.7}{2020/10/13}{As requested by Moritz Heckscher, define
+% \protect\cs{hyxmp@DocumentID} and \protect\cs{hyxmp@InstanceID} at
+% the end of the preamble instead of at the end of the document}
+% \begin{macrocode}
+\expandafter\hyxmp@aep@toks\expandafter=\expandafter{%
+ \the\hyxmp@aep@toks
+ \AtEndPreamble{%
+ \@ifmtargexp{\hyxmp@DocumentID}{\hyxmp@def@DocumentID}{}%
+ \@ifmtargexp{\hyxmp@InstanceID}{\hyxmp@def@InstanceID}{}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\hyxmp@mm@schema}
% Add properties defined by the \acro{XMP} Media Management schema to
% the |\hyxmp@xml| macro. According to the \acro{XMP} specification,
@@ -5629,8 +5742,6 @@ ______</dc:#2>^^J%
% the \protect\acro{XMP} packet}
% \begin{macrocode}
\gdef\hyxmp@mm@schema{%
- \@ifmtargexp{\hyxmp@DocumentID}{\hyxmp@def@DocumentID}{}%
- \@ifmtargexp{\hyxmp@InstanceID}{\hyxmp@def@InstanceID}{}%
\hyxmp@add@simple{xmpMM:DocumentID}{\hyxmp@DocumentID}%
\hyxmp@add@simple{xmpMM:InstanceID}{\hyxmp@InstanceID}%
\hyxmp@add@simple{xmpMM:VersionID}{\@pdfversionid}%
diff --git a/macros/latex/contrib/hyperxmp/hyperxmp.pdf b/macros/latex/contrib/hyperxmp/hyperxmp.pdf
index 23e5ed9f76..d62a5dc555 100644
--- a/macros/latex/contrib/hyperxmp/hyperxmp.pdf
+++ b/macros/latex/contrib/hyperxmp/hyperxmp.pdf
Binary files differ