texlive[69078] Master/texmf-dist: pdfmanagement-testphase (9dec23)

commits+karl at tug.org commits+karl at tug.org
Sat Dec 9 22:35:39 CET 2023


Revision: 69078
          https://tug.org/svn/texlive?view=revision&revision=69078
Author:   karl
Date:     2023-12-09 22:35:39 +0100 (Sat, 09 Dec 2023)
Log Message:
-----------
pdfmanagement-testphase (9dec23)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/README.md
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/hyperref-generic.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3backend-testphase.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdfannot.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdfdict.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-action.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-checkbox.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-choice.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-pushbutton.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-radiobutton.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-textfield.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffile.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdfmanagement.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdfmeta.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdftools.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdfxform.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/ltdocinit.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/pdfmanagement-firstaid.pdf
    trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/pdfmanagement-testphase.pdf
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/hyperref-generic.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3backend-testphase.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfannot.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfdict.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-action.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-checkbox.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-choice.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-pushbutton.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-radiobutton.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-textfield.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffile.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmanagement.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmeta.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdftools.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfxform.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/ltdocinit.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-firstaid.dtx
    trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-testphase.dtx
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/color-ltx.sty
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/hgeneric-testphase.def
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvips.def
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvisvgm.def
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-luatex.def
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-pdftex.def
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-xetex.def
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3pdffield-testphase.sty
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-firstaid.sty
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.sty
    trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/CHANGELOG.md	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/CHANGELOG.md	2023-12-09 21:35:39 UTC (rev 69078)
@@ -6,6 +6,21 @@
 this project uses date-based 'snapshot' version identifiers.
 
 ## [2023-11-17]
+Version: 2023-12-09, 0.96d
+
+### Removed
+
+ - l3bitset is now provided by l3kernel.
+ 
+### Added
+ - 2023-11-20: l3pdfmeta.dtx: support for PDF declarations in XMP metadata, issue #58
+ - hyperref-generic.dtx: option nested-links key to suppress nested links.
+ 
+### Changed
+ - key family in hyperref-generic is now hyp and not hyp/setup
+ - do not use pdfuaid:rev with pdf/UA-1
+   
+## [2023-11-17]
 Version: 2023-11-17, 0.96c
 
  - remove dependency to ltxcmds in the hyperref driver

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/README.md	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/README.md	2023-12-09 21:35:39 UTC (rev 69078)
@@ -1,6 +1,6 @@
 # LaTeX PDF management testphase bundle
 
-Version: 0.96c, 2023-11-17
+Version: 0.96d, 2023-12-09
 
 This package is used during a test phase to load the new PDF management code
 of LaTeX.

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/hyperref-generic.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3backend-testphase.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdfannot.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdfdict.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-action.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-checkbox.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-choice.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-pushbutton.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-radiobutton.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield-textfield.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffield.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdffile.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdfmanagement.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdfmeta.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdftools.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/l3pdfxform.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/ltdocinit.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/pdfmanagement-firstaid.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/pdfmanagement-testphase/pdfmanagement-testphase.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/hyperref-generic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/hyperref-generic.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/hyperref-generic.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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 at 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 at anchor
@@ -1987,7 +1995,46 @@
 %
 % This driver defines for consistency also
 % |\hyper at linklaunch| for Launch and |\hyper at 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 at 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 at xspace@end
-        \@@_link_goto_end:
-        \group_end:
-        \Hy at VerboseLinkStop
+        \int_gincr:N\g_@@_linknestlevel_int
+        \@@_check_link_nesting:TF
+          {
+            \Hy at 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 at xspace@end
+            \@@_link_goto_end:
+            \group_end:
+            \Hy at VerboseLinkStop
+          } 
+          {
+            \group_begin: #3\group_end:
+          }
+        \int_gdecr:N\g_@@_linknestlevel_int
       }
       {{\let\protect\relax#3}}
   }
-
 \cs_new_protected:Npn \hyper at linkstart #1 #2 %#1 context, #2=destination name
   {
     \bool_if:NT \l_@@_annot_GoTo_bool
       {
-        \Hy at 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 at 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 at VerboseLinkStop
+        \@@_check_link_nesting:TF
+          {
+            \@@_link_goto_end:
+            \group_end:
+            \Hy at 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
+        \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 at 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 at xspace@end
+                \Hy at VerboseLinkStop %where is the start??
+              }
+            \group_end:
+           } 
            {
-            \pdfdict_put:nnn{l_hyp/annot/A/URI}{IsMap}{true}
+             \group_begin: #1 \group_end:
            }
-         \cs_set_eq:NN \# \c_hash_str
-         \cs_set_eq:NN \% \c_percent_str
-         \Hy at 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 at xspace@end
-             \Hy at VerboseLinkStop %where is the start??
-           }
-         \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 at xspace@end
+                \Hy at VerboseLinkStop %where is the start??
+              }
+            \group_end:
+          }  
           {
+            \group_begin: #1 \group_end:
           }
-          {
-           \let\protect\relax
-            #1\Hy at xspace@end
-            \Hy at VerboseLinkStop %where is the start??
-          }
-        \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 at xspace@end
-              \Hy at 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 at xspace@end
+                 \Hy at 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 at xspace@end
+                   \Hy at VerboseLinkStop
+                 }
               }
               {
+                \msg_warning:nnn { hyp } { pdfa-no-named-action }{#1}
                 #2
-                \Hy at xspace@end
-                \Hy at 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,7 +2635,7 @@
 %    \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} }
@@ -2546,7 +2642,7 @@
        }
   }
 
-\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,13 +3117,13 @@
 % 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
               }
@@ -3034,7 +3130,7 @@
           }
       }
   }
