[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