diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty | 448 |
1 files changed, 245 insertions, 203 deletions
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty index af8ec11aa9c..390965ae506 100644 --- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty +++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty @@ -1,210 +1,252 @@ -\ProvidesExplPackage {tagpdf-tree-code} {2019/07/02} {0.61} +%% +%% This is file `tagpdf-tree-code.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% tagpdf-tree.dtx (with options: `tree') +%% +%% Copyright (C) 2019 Ulrike Fischer +%% +%% 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 "tagpdf bundle" (The Work in LPPL) +%% and all files in that bundle must be distributed together. +%% +%% File: tagpdf-tree.dtx +\ProvidesExplPackage {tagpdf-tree-code} {2021/02/23} {0.80} {part of tagpdf - code related to writing trees and dictionaries to the pdf} -%this does the actual finishing: -\AtBeginDocument - { - \bool_if:NT \g_uftag_active_tree_bool - { - \AfterEndDocument { \uftag_finish_structure: } - } - } - - -% the StructTreeRoot -% we better get the object number in any case: -\__uftag_pdfreserveobjnum:N \l_tmpa_tl -\tl_const:Nx \c_uftag_tree_obj_structtreeroot_tl { \l_tmpa_tl } - - -\cs_new:Nn \__uftag_tree_write_structtreeroot: - { - \__uftag_pdfcatalog:n { /StructTreeRoot~\c_uftag_tree_obj_structtreeroot_tl\c_space_tl0~R } - \__uftag_struct_write_obj:n { 0 } - } - -\cs_new:Nn \__uftag_tree_write_structelements: - { - \int_step_inline:nnnn {1}{1}{\c@g__uftag_struct_abs_int} - { - %\prop_show:c {g__uftag_struct_##1_prop} - \__uftag_struct_write_obj:n { ##1 } %write the object - } - } - - -%the ParentTree -\__uftag_pdfreserveobjnum:N \l_tmpa_tl -\tl_const:Nx \c__uftag_tree_obj_parenttree_tl { \l_tmpa_tl } - -% we have two sets of entries in the parent tree: -% page streams and real objects. -% The numbers must be distinct and ordered -% So we rely on abspage and put the real objects at the end -% I use a counter to have a chance to get the correct number -% if code is process twice. -\newcounter { g__uftag_parenttree_obj_int } -\AtBeginDocument - { \int_gset:Nn \c@g__uftag_parenttree_obj_int - { \zref@extractdefault{LastPage}{abspage}{100} } - } - -% we need to record the obj references: - -\tl_new:N \g__uftag_parenttree_objr_tl - -\cs_new:Nn \__uftag_parenttree_add_objr:nn %#1 Structparent number, #2 obj number -{ - \tl_gput_right:Nx \g__uftag_parenttree_objr_tl +\hook_gput_code:nnn{begindocument}{tagpdf} { - #1 \c_space_tl #2\c_space_tl 0 \c_space_tl R\c_space_tl ^^J + \bool_if:NT \g__tag_active_tree_bool + { + \AfterEndDocument { \tag_finish_structure: } + } } -} - -\tl_new:N \l__uftag_parenttree_content_tl - -\cs_new:Nn \__uftag_tree_fill_parenttree: - { - \int_step_inline:nnnn{1}{1}{\zref@extractdefault{LastPage}{abspage}{-1}} %not quite clear if labels are needed. See lua code - { %page ##1\par - \prop_clear:N \l_tmpa_prop - \int_step_inline:nnnn{1}{1}{\zref@extractdefault{LastPage}{tagmcabs}{-1}} - { - %mcid####1 - \int_compare:nT%F - {\zref@extractdefault{mcid-####1}{tagabspage}{-1}=##1} %mcid is on current page - {% yes\par - \prop_put:Nxx \l_tmpa_prop - {\zref@extractdefault{mcid-####1}{tagmcid}{-1}} - {\prop_item:Nn \g__uftag_mc_parenttree_prop {####1}} - } - } - %\prop_show:N \l_tmpa_prop - \tl_put_right:Nx\l__uftag_parenttree_content_tl - {\int_eval:n {##1-1}\c_space_tl[\c_space_tl} %%brackt - \int_step_inline:nnnn {0}{1}{ \prop_map_function:NN \l_tmpa_prop\__uftag_prop_count:nn -1 } - { - \prop_get:NnNTF \l_tmpa_prop {####1} \l_tmpb_tl - {% page#1:mcid##1:\l_tmpb_tl :content - \tl_put_right:Nx \l__uftag_parenttree_content_tl - { - \prop_item:cn { g__uftag_struct_\l_tmpb_tl _prop } {objnum}~0~R~ - } - } - {\msg_warning:nn {uftag} {tree-mcid-index-wrong} } - } - \tl_put_right:Nn \l__uftag_parenttree_content_tl {]^^J} % + + +\pdf_object_new:nn { c__tag_struct_0_obj }{ dict } + + %need to think about the best place ... +\hook_gput_code:nnn{begindocument}{tagpdf} + { + \bool_if:NT \g__tag_active_struct_bool + { + \pdfmanagement_add:nnx + { Catalog } + { StructTreeRoot } + { \pdf_object_ref:n { c__tag_struct_0_obj } } + } + } +\cs_new_protected:Nn \__tag_tree_write_structtreeroot: + { + \__tag_struct_write_obj:n { 0 } + } + +\cs_new_protected:Nn \__tag_tree_write_structelements: + { + \int_step_inline:nnnn {1}{1}{\c@g__tag_struct_abs_int} + { + %\prop_show:c {g__tag_struct_##1_prop} + \__tag_struct_write_obj:n { ##1 } %write the object + } + } + + +\pdf_object_new:nn { c__tag_tree_parenttree_obj }{ dict } + +\newcounter { g__tag_parenttree_obj_int } +\hook_gput_code:nnn{begindocument}{tagpdf} + { + \int_gset:Nn + \c@g__tag_parenttree_obj_int + { \__tag_ref_value_lastpage:nn{abspage}{100} } + } + + +\tl_new:N \g__tag_parenttree_objr_tl + +\cs_new_protected:Nn \__tag_parenttree_add_objr:nn %#1 Structparent number, #2 objref + { + \tl_gput_right:Nx \g__tag_parenttree_objr_tl + { + #1 \c_space_tl #2 ^^J + } + } + +\tl_new:N \l__tag_parenttree_content_tl + +\cs_new_protected:Nn \__tag_tree_fill_parenttree: + { + \int_step_inline:nnnn{1}{1}{\__tag_ref_value_lastpage:nn{abspage}{-1}} %not quite clear if labels are needed. See lua code + { %page ##1\par + \prop_clear:N \l_tmpa_prop + \int_step_inline:nnnn{1}{1}{\__tag_ref_value_lastpage:nn{tagmcabs}{-1}} + { + %mcid####1 + \int_compare:nT%F + {\__tag_ref_value:enn{mcid-####1}{tagabspage}{-1}=##1} %mcid is on current page + {% yes\par + \prop_put:Nxx + \l_tmpa_prop + {\__tag_ref_value:enn{mcid-####1}{tagmcid}{-1}} + {\prop_item:Nn \g__tag_mc_parenttree_prop {####1}} + } + } + %\prop_show:N \l_tmpa_prop + \tl_put_right:Nx\l__tag_parenttree_content_tl + { + \int_eval:n {##1-1}\c_space_tl + [\c_space_tl %] + } + \int_step_inline:nnnn + {0} + {1} + { \prop_map_function:NN \l_tmpa_prop\__tag_prop_count:nn -1 } + { + \prop_get:NnNTF \l_tmpa_prop {####1} \l_tmpb_tl + {% page#1:mcid##1:\l_tmpb_tl :content + \tl_put_right:Nx \l__tag_parenttree_content_tl + { + \prop_item:cn { g__tag_struct_\l_tmpb_tl _prop } {objref} + \c_space_tl + } + %\tl_show:N \l__tag_parenttree_content_tl + } + { + \msg_warning:nn { tag } {tree-mcid-index-wrong} + } + } + \tl_put_right:Nn + \l__tag_parenttree_content_tl + {%[ + ]^^J + } + } + } + +\cs_new_protected:Nn \__tag_tree_lua_fill_parenttree: + { + \tl_set:Nn \l__tag_parenttree_content_tl + { + \directlua + { + ltx.__tag.func.output_parenttree + ( + \int_use:N\g_shipout_readonly_int + ) + } + } + } + +\cs_new_protected:Nn \__tag_tree_write_parenttree: + { + \bool_if:NTF \g__tag_mode_lua_bool + { + \__tag_tree_lua_fill_parenttree: + } + { + \__tag_tree_fill_parenttree: + } + \tl_put_right:NV \l__tag_parenttree_content_tl\g__tag_parenttree_objr_tl + \pdf_object_write:nx { c__tag_tree_parenttree_obj } + { + /Nums\c_space_tl [\l__tag_parenttree_content_tl] + } + } + + +\pdf_object_new:nn { c__tag_tree_rolemap_obj }{ dict } + +\tl_new:N \l__tag_rolemap_content_tl + +\cs_new_protected:Nn \__tag_tree_fill_rolemap: + { + \prop_map_inline:Nn \g__tag_role_rolemap_prop + { + \tl_put_right:Nx \l__tag_rolemap_content_tl + { + /##1\c_space_tl/##2^^J + } + } + } + +\cs_new_protected:Nn \__tag_tree_write_rolemap: + { + \__tag_tree_fill_rolemap: + \pdf_object_write:nx { c__tag_tree_rolemap_obj } + { + \l__tag_rolemap_content_tl + } + } + + +\cs_new_protected:Nn \__tag_tree_write_classmap: + { + \tl_gclear:N \g__tag_attr_class_content_tl + \seq_gremove_duplicates:N \g__tag_attr_class_used_seq + \seq_set_map:NNn \l_tmpa_seq \g__tag_attr_class_used_seq + { + /##1\c_space_tl + << + \prop_item:Nn + \g__tag_attr_entries_prop + {##1} + >> + } + \tl_gset:Nx \g__tag_attr_class_content_tl + { + \seq_use:Nn + \l_tmpa_seq + { \iow_newline: } + } + \tl_if_empty:NF + \g__tag_attr_class_content_tl + { + \pdf_object_new:nn { c__tag_tree_classmap_obj }{ dict } + % \__tag_pdfreserveobjnum:N \l_tmpa_tl + % \tl_const:Nx \c__tag_tree_obj_classmap_tl { \l_tmpa_tl } + \pdf_object_write:nx + { c__tag_tree_classmap_obj } + { \g__tag_attr_class_content_tl } + \__tag_prop_gput:cnx + { g__tag_struct_0_prop } + { ClassMap } + { \pdf_object_ref:n { c__tag_tree_classmap_obj } } + } } - } - -%lua mode must/can do it differently -\cs_new:Nn \__uftag_tree_lua_fill_parenttree: - { - \tl_set:Nn \l__uftag_parenttree_content_tl - { - \directlua{uftag.func.output_parenttree(\int_use:N\g__uftag_abspage_int)} - } - } - - - -\cs_new:Nn \__uftag_tree_write_parenttree: - { - \bool_if:NTF \g__uftag_mode_lua_bool - { - \__uftag_tree_lua_fill_parenttree: - } - { - \__uftag_tree_fill_parenttree: - } - \tl_put_right:NV \l__uftag_parenttree_content_tl\g__uftag_parenttree_objr_tl - \__uftag_pdfuseobjnum:xx { \c__uftag_tree_obj_parenttree_tl } - { - <<\c_space_tl/Nums\c_space_tl [\l__uftag_parenttree_content_tl] \c_space_tl >> - } - } - -%the Rolemap tree -\__uftag_pdfreserveobjnum:N \l_tmpa_tl -\tl_const:Nx \c__uftag_tree_obj_rolemap_tl { \l_tmpa_tl } -\tl_new:N \l__uftag_rolemap_content_tl - -\cs_new:Nn \__uftag_tree_fill_rolemap: - { - \prop_map_inline:Nn \g__uftag_role_rolemap_prop - { - \tl_put_right:Nx \l__uftag_rolemap_content_tl - { - /##1\c_space_tl/##2^^J - } - } - } - -\cs_new:Nn \__uftag_tree_write_rolemap: - { - \__uftag_tree_fill_rolemap: - \__uftag_pdfuseobjnum:xx { \c__uftag_tree_obj_rolemap_tl } - { - <<\l__uftag_rolemap_content_tl >> - } - } - -%classmap, should only be written, if values has been used - -\cs_new_protected:Nn \__uftag_tree_class_write_map: - { - \tl_gclear:N \g__uftag_attr_class_content_tl - \seq_gremove_duplicates:N \g__uftag_attr_class_used_seq - \seq_set_map:NNn \l_tmpa_seq \g__uftag_attr_class_used_seq - { - /##1\c_space_tl - \prop_item:Nn \g__uftag_attr_entries_prop - {##1} - } - \tl_gset:Nx \g__uftag_attr_class_content_tl - { - \seq_use:Nn \l_tmpa_seq - { \iow_newline: } - } - \tl_if_empty:NF \g__uftag_attr_class_content_tl + +\cs_new_protected:Nn \tag_finish_structure: + { + \__tag_tree_write_parenttree: + \__tag_tree_write_rolemap: + \__tag_tree_write_classmap: + \__tag_tree_write_structelements: %this is rather slow!! + \__tag_tree_write_structtreeroot: + } + +\cs_set_eq:NN \uftag_finish_structure: \tag_finish_structure: + +\hook_gput_code:nnn{begindocument}{tagpdf} { - \__uftag_pdfreserveobjnum:N \l_tmpa_tl - \tl_const:Nx \c__uftag_tree_obj_classmap_tl { \l_tmpa_tl } - \__uftag_pdfuseobjnum:Nx \c__uftag_tree_obj_classmap_tl - { <<\g__uftag_attr_class_content_tl>> } - - \__uftag_prop_gput:cnx - { g__uftag_struct_0_prop } - { ClassMap } - { \c__uftag_tree_obj_classmap_tl\c_space_tl0\c_space_tl R } + \bool_if:NT\g__tag_active_tree_bool + { + \hook_gput_code:nnn{shipout/before} { tagpdf/structparents } + { + \pdfmanagement_add:nnx + { Page } + {StructParents} + {\int_eval:n { \g_shipout_readonly_int}} + } + } } - } - - -\cs_new:Nn \uftag_finish_structure: - { - \__uftag_pdfcatalog:n {^^J/MarkInfo\c_space_tl<</Marked\c_space_tl true>> } - \__uftag_tree_write_parenttree: - \__uftag_tree_write_rolemap: - \__uftag_tree_class_write_map: - \__uftag_tree_write_structelements: - \__uftag_tree_write_structtreeroot: - } - - -%StructParents + tabs order. Tabs order should be probably be changeable by page. - -\cs_new:Nn \__uftag_tree_write_pageattr: - { - \__uftag_get_pdfpageattr:N \l_tmpa_tl - \regex_replace_once:nnN {/StructParents\s*\d+} {}\l_tmpa_tl - \regex_replace_once:nnN {/Tabs\s*/[SCR]} {}\l_tmpa_tl - \__uftag_gset_pdfpageattr:x - { - \l_tmpa_tl / StructParents \c_space_tl - \int_eval:n { \g__uftag_abspage_int } - \l__uftag_tree_tabs_order_tl - } - } - -\endinput + +%% +%% +%% End of file `tagpdf-tree-code.sty'. |