[latex3-commits] [git/LaTeX3-latex3-pdfresources] backendtest: refactoring ... (0d8c397)

Ulrike Fischer fischer at troubleshooting-tex.de
Mon Jun 3 23:41:29 CEST 2019


Repository : https://github.com/latex3/pdfresources
On branch  : backendtest
Link       : https://github.com/latex3/pdfresources/commit/0d8c397ab1f006766f1eac044fd960fe665b605b

>---------------------------------------------------------------

commit 0d8c397ab1f006766f1eac044fd960fe665b605b
Author: Ulrike Fischer <fischer at troubleshooting-tex.de>
Date:   Mon Jun 3 23:41:29 2019 +0200

    refactoring ...


>---------------------------------------------------------------

0d8c397ab1f006766f1eac044fd960fe665b605b
 pdfresources.dtx |  328 +++++++++++++++++++++++-------------------------------
 1 file changed, 138 insertions(+), 190 deletions(-)

diff --git a/pdfresources.dtx b/pdfresources.dtx
index 42c2be0..34287e6 100644
--- a/pdfresources.dtx
+++ b/pdfresources.dtx
@@ -34,7 +34,7 @@
 %<@@=pdf>
 %<*package>
 \RequirePackage{xparse}
-\RequirePackage{tmpl3shipout}
+%\RequirePackage{tmpl3shipout}
 \ProvidesExplPackage {pdfresources} {2019-03-17} {0.1}
   {experimental pdf-resource management}
 \DeclareOption { debug }
@@ -87,9 +87,9 @@
 %
 % \subsection{\pkg{media9}}
 %
-% \section{New backend Code}
+% \section{New backend Code / experimental }
 %
-% \subsection{Backend commands / experimental}
+% \subsection{end of run}
 % Notes: pdftex and luatex the startlink commands can use different \enquote{action spec}
 % \texttt{user}, \texttt{goto} and \texttt{thread}. To be able to translate this to
 % other drivers, startlink variants are defined.
@@ -101,13 +101,6 @@
 %^^A \pdf at escapestring?? \pdfescapestring
 %    \begin{macrocode}
 %<*package>
