diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/pdfmanagement-testphase')
19 files changed, 558 insertions, 246 deletions
diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/hyperref-generic.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/hyperref-generic.dtx index c03d57a7fc4..03b931f11d3 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/hyperref-generic.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/hyperref-generic.dtx @@ -82,7 +82,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -615,7 +615,15 @@ % the link type, so the link is for example no longer colored. It also removes the % implicit grouping of the content. % -% +% \DescribeHypkey{nested-links}% +% +% Links are sometimes nested. E.g. if a section heading contains a reference +% it can lead to nested links in the table of contents or if |\nameref| is used. +% That is not forbidden and normally work as expected: If the link area overlap +% normally the inner link is \enquote{on top} and chosen at a click. +% But it is not always actually wanted, so with the |nested-links| (a boolean key) +% it is possible to disable such nested links. +% % \section{Draftmode} % pdftex and other engines knows a % draftmode which can be set with |\pdfdraftmode=1| @@ -797,7 +805,7 @@ % %\section{Assorted key descriptions}\label{sec:keydesc} %The following gives a few details to some keys that are perhaps not -%completly described in the manual, or are a bit different in this driver. +%completely described in the manual, or are a bit different in this driver. %The list is alphabetic. % % \DescribeHypkey{bookmarkstype} This key takes as value the extension of a list @@ -956,7 +964,7 @@ %<@@=hyp> % \end{macrocode} % \begin{macrocode} -\ProvidesFile{hgeneric-testphase.def}[2023-11-17 v0.96c % +\ProvidesFile{hgeneric-testphase.def}[2023-12-09 v0.96d % generic Hyperref driver for the LaTeX PDF management testphase bundle] \RequirePackage{etoolbox} %why? @@ -1221,15 +1229,15 @@ \cs_set_protected:Npn \hypersetup #1 { %\kvsetkeys{Hyp} {#1} - \keys_set:nn { hyp / setup }{ #1 } + \keys_set:nn { hyp }{ #1 } } % TODO for now unknown keys should only give warnings. -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { unknown .code:n = { \msg_warning:nneee { hyp } { unknown-key } - { hyp~/~setup }{ \l_keys_key_str } { #1 } + { hyp }{ \l_keys_key_str } { #1 } } } % \end{macrocode} @@ -1238,7 +1246,7 @@ % chapters and sections and with \cs{phantomsection}. The following key allows % to force a specific name for the destination so that it can be used by bookmarks. % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { next-anchor .code:n = { @@ -1274,7 +1282,7 @@ ,destination .tl_set:N = \l_@@_href_pdf_destination_tl ,pdfremotestartview .code:n = { - \keys_set:nn { hyp / setup } + \keys_set:nn { hyp } { pdfremotestartview = #1 } } ,page .code:n = @@ -1293,7 +1301,7 @@ { \pdfdict_put:nnn{l_hyp/annot/A}{Next}{#1} \tl_set:Nn \Hy@href@nextactionraw {/Next~#1} - \keys_set:nn {hyp / setup }{ pdfnewwindow = true} + \keys_set:nn {hyp }{ pdfnewwindow = true} } } ,afrelationship .code:n = @@ -1304,7 +1312,7 @@ } -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,href / urlencode .bool_set:N = \l_@@_href_url_encode_bool ,href / urlencode .default:n = {true} @@ -1467,7 +1475,7 @@ \hook_new:n{hyp/link/cite} %\color_set:nnn {hyp/color/cite}{HTML}{2E7E2A} %\color_set:nn {hyp/color/citeborder}{hyp/color/cite!60!white} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,citecolor .code:n = {\@@_color_set:ne {hyp/color/cite}{#1}\@@_citecolor_hook_init:} ,citebordercolor @@ -1477,7 +1485,7 @@ { \hook_gput_code:nnn { hyp/link/cite }{hyp/cite} { - \keys_set:nn { hyp / setup } + \keys_set:nn { hyp } { linkcolor = hyp/color/cite } @@ -1488,7 +1496,7 @@ { \hook_gput_code:nnn { hyp/link/cite }{hyp/citeborder} { - \keys_set:nn { hyp / setup } + \keys_set:nn { hyp } { linkbordercolor = hyp/color/citeborder } @@ -1972,7 +1980,7 @@ } % \end{macrocode} % \end{macro} -% \section {Core Hyperref Commands} +% \section{Core Hyperref Commands} % Every \pkg{hyperref} has to define eight core command: % \begin{verbatim} % \hyper@anchor @@ -1987,7 +1995,46 @@ % % This driver defines for consistency also % |\hyper@linklaunch| for Launch and |\hyper@linknamed| for Named. +% +% \subsection{Link level} +% Links can be nested. Inner links need perhaps special handling, e.g. +% to deactivate the link, or to change the border, or in the case of +% tagging to add some additional structure to handle the parent-child rules. +% We therefore add a global counter which is increased at the begin of +% link and decreased at the end. +% \begin{macro}{g_@@_linknestlevel_int} +% \begin{macrocode} +\int_new:N \g_@@_linknestlevel_int +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\prg_new_conditional:Npnn \@@_if_outer_link: {TF} + { + \int_compare:nNnTF { \g_@@_linknestlevel_int } > {1} + { \prg_return_false: } + { \prg_return_true: } + } +% \end{macrocode} + +% \begin{macrocode} +\cs_new:Npn \@@_check_link_nesting:TF #1 #2 + { + \use_i:nn {#1}{#2} + } +% \end{macrocode} % +% \begin{macrocode} +\keys_define:nn { hyp } + { + nested-links .choice:, + nested-links / true .code:n = + { \cs_set_eq:NN \@@_check_link_nesting:TF \use_i:nn }, + nested-links / false .code:n = + { \cs_set_eq:NN \@@_check_link_nesting:TF \@@_if_outer_link:TF }, + nested-links .default:n = {true} + } +% \end{macrocode} % \subsection{ Anchors / destinations} % The first three commands are needed for \enquote{anchors}. At first % the internal commands to create a destination. It uses @@ -2157,27 +2204,41 @@ { \bool_if:NTF \l_@@_annot_GoTo_bool { - \Hy@VerboseLinkStart{#1}{#2} - \group_begin: - \tl_set:Nn \l_hyp_current_dest_name_tl {#2} - \hook_use:n {hyp/link/#1} - \@@_link_goto_begin:nw {#2}#3\Hy@xspace@end - \@@_link_goto_end: - \group_end: - \Hy@VerboseLinkStop + \int_gincr:N\g_@@_linknestlevel_int + \@@_check_link_nesting:TF + { + \Hy@VerboseLinkStart{#1}{#2} + \group_begin: + \tl_set:Nn \l_hyp_current_dest_name_tl {#2} + \hook_use:n {hyp/link/#1} + \@@_link_goto_begin:nw {#2}#3\Hy@xspace@end + \@@_link_goto_end: + \group_end: + \Hy@VerboseLinkStop + } + { + \group_begin: #3\group_end: + } + \int_gdecr:N\g_@@_linknestlevel_int } {{\let\protect\relax#3}} } - \cs_new_protected:Npn \hyper@linkstart #1 #2 %#1 context, #2=destination name { \bool_if:NT \l_@@_annot_GoTo_bool { - \Hy@VerboseLinkStart{#1}{#2}% only for debug - \group_begin: - \tl_set:Nn \l_hyp_current_dest_name_tl {#2} - \hook_use:n {hyp/link/#1} - \@@_link_goto_begin:nw {#2} + \int_gincr:N\g_@@_linknestlevel_int + \@@_check_link_nesting:TF + { + \Hy@VerboseLinkStart{#1}{#2}% only for debug + \group_begin: + \tl_set:Nn \l_hyp_current_dest_name_tl {#2} + \hook_use:n {hyp/link/#1} + \@@_link_goto_begin:nw {#2} + } + { + \group_begin: + } } } @@ -2185,9 +2246,16 @@ { \bool_if:NT \l_@@_annot_GoTo_bool { - \@@_link_goto_end: - \group_end: - \Hy@VerboseLinkStop + \@@_check_link_nesting:TF + { + \@@_link_goto_end: + \group_end: + \Hy@VerboseLinkStop + } + { + \group_end: + } + \int_gdecr:N\g_@@_linknestlevel_int } } % \end{macrocode} @@ -2203,31 +2271,39 @@ { \bool_if:NTF \l_@@_annot_URI_bool { - \group_begin: - \@@_text_pdfstring:eoN - { #2} - { \l_@@_text_enc_uri_print_tl } - \l_@@_uri_tmpa_tl - \pdfdict_put:nno{l_hyp/annot/A/URI}{URI}{\l_@@_uri_tmpa_tl} - \bool_if:NT \l_@@_href_url_ismap_bool - { - \pdfdict_put:nnn{l_hyp/annot/A/URI}{IsMap}{true} - } - \cs_set_eq:NN \# \c_hash_str - \cs_set_eq:NN \% \c_percent_str - \Hy@safe@activestrue - \mode_leave_vertical: - \pdfannot_dict_put:nne {link/URI}{A}{<<\pdfdict_use:n {l_hyp/annot/A/URI}>>} - \pdfannot_link:nen { URI } - { - } + \int_gincr:N\g_@@_linknestlevel_int + \@@_check_link_nesting:TF + { + \group_begin: + \@@_text_pdfstring:eoN + { #2} + { \l_@@_text_enc_uri_print_tl } + \l_@@_uri_tmpa_tl + \pdfdict_put:nno{l_hyp/annot/A/URI}{URI}{\l_@@_uri_tmpa_tl} + \bool_if:NT \l_@@_href_url_ismap_bool + { + \pdfdict_put:nnn{l_hyp/annot/A/URI}{IsMap}{true} + } + \cs_set_eq:NN \# \c_hash_str + \cs_set_eq:NN \% \c_percent_str + \Hy@safe@activestrue + \mode_leave_vertical: + \pdfannot_dict_put:nne {link/URI}{A}{<<\pdfdict_use:n {l_hyp/annot/A/URI}>>} + \pdfannot_link:nen { URI } + { + } + { + \let\protect\relax + #1 + \Hy@xspace@end + \Hy@VerboseLinkStop %where is the start?? + } + \group_end: + } { - \let\protect\relax - #1 - \Hy@xspace@end - \Hy@VerboseLinkStop %where is the start?? + \group_begin: #1 \group_end: } - \group_end: + \int_gdecr:N\g_@@_linknestlevel_int } {{\let\protect\relax#1}} } @@ -2244,57 +2320,65 @@ { \bool_if:NTF \l_@@_annot_GoToR_bool { - \group_begin: - \tl_set:Ne \l_@@_filename_tmpa_tl { \text_expand:n { #2 } } - \exp_args:Ne - \pdf_object_if_exist:nF { @@_file_\tl_to_str:N \l_@@_filename_tmpa_tl } - { - \pdfdict_put:nne { l_pdffile/Filespec}{Subtype}{\pdf_name_from_unicode_e:n {application/pdf}} - \pdffile_embed_file:noe - {} - {\l_@@_filename_tmpa_tl } - {@@_file_\tl_to_str:N \l_@@_filename_tmpa_tl } - } - \pdfdict_put:nne - {l_hyp/annot/A/GoToR} - {F} - {\pdf_object_ref:e {@@_file_\tl_to_str:N \l_@@_filename_tmpa_tl}} - \@@_text_pdfstring:nnN - { #3 } - { \l_@@_text_enc_dest_print_tl } - \l_@@_dest_name_tmpa_tl - \tl_if_blank:eTF {#3} + \int_gincr:N\g_@@_linknestlevel_int + \@@_check_link_nesting:TF { - \pdfdict_put:nne {l_hyp/annot/A/GoToR}{D} + \group_begin: + \tl_set:Ne \l_@@_filename_tmpa_tl { \text_expand:n { #2 } } + \exp_args:Ne + \pdf_object_if_exist:nF { @@_file_\tl_to_str:N \l_@@_filename_tmpa_tl } + { + \pdfdict_put:nne { l_pdffile/Filespec}{Subtype}{\pdf_name_from_unicode_e:n {application/pdf}} + \pdffile_embed_file:noe + {} + {\l_@@_filename_tmpa_tl } + {@@_file_\tl_to_str:N \l_@@_filename_tmpa_tl } + } + \pdfdict_put:nne + {l_hyp/annot/A/GoToR} + {F} + {\pdf_object_ref:e {@@_file_\tl_to_str:N \l_@@_filename_tmpa_tl}} + \@@_text_pdfstring:nnN + { #3 } + { \l_@@_text_enc_dest_print_tl } + \l_@@_dest_name_tmpa_tl + \tl_if_blank:eTF {#3} { - [ - \int_eval:n - { \int_max:nn {0}{ 0\l_@@_href_pdf_page_tl - 1 }} - /\l_@@_dest_pdfremotestartview_tl - ] + \pdfdict_put:nne {l_hyp/annot/A/GoToR}{D} + { + [ + \int_eval:n + { \int_max:nn {0}{ 0\l_@@_href_pdf_page_tl - 1 }} + /\l_@@_dest_pdfremotestartview_tl + ] + } } - } - { - \pdfdict_put:nno {l_hyp/annot/A/GoToR}{D}{\l_@@_dest_name_tmpa_tl} - } - \mode_leave_vertical: + { + \pdfdict_put:nno {l_hyp/annot/A/GoToR}{D}{\l_@@_dest_name_tmpa_tl} + } + \mode_leave_vertical: % \end{macrocode} % We use an extra object here, as ghostscript doesn't like the % object reference in the dict % \url{https://chat.stackexchange.com/transcript/message/57361080#57361080} % \begin{macrocode} - \pdf_object_unnamed_write:ne{dict}{\pdfdict_use:n {l_hyp/annot/A/GoToR}} - \pdfannot_dict_put:nne {link/GoToR}{A}{\pdf_object_ref_last:} - \pdfannot_link:nnn %expansion?? - { GoToR } - { - } + \pdf_object_unnamed_write:ne{dict}{\pdfdict_use:n {l_hyp/annot/A/GoToR}} + \pdfannot_dict_put:nne {link/GoToR}{A}{\pdf_object_ref_last:} + \pdfannot_link:nnn %expansion?? + { GoToR } + { + } + { + \let\protect\relax + #1\Hy@xspace@end + \Hy@VerboseLinkStop %where is the start?? + } + \group_end: + } { - \let\protect\relax - #1\Hy@xspace@end - \Hy@VerboseLinkStop %where is the start?? + \group_begin: #1 \group_end: } - \group_end: + \int_gdecr:N\g_@@_linknestlevel_int } {{\let\protect\relax#1}} } @@ -2312,47 +2396,53 @@ { \bool_if:NTF \l_@@_annot_Launch_bool { - \group_begin: - \@@_text_pdfstring:nnN - { #1 } - { \l_@@_text_enc_file_print_tl } - \l_@@_filename_tmpa_tl - \pdfdict_put:nno {l_hyp/annot/A/Launch}{F}{\l_@@_filename_tmpa_tl} - \@@_text_pdfstring:noN - { #3 } - { \l_@@_text_enc_para_print_tl } - \l_@@_para_tmpa_tl - \bool_if:nTF - { - \str_if_eq_p:Vn \l_@@_para_tmpa_tl {()} - || - \pdf_version_compare_p:Nn > {1.9} - } - { - \pdfdict_remove:nn {l_hyp/annot/A/Launch}{Win} - } - { - \pdfdict_put:nne - {l_hyp/annot/A/Launch} - {Win} - {<</P \l_@@_para_tmpa_tl /F \l_@@_filename_tmpa_tl >>} - } - \mode_leave_vertical: - \pdfannot_dict_put:nne {link/Launch}{A}{<<\pdfdict_use:n {l_hyp/annot/A/Launch}>>} - \pdfannot_link:nen - { Launch } - { - % /A -% << -% \pdfdict_use:n {l_hyp/annot/A/Launch} -% >> - } - { - \let\protect\relax - #2\Hy@xspace@end - \Hy@VerboseLinkStop %where is the start?? - } - \group_end: + \int_gincr:N\g_@@_linknestlevel_int + \@@_check_link_nesting:TF + { + \group_begin: + \@@_text_pdfstring:nnN + { #1 } + { \l_@@_text_enc_file_print_tl } + \l_@@_filename_tmpa_tl + \pdfdict_put:nno {l_hyp/annot/A/Launch}{F}{\l_@@_filename_tmpa_tl} + \@@_text_pdfstring:noN + { #3 } + { \l_@@_text_enc_para_print_tl } + \l_@@_para_tmpa_tl + \bool_if:nTF + { + \str_if_eq_p:Vn \l_@@_para_tmpa_tl {()} + || + \pdf_version_compare_p:Nn > {1.9} + } + { + \pdfdict_remove:nn {l_hyp/annot/A/Launch}{Win} + } + { + \pdfdict_put:nne + {l_hyp/annot/A/Launch} + {Win} + {<</P \l_@@_para_tmpa_tl /F \l_@@_filename_tmpa_tl >>} + } + \mode_leave_vertical: + \pdfannot_dict_put:nne {link/Launch}{A}{<<\pdfdict_use:n {l_hyp/annot/A/Launch}>>} + \pdfannot_link:nen + { Launch } + { + % /A + % << + % \pdfdict_use:n {l_hyp/annot/A/Launch} + % >> + } + { + \let\protect\relax + #2\Hy@xspace@end + \Hy@VerboseLinkStop %where is the start?? + } + \group_end: + } + { \group_begin: #2 \group_end: } + \int_gdecr:N\g_@@_linknestlevel_int } {{\let\protect\relax#2}} } @@ -2380,31 +2470,37 @@ { \bool_if:NTF \l_@@_annot_Named_bool { - \group_begin: - \pdfmeta_standard_verify:nnTF {named_actions}{#1} - { - \mode_leave_vertical: - \pdfdict_put:nne {l_hyp/annot/A/Named}{N} - {\pdf_name_from_unicode_e:n{#1}} - \pdfannot_dict_put:nne {link/Named}{A}{<<\pdfdict_use:n {l_hyp/annot/A/Named}>>} - \pdfannot_link:nnn { Named } + \int_gincr:N\g_@@_linknestlevel_int + \@@_check_link_nesting:TF + { + \group_begin: + \pdfmeta_standard_verify:nnTF {named_actions}{#1} { -% /A -% << -% \pdfdict_use:n { l_hyp/annot/A/Named } -% >> + \mode_leave_vertical: + \pdfdict_put:nne {l_hyp/annot/A/Named}{N} + {\pdf_name_from_unicode_e:n{#1}} + \pdfannot_dict_put:nne {link/Named}{A}{<<\pdfdict_use:n {l_hyp/annot/A/Named}>>} + \pdfannot_link:nnn { Named } + { + % /A + % << + % \pdfdict_use:n { l_hyp/annot/A/Named } + % >> + } + { + #2 + \Hy@xspace@end + \Hy@VerboseLinkStop + } } { + \msg_warning:nnn { hyp } { pdfa-no-named-action }{#1} #2 - \Hy@xspace@end - \Hy@VerboseLinkStop } - } - { - \msg_warning:nnn { hyp } { pdfa-no-named-action }{#1} - #2 - } - \group_end: + \group_end: + } + { \group_begin: #2 \group_end: } + \int_gdecr:N\g_@@_linknestlevel_int } {{\let\protect\relax#2}} } @@ -2517,7 +2613,7 @@ % \begin{hypkey}{colorlinks} % This key also resets the border and borderstyle. % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,colorlinks .meta:n = { @@ -2539,14 +2635,14 @@ % \begin{macrocode} \seq_map_inline:Nn \c_@@_annot_types_seq { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { ,color#1 .bool_set:c = { l_hyp_annot_color#1_bool } ,#1color .code:n = { \@@_color_set:ne {hyp/color/#1}{##1} } } } -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,allcolors .meta:n = { @@ -2568,7 +2664,7 @@ % or cmyk (unusual). This can be set with the |bordercolormodel| key: %\begin{hypkey}{bordercolormodel} % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,bordercolormodel .choices:nn = {rgb,cmyk} @@ -2580,7 +2676,7 @@ % \begin{macrocode} \prop_map_inline:Nn \c_@@_map_hyp_annot_prop { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { #1bordercolor .code:n = { @@ -2605,7 +2701,7 @@ } } -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,allbordercolors .meta:n = { @@ -2625,7 +2721,7 @@ % \begin{macrocode} \prop_map_inline:Nn \c_@@_map_hyp_annot_prop { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { #1border .code:n = { @@ -2644,7 +2740,7 @@ } } } -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,pdfborder .code:n = { @@ -2678,7 +2774,7 @@ % \begin{macrocode} \prop_map_inline:Nn \c_@@_map_hyp_annot_prop { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { #1borderstyle .code:n = { @@ -2697,7 +2793,7 @@ } } } -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,pdfborderstyle .code:n = { @@ -2850,7 +2946,7 @@ { \pdf_version_compare_p:Nn > {1.4} } { \str_if_eq_p:ee{\pdf_version_major:}{-1} } { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { ,_ocgcolorlinks .meta:n = { @@ -2864,7 +2960,7 @@ } } { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { ,_ocgcolorlinks .code:n = { @@ -2876,7 +2972,7 @@ } } -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,ocgcolorlinks .choice: ,ocgcolorlinks / true .meta:n = @@ -2899,13 +2995,13 @@ { \pdf_version_compare_p:Nn > {1.4} } { \str_if_eq_p:ee{\pdf_version_major:}{-1} } { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { ,ocgcolor#1 .bool_set:c = { l_hyp_annot_ocgcolor#1_bool } } } { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { ,ocgcolor#1 .code:n= { @@ -2925,7 +3021,7 @@ % \begin{macrocode} \prop_map_inline:Nn \c_@@_map_hyp_annot_prop { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { ,#1highlight .choices:nn = { /I, /N, /O, /P} @@ -2954,7 +3050,7 @@ } -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,pdfhighlight .choices:nn = { /I, /N, /O, /P} @@ -2991,7 +3087,7 @@ % This key disable all appearance keys. The link themselves are still there. % \begin{hypkey}{hidelinks,hidelink,hideurl,hidefile,hiderun,hidemenu} % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { hidelinks .meta:n = { @@ -3004,7 +3100,7 @@ \seq_map_inline:Nn \c_@@_annot_types_seq { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { hide#1 .meta:n = { @@ -3021,20 +3117,20 @@ % This define the key for the color schemes and sets the default colors. % \begin{hypkey}{colorscheme} % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { colorscheme .code:n = { \prop_map_inline:cn { c_@@_colorscheme_#1_prop } { - \keys_set:nn { hyp /setup } + \keys_set:nn { hyp } { ##1 = ##2 } } } } -\keys_set:nn { hyp / setup } {colorscheme=phelype} +\keys_set:nn { hyp } {colorscheme=phelype} % \end{macrocode} % \end{hypkey} % @@ -3044,7 +3140,7 @@ % The following are ignored (with or without warnings) % \begin{hypkey}{unicode,pdfencoding,pdfversion} % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,unicode .code:n = {} ,pdfencoding .code:n = {} @@ -3062,12 +3158,12 @@ % % \begin{hypkey}{verbose,debug,draft,final} % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,verbose .legacy_if_set:n = {Hy@verbose} ,debug .legacy_if_set:n = {Hy@verbose} } -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,draft .code:n = { @@ -3086,7 +3182,7 @@ % pageanchor,linktoc,linktocpage,plainpages,localanchorname, % linkfileprefix} % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,extension .tl_set:N = \XR@ext ,extension .initial:n= pdf @@ -3098,7 +3194,7 @@ ,plainpages .legacy_if_set:n = {Hy@plainpages} } -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,linktoc .choices:nn = { none, section, all, page } { @@ -3124,7 +3220,7 @@ % \begin{macrocode} \prop_map_inline:Nn \c_@@_map_hyp_annot_prop { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { ,#1 .bool_set:c = {l_@@_annot_#2_bool} } @@ -3133,7 +3229,7 @@ % \end{hypkey} % % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,baseurl .code:n = { @@ -3691,7 +3787,7 @@ % \begin{hypkey}{pdfview} % Destination keys. pdfview is a bit more complicated so extra. % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,pdfview .code:n = { @@ -3781,7 +3877,7 @@ % \begin{hypkey}{pdflang} % |pdflang| should be deprecated. % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,pdflang .code:n = { @@ -3807,7 +3903,7 @@ \regex_set:Nn\l_@@_optlang_regex {\A\[([A-Za-z\-]+)\](.*)} \cs_new_protected:Npn \@@_setup_info_key:nn #1 #2 { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { pdf#1 .code:n = { @@ -3894,7 +3990,7 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_setup_info_date_key:nn #1 #2 { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { pdf#1 .code:n = { @@ -3927,7 +4023,7 @@ \@@_setup_info_date_key:nn {creationdate} {CreationDate} \@@_setup_info_date_key:nn {moddate} {ModDate} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { pdfmetadate .code:n = { \@@_store_metadata:nn {pdfmetadate}{#1} } } @@ -3936,12 +4032,12 @@ % \begin{hypkey}{pdftrapped} % Trapped is a bit curious, it has an value "unknown", and one can't suppress it ... % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { ,pdftrapped .code:n = { \exp_args:Nne - \keys_set:nn { hyp / setup } { _pdftrapped = \str_uppercase:n { #1 } } + \keys_set:nn { hyp } { _pdftrapped = \str_uppercase:n { #1 } } } ,_pdftrapped .choices:nn = {TRUE,FALSE,UNKNOWN} { @@ -3969,7 +4065,7 @@ % \begin{hypkey}{pdfinfo} % pdfinfo allows to set the info keys with keyval ... % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { pdfinfo .code:n = { @@ -3980,10 +4076,10 @@ % \end{hypkey} % Now we set some default values % \begin{macrocode} -\keys_set:nn { hyp / setup} {pdfcreator = LaTeX~with~hyperref} -\keys_set:nn { hyp / setup} {pdfauthor = } -\keys_set:nn { hyp / setup} {pdftitle = } -\keys_set:nn { hyp / setup} {pdfsubject = } +\keys_set:nn { hyp} {pdfcreator = LaTeX~with~hyperref} +\keys_set:nn { hyp} {pdfauthor = } +\keys_set:nn { hyp} {pdftitle = } +\keys_set:nn { hyp} {pdfsubject = } % \end{macrocode} % % \subsection{hyperxmp keys} @@ -4032,7 +4128,7 @@ ,pdfdate } { - \keys_define:nn { hyp / setup } + \keys_define:nn { hyp } { #1 .code:n= { \@@_store_metadata:nn {#1}{##1}} } @@ -4043,7 +4139,7 @@ % \subsection{Transitions} % pdfpageduration sets the duration a page is shown in full screen mode. % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { pdfpageduration .code:n = { @@ -4088,7 +4184,7 @@ % opaque & true or false, only relevant for Fly style % \end{tabular} % \begin{macrocode} -\keys_define:nn { hyp / setup } +\keys_define:nn { hyp } { pdfpagetransition .code:n = { @@ -4180,7 +4276,7 @@ % % Finally we process the package option list, to get most keys working % \begin{macrocode} -\keys_set_known:nv{hyp/setup}{opt@hyperref.sty} +\keys_set_known:nv{ hyp }{opt@hyperref.sty} % \end{macrocode} % % Unfinished diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3backend-testphase.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3backend-testphase.dtx index 37e47d5c91b..03e50367f20 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3backend-testphase.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3backend-testphase.dtx @@ -45,7 +45,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % @@ -56,27 +56,27 @@ % \begin{macrocode} %<drivers>\ProvidesExplFile %<*dvipdfmx> - {l3backend-testphase-dvipdfmx.def}{2023-11-17}{} + {l3backend-testphase-dvipdfmx.def}{2023-12-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: dvipdfmx} %</dvipdfmx> %<*dvips> - {l3backend-testphase-dvips.def}{2023-11-17}{} + {l3backend-testphase-dvips.def}{2023-12-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: dvips} %</dvips> %<*dvisvgm> - {l3backend-testphase-dvisvgm.def}{2023-11-17}{} + {l3backend-testphase-dvisvgm.def}{2023-12-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: dvisvgm} %</dvisvgm> %<*luatex> - {l3backend-testphase-luatex.def}{2023-11-17}{} + {l3backend-testphase-luatex.def}{2023-12-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (LuaTeX)} %</luatex> %<*pdftex> - {l3backend-testphase-pdftex.def}{2023-11-17}{} + {l3backend-testphase-pdftex.def}{2023-12-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (pdfTeX)} %</pdftex> %<*xdvipdfmx> - {l3backend-testphase-xetex.def}{2023-11-17}{} + {l3backend-testphase-xetex.def}{2023-12-09}{} {LaTeX~PDF~management~testphase~bundle~backend~support: XeTeX} %</xdvipdfmx> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfannot.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfannot.dtx index 4c0942ad727..dfb1f12e75f 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfannot.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfannot.dtx @@ -48,7 +48,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -432,7 +432,7 @@ % \begin{macrocode} %<@@=pdfannot> %<*header> -\ProvidesExplPackage{l3pdfannot}{2023-11-17}{0.96c} +\ProvidesExplPackage{l3pdfannot}{2023-12-09}{0.96d} {PDF-annotations} \RequirePackage{l3pdfdict} %</header> @@ -441,7 +441,8 @@ % bitset for it. % \begin{macrocode} %<*package> -\RequirePackage{l3bitset} +\cs_if_exist:NF \bitset_new:Nn + { \RequirePackage { l3bitset } } \bitset_new:Nn \l_pdfannot_F_bitset { Invisible = 1, diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfdict.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfdict.dtx index abb1d339364..d1007322fa5 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfdict.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfdict.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -208,7 +208,7 @@ % \begin{macrocode} %<@@=pdfdict> %<*header> -\ProvidesExplPackage{l3pdfdict}{2023-11-17}{0.96c} +\ProvidesExplPackage{l3pdfdict}{2023-12-09}{0.96d} {Tools for PDF dictionaries (LaTeX PDF management testphase bundle)} %</header> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-action.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-action.dtx index b4d535bfc2f..ef7f1a5c4c5 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-action.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-action.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-checkbox.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-checkbox.dtx index dfbf0c3af31..6e6f5fe007b 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-checkbox.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-checkbox.dtx @@ -64,7 +64,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-choice.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-choice.dtx index c94891b7331..ae2cdec29d1 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-choice.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-choice.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-pushbutton.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-pushbutton.dtx index fb7b913a76f..cf0153732e2 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-pushbutton.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-pushbutton.dtx @@ -55,7 +55,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-radiobutton.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-radiobutton.dtx index e9519906506..2f9ce890c52 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-radiobutton.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-radiobutton.dtx @@ -83,7 +83,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-textfield.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-textfield.dtx index 7922c659a75..15fe26a8050 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-textfield.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-textfield.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield.dtx index 59275311f49..28ce09312cb 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield.dtx @@ -69,7 +69,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -972,7 +972,7 @@ %<*package> %<@@=pdffield> \NeedsTeXFormat{LaTeX2e} -\ProvidesExplPackage{l3pdffield-testphase}{2023-11-17}{0.96c}% +\ProvidesExplPackage{l3pdffield-testphase}{2023-12-09}{0.96d}% {form fields} % \end{macrocode} % \subsection{hyperref specific command} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffile.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffile.dtx index 5a11d41e7ee..01d247b7e72 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffile.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffile.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -398,7 +398,7 @@ % % \begin{macrocode} %<*header> -\ProvidesExplPackage{l3pdffile}{2023-11-17}{0.96c} +\ProvidesExplPackage{l3pdffile}{2023-12-09}{0.96d} {embedding and referencing files in PDF---LaTeX PDF management testphase bundle} \RequirePackage{l3pdftools} %temporarly!! %</header> diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmanagement.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmanagement.dtx index 88704f2e51c..2a7ce89481f 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmanagement.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmanagement.dtx @@ -57,7 +57,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -632,7 +632,7 @@ %<@@=pdfmanagement> %<*header> % -\ProvidesExplPackage{l3pdfmanagement}{2023-11-17}{0.96c} +\ProvidesExplPackage{l3pdfmanagement}{2023-12-09}{0.96d} {Management of core PDF dictionaries (LaTeX PDF management testphase bundle)} %</header> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmeta.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmeta.dtx index 6d6b19b2deb..720669e2375 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmeta.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmeta.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -458,6 +458,33 @@ % It is up to the author to ensure and validate % that the document actually follows the standard. % +% \subsubsection{Declarations} +% PDF knows beside standards also a more generic method to declare conformance +% to some specification by adding a declaration, +% see \url{https://pdfa.org/wp-content/uploads/2019/09/PDF-Declarations.pdf}). +% Such declarations can be added as a simple url which identify the specification or +% with additional details regarding date and credentials. An example would be +% +% \begin{verbatim} +% \DocumentMetadata{} +% \documentclass{article} +% \ExplSyntaxOn +% \pdfmeta_xmp_add_declaration:e {https://pdfa.org/declarations\c_hash_str iso32005} +% \pdfmeta_xmp_add_declaration:ennnn +% {https://pdfa.org/declarations\c_hash_str wcag21A}{}{2023-11-20}{}{} +% \pdfmeta_xmp_add_declaration:nnnnn +% {https://github.com/TikZlings/no-duck-harmed} +% {Ulrike~Fischer}{2023-11-20}{Bär}{https://github.com/u-fischer/bearwear} +% \pdfmeta_xmp_add_declaration:nnnnn +% {https://github.com/TikZlings/no-duck-harmed} +% {Ulrike~Fischer}{2023-11-20}{Paulo}{https://github.com/cereda/sillypage} +% \ExplSyntaxOff +% \begin{document} +% text +% \end{document} +% +% \end{verbatim} +% % \subsubsection{Dates} % \begin{itemize} % \item @@ -557,6 +584,31 @@ % With this command a xmlns name space can be added. % \end{function} % +% With the two following commands PDF declarations can be added to the XMP metadata +% (see \url{https://pdfa.org/wp-content/uploads/2019/09/PDF-Declarations.pdf}). +% \begin{function}{\pdfmeta_xmp_add_declaration:n,\pdfmeta_xmp_add_declaration:e} +% \begin{syntax} +% \cs{pdfmeta_xmp_add_declaration:n}\Arg{uri} +% \end{syntax} +% This add a PDF declaration with the required |conformsTo| property to the XMP metadata. +% \meta{uri} should not be empty and is a URI specifying +% the standard or profile referred to by the PDF +% Declaration. If the uri contains a hash, use \cs{c_hash_str} to excape it +% and use the \texttt{e} variant to expand it. +% \end{function} +% +% \begin{function}{\pdfmeta_xmp_add_declaration:nnnnn,\pdfmeta_xmp_add_declaration:ennnn} +% \begin{syntax} +% \cs{pdfmeta_xmp_add_declaration:nnnnn}\Arg{uri}\Arg{By}\Arg{Date}\Arg{Credentials}\Arg{Report} +% \end{syntax} +% This add a PDF declaration to the XMP metadata similar +% to \cs{pdfmeta_xmp_add_declaration:n}. +% With \meta{By}, \meta{Date}, \meta{Credentials}, \meta{Report} the optional +% fields |claimBy| (text), |claimDate| (iso date), |claimCredentials| (text) and +% |claimReport| (uri) of the |claimData| property can be given. +% If \cs{pdfmeta_xmp_add_declaration:nnnnn} is used twice with the same \meta{uri} +% argument the |claimData| are concatenated. There is no check if the |claimData| are identical. +% \end{function} % \end{documentation} % % \begin{implementation} @@ -566,7 +618,7 @@ % \begin{macrocode} %<@@=pdfmeta> %<*header> -\ProvidesExplPackage{l3pdfmeta}{2023-11-17}{0.96c} +\ProvidesExplPackage{l3pdfmeta}{2023-12-09}{0.96d} {PDF-Standards---LaTeX PDF management testphase bundle} %</header> % \end{macrocode} @@ -1217,7 +1269,7 @@ {\AddToDocumentProperties [document]{pdfstandard-X}{PDF/X-6p}}, _pdfstandard / UA-1 .code:n = { - \AddToDocumentProperties [document]{pdfstandard-UA}{{1}{2016}} + \AddToDocumentProperties [document]{pdfstandard-UA}{{1}{}} }, _pdfstandard / UA-2 .code:n = {\AddToDocumentProperties [document]{pdfstandard-UA}{{2}{2023}}}, @@ -1735,6 +1787,7 @@ \@@_xmp_build_pdf: \@@_xmp_build_xmpRights: \@@_xmp_build_standards: %pdfaid,pdfxid,pdfuaid + \@@_xmp_build_pdfd: \@@_xmp_build_dc: \@@_xmp_build_photoshop: \@@_xmp_build_xmp: @@ -2129,6 +2182,84 @@ } % \end{macrocode} % \item[jav]: currently ignored +% +% \item[declarations] The PDF Declarations mechanism allows creation and +% editing software to declare, via a PDF Declaration, a PDF file to be in +% conformance with a 3rd party specification or profile +% that may not be related to PDF technology. Their specification is for example +% described in \url{https://pdfa.org/wp-content/uploads/2019/09/PDF-Declarations.pdf}. +% +% If declarations are added to the XMP-metadata they need (for pdf/A compliancy) a +% schema declaration. We do not add it by default but define here a command to enable +% it. (This can be done in the document preamble as xmp is built only at the end.) +% +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_xmp_schema_enable_pdfd: + { + \@@_xmp_xmlns_new:ne {pdfd}{http://pdfa.org/declarations/} + \@@_xmp_schema_new:nnn + {PDF~Declarations~Schema} + {pdfd} + {http://pdfa.org/declarations/} + \@@_xmp_property_new:nnnnn + {pdfd} + {declarations} + {Bag~declaration} + {external} + {An~unordered~array~of~PDF~Declaration~entries,~where~each~PDF~Declaration~representing~a~statement~of~conformance~with~ an~identified~external~standard~or~profile,~along~with~optional~information~identifying~the~nature~of~the~claim.} +% \end{macrocode} +% the values are complicated so we use the additions: method to add them. +% \begin{macrocode} + \cs_new_protected:cpn { __pdfmeta_xmp_schema_pdfd_additions: } + { + \@@_xmp_add_packet_open:nn{pdfaSchema}{valueType} + \@@_xmp_add_packet_open:nn{rdf}{Seq} + \@@_xmp_add_packet_open_attr:nnn{rdf}{li}{rdf:parseType="Resource"} + \@@_xmp_add_packet_line:nnn{pdfaType}{type}{claim} + \@@_xmp_add_packet_line:nnn{pdfaType}{namespaceURI} + {http://pdfa.org/declarations/} + \@@_xmp_add_packet_line:nnn{pdfaType}{prefix}{pdfd} + \@@_xmp_add_packet_line:nnn{pdfaType}{description} + {A~structure~describing~properties~of~an~individual claim.} + \@@_xmp_add_packet_open:nn{pdfaType}{field} + \@@_xmp_add_packet_open:nn{rdf}{Seq} + \@@_xmp_add_packet_field:nnn{claimReport}{Text} + {A~URL~to~a~report~containing~details~of~the~specific~conformance~claim.} + \@@_xmp_add_packet_field:nnn{claimCredentials}{Text} + {The~claimant's~credentials.} + \@@_xmp_add_packet_field:nnn{claimDate}{Text} + {A~date~identifying~when~the~claim~was~made.} + \@@_xmp_add_packet_field:nnn{claimBy}{Text} + {The~name~of~the~organization~and/or~individual~and/or~software~making~the~claim.} + \@@_xmp_add_packet_close:nn{rdf}{Seq} + \@@_xmp_add_packet_close:nn{pdfaType}{field} + \@@_xmp_add_packet_close:nn{rdf}{li} + \@@_xmp_add_packet_open_attr:nnn{rdf}{li}{rdf:parseType="Resource"} + \@@_xmp_add_packet_line:nnn{pdfaType}{type}{declaration} + \@@_xmp_add_packet_line:nnn{pdfaType}{namespaceURI} + {http://pdfa.org/declarations/} + \@@_xmp_add_packet_line:nnn{pdfaType}{prefix}{pdfd} + \@@_xmp_add_packet_line:nnn{pdfaType}{description} + {A~structure~describing~a~single~PDF~ Declaration~asserting~conformance~with~ an~externally-identified~standard~or~ profile.} + \@@_xmp_add_packet_open:nn{pdfaType}{field} + \@@_xmp_add_packet_open:nn{rdf}{Seq} + \@@_xmp_add_packet_field:nnn{conformsTo}{Text} + {A~property~containing~a~URI~specifying~the~standard~or~profile~by~the~PDF~Declaration.~This~property~is~ intended~to~mirror~the~Dublin~Core~property~dc:conformsTo.} + \@@_xmp_add_packet_field:nnn{claimData}{Bag~claim} + {An~unordered~array~of~claim~data,~where~each~claim~identifies~the~nature~of~the~claim.} + \@@_xmp_add_packet_close:nn{rdf}{Seq} + \@@_xmp_add_packet_close:nn{pdfaType}{field} + \@@_xmp_add_packet_close:nn{rdf}{li} + \@@_xmp_add_packet_close:nn{rdf}{Seq} + \@@_xmp_add_packet_close:nn{pdfaSchema}{valueType} + } +% \end{macrocode} +% the schema should be added only once so disable it after use: +% \begin{macrocode} + \cs_gset_eq:NN \@@_xmp_schema_enable_pdfd: \prg_do_nothing: + } +% \end{macrocode} % % \end{description} % \subsection{The actual user / document data} @@ -2241,8 +2372,56 @@ % \end{macrocode} % \end{macro} % - -% \subsubsection{Photoshop} +% \subsection{Declarations} +% See \url{https://pdfa.org/wp-content/uploads/2019/09/PDF-Declarations.pdf} +% +% \begin{variable}{\g_@@_xmp_pdfd_data_prop} +% This holds the data for declarations. +% \begin{macrocode} +\prop_new:N \g_@@_xmp_pdfd_data_prop +% \end{macrocode} +% \end{variable} +% the main building command used in the xmp generation +% \begin{macro}{\@@_xmp_build_pdfd:} +% \begin{macrocode} +\cs_new_protected:Npn \@@_xmp_build_pdfd: + { + \prop_if_empty:NF\g_@@_xmp_pdfd_data_prop + { + \@@_xmp_add_packet_open:nn{pdfd}{declarations} + \@@_xmp_add_packet_open:nn{rdf}{Bag} + \prop_map_inline:Nn \g_@@_xmp_pdfd_data_prop + { + \@@_xmp_build_pdfd_claim:nn{##1}{##2} + } + \@@_xmp_add_packet_close:nn{rdf}{Bag} + \@@_xmp_add_packet_close:nn{pdfd}{declarations} + } + } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@_xmp_build_pdfd_claim:nn} +% This build the xml for one claim. If there is no +% claimData only the conformsTo is output. +% \begin{macrocode} +\cs_new_protected:Npn \@@_xmp_build_pdfd_claim:nn #1#2 + { + \@@_xmp_add_packet_open_attr:nnn{rdf}{li}{rdf:parseType="Resource"} + \@@_xmp_add_packet_line:nnn{pdfd}{conformsTo}{#1} + \tl_if_empty:nF {#2} + { + \@@_xmp_add_packet_open:nn{pdfd}{claimData} + \@@_xmp_add_packet_open:nn{rdf}{Bag} + #2 + \@@_xmp_add_packet_close:nn{rdf}{Bag} + \@@_xmp_add_packet_close:nn{pdfd}{claimData} + } + \@@_xmp_add_packet_close:nn{rdf}{li} + } +% \end{macrocode} +% \end{macro} +% +% \subsection{Photoshop} % \begin{macro}{\@@_xmp_build_photoshop:} % \begin{macrocode} \cs_new_protected:Npn \@@_xmp_build_photoshop: @@ -2633,6 +2812,45 @@ } % \end{macrocode} % \end{macro} +% +% \begin{macro}{\pdfmeta_xmp_add_declaration:n,\pdfmeta_xmp_add_declaration:e} +% \begin{macrocode} +\cs_new_protected:Npn \pdfmeta_xmp_add_declaration:n #1 %conformsTo uri + { + \@@_xmp_schema_enable_pdfd: + \prop_gput:Nnn\g_@@_xmp_pdfd_data_prop{#1}{} + } +\cs_generate_variant:Nn \pdfmeta_xmp_add_declaration:n {e} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdfmeta_xmp_add_declaration:nnnnn,\pdfmeta_xmp_add_declaration:ennnn} +% \begin{macrocode} +\cs_new_protected:Npn \pdfmeta_xmp_add_declaration:nnnnn #1#2#3#4#5 + %#1=conformsTo uri, #2 claimBy, #3 claimDate #4 claimCredentials #4 claimReport + { + \@@_xmp_schema_enable_pdfd: + \tl_set:Nn \l_@@_tmpa_tl + { + \@@_xmp_add_packet_open_attr:nnn{rdf}{li}{rdf:parseType="Resource"} + \@@_xmp_add_packet_line:nnn{pdfd}{claimBy}{#2} + \@@_xmp_add_packet_line:nnn{pdfd}{claimDate}{#3} + \@@_xmp_add_packet_line:nnn{pdfd}{claimCredentials}{#4} + \@@_xmp_add_packet_line:nnn{pdfd}{claimReport}{#5} + \@@_xmp_add_packet_close:nn{rdf}{li} + } + \prop_get:NnNT \g_@@_xmp_pdfd_data_prop {#1}\l_@@_tmpb_tl + { + \tl_concat:NNN \l_@@_tmpa_tl \l_@@_tmpa_tl \l_@@_tmpb_tl + } + \prop_gput:Nno\g_@@_xmp_pdfd_data_prop{#1} + { + \l_@@_tmpa_tl + } + } +\cs_generate_variant:Nn\pdfmeta_xmp_add_declaration:nnnnn {e} +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdftools.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdftools.dtx index c6efc127f39..3e5dc1f1fff 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdftools.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdftools.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -231,7 +231,7 @@ % % \begin{macrocode} %<*header> -\ProvidesExplPackage{l3pdftools}{2023-11-17}{0.96c} +\ProvidesExplPackage{l3pdftools}{2023-12-09}{0.96d} {candidate commands for l3pdf---LaTeX PDF management testphase bundle} %</header> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfxform.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfxform.dtx index 0f3196cb0a7..3928d790d33 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfxform.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfxform.dtx @@ -48,7 +48,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -132,7 +132,7 @@ % \begin{macrocode} %<@@=pdf> %<*header> -\ProvidesExplPackage{l3pdfxform}{2023-11-17}{0.96c} +\ProvidesExplPackage{l3pdfxform}{2023-12-09}{0.96d} {command to create xforms (beta)---LaTeX PDF management testphase bundle} %</header> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/ltdocinit.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/ltdocinit.dtx index 332012c4dc2..7688446417c 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/ltdocinit.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/ltdocinit.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -220,7 +220,7 @@ % \begin{macrocode} %<@@=pdfmanagement> %<*header> -\ProvidesExplPackage{ltdocinit}{2023-11-17}{0.96c} +\ProvidesExplPackage{ltdocinit}{2023-12-09}{0.96d} {Initialize document metadata} %</header> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-firstaid.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-firstaid.dtx index 6154ccf3e34..cdcc24255ed 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-firstaid.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-firstaid.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -63,7 +63,7 @@ % |debug={firstaidoff={name1,name2,...},...}|. % \begin{macrocode} %<*package> -\ProvidesExplPackage{pdfmanagement-firstaid}{2023-11-17}{0.96c} +\ProvidesExplPackage{pdfmanagement-firstaid}{2023-12-09}{0.96d} {LaTeX PDF management testphase bundle / firstaid-patches} %<@@=pdfmanagement> diff --git a/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-testphase.dtx b/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-testphase.dtx index a685374c524..189f496cf26 100644 --- a/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-testphase.dtx +++ b/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-testphase.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Version 0.96c, released 2023-11-17} +% \date{Version 0.96d, released 2023-12-09} % % \maketitle % \begin{documentation} @@ -233,10 +233,7 @@ % % \section{Requirements} % The new PDF management is developed parallel to the \LaTeX{} format -% and should be updated together with the format. It -% requires currently a \LaTeX{} format from 2023/11/01 or later -% and an L3 programming layer of 2023-11-01 or later. -% It currently depends on the experimental package and \pkg{l3bitset}. +% and should be updated together with the format. % In some places, e.g. when writing strings to the pdf it assumes that % the file is utf8 encoded -- ascii will naturally work too, but legacy 8bit encodings are % not supported. @@ -397,7 +394,7 @@ % \begin{macrocode} %<@@=pdf> %<*package> -\ProvidesExplPackage{pdfmanagement-testphase}{2023-11-17}{0.96c} +\ProvidesExplPackage{pdfmanagement-testphase}{2023-12-09}{0.96d} {LaTeX PDF management testphase bundle} \providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion} \IfFormatAtLeastTF{2020-10-01}{}{ @@ -425,7 +422,7 @@ % to allow to set it in the document. % \begin{macrocode} %<*header> -\ProvidesExplFile{pdfmanagement-testphase.ltx}{2023-11-17}{0.96c} +\ProvidesExplFile{pdfmanagement-testphase.ltx}{2023-12-09}{0.96d} {PDF~management~code~(testphase)} % \end{macrocode} % We define a boolean for the new delayed shipout. This is temporary. At some |