From bb1b3f8e561d48962c52f7d5aa057cd674520007 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 25 Sep 2020 20:57:39 +0000 Subject: hyperxmp (25sep20) git-svn-id: svn://tug.org/texlive/trunk@56432 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/hyperxmp/hyperxmp.sty | 369 +++++++++++++++------- 1 file changed, 249 insertions(+), 120 deletions(-) (limited to 'Master/texmf-dist/tex/latex/hyperxmp') diff --git a/Master/texmf-dist/tex/latex/hyperxmp/hyperxmp.sty b/Master/texmf-dist/tex/latex/hyperxmp/hyperxmp.sty index 33e7335e848..87a0f265a8b 100644 --- a/Master/texmf-dist/tex/latex/hyperxmp/hyperxmp.sty +++ b/Master/texmf-dist/tex/latex/hyperxmp/hyperxmp.sty @@ -22,7 +22,7 @@ %% \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{hyperxmp} - [2020/06/19 v5.4 Store hyperref metadata in XMP format] + [2020/09/24 v5.5 Store hyperref metadata in XMP format] \edef\hyxmp@dq@code{\the\catcode`\"} \catcode`\"=12 \@ifundefined{AtEndDocument}{% @@ -31,6 +31,13 @@ }{% \let\hyxmp@at@end=\AtEndDocument } +\def\hyxmp@set@jobname#1\relax{% + \@ifnextchar"{\hyxmp@set@jobname@dbl}{\hyxmp@set@jobname@plain}#1\relax +} +\def\hyxmp@set@jobname@dbl"#1"\relax{\xdef\hyxmp@jobname{#1}} +\def\hyxmp@set@jobname@plain#1\relax{\xdef\hyxmp@jobname{#1}} +\expandafter\hyxmp@set@jobname\jobname\relax +\newtoks{\hyxmp@aep@toks} \RequirePackage{kvoptions} \RequirePackage{pdfescape} \RequirePackage{stringenc} @@ -39,6 +46,9 @@ \RequirePackage{ifmtarg} \RequirePackage{etoolbox} \RequirePackage{ifthen} +\ifLuaTeX + \RequirePackage{luacode} +\fi \def\@ifmtargexp#1{\expandafter\@ifmtarg\expandafter{#1}} \def\@ifnotmtargexp#1{\expandafter\@ifnotmtarg\expandafter{#1}} \newcommand*{\@if@def@and@nonempty}[3]{% @@ -137,7 +147,7 @@ \next \hyxmp@set@pdfx@major{#1}% } -\edef\@pdfsource{\jobname.tex} +\edef\@pdfsource{\hyxmp@jobname.tex} \define@key{Hyp}{pdfsource}{\hyxmp@pdfstringdef\@pdfsource{#1}} \def\hyxmp@DocumentID{} \define@key{Hyp}{pdfdocumentid}{\hyxmp@pdfstringdef\hyxmp@DocumentID{#1}} @@ -187,6 +197,8 @@ \define@key{Hyp}{pdfidentifier}{\hyxmp@pdfstringdef\@pdfidentifier{#1}} \def\@pdfsubtitle{} \define@key{Hyp}{pdfsubtitle}{\hyxmp@pdfstringdef\@pdfsubtitle{#1}} +\def\@pdfpubstatus{} +\define@key{Hyp}{pdfpubstatus}{\hyxmp@pdfstringdef\@pdfpubstatus{#1}} \def\@pdfcontactaddress{} \define@key{Hyp}{pdfcontactaddress}{% \let\xmpcomma=\hyxmp@comma @@ -288,17 +300,20 @@ \hyxmp@hypersetup } \edef\hyxmp@concated@metadata{} -\AtEndPreamble{% - \@ifpackageloaded{babel}{% - \edef\hyxmp@concated@metadata{babel}% - }{% - \@ifpackageloaded{polyglossia}{% - \edef\hyxmp@concated@metadata{polyglossia}% +\expandafter\hyxmp@aep@toks\expandafter=\expandafter{% + \the\hyxmp@aep@toks + \AtEndPreamble{% + \@ifpackageloaded{babel}{% + \edef\hyxmp@concated@metadata{babel}% }{% + \@ifpackageloaded{polyglossia}{% + \edef\hyxmp@concated@metadata{polyglossia}% + }{% + }% }% }% } -\newcommand*{\hyxmp@find@metadata}{% +\newcommand*{\hyxmp@warn@if@no@metadata}{% \edef\hyxmp@concated@metadata{% \hyxmp@concated@metadata \@baseurl @@ -343,7 +358,7 @@ }% \ifx\hyxmp@concated@metadata\@empty \PackageWarningNoLine{hyperxmp}{% - \jobname.tex did not specify any metadata to\MessageBreak + \hyxmp@jobname.tex did not specify any metadata to\MessageBreak include in the XMP packet.\space\space Please see the\MessageBreak hyperxmp documentation for instructions on how to\MessageBreak provide metadata values to hyperxmp}% @@ -377,59 +392,46 @@ {}% }% } -\AtEndPreamble{% - \@ifpackageloaded{hyperref}{% - \@if@def@and@nonempty{@pdflang}{% - }{% - \hyxmp@detect@langs - }% - \hyxmp@auto@assign@data - \@ifundefined{XeTeXversion}{}{% - \@ifmtargexp{\@pdfcreationdate}{% - \let\@pdfcreationdate=\hyxmp@today@pdf - }% - {}% - }% - \hyxmp@check@standards +\expandafter\hyxmp@aep@toks\expandafter=\expandafter{% + \the\hyxmp@aep@toks + \AtEndPreamble{% + \RequirePackage{hyperref}% \hyxmp@no@info@lists - \hyxmp@at@end{% - \hyxmp@find@metadata - \hyxmp@embed@packet - }% - }{% - \PackageWarningNoLine{hyperxmp}{% - \jobname.tex failed to include a\MessageBreak - \string\usepackage\string{hyperref\string} - in the preamble.\MessageBreak - Consequently, all hyperxmp functionality will be\MessageBreak - disabled}% + \begingroup + \let\@latex@warning@no@line=\@gobble + \hyxmp@use@first@valid{pdftitle}{\@pdftitle}{% + \scr@subject@var,% + \@title + }% + \hyxmp@use@first@valid{pdfauthor}{\@pdfauthor}{% + \scr@fromname@var,% + \@author + }% + \endgroup }% } \hyxmp@at@end{% - \hyxmp@set@dc@lang - \ifx\@pdfmetalang\@empty - \ifx\@pdflang\@empty - \let\@pdfmetalang=\hyxmp@x@default - \else - \edef\@pdfmetalang{\@pdflang}% - \fi - \fi - \hyxmp@xmlify\@pdfmetalang \hyxmp@auto@assign@data + \hyxmp@check@standards + \hyxmp@warn@if@no@metadata + \hyxmp@embed@packet } \newcommand*{\hyxmp@set@koma@phones}{% - \@if@def@and@nonempty{scr@frommobilephone@var}{% - \@if@def@and@nonempty{scr@fromphone@var}{% - \edef\hyxmp@koma@phones{\scr@frommobilephone@var,\scr@fromphone@var}% - }{% - \edef\hyxmp@koma@phones{\scr@frommobilephone@var}% - }% - }{% - \@if@def@and@nonempty{scr@fromphone@var}{% - \edef\hyxmp@koma@phones{\scr@fromphone@var}% + \begingroup + \Hy@unicodefalse + \@if@def@and@nonempty{scr@frommobilephone@var}{% + \@if@def@and@nonempty{scr@fromphone@var}{% + \hyxmp@pdfstringdef\hyxmp@koma@phones{\scr@frommobilephone@var,\scr@fromphone@var}% + }{% + \hyxmp@pdfstringdef\hyxmp@koma@phones{\scr@frommobilephone@var}% + }% }{% + \@if@def@and@nonempty{scr@fromphone@var}{% + \hyxmp@pdfstringdef\hyxmp@koma@phones{\scr@fromphone@var}% + }{% + }% }% - }% + \endgroup } \newcommand*{\hyxmp@use@first@valid}[3]{% \@ifmtargexp{#2}{% @@ -453,14 +455,18 @@ \next } \newcommand*{\hyxmp@auto@assign@data}{% - \hyxmp@use@first@valid{pdftitle}{\@pdftitle}{% - \scr@subject@var,% - \@title - }% - \hyxmp@use@first@valid{pdfauthor}{\@pdfauthor}{% - \scr@fromname@var,% - \@author + \@if@def@and@nonempty{@pdflang}{% + \let\hyxmp@dc@lang=\@pdflang + }{% + \hyxmp@detect@langs }% + \ifx\@pdfmetalang\@empty + \ifx\@pdflang\@empty + \let\@pdfmetalang=\hyxmp@x@default + \else + \edef\@pdfmetalang{\@pdflang}% + \fi + \fi \hyxmp@use@first@valid{pdfcontactemail}{\@pdfcontactemail}{% \scr@fromemail@var }% @@ -478,6 +484,45 @@ \@publishers }% \hyxmp@parse@acmart + \@ifundefined{XeTeXversion}{}{% + \@ifmtargexp{\@pdfcreationdate}{% + \let\@pdfcreationdate=\hyxmp@today@pdf + }% + {}% + }% + \hyxmp@query@self +} +\ifLuaTeX +\else + \RequirePackage{totpages} +\fi +\ifLuaTeX + \edef\hyxmp@prev@pdf@size{% + \luadirect{% +local nbytes = lfs.attributes("\hyxmp@jobname.pdf", "size") +if nbytes then + tex.write(nbytes) +end + }% + }% +\else + \ifPDFTeX + \edef\hyxmp@prev@pdf@size{\pdffilesize{\hyxmp@jobname.pdf}}% + \fi +\fi +\newcommand*{\hyxmp@query@self}{% + \ifLuaTeX + \@if@def@and@nonempty{@pdfnumpages}{% + }{% + \clearpage + \xdef\@pdfnumpages{\luadirect{tex.print(status.total_pages)}}% + }% + \else + \pdfstringdef\@pdfnumpages{\ref*{TotPages}}% + \fi + \hyxmp@use@first@valid{pdfbytes}{\@pdfbytes}{% + \hyxmp@prev@pdf@size + }% } \newcommand*{\hyxmp@parse@acmart}{% \begingroup @@ -573,55 +618,29 @@ }% } \@ifclassloaded{acmart}{}{\let\hyxmp@parse@acmart=\relax} -\newcommand*{\hyxmp@set@dc@lang}{% - \let\hyxmp@dc@lang=\@pdflang -} +\let\hyxmp@dc@lang=\@empty \newcommand*{\hyxmp@detect@langs}{% \@ifundefined{mainbcp47id}{% \@ifundefined{LocaleForEach}{% \let\@pdflang=\@empty }{% \BabelEnsureInfo - \renewcommand*{\hyxmp@set@dc@lang}{% - \getlocaleproperty\@pdflang{\bbl@main@language}{identification/tag.bcp47}% - \hyxmp@write@pdflang - \let\hyxmp@dc@lang=\relax - \LocaleForEach{% - \getlocaleproperty\hyxmp@lang@tag{####1}{identification/tag.bcp47}% - \ifx\hyxmp@dc@lang\relax - \edef\hyxmp@dc@lang{\hyxmp@lang@tag}% - \else - \edef\hyxmp@dc@lang{\hyxmp@dc@lang,\hyxmp@lang@tag}% - \fi - }% + \LocaleForEach{% + \getlocaleproperty\hyxmp@lang@tag{##1}{identification/tag.bcp47}% + \ifx\hyxmp@dc@lang\@empty + \xdef\hyxmp@dc@lang{\hyxmp@lang@tag}% + \else + \xdef\hyxmp@dc@lang{\hyxmp@dc@lang,\hyxmp@lang@tag}% + \fi + \def\hyxmp@lang@name{##1}% + \ifx\hyxmp@lang@name\bbl@main@language + \edef\@pdflang{\hyxmp@lang@tag}% + \fi }% }% }{% \xdef\@pdflang{\csname mainbcp47id\endcsname}% - \renewcommand*{\hyxmp@set@dc@lang}{% - \edef\hyxmp@dc@lang{\xpg@bcp@loaded}% - }% - }% -} -\newcommand*{\hyxmp@write@pdflang}{% - \@ifundefined{pdfmark}{% - \@ifundefined{@pdfm@mark}{% - \@ifundefined{pdfcatalog}{% - \PackageWarning{hyperxmp}{Unknown PDF generator; not setting the language (\@pdflang) in the PDF catalog}% - }{% - \pdfcatalog{/Lang (\@pdflang)}% - }% - }{% - \@pdfm@mark{docview << /Lang (\@pdflang) >>}% - }% -}{% - \pdfmark{% - pdfmark=/PUT,Raw={% - \string{Catalog\string} << - /Lang (\@pdflang) - >> - }% - }% + \edef\hyxmp@dc@lang{\xpg@bcp@loaded}% }% } \newcommand*{\hyxmp@commas@to@list}[2]{% @@ -805,7 +824,7 @@ \edef\hyxmp@today@xmp{\expandafter\hyxmp@pdf@to@xmp@date\pdffeedback creationdate}% } \hyxmp@try@today{filemoddate}{% - \edef\hyxmp@today@xmp{\filemoddate{\jobname.log}}% + \edef\hyxmp@today@xmp{\filemoddate{\hyxmp@jobname.log}}% \edef\next{% \edef\noexpand\hyxmp@today@xmp{\noexpand\hyxmp@as@xmp@date{\hyxmp@today@xmp}}% }% @@ -1051,7 +1070,7 @@ }% } \newcommand*{\hyxmp@add@simple@lang@i}{% - \@ifnextchar[\hyxmp@add@simple@lang@ii{\hyxmp@add@simple@lang@ii[]}% + \@ifnextchar[\hyxmp@add@simple@lang@ii{\hyxmp@add@simple@lang@ii[\@pdfmetalang]}% } \def\hyxmp@add@simple@lang@ii[#1]#2\relax#3{% \@ifnotmtarg{#2}{% @@ -1180,7 +1199,7 @@ ______<#3 xml:lang="#1">\hyxmp@xmlified^^J% \hyxmp@append@hex@iv#1% } \newcommand*{\hyxmp@def@DocumentID}{% - \edef\hyxmp@seed@string{\jobname:\@pdftitle:\@pdfauthor:}% + \edef\hyxmp@seed@string{\hyxmp@jobname:\@pdftitle:\@pdfauthor:}% \expandafter\hyxmp@seed@rng\expandafter{\hyxmp@seed@string}% \edef\hyxmp@rand@num{\the\@tempcnta}% \hyxmp@create@uuid\hyxmp@DocumentID @@ -1188,7 +1207,7 @@ ______<#3 xml:lang="#1">\hyxmp@xmlified^^J% \newcommand*{\hyxmp@def@InstanceID}{% \hyxmp@today@xmp@define{\hyxmp@seed@string}% \edef\hyxmp@seed@string{% - \jobname:\@pdftitle:\@pdfauthor:\hyxmp@today@xmp:\hyxmp@seed@string + \hyxmp@jobname:\@pdftitle:\@pdfauthor:\hyxmp@today@xmp:\hyxmp@seed@string }% \expandafter\hyxmp@seed@rng\expandafter{\hyxmp@seed@string}% \edef\hyxmp@rand@num{\the\@tempcnta}% @@ -1280,6 +1299,7 @@ _______________________________________________________________^^J% \hyxmp@assign@major@minor \hyxmp@add@simple@var{pdf:PDFVersion}{hyxmp@major@minor}% } +\newif\ifhyxmp@multi@langs \newcommand*{\hyxmp@rdf@dc}[3][\iffalse]{% \@ifmtargexp{#3}{\@tempswafalse}{\@tempswatrue}% #1 @@ -1292,24 +1312,47 @@ _______________________________________________________________^^J% ______^^J% ________^^J% }% + \@if@def@and@nonempty{hyxmp@alt@#2}{% + \hyxmp@multi@langstrue + }{% + \hyxmp@multi@langsfalse + }% \ifx\@pdfmetalang\hyxmp@x@default + \ifhyxmp@multi@langs + \PackageError{hyperxmp}% + {\string\XMPLangAlt\space was used without specifying + pdfmetalang\MessageBreak + or pdflang}% + {Be sure to assign a language code to the pdfmetalang key and/or a + document\MessageBreak + language to the pdflang key (e.g., \string\hypersetup{pdfmetalang={en}}).}% + \else + \hyxmp@add@to@xml{% +__________\hyxmp@value^^J% + }% + \fi \else - \hyxmp@xmlify{\@pdfmetalang}% - \hyxmp@add@to@xml{% + \ifhyxmp@multi@langs + \hyxmp@xmlify{\@pdfmetalang}% + \hyxmp@add@to@xml{% +__________\hyxmp@value^^J% __________\hyxmp@value^^J% - }% + }% + \def\do##1##2{ + \hyxmp@xmlify{##2}% + \hyxmp@add@to@xml{% + __________\hyxmp@xmlified^^J% + }% + }% + \csname hyxmp@alt@#2\endcsname + \else + \hyxmp@xmlify{\@pdfmetalang}% + \hyxmp@add@to@xml{% +__________\hyxmp@value^^J% + }% + \fi \fi \hyxmp@add@to@xml{% -__________\hyxmp@value^^J% - }% - \def\do##1##2{ - \hyxmp@xmlify{##2}% - \hyxmp@add@to@xml{% -__________\hyxmp@xmlified^^J% - }% - }% - \csname hyxmp@alt@#2\endcsname - \hyxmp@add@to@xml{% ________^^J% ______^^J% }% @@ -1416,6 +1459,7 @@ ______^^J% \hyxmp@add@simple{xmpMM:VersionID}{\@pdfversionid}% \hyxmp@add@simple{xmpMM:RenditionClass}{\@pdfrendition}% } + \newcommand*{\hyxmp@xmp@basic@schema}{% \@ifmtargexp{\@pdfcreationdate}{% \hyxmp@add@simple{xmp:CreateDate}{\hyxmp@today@xmp}% @@ -1536,6 +1580,62 @@ ______^^J% \hyxmp@add@simple{prism:byteCount}{\@pdfbytes}% \hyxmp@add@simple{prism:pageCount}{\@pdfnumpages}% } +\newcommand*{\hyxmp@jav@schema}{% + \hyxmp@add@simple{jav:journal_article_version}{\@pdfpubstatus}% +} +\newcommand*{\hyxmp@xmptpg@schema}{% + \ifLuaTeX + \luadirect{write_xmp_font_list(\the\hyxmp@cct)}% + \fi + \hyxmp@add@simple{xmpTPg:NPages}{\@pdfnumpages}% +} +\ifLuaTeX + \newcatcodetable\hyxmp@cct + \savecatcodetable\hyxmp@cct +\fi +\ifLuaTeX + \begin{luacode*} +function write_xmp_font_list (cct) + local function show_field(name, ...) + for i = 1, select("#", ...) do + local val = select(i, ...) + if val then + local xml = string.gsub(val, "&", "&") + xml = string.gsub(xml, "<", "<") + xml = string.gsub(xml, ">", ">") + tex.print(cct, "____________" .. + val .. "^^J%") + return + end + end + end + tex.print(cct, "\\hyxmp@add@to@xml{%") + tex.print(cct, "______^^J%") + tex.print(cct, "________^^J%") + for i, f in font.each() do + tex.print(cct, "__________^^J%") + if f.filename then + local info = fontloader.info(f.filename) + show_field("fontFace", info.fullname) + show_field("fontFamily", info.familyname) + show_field("fontName", info.fontname) + show_field("versionString", info.version) + local baseName = string.gsub(f.filename, ".*[/\\](.*)", "%1") + show_field("fontFileName", baseName) + else + show_field("fontName", f.psname, f.fullname, f.name) + end + if f.format and f.format ~= "unknown" then + show_field("fontType", f.format) + end + tex.print(cct, "__________^^J%") + end + tex.print(cct, "________^^J%") + tex.print(cct, "______^^J%") + tex.print(cct, "}") +end + \end{luacode*} +\fi \newcommand*{\hyxmp@check@iptc@data}{% \edef\hyxmp@iptc@data{% \@pdfcontactaddress @@ -1566,6 +1666,11 @@ ______^^J% \@pdfvolumenum }% }% +\newcommand*{\hyxmp@check@jav@data}{% + \edef\hyxmp@jav@data{% + \@pdfpubstatus + }% +} \newcommand*{\hyxmp@begin@extension@decls}{% \hyxmp@add@to@xml{% ______^^J% @@ -1647,6 +1752,7 @@ ______________________^^J% {internal}% {Document version identifier}% \hyxmp@declare@property + [RenditionClass]% {RenditionClass}% {internal}% {The manner in which a document is rendered}% @@ -1772,7 +1878,7 @@ __________^^J% \hyxmp@begin@ext@decl {PRISM Basic Metadata}% {prism}% - {http://prismstandard.org/namespaces/basic/2.1/}% + {http://prismstandard.org/namespaces/basic/3.0/}% \hyxmp@declare@property {complianceProfile}% {internal}% @@ -1838,6 +1944,18 @@ __________^^J% {Document's subtitle}% \hyxmp@end@ext@decl }% +\newcommand*{\hyxmp@jav@extensions}{% + \hyxmp@begin@ext@decl + {NISO/ALPSP Journal Article Versions}% + {jav}% + {http://www.niso.org/schemas/jav/1.0/}% + \hyxmp@declare@property + [Closed Choice of Text]% + {journal_article_version}% + {external}% + {Article status, one of "AO", "SMUR", "AM", "P", "VoR", "CVoR", or "EVoR"}% + \hyxmp@end@ext@decl +}% \newcommand*{\hyxmp@declare@extensions}{% \hyxmp@begin@extension@decls \hyxmp@pdf@extensions @@ -1861,6 +1979,10 @@ __________^^J% \else \hyxmp@prism@extensions \fi + \ifx\hyxmp@jav@data\@empty + \else + \hyxmp@jav@extensions + \fi \hyxmp@end@extension@decls } \begingroup @@ -1895,7 +2017,10 @@ _____________________xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/"^^J% _____________________xmlns:pdfuaid="http://www.aiim.org/pdfua/ns/id/"^^J% _____________________xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/"^^J% _____________________xmlns:pdfxid="http://www.npes.org/pdfx/ns/id/"^^J% -_____________________xmlns:prism="http://prismstandard.org/namespaces/basic/2.1/"^^J% +_____________________xmlns:prism="http://prismstandard.org/namespaces/basic/3.0/"^^J% +_____________________xmlns:jav="http://www.niso.org/schemas/jav/1.0/"^^J% +_____________________xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"^^J% +_____________________xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font\hyxmp@hash"^^J% _____________________xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"^^J% _____________________xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/"^^J% _____________________xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema\hyxmp@hash"^^J% @@ -1905,6 +2030,7 @@ _____________________xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field\hyxmp@ha }% \hyxmp@check@iptc@data \hyxmp@check@prism@data + \hyxmp@check@jav@data \hyxmp@declare@extensions \hyxmp@pdf@schema \hyxmp@xmpRights@schema @@ -1917,6 +2043,8 @@ _____________________xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field\hyxmp@ha \hyxmp@mm@schema \hyxmp@iptc@schema \hyxmp@prism@schema + \hyxmp@jav@schema + \hyxmp@xmptpg@schema \hyxmp@add@to@xml{% ____^^J% __^^J% @@ -1946,7 +2074,7 @@ __^^J% \@ifundefined{pdfmark}{% \PackageWarningNoLine{hyperxmp}{% Unrecognized hyperref driver `\Hy@driver'.\MessageBreak - \jobname.tex's XMP metadata will *not* be\MessageBreak + \hyxmp@jobname.tex's XMP metadata will *not* be\MessageBreak embedded in the resulting file}% }{% \hyxmp@embed@packet@pdfmark @@ -2058,6 +2186,7 @@ __^^J% >> }% } +\the\hyxmp@aep@toks \catcode`\"=\hyxmp@dq@code \endinput %% -- cgit v1.2.3