[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