-\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 at verbose}
    ,debug     .legacy_if_set:n  = {Hy at 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 at ext
    ,extension .initial:n= pdf
@@ -3098,7 +3194,7 @@
    ,plainpages   .legacy_if_set:n = {Hy at 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 at hyperref.sty}
+\keys_set_known:nv{ hyp }{opt at hyperref.sty}
 %    \end{macrocode}
 %
 %  Unfinished

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3backend-testphase.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3backend-testphase.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3backend-testphase.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfannot.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfannot.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfannot.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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,

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfdict.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfdict.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfdict.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-action.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-action.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-action.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Version 0.96c, released 2023-11-17}
+% \date{Version 0.96d, released 2023-12-09}
 %
 % \maketitle
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-checkbox.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-checkbox.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-checkbox.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -64,7 +64,7 @@
 %    }^^A
 % }
 %
-% \date{Version 0.96c, released 2023-11-17}
+% \date{Version 0.96d, released 2023-12-09}
 %
 % \maketitle
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-choice.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-choice.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-choice.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Version 0.96c, released 2023-11-17}
+% \date{Version 0.96d, released 2023-12-09}
 %
 % \maketitle
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-pushbutton.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-pushbutton.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-pushbutton.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -55,7 +55,7 @@
 %    }^^A
 % }
 %
-% \date{Version 0.96c, released 2023-11-17}
+% \date{Version 0.96d, released 2023-12-09}
 %
 % \maketitle
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-radiobutton.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-radiobutton.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-radiobutton.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -83,7 +83,7 @@
 %    }^^A
 % }
 %
-% \date{Version 0.96c, released 2023-11-17}
+% \date{Version 0.96d, released 2023-12-09}
 %
 % \maketitle
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-textfield.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-textfield.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield-textfield.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Version 0.96c, released 2023-11-17}
+% \date{Version 0.96d, released 2023-12-09}
 %
 % \maketitle
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffield.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffile.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffile.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdffile.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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>

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmanagement.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmanagement.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmanagement.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmeta.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmeta.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfmeta.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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,7 +2812,46 @@
   }
 %    \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}
 %

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdftools.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdftools.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdftools.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfxform.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfxform.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/l3pdfxform.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/ltdocinit.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/ltdocinit.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/ltdocinit.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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}

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-firstaid.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-firstaid.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-firstaid.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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>

