[latex3-commits] [git/LaTeX3-latex3-pdfresources] backendtest: working on bdc/properties (f456944)

Ulrike Fischer fischer at troubleshooting-tex.de
Wed Jun 26 00:16:13 CEST 2019


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

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

commit f4569446752e0ecfb30f743b950ddfd7f5dc0b9a
Author: Ulrike Fischer <fischer at troubleshooting-tex.de>
Date:   Wed Jun 26 00:16:13 2019 +0200

    working on bdc/properties


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

f4569446752e0ecfb30f743b950ddfd7f5dc0b9a
 experiments/bdc-properties.tex | 167 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 167 insertions(+)

diff --git a/experiments/bdc-properties.tex b/experiments/bdc-properties.tex
new file mode 100644
index 0000000..86181f2
--- /dev/null
+++ b/experiments/bdc-properties.tex
@@ -0,0 +1,167 @@
+% !Mode:: "TeX:DE:UTF-8:Main"
+\documentclass{article}
+\usepackage{l3pdf,ifluatex,atbegshi}
+
+
+\ExplSyntaxOn
+\cs_new:Nn\properties_shipout_code:{}
+\AtBeginShipout
+ {%
+  \AtBeginShipoutAddToBox
+  {
+   \properties_shipout_code:
+  }
+ }
+
+%correct g to c, is already in master ...
+\sys_if_engine_xetex:T
+{
+ \cs_set:Npn \__pdf_backend_object_ref:n #1
+   { @pdf.obj \int_use:c { c__pdf_backend_object_ \tl_to_str:n {#1} _int } }
+}   
+
+\pdf_uncompress:
+\ExplSyntaxOff
+\ifluatex
+\usepackage{luacode}
+% the following should latter get in the l3kernel table and be named
+% more sensibly. This here is only for testing
+\begin{luacode}
+l3kernel= l3kernel or {}
+l3kernel.properties = l3kernel.properties or {}
+
+local function __pdf_backend_PageN_Resources_gpush (page)
+ local token=""
+ if l3kernel.properties[page] then
+  for name,value in pairs(l3kernel.properties[page]) do
+   token = token .. "/"..name.." "..value
+  end 
+  token = "/Properties <<"..token..">>"
+ end
+ -- add ExtGstate etc here ....
+ return token
+end
+
+function l3kernel.PageN_properties_gput (page,name,value) -- tex.count["g__pdf_abspage_int"]
+ l3kernel.properties[page] = l3kernel.properties[page] or {}
+ l3kernel.properties[page][name]=value
+end
+
+function l3kernel.properties_PageN_gpush (page)
+ if l3kernel.properties[page] then 
+  pdf.setpageresources(__pdf_backend_PageN_Resources_gpush (page))
+ end 
+end
+\end{luacode}
+\fi
+
+\ExplSyntaxOn
+%dvips
+% dvips is easy: create an object, and reference it in the bdc
+% ghostscript will then automatically replace it by a name
+% and add the name to the /Properties dict
+% first special from pdfbase.sty, second from von accsupp:
+
+\bool_if:nT {\sys_if_engine_pdftex_p: && !\sys_if_output_pdf_p: }
+ {
+  \cs_set_protected:Npn \__pdf_backend_bdc:nn #1 #2 % #1 eg. Span, #2: object name
+   {
+     %\special{ps:~SDict~begin~mark~/#1~\__pdf_backend_object_ref:n{#2}~/BDC~pdfmark~end}
+     \special{ps:[/#1~\__pdf_backend_object_ref:n{#2}~BDC~pdfmark} %]
+   }
+  \cs_set_protected:Npn \__pdf_backend_emc:
+   {
+    %\special{ps:~SDict~begin~mark~/EMC~pdfmark~end}
+    \special{ps:[/EMC~pdfmark} %]
+   }
+ }
+
+\int_new:N  \g__pdf_backend_name_int
+%xetex has so create the entries in the /Properties manually (like the other backends)
+\sys_if_engine_xetex:T
+{
+ \cs_set_protected:Npn \__pdf_backend_bdc:nn #1 #2 % #1 eg. Span, #2: object name
+   {
+     \int_gincr:N \g__pdf_backend_name_int
+     %\special{pdf:code~#1/l3pdf\int_use:N\g__pdf_backend_name_int\c_space_tl BDC}
+     \special{pdf:content~/#1/l3pdf\int_use:N\g__pdf_backend_name_int\c_space_tl BDC}
+     \special{
+        pdf:put~@resources~
+        <<
+         /Properties~
+          <<
+           /l3pdf\int_use:N\g__pdf_backend_name_int\c_space_tl
+           \__pdf_backend_object_ref:n{#2}
+          >>
+         >>
+       }
+     %\special{ps:~SDict~begin~mark~/#1~\__pdf_backend_object_ref:n{#2}~/BDC~pdfmark~end}
+   }
+  \cs_set_protected:Npn \__pdf_backend_emc:
+   {
+    %\special{pdf:code~EMC}  %pdfbase
+    \special{pdf:content~EMC}% accsupp
+   }
+
+}
+
+% luatex
+\sys_if_engine_luatex:T
+{
+ \cs_set_protected:Npn \__pdf_backend_bdc:nn #1 #2 % #1 eg. Span, #2: object name
+   {
+     \int_gincr:N \g__pdf_backend_name_int
+     \exp_args:Nx\__kernel_backend_literal_page:n
+       {/#1 ~ /l3pdf\int_use:N\g__pdf_backend_name_int\c_space_tl BDC}
+     \exp_args:Nx\tex_latelua:D
+     {
+      l3kernel.PageN_properties_gput 
+       ( tex.count["c at page"],
+         "l3pdf\int_use:N\g__pdf_backend_name_int",
+         "\__pdf_backend_object_ref:n{#2}"
+       )
+      l3kernel.properties_PageN_gpush (tex.count["c at page"]) 
+     }
+   }
+  \cs_set_protected:Npn \__pdf_backend_emc:
+   {
+    \__kernel_backend_literal_page:n { EMC }
+   }
+}
+% pdflatex is the most complicated as it has to go through the aux ...
+\bool_if:nT {\sys_if_engine_pdftex_p: && \sys_if_output_pdf_p: }
+{
+ \cs_set_protected:Npn \__pdf_backend_bdc:nn #1 #2 % #1 eg. Span, #2: object name
+   {
+     \int_gincr:N \g__pdf_backend_name_int
+     \exp_args:Nx\__kernel_backend_literal_page:n
+       {/#1 ~ /l3pdf\int_use:N\g__pdf_backend_name_int\c_space_tl BDC}
+    % code to set the property ....   
+       
+   }    
+ \cs_set_protected:Npn \__pdf_backend_emc:
+   {
+    \__kernel_backend_literal_page:n { EMC }
+   }
+}
+\ExplSyntaxOff
+\begin{document}
+\ExplSyntaxOn
+\__pdf_backend_object_new:nn   {objA}{dict}
+\__pdf_backend_object_write:nn {objA}{/Type/Artifact}
+
+\__pdf_backend_object_new:nn   {objB}{dict}
+\__pdf_backend_object_write:nn {objB}{/ActualText(abc)}
+
+
+\__pdf_backend_bdc:nn {Span}{objA}xxx
+\__pdf_backend_emc:
+
+\__pdf_backend_bdc:nn {Span}{objA}xxx
+\__pdf_backend_emc:
+
+\__pdf_backend_bdc:nn {Span}{objB}xxx
+\__pdf_backend_emc:
+
+\ExplSyntaxOff
+\end{document} 
\ No newline at end of file





More information about the latex3-commits mailing list