[latex3-commits] [git/LaTeX3-latex3-latex3] master: \driver_pdf_object_now:nn (0b7cc69)

Joseph Wright joseph.wright at morningstar2.co.uk
Wed May 29 22:25:55 CEST 2019


Repository : https://github.com/latex3/latex3
On branch  : master
Link       : https://github.com/latex3/latex3/commit/0b7cc6944d194ad6c5cd548f25c16762631de923

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

commit 0b7cc6944d194ad6c5cd548f25c16762631de923
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Wed May 29 21:25:55 2019 +0100

    \driver_pdf_object_now:nn


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

0b7cc6944d194ad6c5cd548f25c16762631de923
 l3kernel/CHANGELOG.md                   |    4 ++
 l3kernel/l3drivers-pdf.dtx              |  115 ++++++++++++++++++++++++-------
 l3kernel/l3drivers.dtx                  |   22 ++++++
 l3kernel/testfiles/m3expl001.luatex.tlg |    2 +
 l3kernel/testfiles/m3expl001.ptex.tlg   |    2 +
 l3kernel/testfiles/m3expl001.tlg        |    2 +
 l3kernel/testfiles/m3expl001.uptex.tlg  |    2 +
 l3kernel/testfiles/m3expl001.xetex.tlg  |    2 +
 l3kernel/testfiles/m3expl003.luatex.tlg |    2 +
 l3kernel/testfiles/m3expl003.ptex.tlg   |    2 +
 l3kernel/testfiles/m3expl003.tlg        |    2 +
 l3kernel/testfiles/m3expl003.uptex.tlg  |    2 +
 l3kernel/testfiles/m3expl003.xetex.tlg  |    2 +
 13 files changed, 138 insertions(+), 23 deletions(-)

diff --git a/l3kernel/CHANGELOG.md b/l3kernel/CHANGELOG.md
index b9988bd..741bb46 100644
--- a/l3kernel/CHANGELOG.md
+++ b/l3kernel/CHANGELOG.md
@@ -7,6 +7,10 @@ this project uses date-based 'snapshot' version identifiers.
 
 ## [Unreleased]
 
+### Added
+
+- Driver support for anonymous objects
+
 ## [2019-05-28]
 
 ### Added
