%% %% This is file `l3backend-testphase-luatex.def', %% generated with the docstrip utility. %% %% The original source files were: %% %% l3backend-testphase.dtx (with options: `drivers,luatex') %% %% Copyright (C) 2019-2021 The LaTeX Project %% %% It may be distributed and/or modified under the conditions of %% the LaTeX Project Public License (LPPL), either version 1.3c of %% this license or (at your option) any later version. The latest %% version of this license is in the file: %% %% https://www.latex-project.org/lppl.txt %% %% This file is part of the "LaTeX PDF management testphase bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% %% File: l3backend-testphase.dtx \ProvidesExplFile {l3backend-testphase-luatex.def}{2021-03-17}{} {LaTeX~PDF~management~testphase~bundle~backend~support: PDF output (LuaTeX)} \RequirePackage{l3ref-tmp} \cs_generate_variant:Nn \ref_label:nn {en} \cs_generate_variant:Nn \ref_value:nn {en} \cs_new_protected:Npn \__pdf_backend_ref_label:nn #1 #2 { \@bsphack \ref_label:nn{#1}{abspage} \@esphack } \cs_new:Npn \__pdf_backend_ref_value:nn #1 #2 { \ref_value:nn{#1}{#2} } \cs_generate_variant:Nn \__pdf_backend_ref_label:nn {en} \cs_generate_variant:Nn \__pdf_backend_ref_value:nn {en} \prop_new:N \g__pdf_tmpa_prop \tl_new:N \l__pdf_tmpa_tl \box_new:N \l__pdf_backend_tmpa_box \int_new:N \g__pdf_backend_resourceid_int \int_new:N \g__pdf_backend_name_int \int_new:N \g__pdf_backend_page_int \directlua { require("l3backend-testphase.lua") } \cs_new:Npn \__kernel_pdf_name_from_unicode_e:n #1 { / \str_convert_pdfname:e { \text_expand:n { #1 } } } \tl_gput_right:Nn \@kernel@after@enddocument@afterlastpage { \g__kernel_pdfmanagement_end_run_code_tl } \tl_if_exist:NTF \@kernel@after@shipout@background { \g@addto@macro \@kernel@before@shipout@background{\relax} \g@addto@macro \@kernel@after@shipout@background { \g__kernel_pdfmanagement_thispage_shipout_code_tl } \tl_gput_left:Nn\@kernel@after@shipout@lastpage { \g__kernel_pdfmanagement_lastpage_shipout_code_tl } } { \hook_gput_code:nnn{shipout/background}{pdf} { \g__kernel_pdfmanagement_thispage_shipout_code_tl } \hook_gput_code:nnn {shipout/lastpage} {pdf} { \g__kernel_pdfmanagement_lastpage_shipout_code_tl } } \sys_if_engine_luatex:T { \cs_new_protected:Npn \__pdf_backend_Pages_primitive:n #1 { \tex_directlua:D { pdf.setpagesattributes( \__pdf_backend_luastring:n { #1 } ) } } } \cs_new:Npn \__pdf_backend_luastring:n #1 { "\tex_luaescapestring:D { \tex_unexpanded:D { #1 } }" } %not used, only there for consistency \cs_new_protected:Npn \__pdf_backend_Page_primitive:n #1 { \tex_latelua:D { pdf.setpageattributes(\__pdf_backend_luastring:n { #1 }) } } % the command to store default values. % Uses a prop with pdflatex + dvi, % sets a lua table with lualatex \cs_new_protected:Npn \__pdf_backend_Page_gput:nn #1 #2 { \tex_directlua:D { ltx.__pdf.backend_Page_gput ( \__pdf_backend_luastring:n { #1 }, \__pdf_backend_luastring:n { #2 } ) } } % the command to remove a default value. % Uses a prop with pdflatex + dvi, % changes a lua table with lualatex \cs_new_protected:Npn \__pdf_backend_Page_gremove:n #1 { \tex_directlua:D { ltx.__pdf.backend_Page_gremove (\__pdf_backend_luastring:n { #1 }) } } % the command used in the document. % direct call of the primitive special with dvips/dvipdfmx % \latelua: fill a page related table with lualatex, merge it with the page % table and push it directly % write to aux and store in prop with pdflatex \cs_new_protected:Npn \__pdf_backend_ThisPage_gput:nn #1 #2 { \tex_latelua:D { ltx.__pdf.backend_ThisPage_gput ( tex.count["g_shipout_readonly_int"], \__pdf_backend_luastring:n { #1 }, \__pdf_backend_luastring:n { #2 } ) ltx.__pdf.backend_ThisPage_gpush (tex.count["g_shipout_readonly_int"]) } } %the code to push the values, used in shipout %merges the two props and then fills the register in pdflatex %merges the two tables (the one is probably still empty) and then fills (in lua) in luatex %issues the values stored in the global prop with dvi \cs_new_protected:Npn \__pdf_backend_ThisPage_gpush:n #1 { \tex_latelua:D { ltx.__pdf.backend_ThisPage_gpush (tex.count["g_shipout_readonly_int"]) } } \clist_const:Nn \c__pdf_backend_PageResources_clist { ExtGState, ColorSpace, Pattern, Shading, } %create the backend objects: \clist_map_inline:Nn \c__pdf_backend_PageResources_clist { \__pdf_backend_object_new:nn {Page/Resources/#1} {dict} \cs_if_exist:NT \tex_directlua:D { \tex_directlua:D { ltx.__pdf.object["Page/Resources/#1"] = "\__pdf_backend_object_ref:n{Page/Resources/#1}" } } } \cs_new_protected:Npn \__pdf_backend_PageResources_gput:nnn #1 #2 #3 { \pdfdict_gput:nnn {g__pdf_Core/Page/Resources/#1} { #2 }{ #3 } % luatex must also trigger the lua side \tex_latelua:D{ltx.__pdf.Page.Resources.#1=true} \tex_latelua:D { ltx.pdf.Page_Resources_gpush(tex.count["g_shipout_readonly_int"]) } } \cs_new_protected:Npn \__pdf_backend_PageResources_obj_gpush: { \clist_map_inline:Nn \c__pdf_backend_PageResources_clist { \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Page/Resources/##1} } { \__pdf_backend_object_write:nx { Page/Resources/##1 } { \pdfdict_use:n { g__pdf_Core/Page/Resources/##1} } } } } \bool_new:N \l__pdf_backend_xform_bool \cs_set_protected:Npn \__pdf_backend_bdcobject: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 } \bool_if:NTF \l__pdf_backend_xform_bool { \exp_args:Nnx\pdfdict_gput:nnn { g__pdf_Core/Xform/Resources/Properties } { l3pdf\int_use:N\g__pdf_backend_name_int } { \__pdf_backend_object_ref:n { #2 } } } { \exp_args:Nx \tex_latelua:D { ltx.pdf.Page_Resources_Properties_gput ( tex.count["g_shipout_readonly_int"], "l3pdf\int_use:N\g__pdf_backend_name_int", "\__pdf_backend_object_ref:n { #2 }" ) } } } \cs_set_protected:Npn \__pdf_backend_bdcobject:n #1% #1 eg. Span { \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 } \bool_if:NTF \l__pdf_backend_xform_bool { \exp_args:Nnx\pdfdict_gput:nnn %no handler needed { g__pdf_Core/Xform/Resources/Properties } { l3pdf\int_use:N\g__pdf_backend_name_int } { \__pdf_backend_object_last: } } { \exp_args:Nx \tex_latelua:D { ltx.pdf.Page_Resources_Properties_gput ( tex.count["g_shipout_readonly_int"], "l3pdf\int_use:N\g__pdf_backend_name_int", "\__pdf_backend_object_last:" ) } } } \cs_set_protected:Npn \__pdf_backend_bmc:n #1 { \__kernel_backend_literal_page:n { /#1~BMC } } \cs_set_protected:Npn \__pdf_backend_bdc_contobj:nn #1 #2 { \pdf_object_unnamed_write:nn { dict } { #2 } \__pdf_backend_bdcobject:n { #1 } } \cs_set_protected:Npn \__pdf_backend_bdc_contstream:nn #1 #2 { \__kernel_backend_literal_page:n { /#1~<<#2>>~BDC } } \cs_set_protected:Npn \__pdf_backend_bdc:nn #1 #2 { \bool_if:NTF \g__pdfmanagement_active_bool {\cs_gset_eq:NN \__pdf_backend_bdc:nn \__pdf_backend_bdc_contobj:nn} {\cs_gset_eq:NN \__pdf_backend_bdc:nn \__pdf_backend_bdc_contstream:nn} \__pdf_backend_bdc:nn {#1}{#2} } \cs_set_protected:Npn \__pdf_backend_emc: { \__kernel_backend_literal_page:n { EMC } } \cs_new_protected:Npn \__pdf_backend_PageResources_gpush:n #1 {} \cs_new_protected:Npn \__pdf_backend_NamesEmbeddedFiles_gpush:n #1 %array content { \pdf_object_unnamed_write:nn {dict} {/Names [#1] } \tex_pdfextension:D~names~{/EmbeddedFiles~\pdf_object_ref_last: } } \int_new:N \g__pdf_backend_EmbeddedFiles_int \cs_new:Npn \__pdf_backend_EmbeddedFiles_name: { ( l3ef \int_compare:nNnT {\g__pdf_backend_EmbeddedFiles_int} < {10} {0} \int_compare:nNnT {\g__pdf_backend_EmbeddedFiles_int} < {100} {0} \int_compare:nNnT {\g__pdf_backend_EmbeddedFiles_int} < {1000} {0} \int_use:N \g__pdf_backend_EmbeddedFiles_int ) } \seq_new:N \g__pdf_backend_EmbeddedFiles_seq \prop_new:N \g__pdf_backend_EmbeddedFiles_named_prop \cs_new_protected:Npn \__pdf_backend_NamesEmbeddedFiles_add:n #1 %#1 object ref { \int_gincr:N \g__pdf_backend_EmbeddedFiles_int \prop_gput:Nnx \g__pdf_backend_EmbeddedFiles_named_prop { #1 } { \__pdf_backend_EmbeddedFiles_name: } \seq_gput_right:Nx \g__pdf_backend_EmbeddedFiles_seq { \__pdf_backend_EmbeddedFiles_name: \c_space_tl #1 } } \cs_new_protected:Npn \__pdf_backend_xform_new:nnnn #1 #2 #3 #4 { \hbox_set:Nn \l__pdf_backend_tmpa_box { \bool_set_true:N \l__pdf_backend_xform_bool \prop_gclear:c { \__kernel_pdfdict_name:n { g__pdf_Core/Xform/Resources/Properties } } #4 } \tl_const:cx { c__pdf_backend_xform_wd_ \tl_to_str:n {#1} _tl } { \tex_the:D \box_wd:N \l__pdf_backend_tmpa_box } \tl_const:cx { c__pdf_backend_xform_ht_ \tl_to_str:n {#1} _tl } { \tex_the:D \box_ht:N \l__pdf_backend_tmpa_box } \tl_const:cx { c__pdf_backend_xform_dp_ \tl_to_str:n {#1} _tl } { \tex_the:D \box_dp:N \l__pdf_backend_tmpa_box } %% do we need to test if #2 and #3 are empty?? \tex_immediate:D \tex_pdfxform:D ~ attr ~ { #2 } %% which resources should be default? Is an argument actually needed? ~ resources ~ { #3 \int_compare:nNnT {\prop_count:c { \__kernel_pdfdict_name:n { g__pdf_Core/Xform/Resources/Properties } }} > { 0 } { /Properties~ << \pdfdict_use:n { g__pdf_Core/Xform/Resources/Properties } >> } \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Page/Resources/ExtGState } } { /ExtGState~ \pdf_object_ref:n { Page/Resources/ExtGState } } \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Page/Resources/Pattern } } { /Pattern~ \pdf_object_ref:n { Page/Resources/Pattern } } \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Page/Resources/Shading } } { /Shading~ \pdf_object_ref:n { Page/Resources/Shading } } \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Page/Resources/ColorSpace } } { /ColorSpace~ \pdf_object_ref:n { Page/Resources/ColorSpace } } } \l__pdf_backend_tmpa_box \int_const:cn { c__pdf_backend_xform_ \tl_to_str:n {#1} _int } { \tex_pdflastxform:D } } \cs_new_protected:Npn \__pdf_backend_xform_use:n #1 %protected as with xelatex { \tex_pdfrefxform:D \int_use:c { c__pdf_backend_xform_ \tl_to_str:n {#1} _int } \scan_stop: } \cs_new:Npn \__pdf_backend_xform_ref:n #1 { \int_use:c { c__pdf_backend_xform_ \tl_to_str:n {#1} _int } ~ 0 ~ R } %% all \prg_new_conditional:Npnn \__pdf_backend_xform_if_exist:n #1 { p , T , F , TF } { \int_if_exist:cTF { c__pdf_backend_xform_ \tl_to_str:n {#1} _int } { \prg_return_true: } { \prg_return_false:} } \prg_new_eq_conditional:NNn \pdfxform_if_exist:n\__pdf_backend_xform_if_exist:n { TF , T , F , p } %% %% %% End of file `l3backend-testphase-luatex.def'.