\RequirePackage{expl3}[2019/07/01] %\RequirePackage[enable-debug]{expl3}[2018/06/14] \ProvidesExplPackage {tagpdf} {2019/07/02} {0.61} {A package to experiment with pdf tagging} %\debug_on:n{check-declarations,check-expressions,deprecation} %map internal tag to package name \prop_if_exist:NT \g_msg_module_name_prop { \prop_gput:Nnn \g_msg_module_name_prop { uftag }{ tagpdf } } % storing internal names to my name space: \cs_set_eq:NN \__uftag_tex_pdffeedback:D \tex_pdffeedback:D \cs_set_eq:NN \__uftag_tex_pdfextension:D \tex_pdfextension:D \cs_set_eq:NN \__uftag_tex_immediate:D \tex_immediate:D \cs_set_eq:NN \__uftag_tex_pdfvariable:D \tex_pdfvariable:D \cs_set_eq:NN \__uftag_tex_global:D \tex_global:D \cs_set_eq:NN \__uftag_tex_the:D \tex_the:D \cs_set_eq:NN \__uftag_tex_pdfliteral:D \tex_pdfliteral:D \cs_set_eq:NN \__uftag_tex_pdfcatalog:D \tex_pdfcatalog:D \cs_set_eq:NN \__uftag_tex_pdflastobj:D \tex_pdflastobj:D \cs_set_eq:NN \__uftag_tex_pdfobj:D \tex_pdfobj:D \cs_set_eq:NN \__uftag_tex_pdfpageattr:D \tex_pdfpageattr:D \cs_set_eq:NN \__uftag_tex_pdfpagesattr:D \tex_pdfpagesattr:D \cs_set_eq:NN \__uftag_tex_pdfpageref:D \tex_pdfpageref:D \cs_set_eq:NN \__uftag_tex_pdfcompresslevel:D \tex_pdfcompresslevel:D \cs_set_eq:NN \__uftag_tex_pdfobjcompresslevel:D \tex_pdfobjcompresslevel:D %%% package options \bool_new:N\g__uftag_mode_lua_bool \DeclareOption{luamode} { \sys_if_engine_luatex:T { \bool_gset_true:N \g__uftag_mode_lua_bool } } \DeclareOption{genericmode}{ \bool_gset_false:N\g__uftag_mode_lua_bool } \ExecuteOptions{luamode} \ProcessOptions %%% some packages \RequirePackage{xparse} \RequirePackage{atbegshi} \RequirePackage{zref-base,zref-lastpage} \RequirePackage{etoolbox} \RequirePackage{l3pdf} %\RequirePackage{pdfescape} %check if needed %\RequirePackage{pdftexcmds}%check if needed (expandable commands!) %\RequirePackage{l3str-convert} \cs_generate_variant:Nn \str_set_convert:Nnnn {Nonn, Noon, Nnon } %%% absolute page numbers \int_new:N \g__uftag_abspage_int \int_gset:Nn \g__uftag_abspage_int { 0 } \zref@newlist {uftagzrl} %zrl=zreflist \zref@newprop*{tagabspage} [0] { \int_use:N \g__uftag_abspage_int } \zref@addprop {uftagzrl} {tagabspage} %%% tagpdfsetup, %%% TODO: checks need to be improved \int_new:N \l__uftag_loglevel_int \tl_new:N \l__uftag_tree_tabs_order_tl \keys_define:nn { uftag / setup } { activate-mc .bool_gset:N = \g_uftag_active_mc_bool, activate-tree .bool_gset:N = \g_uftag_active_tree_bool, activate-struct .bool_gset:N = \g_uftag_active_struct_bool, activate-all .meta:n ={activate-mc,activate-tree,activate-struct}, check-tags .bool_gset:N = \g__uftag_check_tags_bool, check-tags .initial:n = true, log .choice:, log / none .code:n = {\int_set:Nn \l__uftag_loglevel_int { 0 }}, log / v .code:n = {\int_set:Nn \l__uftag_loglevel_int { 1 }}, log / vv .code:n = {\int_set:Nn \l__uftag_loglevel_int { 2 }}, log / vvv .code:n = {\int_set:Nn \l__uftag_loglevel_int { 3 }}, log / all .code:n = {\int_set:Nn \l__uftag_loglevel_int { 10 }}, tagunmarked .bool_gset:N = \g__uftag_tagunmarked_bool, tagunmarked .initial:n = true, tabsorder .choice:, tabsorder / row .code:n = {\tl_set:Nn \l__uftag_tree_tabs_order_tl {/Tabs/R}}, tabsorder / column .code:n = {\tl_set:Nn \l__uftag_tree_tabs_order_tl {/Tabs/C}}, tabsorder / structure .code:n = {\tl_set:Nn \l__uftag_tree_tabs_order_tl {/Tabs/S}}, tabsorder / none .code:n = {\tl_set:Nn \l__uftag_tree_tabs_order_tl {}}, tabsorder .initial:n = structure, uncompress .code:n = {\pdf_uncompress: }, inputencoding .code:n = { \sys_if_engine_pdftex:T { \tl_gset:Nn \g__uftag_inputencoding_tl { #1 } } }, } % escape commands are a bit engine specific so have been moved to the backend files. % commands to escape strings so that they can be safely used in pdf % currently not much used. But will be needed later, when alt and actualtext are added. % we probably need the equivalent \pdfescapestring, \pdfescapename \pdfescapehex % the commands of pdfescape adds an additional layout to allow for babel shorthands %\cs_set_eq:NN \__uftag_pdf_escape_string:Nn \EdefEscapeString %\cs_set_eq:NN \__uftag_pdf_escape_name:Nn \EdefEscapeName %\cs_set_eq:NN \__uftag_pdf_escape_hex:Nn \EdefEscapeHex %\cs_set_eq:NN \__uftag_pdf_escape_string:n \EdefEscapeString %\cs_set_eq:NN \__uftag_pdf_escape_name:Nn \EdefEscapeName %escape command. They are backend specific as \pdf@escapehex would ignore most chars %outside the "pdflatex" range % a hook for later code and an absolute page counter % should be executed before counters are resetted. % is it used? \cs_new:Nn \__uftag_finish_page_hook: { } \AtBeginShipout { \__uftag_finish_page_hook: \bool_if:NT\g_uftag_active_tree_bool { \__uftag_tree_write_pageattr: } \int_gincr:N \g__uftag_abspage_int } %testing the engines and loading the backend files \sys_if_engine_xetex:T { \PackageError { tagpdf } { xelatex~is~not~supported~-~aborting } {} \tex_endinput:D } \sys_if_engine_luatex:T { \file_input:n {tagpdf-luatex.def} } \sys_if_engine_pdftex:T { \file_input:n {tagpdf-pdftex.def} } \sys_if_output_dvi:T { \PackageError { tagpdf } { dvi~output~is~not~supported~-~aborting }{} \tex_endinput:D } \cs_generate_variant:Nn \__uftag_prop_gput:Nnn { Nxn , Nxx, Nnx , cnn, cxn, cnx, cno} \cs_generate_variant:Nn \__uftag_seq_gput_right:Nn { Nx , No, cn, cx } \cs_generate_variant:Nn \__uftag_prop_new:N { c } \cs_generate_variant:Nn \__uftag_seq_new:N { c } \cs_generate_variant:Nn \__uftag_seq_show:N { c } \cs_generate_variant:Nn \__uftag_prop_show:N { c } \cs_generate_variant:Nn \prop_gput:Nnn {Nxx} \cs_generate_variant:Nn \prop_put:Nnn {Nxx} \cs_generate_variant:Nn \__uftag_pdfuseobjnum:Nn {Nx,No} \cs_generate_variant:Nn \__uftag_pdfuseobjnum:nn {nx,xx} \cs_generate_variant:Nn \__uftag_gset_pdfpageattr:n {x} % few temp tl \tl_new:N \g__uftag_tmpa_tl \tl_new:N \l__uftag_tmpa_tl \tl_new:N \l__uftag_tmpb_tl \tl_new:N \l__uftag_tmpc_tl \tl_new:N \l__uftag_tmpd_tl \tl_new:N \l__uftag_tmpe_tl \str_new:N \l__uftag_tmpa_str % helper function to get the propcount. % use as \prop_map_function:NN PROP { \__uftag_prop_count:nn -1 } \cs_new:Nn\__uftag_prop_count:nn { + 1 } %% Loading the tagpdf sub packages \RequirePackage { tagpdf-checks-code } \RequirePackage { tagpdf-user } \RequirePackage { tagpdf-tree-code } \RequirePackage { tagpdf-roles-code } \RequirePackage { tagpdf-attr-code } % mc-code is split: \RequirePackage { tagpdf-mc-code-shared } \bool_if:NTF \g__uftag_mode_lua_bool { \RequirePackage {tagpdf-mc-code-lua} } { \RequirePackage { tagpdf-mc-code-generic } % } \RequirePackage { tagpdf-struct-code } \RequirePackage { tagpdf-space-code } \endinput