diff --git a/l3kernel/l3drivers-pdf.dtx b/l3kernel/l3drivers-pdf.dtx
index 5fb296f..2968e57 100644
--- a/l3kernel/l3drivers-pdf.dtx
+++ b/l3kernel/l3drivers-pdf.dtx
@@ -154,31 +154,23 @@
       }
     \use:c
       { @@_pdf_object_write_ \prop_item:Nn \g_@@_pdf_object_prop {#1} :nn }
-      {#1} {#2}
+      { \driver_pdf_object_ref:n {#1} } {#2}
   }
 \cs_generate_variant:Nn \driver_pdf_object_write:nn { nx }
 \cs_new_protected:Npn \@@_pdf_object_write_array:nn #1#2
   {
     \@@_pdfmark:x
-      {
-        \driver_pdf_object_ref:n {#1}
-          [ ~ \exp_not:n {#2} ~ ] ~ /PUTINTERVAL
-      }
+      { #1 [ ~ \exp_not:n {#2} ~ ] ~ /PUTINTERVAL }
   }
 \cs_new_protected:Npn \@@_pdf_object_write_dict:nn #1#2
   {
     \@@_pdfmark:x
-      {
-        \driver_pdf_object_ref:n {#1}
-          << \exp_not:n {#2} >> /PUT
-      }
+      { #1 << \exp_not:n {#2} >> /PUT }
   }
 \cs_new_protected:Npn \@@_pdf_object_write_stream:nn #1#2
   {
     \exp_args:Nx
-      \@@_pdf_object_write_stream:nnn
-        { \driver_pdf_object_ref:n {#1} }
-        #2
+      \@@_pdf_object_write_stream:nnn {#1} #2
   }
 \cs_new_protected:Npn \@@_pdf_object_write_stream:nnn #1#2#3
   {
@@ -194,6 +186,33 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\driver_pdf_object_now:nn, \driver_pdf_object_now:nx}
+%   No anonymous objects, so things are done manually.
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_object_write:nn #1#2
+  {
+    \int_gincr:N \g_@@_pdf_object_int
+    \@@_pdfmark:x
+      {
+        /_objdef ~ { driver.obj \int_use:N \g_@@_pdf_object_int }
+        /type
+        \str_case:nn
+          {#1}
+          {
+            { array }   { /array }
+            { dict }    { /dict }
+            { fstream } { /stream }
+            { stream }  { /stream }
+          }
+        /OBJ
+      }
+    \exp_args:Nnx \use:c { @@_pdf_object_write_ #1 :nn }
+      { { driver.obj \int_use:N \g_@@_pdf_object_int } } {#2}
+  }
+\cs_generate_variant:Nn \driver_pdf_object_write:nn { nx }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsubsection{Annotations}
 %
 % In \texttt{dvips}, annotations have to be constructed manually. As such,
@@ -1442,6 +1461,41 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\driver_pdf_object_now:nn, \driver_pdf_object_now:nx}
+%   Much like writing, but direct creation.
+%    \begin{macrocode}
+\group_begin:
+  \cs_set_protected:Npn \@@_tmp:w #1
+    {
+      \cs_new_protected:Npn \driver_pdf_object_now:nn ##1##2
+        {
+          \tex_immediate:D #1
+            \str_case:nn
+              {##1}
+              {
+                { array } { { [ ~ \exp_not:n {##2} ~ ] } }
+                { dict }  { { << ~ \exp_not:n {##2} ~ >> } }
+                { fstream }
+                  {
+                    stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~
+                      file ~ { \@@_exp_not_ii:nn ##2 }
+                  }
+                { stream }
+                  {
+                    stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~ 
+                      { \@@_exp_not_ii:nn ##2 }
+                  }
+              }
+        }
+    }
+  \cs_if_exist:NTF \tex_pdfextension:D
+    { \@@_tmp:w { \tex_pdfextension:D obj ~ } }
+    { \@@_tmp:w { \tex_pdfobj:D } }
+\group_end:
+\cs_generate_variant:Nn \driver_pdf_object_now:nn { nx }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsubsection{Structure}
 %
 % \begin{macro}{\driver_pdf_compresslevel:n}
@@ -1615,22 +1669,19 @@
   }
 \cs_generate_variant:Nn \driver_pdf_object_write:nn { nx }
 \cs_new_protected:Npn \@@_pdf_object_write:nnn #1#2#3
-  { \use:c { @@_pdf_object_write_ #1 :nn } {#2} {#3} }
+  {
+    \use:c { @@_pdf_object_write_ #1 :nn }
+      { \driver_pdf_object_ref:n {#2} } {#3}
+  }
 \cs_new_protected:Npn \@@_pdf_object_write_array:nn #1#2
   {
     \@@_pdf:x
-      {
-        obj ~ \driver_pdf_object_ref:n {#1} ~
-          [ ~ \exp_not:n {#2} ~ ]
-      }
+      { obj ~ #1 ~ [ ~ \exp_not:n {#2} ~ ] }
   }
 \cs_new_protected:Npn \@@_pdf_object_write_dict:nn #1#2
   {
     \@@_pdf:x
-      {
-        obj ~ \driver_pdf_object_ref:n {#1} ~
-          << ~ \exp_not:n {#2} ~ >>
-      }
+      { obj ~ #1 ~ << ~ \exp_not:n {#2} ~ >> }
   }
 \cs_new_protected:Npn \@@_pdf_object_write_fstream:nn #1#2
   { \@@_pdf_object_write_stream:nnnn { f } {#1} #2 }
@@ -1640,9 +1691,8 @@
   {
     \@@_pdf:x
       {
-        #1 stream ~ \driver_pdf_object_ref:n {#2} ~
+        #1 stream ~ #2 ~
           ( \exp_not:n {#4} ) ~ << \exp_not:n {#3} >>
-        
       }
   }
 %    \end{macrocode}
@@ -1651,6 +1701,21 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\driver_pdf_object_now:nn, \driver_pdf_object_now:nx}
+%   No anonymous objects with \texttt{dvipdfmx} so we have to give an
+%   object name.
+%    \begin{macrocode}
+\cs_new_protected:Npn \driver_pdf_object_now:nn #1#2
+  {
+    \int_gincr:N \g_@@_pdf_object_int
+    \exp_args:Nnx \use:c { @@_pdf_object_write_ #1 :nn }
+      { @driver.obj \int_use:N \g_@@_pdf_object_int }
+      {#2}
+  }
+\cs_generate_variant:Nn \driver_pdf_object_now:nn { nx }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsubsection{Annotations}
 %
 % \begin{variable}{\g_@@_landscape_bool}
@@ -1885,16 +1950,20 @@
 % \begin{macro}{\driver_pdf_object_new:nn}
 % \begin{macro}[EXP]{\driver_pdf_object_ref:n}
 % \begin{macro}{\driver_pdf_object_write:nn, , \driver_pdf_object_write:nx}
+% \begin{macro}{\driver_pdf_object_now:nn, , \driver_pdf_object_now:nx}
 %   All no-ops here.
 %    \begin{macrocode}
 \cs_new_protected:Npn \driver_pdf_object_new:nn #1#2 { }
 \cs_new:Npn \driver_pdf_object_ref:n #1 { }
 \cs_new_protected:Npn \driver_pdf_object_write:nn #1#2 { }
 \cs_new_protected:Npn \driver_pdf_object_write:nx #1#2 { }
+\cs_new_protected:Npn \driver_pdf_object_now:nn #1#2 { }
+\cs_new_protected:Npn \driver_pdf_object_now:nx #1#2 { }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 % \subsubsection{Structure}
 %
diff --git a/l3kernel/l3drivers.dtx b/l3kernel/l3drivers.dtx
index 09c3254..26c06e9 100644
--- a/l3kernel/l3drivers.dtx
+++ b/l3kernel/l3drivers.dtx
@@ -685,6 +685,28 @@
 %   \end{itemize}
 % \end{function}
 %
+% \begin{function}{\driver_pdf_object_now:nn, \driver_pdf_object_write:nx}
+%   \begin{syntax}
+%     \cs{driver_pdf_object_now:nn} \Arg{type} \Arg{data}
+%   \end{syntax}
+%   Creates an anonymous object of \meta{type} and writes the \meta{data} 
+%   content immediately. Depending on the
+%   \meta{type} declared for the object, the format required for the
+%   \meta{data} will vary
+%   \begin{itemize}
+%     \item[\texttt{array}] A space-separated list of values
+%     \item[\texttt{dict}] Key--value pairs in the form
+%       \texttt{/\meta{key} \meta{value}}
+%     \item[\texttt{fstream}] Two brace groups: \meta{file name} and
+%       \meta{content}
+%     \item[\texttt{stream}] Two brace groups: \meta{attributes (dictionary)}
+%       and \meta{content}
+%   \end{itemize}
+%   Conceptually, this combines \cs{driver_pdf_object_new:nn} and
+%   \cs{driver_pdf_object_write:nn} for cases where the object must be written
+%   but is not referred to separately.
+% \end{function}
+%
 % \subsection{PDF structure}
 %
 % \begin{function}{\driver_pdf_compresslevel:n}
diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg
index d151f3c..e2ef93a 100644
--- a/l3kernel/testfiles/m3expl001.luatex.tlg
+++ b/l3kernel/testfiles/m3expl001.luatex.tlg
@@ -6524,6 +6524,8 @@ Defining \driver_pdf_object_write:nn on line ...
 Defining \driver_pdf_object_write:nx on line ...
 Defining \__driver_exp_not_i:nn on line ...
 Defining \__driver_exp_not_ii:nn on line ...
+Defining \driver_pdf_object_now:nn on line ...
+Defining \driver_pdf_object_now:nx on line ...
 Defining \driver_pdf_compresslevel:n on line ...
 Defining \driver_pdf_compress_objects:n on line ...
 Defining \__driver_pdf_objcompresslevel:n on line ...
diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg
index 63751de..483d302 100644
--- a/l3kernel/testfiles/m3expl001.ptex.tlg
+++ b/l3kernel/testfiles/m3expl001.ptex.tlg
@@ -6513,6 +6513,8 @@ Defining \__driver_pdf_object_write_dict:nn on line ..
 Defining \__driver_pdf_object_write_fstream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nnnn on line ...
+Defining \driver_pdf_object_now:nn on line ...
+Defining \driver_pdf_object_now:nx on line ...
 Defining \g__driver_landscape_bool on line ...
 Defining \g__driver_pdf_annotation_int on line ...
 \g__driver_pdf_annotation_int=\count...
diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg
index dfe632b..0830706 100644
--- a/l3kernel/testfiles/m3expl001.tlg
+++ b/l3kernel/testfiles/m3expl001.tlg
@@ -6821,6 +6821,8 @@ Defining \driver_pdf_object_write:nn on line ...
 Defining \driver_pdf_object_write:nx on line ...
 Defining \__driver_exp_not_i:nn on line ...
 Defining \__driver_exp_not_ii:nn on line ...
+Defining \driver_pdf_object_now:nn on line ...
+Defining \driver_pdf_object_now:nx on line ...
 Defining \driver_pdf_compresslevel:n on line ...
 Defining \driver_pdf_compress_objects:n on line ...
 Defining \__driver_pdf_objcompresslevel:n on line ...
diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg
index db6fe2c..f17955f 100644
--- a/l3kernel/testfiles/m3expl001.uptex.tlg
+++ b/l3kernel/testfiles/m3expl001.uptex.tlg
@@ -6810,6 +6810,8 @@ Defining \__driver_pdf_object_write_dict:nn on line ..
 Defining \__driver_pdf_object_write_fstream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nnnn on line ...
+Defining \driver_pdf_object_now:nn on line ...
+Defining \driver_pdf_object_now:nx on line ...
 Defining \g__driver_landscape_bool on line ...
 Defining \g__driver_pdf_annotation_int on line ...
 \g__driver_pdf_annotation_int=\count...
diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg
index 7630e74..a4f6e6e 100644
--- a/l3kernel/testfiles/m3expl001.xetex.tlg
+++ b/l3kernel/testfiles/m3expl001.xetex.tlg
@@ -6524,6 +6524,8 @@ Defining \__driver_pdf_object_write_dict:nn on line ..
 Defining \__driver_pdf_object_write_fstream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nnnn on line ...
+Defining \driver_pdf_object_now:nn on line ...
+Defining \driver_pdf_object_now:nx on line ...
 Defining \g__driver_landscape_bool on line ...
 Defining \g__driver_pdf_annotation_int on line ...
 \g__driver_pdf_annotation_int=\count...
diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg
index d151f3c..e2ef93a 100644
--- a/l3kernel/testfiles/m3expl003.luatex.tlg
+++ b/l3kernel/testfiles/m3expl003.luatex.tlg
@@ -6524,6 +6524,8 @@ Defining \driver_pdf_object_write:nn on line ...
 Defining \driver_pdf_object_write:nx on line ...
 Defining \__driver_exp_not_i:nn on line ...
 Defining \__driver_exp_not_ii:nn on line ...
+Defining \driver_pdf_object_now:nn on line ...
+Defining \driver_pdf_object_now:nx on line ...
 Defining \driver_pdf_compresslevel:n on line ...
 Defining \driver_pdf_compress_objects:n on line ...
 Defining \__driver_pdf_objcompresslevel:n on line ...
diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg
index 63751de..483d302 100644
--- a/l3kernel/testfiles/m3expl003.ptex.tlg
+++ b/l3kernel/testfiles/m3expl003.ptex.tlg
@@ -6513,6 +6513,8 @@ Defining \__driver_pdf_object_write_dict:nn on line ..
 Defining \__driver_pdf_object_write_fstream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nnnn on line ...
+Defining \driver_pdf_object_now:nn on line ...
+Defining \driver_pdf_object_now:nx on line ...
 Defining \g__driver_landscape_bool on line ...
 Defining \g__driver_pdf_annotation_int on line ...
 \g__driver_pdf_annotation_int=\count...
diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg
index dfe632b..0830706 100644
--- a/l3kernel/testfiles/m3expl003.tlg
+++ b/l3kernel/testfiles/m3expl003.tlg
@@ -6821,6 +6821,8 @@ Defining \driver_pdf_object_write:nn on line ...
 Defining \driver_pdf_object_write:nx on line ...
 Defining \__driver_exp_not_i:nn on line ...
 Defining \__driver_exp_not_ii:nn on line ...
+Defining \driver_pdf_object_now:nn on line ...
+Defining \driver_pdf_object_now:nx on line ...
 Defining \driver_pdf_compresslevel:n on line ...
 Defining \driver_pdf_compress_objects:n on line ...
 Defining \__driver_pdf_objcompresslevel:n on line ...
diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg
index db6fe2c..f17955f 100644
--- a/l3kernel/testfiles/m3expl003.uptex.tlg
+++ b/l3kernel/testfiles/m3expl003.uptex.tlg
@@ -6810,6 +6810,8 @@ Defining \__driver_pdf_object_write_dict:nn on line ..
 Defining \__driver_pdf_object_write_fstream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nnnn on line ...
+Defining \driver_pdf_object_now:nn on line ...
+Defining \driver_pdf_object_now:nx on line ...
 Defining \g__driver_landscape_bool on line ...
 Defining \g__driver_pdf_annotation_int on line ...
 \g__driver_pdf_annotation_int=\count...
diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg
index 7630e74..a4f6e6e 100644
--- a/l3kernel/testfiles/m3expl003.xetex.tlg
+++ b/l3kernel/testfiles/m3expl003.xetex.tlg
@@ -6524,6 +6524,8 @@ Defining \__driver_pdf_object_write_dict:nn on line ..
 Defining \__driver_pdf_object_write_fstream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nn on line ...
 Defining \__driver_pdf_object_write_stream:nnnn on line ...
+Defining \driver_pdf_object_now:nn on line ...
+Defining \driver_pdf_object_now:nx on line ...
 Defining \g__driver_landscape_bool on line ...
 Defining \g__driver_pdf_annotation_int on line ...
 \g__driver_pdf_annotation_int=\count...





More information about the latex3-commits mailing list