-% helper command to output a key + value of a prop as needed in a dict.
-% not internal as perhaps needed also by users?
-% I don't check if #1 or #2 is empty, imho this should be done only in the pdf layer
-% at the input?
-%
-\cs_new:Npn \@@_dict_item:nn #1 #2 {/#1~#2~}
-
 %% TEMPORARY command for the "end of run"
 \bool_if:nT {(\sys_if_engine_pdftex_p: && \sys_if_output_pdf_p:) || \sys_if_engine_luatex_p: }
 {
@@ -132,106 +125,76 @@
 % a delayed version can be added later.
 %    \begin{macrocode}
 %<*package>
-\prop_new:N \g__driver_pdf_xform_prop
+
+\prop_new:N \g_@@_backend_xform_prop
+
 \bool_if:nT {\sys_if_engine_pdftex_p: && \sys_if_output_pdf_p: }
 {
- \cs_new_protected:Npn \driver_pdf_xform_new:nnnN #1 #2 #3 #4 %name, attr, resources, box
+ \cs_new_protected:Npn \@@_backend_xform_new:nnnN #1 #2 #3 #4 %name, attr, resources, box
  {
   \tex_immediate:D \tex_pdfxform:D~attr { #2 }~resources {#3} #4
   \int_const:cn
-   { c__driver_pdf_xform_ \tl_to_str:n {#1} _int }
+   { c_@@_backend_xform_ \tl_to_str:n {#1} _int }
    { \tex_pdflastxform:D }
-  \prop_gput:Nnx \g__driver_pdf_xform_prop {#1}
+  \prop_gput:Nnx \g_@@_backend_xform_prop {#1}
    {
-    \tex_pdfxformname:D \int_use:c {c__driver_pdf_xform_ \tl_to_str:n {#1} _int}
+    \tex_pdfxformname:D \int_use:c {c_@@_backend_xform_ \tl_to_str:n {#1} _int}
    }
  }
 
-\cs_new:Npn \driver_pdf_xform_use:n #1
+\cs_new:Npn \@@_backend_xform_use:n #1
  {
-  \tex_pdfrefxform:D \int_use:c { c__driver_pdf_xform_ \tl_to_str:n {#1} _int } \scan_stop:
+  \tex_pdfrefxform:D \int_use:c { c_@@_backend_xform_ \tl_to_str:n {#1} _int } \scan_stop:
  }
 
 % should there be a test if the name exists???
-\cs_new:Npn \driver_pdf_xform_ref:n #1
-  { \int_use:c { c__driver_pdf_xform_ \tl_to_str:n {#1} _int } ~ 0 ~ R }
+\cs_new:Npn \@@_backend_xform_ref:n #1
+  { \int_use:c { c_@@_backend_xform_ \tl_to_str:n {#1} _int } ~ 0 ~ R }
 
-\cs_new:Npn \driver_pdf_xform_name_ref:n #1
-  { /Fm\prop_item:Nn \g__driver_pdf_xform_prop {#1} }
+\cs_new:Npn \@@_backend_xform_name_ref:n #1
+  { /Fm\prop_item:Nn \g_@@_backend_xform_prop {#1} }
 }
 
 %nearly identical but not completly ...
 \sys_if_engine_luatex:T
 {
- \cs_new_protected:Npn \driver_pdf_xform_new:nnnN #1 #2 #3 #4 %name, attr, resources, box
+ \cs_new_protected:Npn \@@_backend_xform_new:nnnN #1 #2 #3 #4 %name, attr, resources, box
  {
   \tex_immediate:D \tex_pdfxform:D~attr { #2 }~resources {#3} #4
   \int_const:cn
-   { c__driver_pdf_xform_ \tl_to_str:n {#1} _int }
+   { c_@@_backend_xform_ \tl_to_str:n {#1} _int }
    { \tex_pdflastxform:D }
-  \prop_gput:Nnx \g__driver_pdf_xform_prop {#1}
+  \prop_gput:Nnx \g_@@_backend_xform_prop {#1}
    {
-    \tex_pdffeedback:D~xformname  \int_use:c {c__driver_pdf_xform_ \tl_to_str:n {#1} _int}
+    \tex_pdffeedback:D~xformname  \int_use:c {c_@@_backend_xform_ \tl_to_str:n {#1} _int}
    }
  }
 
-\cs_new:Npn \driver_pdf_xform_use:n #1
+\cs_new:Npn \@@_backend_xform_use:n #1
  {
-  \tex_pdfrefxform:D \int_use:c { c__driver_pdf_xform_ \tl_to_str:n {#1} _int } \scan_stop:
+  \tex_pdfrefxform:D \int_use:c { c_@@_backend_xform_ \tl_to_str:n {#1} _int } \scan_stop:
  }
-\cs_new:Npn \driver_pdf_xform_ref:n #1
-  { \int_use:c { c__driver_pdf_xform_ \tl_to_str:n {#1} _int } ~ 0 ~ R }
+\cs_new:Npn \@@_backend_xform_ref:n #1
+  { \int_use:c { c_@@_backend_xform_ \tl_to_str:n {#1} _int } ~ 0 ~ R }
 
-\cs_new:Npn \driver_pdf_xform_name_ref:n #1
-  { /Fm\prop_item:Nn \g__driver_pdf_xform_prop {#1} }
+\cs_new:Npn \@@_backend_xform_name_ref:n #1
+  { /Fm\prop_item:Nn \g_@@_backend_xform_prop {#1} }
 }
 
 %</package>
 %    \end{macrocode}
-% \subsubsection{driver / pdfpagesattr}
+% \subsubsection{backend / pdfpagesattr}
 % pdfpagesattr is a single token register which is output at the end of the compilation.
 % It is normally used only a few times in a document, so it is okay to update the
-% register at every change. This also allows to test for unwanted changes.
-% throught uses of the primitives. We issue the push code also at the end of
+% register at every change. We issue the push code also at the end of
 % the document, so that it wins.
 %
 %    \begin{macrocode}
 %<*package>
-\prop_new:N \g_@@_pdf_pagesattr_prop
-% setter:
-\cs_new_protected:Npn \driver_pdf_pagesattr_gput:nn #1 #2
-  {
-   \prop_gput:Nnn \g_@@_pdf_pagesattr_prop { #1 }{ #2}
-   \@@_pdf_pagesattr_gpush:
-  }
-
-% getter from the prop:
-\cs_new_protected:Npn \driver_pdf_pagesattr_get:nN #1 #2
-  {
-   \prop_get:NnN \g_@@_pdf_pagesattr_prop { #1 } #2
-  }
-
-% remove:
-\cs_new_protected:Npn \driver_pdf_pagesattr_gremove:n #1
-  {
-   \prop_gremove:Nn \g_@@_pdf_pagesattr_prop { #1 }
-   \@@_pdf_pagesattr_gpush:
-  }
-
-% push to the register
-\cs_new_protected:Npn \@@_pdf_pagesattr_gpush:
-  {
-    \exp_args:NNx \tex_global:D \@@_pdf_pagesattr:n
-    {
-     \prop_map_function:NN \g_@@_pdf_pagesattr_prop \driver_pdf_dict_item:nn
-    }
-  }
-
-
 \bool_if:nT {\sys_if_engine_pdftex_p: && \sys_if_output_pdf_p: }
 {
  %definition works also for luatex
- \cs_new_protected:Npx \@@_pdf_pagesattr:n #1
+ \cs_new_protected:Npx \@@_backend_pagesattr:n #1
   {
     \exp_not:N \tex_global:D
     \cs_if_exist:NTF \tex_pdfpagesattr:D
@@ -240,16 +203,16 @@
       {#1}
   }
 
- \cs_new_protected:Npn \driver_pdf_pagesattr_get:N #1
+ \cs_new_protected:Npn \@@_backend_pagesattr_get:N #1
   {
    \tl_set:Nx #1 {\tex_the:D \tex_pdfpagesattr:D}
   }
- \AtEndDocument{\clearpage\@@_pdf_pagesattr_gpush:}
+
 }
 
 \sys_if_engine_luatex:T
 {
-  \cs_new_protected:Npx \@@_pdf_pagesattr:n #1
+  \cs_new_protected:Npx \@@_backend_pagesattr:n #1
   {
     \exp_not:N \tex_global:D
     \cs_if_exist:NTF \tex_pdfpagesattr:D
@@ -257,61 +220,31 @@
       { \tex_pdfvariable:D pagesattr }
       {#1}
   }
-  \cs_new_protected:Npn \driver_pdf_pagesattr_get:N #1
+  \cs_new_protected:Npn \@@_backend_pagesattr_get:N #1
   {
    \tl_set:Nx #1 {\tex_the:D \tex_pdfvariable:D pagesattr}
   }
-
-  \AtEndDocument{\clearpage\@@_pdf_pagesattr_gpush:}
 }
+%dvips, dvipdfmx missing
+% move this !!!!!!!!!!!!!!!!!!
+\@@_backend_end_run:n { \@@_pdf_pagesattr_gpush: }
 %</package>
 %    \end{macrocode}
-% \subsubsection{driver / pdfpageattr}
+% \subsubsection{backend / pdfpageattr}
 % pdfpageattr is a single token register which is output at the shipout for every page.
 % It is normally used only a few times in a document, so it is okay to update the
-% register at every change. This also allows to test for unwanted changes.
-% through uses of the primitives.
+% register at every change.
 % Open is the question if one need more shipout hooks to set e.g. Rotate on specific
 % pages. Open is the setter for /AF (and perhaps /OutputIntents).
 % See also https://tex.stackexchange.com/questions/479812/extension-of-rotating-package-to-set-pdf-rotation
 %
 %    \begin{macrocode}
 %<*package>
-\prop_new:N \g_@@_pdf_pageattr_prop
-% setter:
-\cs_new_protected:Npn \driver_pdf_pageattr_gput:nn #1 #2
-  {
-   \prop_gput:Nnn \g_@@_pdf_pageattr_prop { #1 }{ #2}
-   \@@_pdf_pageattr_gpush:
-  }
-
-% getter from the prop:
-\cs_new_protected:Npn \driver_pdf_pageattr_get:nN #1 #2
-  {
-   \prop_get:NnN \g_@@_pdf_pageattr_prop { #1 } #2
-  }
-
-% remove:
-\cs_new_protected:Npn \driver_pdf_pageattr_gremove:n #1
-  {
-   \prop_gremove:Nn \g_@@_pdf_pageattr_prop { #1 }
-   \@@_pdf_pageattr_gpush:
-  }
-
-% push to the register
-\cs_new_protected:Npn \@@_pdf_pageattr_gpush:
- {
-   \exp_args:NNx \tex_global:D \@@_pdf_pageattr:n
-   {
-    \prop_map_function:NN \g_@@_pdf_pageattr_prop \driver_pdf_dict_item:nn
-   }
- }
-
-
+%% backend commands
 \bool_if:nT {\sys_if_engine_pdftex_p: && \sys_if_output_pdf_p: }
  {
  %definition works also for luatex
- \cs_new_protected:Npx \@@_pdf_pageattr:n #1
+ \cs_new_protected:Npx \@@_backend_pageattr:n #1
   {
     \exp_not:N \tex_global:D
     \cs_if_exist:NTF \tex_pdfpageattr:D
@@ -320,7 +253,7 @@
       {#1}
   }
 
- \cs_new_protected:Npn \driver_pdf_pageattr_get:N #1
+ \cs_new_protected:Npn \@@_backend_pageattr_get:N #1
  {
    \tl_set:Nx #1 {\tex_the:D \tex_pdfpageattr:D}
  }
@@ -328,7 +261,7 @@
 
 \sys_if_engine_luatex:T
 {
-  \cs_new_protected:Npx \@@_pdf_pageattr:n #1
+  \cs_new_protected:Npx \@@_backend_pageattr:n #1
   {
     \exp_not:N \tex_global:D
     \cs_if_exist:NTF \tex_pdfpageattr:D
@@ -336,14 +269,81 @@
       { \tex_pdfvariable:D pageattr }
       {#1}
   }
-  \cs_new_protected:Npn \driver_pdf_pageattr_get:N #1
+  \cs_new_protected:Npn \@@_backend_pageattr_get:N #1
   {
    \tl_set:Nx #1 {\tex_the:D \tex_pdfvariable:D pageattr}
   }
 }
+%dvips, dvipdfmx missing
+%</package>
+%    \end{macrocode}
+% \subsection{ pagesattr / resources management}
+%    \begin{macrocode}
+%<*package>
+\prop_new:N \g_@@_pagesattr_prop
+% setter: internal???
+\cs_new_protected:Npn \pdf_pagesattr_gput:nn #1 #2
+  {
+   \prop_gput:Nnn \g_@@_pagesattr_prop { #1 }{ #2}
+   \@@_pagesattr_gpush:
+  }
+
+% getter from the prop:
+\cs_new_protected:Npn \pdf_pagesattr_get:nN #1 #2
+  {
+   \prop_get:NnN \g_@@_pagesattr_prop { #1 } #2
+  }
+
+% remove:
+\cs_new_protected:Npn \pdf_pagesattr_gremove:n #1
+  {
+   \prop_gremove:Nn \g_@@_pagesattr_prop { #1 }
+   \@@_pagesattr_gpush:
+  }
 
+% push to the register command
+\cs_new_protected:Npn \@@_pagesattr_gpush:
+  {
+    \exp_args:Nx \@@_backend_pagesattr:n
+    {
+     \prop_map_function:NN \g_@@_pagesattr_prop \@@_dict_item:nn
+    }
+  }
 %</package>
 %    \end{macrocode}
+% \subsection{pageattr / management commands}
+%    \begin{macrocode}
+\prop_new:N \g_@@_pageattr_prop
+% setter:
+\cs_new_protected:Npn \pdf_pageattr_gput:nn #1 #2
+  {
+   \prop_gput:Nnn \g_@@_pageattr_prop { #1 }{ #2}
+   \@@_pageattr_gpush:
+  }
+
+% getter from the prop:
+\cs_new_protected:Npn \pdf_pageattr_get:nN #1 #2
+  {
+   \prop_get:NnN \g_@@_pageattr_prop { #1 } #2
+  }
+
+% remove:
+\cs_new_protected:Npn \pdf_pageattr_gremove:n #1
+  {
+   \prop_gremove:Nn \g_@@_pageattr_prop { #1 }
+   \@@_pageattr_gpush:
+  }
+
+% push to the register
+\cs_new_protected:Npn \@@_pageattr_gpush:
+ {
+   \exp_args:Nx \@@_backend_pageattr:n
+   {
+    \prop_map_function:NN \g_@@_pageattr_prop \@@_dict_item:nn
+   }
+ }
+%    \end{macrocode}
+%
 % \subsection{pdfpageresources}
 % We need code for ExtGState, ColorSpace, Pattern, Shading and Properties.
 % All are dictionaries which can receive entries from more than one source.
@@ -352,86 +352,46 @@
 % exists. A global dictionary can be empty but as this is known only at the end of the document
 % it would require a two-pass compilation to test it and the overhead is small so we ignore this.
 % Example for ColorSpace:
-%^^A Global resources are stored in g_@@_pdf_pageresources_ColorSpace_prop
-%^^A An object {g_@@_pdf_pageresources_ColorSpace_obj} is reserved
+%^^A Global resources are stored in g_@@_pageresources_ColorSpace_prop
+%^^A An object {g_@@_pageresources_ColorSpace_obj} is reserved
 %^^A At the end of the document the obj is written to the pdf with the content of the prop:
-%^^A \driver_pdf_object_write:nn { g_@@_pdf_pageresources_ColorSpace_obj }
+%^^A \pdf_object_write:nn { g_@@_pageresources_ColorSpace_obj }
 %^^A           {
-%^^A             \prop_map_function:cN { g_@@_pdf_pageresources_#1_prop} \driver_pdf_dict_item:nn
+%^^A             \prop_map_function:cN { g_@@_pageresources_#1_prop} \@@_dict_item:nn
 %^^A           }
-%^^A local resources for page N are stored in g_@@_pdf_pageresources_N_ColorSpace_prop
-%^^A An object {g_@@_pdf_pageresources_N_ColorSpace_obj} is reserved
+%^^A local resources for page N are stored in g_@@_pageresources_N_ColorSpace_prop
+%^^A An object {g_@@_pageresources_N_ColorSpace_obj} is reserved
 %^^A At the end of the document first the global then the local property is
 %^^A added to a temporary prop:
-%^^A \prop_set_eq:Nc \g_tmpa_prop { g_@@_pdf_pageresource_ColorSpace_prop}
-%^^A \prop_map_inline:cn { g_@@_pdf_pageresource_N_ColorSpace_prop}
+%^^A \prop_set_eq:Nc \g_tmpa_prop { g_@@_pageresource_ColorSpace_prop}
+%^^A \prop_map_inline:cn { g_@@_pageresource_N_ColorSpace_prop}
 %^^A {\prop_gput:Nnn \g_tmpa_prop {#1}{#2}}
 %^^A
 %^^A then obj is written to the pdf with the combined content of the global and the
 %^^A local prop:
-%^^A \driver_pdf_object_write:nn { g_@@_pdf_pageresources_N_ColorSpace_obj }
+%^^A \pdf_object_write:nn { g_@@_pageresources_N_ColorSpace_obj }
 %^^A           {
-%^^A             \prop_map_function:cN \g_tmpa_prop \driver_pdf_dict_item:nn
+%^^A             \prop_map_function:cN \g_tmpa_prop \@@_dict_item:nn
 %^^A           }
 %^^A This means that local entries can overwrite global entries, it is up to the user to avoid this
 %^^A with sensible names spaces.
-%^^A At every shipout we check if g_@@_pdf_pageresource_N_ColorSpace_prop exists.
+%^^A At every shipout we check if g_@@_pageresource_N_ColorSpace_prop exists.
 %^^A (That's probably more effective than trying to keep a list of pages with local settings.)
-%^^A If yes we put "ColorSpace = objnum  of g_@@_pdf_pageresources_N_ColorSpace_obj" into
-%^^A \g_@@_pdf_pageresources_prop and push this into pdfpageresources
-%^^A If not we put "ColorSpace = objnum of g_@@_pdf_pageresources_ColorSpace_obj" into
+%^^A If yes we put "ColorSpace = objnum  of g_@@_pageresources_N_ColorSpace_obj" into
 %^^A \g_@@_pdf_pageresources_prop and push this into pdfpageresources
+%^^A If not we put "ColorSpace = objnum of g_@@_pageresources_ColorSpace_obj" into
+%^^A \g_@@_pageresources_prop and push this into pdfpageresources
 
 
 %    \begin{macrocode}
 %<*package>
 %message
-\msg_new:nnnn{driver}{pageresources-changed}
- {
-   The~content~of~pageresources~has~changed~on~the~absolute~page~#1.~
-   Check~if~it~is~correct.
- }
- {
-  This~is~probably~due~to~some~package~or~command~using~the~
-  primitive~\token_to_str:N\pdfresources\c_space_tl or~an~equivalent~command~
-  instead~of~the~expl3~interface.
- }
 % lowlevel stuff
-% to be able to test if someone tampered with the resources
-% a command to retrieve the content:
-\bool_if:nT {\sys_if_engine_pdftex_p: && \sys_if_output_pdf_p: }
-{
-  \cs_new_protected:Npn \driver_pdf_pageresources_gget:N #1
-  {
-   \tl_gset:Nx #1 {\tex_the:D \tex_pdfpageresources:D}
-  }
-}
-
-\sys_if_engine_luatex:T
-{
-  \cs_new_protected:Npn \driver_pdf_pageresources_gget:N #1
-  {
-   \tl_gset:Nx #1 {\tex_the:D \tex_pdfvariable:D pageresources}
-  }
-}
-
-\sys_if_engine_xetex:T
-{
-  \cs_new_protected:Npn \driver_pdf_pageresources_gget:N #1
-  {
-  %%???????????????????
-   %\tl_gset:Nx #1 {\tex_the:D \tex_pdfvariable:D pageresources}
-  }
-}
-
 
-\tl_new:N\g_@@_pdf_pageresources_tl
-\tl_new:N\g_@@_pdf_pageresources_tmp_tl
-\driver_pdf_pageresources_gget:N \g_@@_pdf_pageresources_tl
-% the command to fill the register
+% backend commands the command to fill the register
 \bool_if:nT { \sys_if_engine_pdftex_p: || \sys_if_engine_luatex_p: }
 {
- \cs_new_protected:Npx \@@_pdf_pageresources:n #1
+ \cs_new_protected:Npx \@@_backend_pageresources:n #1
   {
     \exp_not:N \tex_global:D
     \cs_if_exist:NTF \tex_pdfpageresources:D
@@ -443,37 +403,20 @@
 
 \sys_if_engine_xetex:T
 {
- \cs_new_protected:Npx \@@_pdf_pageresources:n #1
+ \cs_new_protected:Npx \@@_backend_pageresources:n #1
   {
    \special{pdf:pageresources<<#1>>} %???????
   }
 }
 
 % push a prop to the register:
-\bool_if:nT { \sys_if_engine_pdftex_p: || \sys_if_engine_luatex_p: }
-{
- \cs_new_protected:Npn \@@_pdf_pageresources_gpush:N #1
-  {
-    \exp_args:NNx \tex_global:D \@@_pdf_pageresources:n
-    {
-     \prop_map_function:NN #1 \driver_pdf_dict_item:nn
-    }
-  }
-}
-
-\sys_if_engine_xetex:T
-{%??????????????????????????????????
- \cs_new_protected:Npn \@@_pdf_pageresources_gpush:N #1
+ \cs_new_protected:Npn \@@_pageresources_gpush:N #1
   {
-    %\tl_set:Nx \l_tmpa_tl {\prop_map_function:NN #1 \driver_pdf_dict_item:nn}
-    %\tl_show:N \l_tmpa_tl
-    \exp_args:Nx \@@_pdf_pageresources:n
+    \exp_args:Nx  \@@_backend_pageresources:n
     {
-     \prop_map_function:NN #1 \driver_pdf_dict_item:nn
+     \prop_map_function:NN #1 \@@_dict_item:nn
     }
   }
-}
-%
 
 % management code
 % the list of standard resources which are handle with objects
@@ -576,7 +519,7 @@
    \exp_args:Nnx
      \driver_pdf_object_write:nn { g_@@_pdf_pageresources_#1_obj }
      {
-      \prop_map_function:cN { g_@@_pdf_pageresources_#1_prop} \driver_pdf_dict_item:nn
+      \prop_map_function:cN { g_@@_pdf_pageresources_#1_prop} \@@_dict_item:nn
      }
     }
    % write the local objects
@@ -598,7 +541,7 @@
       \exp_args:Nnx
        \driver_pdf_object_write:nn { g_@@_pdf_pageresources_##1_#1_obj }
        {
-        \prop_map_function:NN \g_tmpa_prop \driver_pdf_dict_item:nn
+        \prop_map_function:NN \g_tmpa_prop \@@_dict_item:nn
        }
      }
     }
@@ -612,6 +555,11 @@
 % \subsubsection{other stuff}
 %    \begin{macrocode}
 %<*package>
+% helper command to output a key + value of a prop as needed in a dict.
+% not internal as perhaps needed also by users?
+% I don't check if #1 or #2 is empty, imho this should be done only in the pdf layer
+% at the input?
+\cs_new:Npn \@@_dict_item:nn #1 #2 {/#1~#2~}
 \bool_if:nT {\sys_if_engine_pdftex_p: && \sys_if_output_pdf_p: }
 {
  \cs_new_protected:Nn \driver_pdf_docview:nn %#1 page number, #2 e.g. /FitH
@@ -741,7 +689,7 @@
       \driver_pdf_object_new:nn   { g_@@_value_#1_#2_obj } { dict }
       \driver_pdf_object_write:nx { g_@@_value_#1_#2_obj }
        {
-        \prop_map_function:cN  { g__pdf_value_#1_#2_prop } \driver_pdf_dict_item:nn
+        \prop_map_function:cN  { g__pdf_value_#1_#2_prop } \@@_dict_item:nn
        }
       #3 { #2 }{ \driver_pdf_object_ref:n { g_@@_value_#1_#2_obj } }
      }





More information about the latex3-commits mailing list