Modified: trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-testphase.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-testphase.dtx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/source/latex/pdfmanagement-testphase/pdfmanagement-testphase.dtx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -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 at 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

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/color-ltx.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/color-ltx.sty	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/color-ltx.sty	2023-12-09 21:35:39 UTC (rev 69078)
@@ -24,7 +24,7 @@
 %% This file has the LPPL maintenance status "maintained".
 %%
 \NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesPackage{color-ltx}[2023-11-17 v0.96c
+\ProvidesPackage{color-ltx}[2023-12-09 v0.96d
   Standard LaTeX Color (patched for l3color, part of pdfmanagement-testphase, original version 2022/01/06 v1.3d) (DPC)]
 \edef\Gin at codes{%
  \catcode`\noexpand\^^A\the\catcode`\^^A\relax

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/colorspace-patches-tmp-ltx.sty	2023-12-09 21:35:39 UTC (rev 69078)
@@ -19,7 +19,7 @@
 %
 % for those people who are interested.
 \NeedsTeXFormat{LaTeX2e}[2020/10/01]
-\ProvidesExplPackage{colorspace-patches-tmp-ltx}{2023-11-17}{0.96c}
+\ProvidesExplPackage{colorspace-patches-tmp-ltx}{2023-12-09}{0.96d}
   {temporay patches to for the colorspace package to test pdfresource management ... UF}
 
 % colorspace can define more models, that l3color can't yet handle.

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/hgeneric-testphase.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/hgeneric-testphase.def	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/hgeneric-testphase.def	2023-12-09 21:35:39 UTC (rev 69078)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: hyperref-generic.dtx
-\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?
@@ -195,17 +195,17 @@
 \cs_set_protected:Npn \hypersetup #1
   {
      %\kvsetkeys{Hyp} {#1}
-     \keys_set:nn { hyp / setup }{ #1 }
+     \keys_set:nn { hyp }{ #1 }
   }
-\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 }
     }
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     next-anchor .code:n =
     {
@@ -230,7 +230,7 @@
     ,destination .tl_set:N = \l__hyp_href_pdf_destination_tl
     ,pdfremotestartview .code:n =
       {
-        \keys_set:nn { hyp / setup }
+        \keys_set:nn { hyp }
           { pdfremotestartview = #1 }
       }
     ,page .code:n =
@@ -249,7 +249,7 @@
          {
            \pdfdict_put:nnn{l_hyp/annot/A}{Next}{#1}
            \tl_set:Nn \Hy at href@nextactionraw {/Next~#1}
-           \keys_set:nn {hyp / setup }{ pdfnewwindow = true}
+           \keys_set:nn {hyp }{ pdfnewwindow = true}
          }
      }
     ,afrelationship .code:n =
@@ -260,7 +260,7 @@
 
   }
 
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,href / urlencode .bool_set:N =  \l__hyp_href_url_encode_bool
     ,href / urlencode .default:n  = {true}
@@ -401,7 +401,7 @@
   }
 \cs_generate_variant:Nn \__hyp_store_metadata:nn {en,ne,ee}
 \hook_new:n{hyp/link/cite}
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,citecolor .code:n = {\__hyp_color_set:ne {hyp/color/cite}{#1}\__hyp_citecolor_hook_init:}
     ,citebordercolor
@@ -411,7 +411,7 @@
  {
    \hook_gput_code:nnn { hyp/link/cite }{hyp/cite}
      {
-       \keys_set:nn { hyp / setup }
+       \keys_set:nn { hyp }
          {
            linkcolor      = hyp/color/cite
          }
@@ -422,7 +422,7 @@
  {
    \hook_gput_code:nnn { hyp/link/cite }{hyp/citeborder}
      {
-       \keys_set:nn { hyp / setup }
+       \keys_set:nn { hyp }
          {
            linkbordercolor      = hyp/color/citeborder
          }
@@ -589,6 +589,27 @@
         \__hyp_PageLabels_gpush:
       }
   }
+\int_new:N \g__hyp_linknestlevel_int
+\prg_new_conditional:Npnn \__hyp_if_outer_link: {TF}
+ {
+   \int_compare:nNnTF { \g__hyp_linknestlevel_int } > {1}
+     { \prg_return_false:  }
+     { \prg_return_true: }
+ }
+
+\cs_new:Npn \__hyp_check_link_nesting:TF #1 #2
+ {
+   \use_i:nn {#1}{#2}
+ }
+\keys_define:nn { hyp }
+  {
+    nested-links .choice:,
+    nested-links / true .code:n =
+     { \cs_set_eq:NN \__hyp_check_link_nesting:TF \use_i:nn },
+    nested-links / false .code:n =
+     { \cs_set_eq:NN \__hyp_check_link_nesting:TF \__hyp_if_outer_link:TF },
+    nested-links .default:n = {true}
+  }
 \Hy at WrapperDef \__hyp_destination:nn #1 #2
   {
     \mode_if_horizontal:T { \@savsf\spacefactor }
@@ -670,27 +691,41 @@
   {
     \bool_if:NTF \l__hyp_annot_GoTo_bool
       {
-        \Hy at VerboseLinkStart{#1}{#2}
-        \group_begin:
-        \tl_set:Nn \l_hyp_current_dest_name_tl {#2}
-        \hook_use:n {hyp/link/#1}
-        \__hyp_link_goto_begin:nw {#2}#3\Hy at xspace@end
-        \__hyp_link_goto_end:
-        \group_end:
-        \Hy at VerboseLinkStop
+        \int_gincr:N\g__hyp_linknestlevel_int
+        \__hyp_check_link_nesting:TF
+          {
+            \Hy at VerboseLinkStart{#1}{#2}
+            \group_begin:
+            \tl_set:Nn \l_hyp_current_dest_name_tl {#2}
+            \hook_use:n {hyp/link/#1}
+            \__hyp_link_goto_begin:nw {#2}#3\Hy at xspace@end
+            \__hyp_link_goto_end:
+            \group_end:
+            \Hy at VerboseLinkStop
+          }
+          {
+            \group_begin: #3\group_end:
+          }
+        \int_gdecr:N\g__hyp_linknestlevel_int
       }
       {{\let\protect\relax#3}}
   }
-
 \cs_new_protected:Npn \hyper at linkstart #1 #2 %#1 context, #2=destination name
   {
     \bool_if:NT \l__hyp_annot_GoTo_bool
       {
-        \Hy at VerboseLinkStart{#1}{#2}% only for debug
-        \group_begin:
-        \tl_set:Nn \l_hyp_current_dest_name_tl {#2}
-        \hook_use:n {hyp/link/#1}
-        \__hyp_link_goto_begin:nw {#2}
+        \int_gincr:N\g__hyp_linknestlevel_int
+        \__hyp_check_link_nesting:TF
+          {
+            \Hy at VerboseLinkStart{#1}{#2}% only for debug
+            \group_begin:
+            \tl_set:Nn \l_hyp_current_dest_name_tl {#2}
+            \hook_use:n {hyp/link/#1}
+            \__hyp_link_goto_begin:nw {#2}
+          }
+          {
+            \group_begin:
+          }
       }
   }
 
@@ -698,9 +733,16 @@
   {
     \bool_if:NT \l__hyp_annot_GoTo_bool
       {
-        \__hyp_link_goto_end:
-        \group_end:
-        \Hy at VerboseLinkStop
+        \__hyp_check_link_nesting:TF
+          {
+            \__hyp_link_goto_end:
+            \group_end:
+            \Hy at VerboseLinkStop
+          }
+          {
+            \group_end:
+          }
+        \int_gdecr:N\g__hyp_linknestlevel_int
       }
   }
 \pdfdict_new:n   {l_hyp/annot/A/URI}
@@ -711,31 +753,39 @@
   {
     \bool_if:NTF \l__hyp_annot_URI_bool
       {
-        \group_begin:
-         \__hyp_text_pdfstring:eoN
-           { #2}
-           { \l__hyp_text_enc_uri_print_tl }
-           \l__hyp_uri_tmpa_tl
-         \pdfdict_put:nno{l_hyp/annot/A/URI}{URI}{\l__hyp_uri_tmpa_tl}
-         \bool_if:NT \l__hyp_href_url_ismap_bool
-           {
-            \pdfdict_put:nnn{l_hyp/annot/A/URI}{IsMap}{true}
+        \int_gincr:N\g__hyp_linknestlevel_int
+        \__hyp_check_link_nesting:TF
+          {
+           \group_begin:
+            \__hyp_text_pdfstring:eoN
+              { #2}
+              { \l__hyp_text_enc_uri_print_tl }
+              \l__hyp_uri_tmpa_tl
+            \pdfdict_put:nno{l_hyp/annot/A/URI}{URI}{\l__hyp_uri_tmpa_tl}
+            \bool_if:NT \l__hyp_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 at 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 at xspace@end
+                \Hy at VerboseLinkStop %where is the start??
+              }
+            \group_end:
            }
-         \cs_set_eq:NN \# \c_hash_str
-         \cs_set_eq:NN \% \c_percent_str
-         \Hy at safe@activestrue
-         \mode_leave_vertical:
-         \pdfannot_dict_put:nne {link/URI}{A}{<<\pdfdict_use:n {l_hyp/annot/A/URI}>>}
-         \pdfannot_link:nen { URI }
            {
+             \group_begin: #1 \group_end:
            }
-           {
-             \let\protect\relax
-             #1
-             \Hy at xspace@end
-             \Hy at VerboseLinkStop %where is the start??
-           }
-         \group_end:
+         \int_gdecr:N\g__hyp_linknestlevel_int
       }
       {{\let\protect\relax#1}}
   }
@@ -749,52 +799,60 @@
   {
    \bool_if:NTF \l__hyp_annot_GoToR_bool
      {
-        \group_begin:
-        \tl_set:Ne \l__hyp_filename_tmpa_tl { \text_expand:n { #2 } }
-        \exp_args:Ne
-          \pdf_object_if_exist:nF { __hyp_file_\tl_to_str:N \l__hyp_filename_tmpa_tl }
-            {
-              \pdfdict_put:nne { l_pdffile/Filespec}{Subtype}{\pdf_name_from_unicode_e:n {application/pdf}}
-              \pdffile_embed_file:noe
-                {}
-                {\l__hyp_filename_tmpa_tl }
-                {__hyp_file_\tl_to_str:N \l__hyp_filename_tmpa_tl }
-            }
-        \pdfdict_put:nne
-           {l_hyp/annot/A/GoToR}
-           {F}
-           {\pdf_object_ref:e {__hyp_file_\tl_to_str:N \l__hyp_filename_tmpa_tl}}
-        \__hyp_text_pdfstring:nnN
-          { #3 }
-          { \l__hyp_text_enc_dest_print_tl }
-          \l__hyp_dest_name_tmpa_tl
-        \tl_if_blank:eTF {#3}
+        \int_gincr:N\g__hyp_linknestlevel_int
+        \__hyp_check_link_nesting:TF
           {
-            \pdfdict_put:nne {l_hyp/annot/A/GoToR}{D}
+            \group_begin:
+            \tl_set:Ne \l__hyp_filename_tmpa_tl { \text_expand:n { #2 } }
+            \exp_args:Ne
+              \pdf_object_if_exist:nF { __hyp_file_\tl_to_str:N \l__hyp_filename_tmpa_tl }
+                {
+                  \pdfdict_put:nne { l_pdffile/Filespec}{Subtype}{\pdf_name_from_unicode_e:n {application/pdf}}
+                  \pdffile_embed_file:noe
+                    {}
+                    {\l__hyp_filename_tmpa_tl }
+                    {__hyp_file_\tl_to_str:N \l__hyp_filename_tmpa_tl }
+                }
+            \pdfdict_put:nne
+               {l_hyp/annot/A/GoToR}
+               {F}
+               {\pdf_object_ref:e {__hyp_file_\tl_to_str:N \l__hyp_filename_tmpa_tl}}
+            \__hyp_text_pdfstring:nnN
+              { #3 }
+              { \l__hyp_text_enc_dest_print_tl }
+              \l__hyp_dest_name_tmpa_tl
+            \tl_if_blank:eTF {#3}
               {
-               [
-                 \int_eval:n
-                  { \int_max:nn {0}{ 0\l__hyp_href_pdf_page_tl - 1 }}
-                 /\l__hyp_dest_pdfremotestartview_tl
-               ]
+                \pdfdict_put:nne {l_hyp/annot/A/GoToR}{D}
+                  {
+                   [
+                     \int_eval:n
+                      { \int_max:nn {0}{ 0\l__hyp_href_pdf_page_tl - 1 }}
+                     /\l__hyp_dest_pdfremotestartview_tl
+                   ]
+                  }
               }
+              {
+                \pdfdict_put:nno {l_hyp/annot/A/GoToR}{D}{\l__hyp_dest_name_tmpa_tl}
+              }
+            \mode_leave_vertical:
+            \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 at xspace@end
+                \Hy at VerboseLinkStop %where is the start??
+              }
+            \group_end:
           }
           {
-            \pdfdict_put:nno {l_hyp/annot/A/GoToR}{D}{\l__hyp_dest_name_tmpa_tl}
+            \group_begin: #1 \group_end:
           }
-        \mode_leave_vertical:
-        \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 at xspace@end
-            \Hy at VerboseLinkStop %where is the start??
-          }
-        \group_end:
+        \int_gdecr:N\g__hyp_linknestlevel_int
      }
      {{\let\protect\relax#1}}
   }
@@ -806,44 +864,53 @@
   {
    \bool_if:NTF \l__hyp_annot_Launch_bool
      {
-        \group_begin:
-          \__hyp_text_pdfstring:nnN
-            { #1 }
-            { \l__hyp_text_enc_file_print_tl }
-            \l__hyp_filename_tmpa_tl
-          \pdfdict_put:nno {l_hyp/annot/A/Launch}{F}{\l__hyp_filename_tmpa_tl}
-          \__hyp_text_pdfstring:noN
-            { #3 }
-            { \l__hyp_text_enc_para_print_tl }
-            \l__hyp_para_tmpa_tl
-          \bool_if:nTF
-            {
-              \str_if_eq_p:Vn \l__hyp_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__hyp_para_tmpa_tl /F \l__hyp_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
-            }
-            {
-              \let\protect\relax
-              #2\Hy at xspace@end
-              \Hy at VerboseLinkStop %where is the start??
-            }
-        \group_end:
+        \int_gincr:N\g__hyp_linknestlevel_int
+        \__hyp_check_link_nesting:TF
+          {
+           \group_begin:
+             \__hyp_text_pdfstring:nnN
+               { #1 }
+               { \l__hyp_text_enc_file_print_tl }
+               \l__hyp_filename_tmpa_tl
+             \pdfdict_put:nno {l_hyp/annot/A/Launch}{F}{\l__hyp_filename_tmpa_tl}
+             \__hyp_text_pdfstring:noN
+               { #3 }
+               { \l__hyp_text_enc_para_print_tl }
+               \l__hyp_para_tmpa_tl
+             \bool_if:nTF
+               {
+                 \str_if_eq_p:Vn \l__hyp_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__hyp_para_tmpa_tl /F \l__hyp_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 at xspace@end
+                 \Hy at VerboseLinkStop %where is the start??
+               }
+           \group_end:
+          }
+          { \group_begin: #2 \group_end: }
+        \int_gdecr:N\g__hyp_linknestlevel_int
       }
       {{\let\protect\relax#2}}
   }
@@ -862,27 +929,37 @@
   {
     \bool_if:NTF \l__hyp_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__hyp_linknestlevel_int
+         \__hyp_check_link_nesting:TF
+          {
+            \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 }
+                 {
+   %                /A
+   %                  <<
+   %                    \pdfdict_use:n { l_hyp/annot/A/Named }
+   %                  >>
+                 }
+                 {
+                   #2
+                   \Hy at xspace@end
+                   \Hy at VerboseLinkStop
+                 }
               }
               {
+                \msg_warning:nnn { hyp } { pdfa-no-named-action }{#1}
                 #2
-                \Hy at xspace@end
-                \Hy at VerboseLinkStop
               }
-           }
-           {
-             \msg_warning:nnn { hyp } { pdfa-no-named-action }{#1}
-             #2
-           }
-        \group_end:
+           \group_end:
+          }
+          { \group_begin: #2 \group_end: }
+        \int_gdecr:N\g__hyp_linknestlevel_int
       }
       {{\let\protect\relax#2}}
   }
@@ -944,7 +1021,7 @@
            }
        }
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,colorlinks .meta:n =
       {
@@ -960,7 +1037,7 @@
   }
 \seq_map_inline:Nn \c__hyp_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 =     { \__hyp_color_set:ne {hyp/color/#1}{##1} }
@@ -967,7 +1044,7 @@
        }
   }
 
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,allcolors .meta:n =
       {
@@ -979,7 +1056,7 @@
       }
     ,allcolors .value_required:n = true
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,bordercolormodel .choices:nn =
      {rgb,cmyk}
@@ -988,7 +1065,7 @@
   }
 \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
   {
-    \keys_define:nn { hyp / setup }
+    \keys_define:nn { hyp }
       {
         #1bordercolor .code:n =
           {
@@ -1013,7 +1090,7 @@
       }
   }
 
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,allbordercolors .meta:n =
       {
@@ -1028,7 +1105,7 @@
 
 \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
   {
-    \keys_define:nn { hyp / setup }
+    \keys_define:nn { hyp }
       {
         #1border .code:n =
           {
@@ -1047,7 +1124,7 @@
           }
       }
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,pdfborder  .code:n =
       {
@@ -1074,7 +1151,7 @@
   }
 \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
   {
-    \keys_define:nn { hyp / setup }
+    \keys_define:nn { hyp }
       {
         #1borderstyle .code:n =
           {
@@ -1093,7 +1170,7 @@
           }
       }
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,pdfborderstyle  .code:n =
       {
@@ -1216,7 +1293,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 =
             {
@@ -1230,7 +1307,7 @@
        }
   }
   {
-    \keys_define:nn { hyp / setup }
+    \keys_define:nn { hyp }
       {
         ,_ocgcolorlinks .code:n =
           {
@@ -1242,7 +1319,7 @@
       }
   }
 
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,ocgcolorlinks .choice:
     ,ocgcolorlinks / true .meta:n =
@@ -1265,13 +1342,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=
               {
@@ -1286,7 +1363,7 @@
   }
 \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
   {
-    \keys_define:nn { hyp / setup }
+    \keys_define:nn { hyp }
       {
         ,#1highlight .choices:nn =
           { /I, /N, /O, /P}
@@ -1314,7 +1391,7 @@
       }
   }
 
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,pdfhighlight .choices:nn =
       { /I, /N, /O, /P}
@@ -1345,7 +1422,7 @@
          { \exp_not:n {#1} }
       }
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     hidelinks .meta:n =
       {
@@ -1358,7 +1435,7 @@
 
 \seq_map_inline:Nn \c__hyp_annot_types_seq
   {
-    \keys_define:nn { hyp / setup }
+    \keys_define:nn { hyp }
       {
         hide#1 .meta:n =
           {
@@ -1369,13 +1446,13 @@
           }
       }
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     colorscheme .code:n =
       {
         \prop_map_inline:cn { c__hyp_colorscheme_#1_prop }
           {
-            \keys_set:nn { hyp /setup }
+            \keys_set:nn { hyp  }
               {
                  ##1 = ##2
               }
@@ -1382,8 +1459,8 @@
           }
       }
   }
-\keys_set:nn { hyp / setup } {colorscheme=phelype}
-\keys_define:nn { hyp / setup }
+\keys_set:nn { hyp } {colorscheme=phelype}
+\keys_define:nn { hyp }
   {
     ,unicode     .code:n = {}
     ,pdfencoding .code:n = {}
@@ -1392,12 +1469,12 @@
          \msg_warning:nn { hyp }{ pdfversion-disabled }
       }
    }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
  {
    ,verbose   .legacy_if_set:n  = {Hy at verbose}
    ,debug     .legacy_if_set:n  = {Hy at verbose}
  }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
    ,draft .code:n =
      {
@@ -1410,7 +1487,7 @@
        \PassOptionsToPackage{final}{bookmark}
      }
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
  {
    ,extension .tl_set:N = \XR at ext
    ,extension .initial:n= pdf
@@ -1422,7 +1499,7 @@
    ,plainpages   .legacy_if_set:n = {Hy at plainpages}
  }
 
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
  {
    ,linktoc .choices:nn = { none, section, all, page }
      {
@@ -1443,12 +1520,12 @@
 
 \prop_map_inline:Nn \c__hyp_map_hyp_annot_prop
   {
-    \keys_define:nn { hyp / setup }
+    \keys_define:nn { hyp }
      {
        ,#1 .bool_set:c = {l__hyp_annot_#2_bool}
      }
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
  {
    ,baseurl       .code:n =
      {
@@ -2001,7 +2078,7 @@
      }
    ,pdfwindowui    .default:n = true
  }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     ,pdfview .code:n =
       {
@@ -2083,7 +2160,7 @@
       }
     ,pdfview .initial:n  = {xyz}
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
    ,pdflang       .code:n =
           {
@@ -2098,7 +2175,7 @@
 \regex_set:Nn\l__hyp_optlang_regex {\A\[([A-Za-z\-]+)\](.*)}
 \cs_new_protected:Npn \__hyp_setup_info_key:nn #1 #2
   {
-    \keys_define:nn { hyp / setup }
+    \keys_define:nn { hyp }
       {
         pdf#1  .code:n =
           {
@@ -2178,7 +2255,7 @@
 \__hyp_setup_info_key:nn {keywords}  {Keywords}
 \cs_new_protected:Npn \__hyp_setup_info_date_key:nn #1 #2
   {
-    \keys_define:nn { hyp / setup }
+    \keys_define:nn { hyp }
       {
         pdf#1  .code:n =
           {
@@ -2211,16 +2288,16 @@
 
 \__hyp_setup_info_date_key:nn {creationdate}  {CreationDate}
 \__hyp_setup_info_date_key:nn {moddate}  {ModDate}
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
       {
         pdfmetadate  .code:n = { \__hyp_store_metadata:nn {pdfmetadate}{#1} }
       }
-\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}
        {
@@ -2243,7 +2320,7 @@
            { \exp_not:n {#1} }
        }
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     pdfinfo .code:n =
       {
@@ -2250,10 +2327,10 @@
         \keys_set:nn { hyp / info } { #1 }
       }
   }
-\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  = }
 \clist_map_inline:nn
   {
    ,pdfcopyright
@@ -2295,13 +2372,13 @@
    ,pdfdate
   }
   {
-    \keys_define:nn { hyp / setup }
+    \keys_define:nn { hyp }
       {
         #1 .code:n= { \__hyp_store_metadata:nn {#1}{##1}}
       }
   }
 
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     pdfpageduration .code:n =
      {
@@ -2314,7 +2391,7 @@
           }
      }
   }
-\keys_define:nn { hyp / setup }
+\keys_define:nn { hyp }
   {
     pdfpagetransition .code:n =
      {
@@ -2402,7 +2479,7 @@
          \exp_args:Nne\keys_set:nn {hyp/trans}{ style=\l_keys_key_str }
        }
   }
-\keys_set_known:nv{hyp/setup}{opt at hyperref.sty}
+\keys_set_known:nv{ hyp }{opt at hyperref.sty}
 %% Form field code
 \NewDocumentCommand \MakeFieldObject { m m }
   {

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvipdfmx.def	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvipdfmx.def	2023-12-09 21:35:39 UTC (rev 69078)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3backend-testphase.dtx
 \ProvidesExplFile
-  {l3backend-testphase-dvipdfmx.def}{2023-11-17}{}
+  {l3backend-testphase-dvipdfmx.def}{2023-12-09}{}
   {LaTeX~PDF~management~testphase~bundle~backend~support: dvipdfmx}
 \cs_generate_variant:Nn \__kernel_backend_literal:n { e }
 \cs_generate_variant:Nn \__pdf_backend:n { e }

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvips.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvips.def	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvips.def	2023-12-09 21:35:39 UTC (rev 69078)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3backend-testphase.dtx
 \ProvidesExplFile
-  {l3backend-testphase-dvips.def}{2023-11-17}{}
+  {l3backend-testphase-dvips.def}{2023-12-09}{}
   {LaTeX~PDF~management~testphase~bundle~backend~support: dvips}
 \cs_generate_variant:Nn \__kernel_backend_postscript:n { e }
 \cs_generate_variant:Nn \__pdf_backend_pdfmark:n { e }

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvisvgm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvisvgm.def	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-dvisvgm.def	2023-12-09 21:35:39 UTC (rev 69078)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3backend-testphase.dtx
 \ProvidesExplFile
-  {l3backend-testphase-dvisvgm.def}{2023-11-17}{}
+  {l3backend-testphase-dvisvgm.def}{2023-12-09}{}
   {LaTeX~PDF~management~testphase~bundle~backend~support: dvisvgm}
 \bool_if:NT \l__pdfmanagement_delayed_shipout_bool
  {

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-luatex.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-luatex.def	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-luatex.def	2023-12-09 21:35:39 UTC (rev 69078)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3backend-testphase.dtx
 \ProvidesExplFile
-  {l3backend-testphase-luatex.def}{2023-11-17}{}
+  {l3backend-testphase-luatex.def}{2023-12-09}{}
   {LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (LuaTeX)}
 \cs_generate_variant:Nn \__kernel_backend_literal_page:n { e }
 \bool_if:NT \l__pdfmanagement_delayed_shipout_bool

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-pdftex.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-pdftex.def	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-pdftex.def	2023-12-09 21:35:39 UTC (rev 69078)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3backend-testphase.dtx
 \ProvidesExplFile
-  {l3backend-testphase-pdftex.def}{2023-11-17}{}
+  {l3backend-testphase-pdftex.def}{2023-12-09}{}
   {LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (pdfTeX)}
 \cs_generate_variant:Nn \__kernel_backend_literal_page:n { e }
 \bool_if:NT \l__pdfmanagement_delayed_shipout_bool

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-xetex.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-xetex.def	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3backend-testphase-xetex.def	2023-12-09 21:35:39 UTC (rev 69078)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3backend-testphase.dtx
 \ProvidesExplFile
-  {l3backend-testphase-xetex.def}{2023-11-17}{}
+  {l3backend-testphase-xetex.def}{2023-12-09}{}
   {LaTeX~PDF~management~testphase~bundle~backend~support: XeTeX}
 \cs_generate_variant:Nn \__kernel_backend_literal:n { e }
 \cs_generate_variant:Nn \__pdf_backend:n { e }

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3pdffield-testphase.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3pdffield-testphase.sty	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/l3pdffield-testphase.sty	2023-12-09 21:35:39 UTC (rev 69078)
@@ -27,7 +27,7 @@
 %% File: l3pdffield.dtx
 
 \NeedsTeXFormat{LaTeX2e}
-\ProvidesExplPackage{l3pdffield-testphase}{2023-11-17}{0.96c}%
+\ProvidesExplPackage{l3pdffield-testphase}{2023-12-09}{0.96d}%
   {form fields}
 \csname HyField at NeedAppearancesfalse\endcsname % suppress NeedAppearances
 \str_new:N \l__pdffield_tmpa_str

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-firstaid.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-firstaid.sty	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-firstaid.sty	2023-12-09 21:35:39 UTC (rev 69078)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: pdfmanagement-firstaid.dtx
-\ProvidesExplPackage{pdfmanagement-firstaid}{2023-11-17}{0.96c}
+\ProvidesExplPackage{pdfmanagement-firstaid}{2023-12-09}{0.96d}
   {LaTeX PDF management testphase bundle / firstaid-patches}
 
 \clist_map_inline:nn

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.ltx	2023-12-09 21:35:39 UTC (rev 69078)
@@ -27,7 +27,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: pdfmanagement-testphase.dtx
-\ProvidesExplFile{pdfmanagement-testphase.ltx}{2023-11-17}{0.96c}
+\ProvidesExplFile{pdfmanagement-testphase.ltx}{2023-12-09}{0.96d}
   {PDF~management~code~(testphase)}
 \bool_new:N\l__pdfmanagement_delayed_shipout_bool
 \msg_new:nnn {pdfmanagement}{delayed-shipout}
@@ -1081,7 +1081,8 @@
       }
   }
 %% File: l3pdfannot.dtx
-\RequirePackage{l3bitset}
+\cs_if_exist:NF \bitset_new:Nn
+  { \RequirePackage { l3bitset } }
 \bitset_new:Nn \l_pdfannot_F_bitset
   {
     Invisible      = 1,
@@ -1764,7 +1765,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}}},
@@ -2076,6 +2077,7 @@
         \__pdfmeta_xmp_build_pdf:
         \__pdfmeta_xmp_build_xmpRights:
         \__pdfmeta_xmp_build_standards: %pdfaid,pdfxid,pdfuaid
+        \__pdfmeta_xmp_build_pdfd:
         \__pdfmeta_xmp_build_dc:
         \__pdfmeta_xmp_build_photoshop:
         \__pdfmeta_xmp_build_xmp:
@@ -2358,6 +2360,64 @@
       \__pdfmeta_xmp_add_packet_close:nn{rdf}{Seq}
     \__pdfmeta_xmp_add_packet_close:nn{pdfaSchema}{valueType}
   }
+\cs_new_protected:Npn \__pdfmeta_xmp_schema_enable_pdfd:
+ {
+  \__pdfmeta_xmp_xmlns_new:ne {pdfd}{http://pdfa.org/declarations/}
+  \__pdfmeta_xmp_schema_new:nnn
+    {PDF~Declarations~Schema}
+    {pdfd}
+    {http://pdfa.org/declarations/}
+  \__pdfmeta_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.}
+  \cs_new_protected:cpn { __pdfmeta_xmp_schema_pdfd_additions: }
+    {
+      \__pdfmeta_xmp_add_packet_open:nn{pdfaSchema}{valueType}
+        \__pdfmeta_xmp_add_packet_open:nn{rdf}{Seq}
+          \__pdfmeta_xmp_add_packet_open_attr:nnn{rdf}{li}{rdf:parseType="Resource"}
+            \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{type}{claim}
+            \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{namespaceURI}
+               {http://pdfa.org/declarations/}
+            \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{prefix}{pdfd}
+            \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{description}
+              {A~structure~describing~properties~of~an~individual claim.}
+            \__pdfmeta_xmp_add_packet_open:nn{pdfaType}{field}
+             \__pdfmeta_xmp_add_packet_open:nn{rdf}{Seq}
+              \__pdfmeta_xmp_add_packet_field:nnn{claimReport}{Text}
+                {A~URL~to~a~report~containing~details~of~the~specific~conformance~claim.}
+              \__pdfmeta_xmp_add_packet_field:nnn{claimCredentials}{Text}
+                {The~claimant's~credentials.}
+              \__pdfmeta_xmp_add_packet_field:nnn{claimDate}{Text}
+                {A~date~identifying~when~the~claim~was~made.}
+              \__pdfmeta_xmp_add_packet_field:nnn{claimBy}{Text}
+                {The~name~of~the~organization~and/or~individual~and/or~software~making~the~claim.}
+             \__pdfmeta_xmp_add_packet_close:nn{rdf}{Seq}
+           \__pdfmeta_xmp_add_packet_close:nn{pdfaType}{field}
+          \__pdfmeta_xmp_add_packet_close:nn{rdf}{li}
+          \__pdfmeta_xmp_add_packet_open_attr:nnn{rdf}{li}{rdf:parseType="Resource"}
+            \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{type}{declaration}
+            \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{namespaceURI}
+               {http://pdfa.org/declarations/}
+            \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{prefix}{pdfd}
+            \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{description}
+              {A~structure~describing~a~single~PDF~ Declaration~asserting~conformance~with~ an~externally-identified~standard~or~ profile.}
+            \__pdfmeta_xmp_add_packet_open:nn{pdfaType}{field}
+             \__pdfmeta_xmp_add_packet_open:nn{rdf}{Seq}
+              \__pdfmeta_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.}
+              \__pdfmeta_xmp_add_packet_field:nnn{claimData}{Bag~claim}
+                {An~unordered~array~of~claim~data,~where~each~claim~identifies~the~nature~of~the~claim.}
+             \__pdfmeta_xmp_add_packet_close:nn{rdf}{Seq}
+           \__pdfmeta_xmp_add_packet_close:nn{pdfaType}{field}
+          \__pdfmeta_xmp_add_packet_close:nn{rdf}{li}
+        \__pdfmeta_xmp_add_packet_close:nn{rdf}{Seq}
+      \__pdfmeta_xmp_add_packet_close:nn{pdfaSchema}{valueType}
+    }
+   \cs_gset_eq:NN \__pdfmeta_xmp_schema_enable_pdfd: \prg_do_nothing:
+ }
 
 \cs_new_protected:Npn \__pdfmeta_xmp_build_pdf:
   {
@@ -2406,7 +2466,35 @@
         {pdfuaid}{rev}{\exp_last_unbraced:No\use_ii:nn \l__pdfmeta_tmpa_tl}
      }
   }
-
+\prop_new:N \g__pdfmeta_xmp_pdfd_data_prop
+\cs_new_protected:Npn \__pdfmeta_xmp_build_pdfd:
+  {
+    \prop_if_empty:NF\g__pdfmeta_xmp_pdfd_data_prop
+      {
+        \__pdfmeta_xmp_add_packet_open:nn{pdfd}{declarations}
+        \__pdfmeta_xmp_add_packet_open:nn{rdf}{Bag}
+          \prop_map_inline:Nn \g__pdfmeta_xmp_pdfd_data_prop
+            {
+              \__pdfmeta_xmp_build_pdfd_claim:nn{##1}{##2}
+            }
+        \__pdfmeta_xmp_add_packet_close:nn{rdf}{Bag}
+        \__pdfmeta_xmp_add_packet_close:nn{pdfd}{declarations}
+      }
+  }
+\cs_new_protected:Npn \__pdfmeta_xmp_build_pdfd_claim:nn #1#2
+ {
+    \__pdfmeta_xmp_add_packet_open_attr:nnn{rdf}{li}{rdf:parseType="Resource"}
+      \__pdfmeta_xmp_add_packet_line:nnn{pdfd}{conformsTo}{#1}
+      \tl_if_empty:nF {#2}
+       {
+         \__pdfmeta_xmp_add_packet_open:nn{pdfd}{claimData}
+          \__pdfmeta_xmp_add_packet_open:nn{rdf}{Bag}
+            #2
+          \__pdfmeta_xmp_add_packet_close:nn{rdf}{Bag}
+         \__pdfmeta_xmp_add_packet_close:nn{pdfd}{claimData}
+       }
+    \__pdfmeta_xmp_add_packet_close:nn{rdf}{li}
+ }
 \cs_new_protected:Npn \__pdfmeta_xmp_build_photoshop:
   {
    \__pdfmeta_xmp_add_packet_line:nne{photoshop}{AuthorsPosition}
@@ -2630,6 +2718,35 @@
       {\msg_warning:nnn{pdfmeta}{namespace-defined}{#1}}
       {\__pdfmeta_xmp_xmlns_new:nn {#1}{#2}}
   }
+\cs_new_protected:Npn \pdfmeta_xmp_add_declaration:n #1 %conformsTo uri
+ {
+   \__pdfmeta_xmp_schema_enable_pdfd:
+   \prop_gput:Nnn\g__pdfmeta_xmp_pdfd_data_prop{#1}{}
+ }
+\cs_generate_variant:Nn \pdfmeta_xmp_add_declaration:n {e}
+\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
+ {
+   \__pdfmeta_xmp_schema_enable_pdfd:
+   \tl_set:Nn \l__pdfmeta_tmpa_tl
+     {
+       \__pdfmeta_xmp_add_packet_open_attr:nnn{rdf}{li}{rdf:parseType="Resource"}
+       \__pdfmeta_xmp_add_packet_line:nnn{pdfd}{claimBy}{#2}
+       \__pdfmeta_xmp_add_packet_line:nnn{pdfd}{claimDate}{#3}
+       \__pdfmeta_xmp_add_packet_line:nnn{pdfd}{claimCredentials}{#4}
+       \__pdfmeta_xmp_add_packet_line:nnn{pdfd}{claimReport}{#5}
+       \__pdfmeta_xmp_add_packet_close:nn{rdf}{li}
+     }
+   \prop_get:NnNT \g__pdfmeta_xmp_pdfd_data_prop {#1}\l__pdfmeta_tmpb_tl
+    {
+      \tl_concat:NNN \l__pdfmeta_tmpa_tl \l__pdfmeta_tmpa_tl \l__pdfmeta_tmpb_tl
+    }
+   \prop_gput:Nno\g__pdfmeta_xmp_pdfd_data_prop{#1}
+       {
+         \l__pdfmeta_tmpa_tl
+       }
+ }
+\cs_generate_variant:Nn\pdfmeta_xmp_add_declaration:nnnnn {e}
 %% File: l3pdftools.dtx
 \cs_generate_variant:Nn \str_convert_pdfname:n { e }
 

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.sty	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/pdfmanagement-testphase.sty	2023-12-09 21:35:39 UTC (rev 69078)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: pdfmanagement-testphase.dtx
-\ProvidesExplPackage{pdfmanagement-testphase}{2023-11-17}{0.96c}
+\ProvidesExplPackage{pdfmanagement-testphase}{2023-12-09}{0.96d}
   {LaTeX PDF management testphase bundle}
 \providecommand\IfFormatAtLeastTF{\@ifl at t@r\fmtversion}
 \IfFormatAtLeastTF{2020-10-01}{}{

Modified: trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty	2023-12-09 21:35:06 UTC (rev 69077)
+++ trunk/Master/texmf-dist/tex/latex/pdfmanagement-testphase/xcolor-patches-tmp-ltx.sty	2023-12-09 21:35:39 UTC (rev 69078)
@@ -1,6 +1,6 @@
 %% LaTeX2e file `xcolor-patches-tmp-ltx.sty'
 %%
-\ProvidesPackage{xcolor-patches-tmp-ltx}[2023-11-17 v0.96c patch xcolor for l3color]
+\ProvidesPackage{xcolor-patches-tmp-ltx}[2023-12-09 v0.96d patch xcolor for l3color]
 \@ifundefined{color_set:nn}{\RequirePackage{l3color}}{}
 
 \ExplSyntaxOn



More information about the tex-live-commits mailing list.