summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/pdfmanagement-testphase
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/pdfmanagement-testphase')
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/hyperref-generic.dtx500
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3backend-testphase.dtx14
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfannot.dtx7
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfdict.dtx4
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-action.dtx2
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-checkbox.dtx2
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-choice.dtx2
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-pushbutton.dtx2
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-radiobutton.dtx2
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-textfield.dtx2
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield.dtx4
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffile.dtx4
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmanagement.dtx4
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmeta.dtx228
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdftools.dtx4
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfxform.dtx4
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/ltdocinit.dtx4
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-firstaid.dtx4
-rw-r--r--Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-testphase.dtx11
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