diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty | 265 |
1 files changed, 228 insertions, 37 deletions
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty index a16f4ebacf8..83a173ba6de 100644 --- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty +++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty @@ -27,7 +27,7 @@ %% and all files in that bundle must be distributed together. %% %% File: tagpdf.dtx -\ProvidesExplPackage {tagpdf} {2021-07-03} {0.91} +\ProvidesExplPackage {tagpdf} {2021-08-27} {0.92} { A package to experiment with pdf tagging } \bool_if:nF @@ -102,6 +102,8 @@ \seq_new:N \l__tag_tmpb_seq \clist_new:N \l__tag_tmpa_clist \int_new:N \l__tag_tmpa_int +\box_new:N \l__tag_tmpa_box +\box_new:N \l__tag_tmpb_box \clist_const:Nn \c__tag_refmc_clist {tagabspage,tagmcabs,tagmcid} \clist_const:Nn \c__tag_refstruct_clist {tagstruct,tagstructobj} \int_new:N \l__tag_loglevel_int @@ -192,7 +194,11 @@ % \end{macrocode} log .choice:, log / none .code:n = {\int_set:Nn \l__tag_loglevel_int { 0 }}, - log / v .code:n = {\int_set:Nn \l__tag_loglevel_int { 1 }}, + log / v .code:n = + { + \int_set:Nn \l__tag_loglevel_int { 1 } + \cs_set_protected:Nn \__tag_check_typeout_v:n { \iow_term:x {##1} } + }, log / vv .code:n = {\int_set:Nn \l__tag_loglevel_int { 2 }}, log / vvv .code:n = {\int_set:Nn \l__tag_loglevel_int { 3 }}, log / all .code:n = {\int_set:Nn \l__tag_loglevel_int { 10 }}, @@ -252,6 +258,10 @@ {something~is~wrong~with~the~mcid--rerun} \msg_new:nnn { tag } {sys-no-interwordspace} {engine/output~mode~#1~doesn't~support~the~interword~spaces} +\cs_set_eq:NN \__tag_check_typeout_v:n \use_none:n +\msg_new:nnnn { tag } {para-hook-count-wrong} + {The~number~of~automatic~begin~(#1)~and~end~(#2)~para~hooks~differ!} + {This~quite~probably~a~coding~error~and~the~structure~will~be~wrong!} \cs_new:Npn \tag_get:n #1 { \use:c {__tag_get_data_#1: } } \prg_new_conditional:Npnn \tag_if_active: { p , T , TF, F } { @@ -455,8 +465,34 @@ \seq_show:N \l_tmpa_seq } } +\prg_new_conditional:Npnn \__tag_check_if_mc_in_galley: { T,F,TF } + { + \tl_if_eq:NNTF \l__tag_mc_firstmarks_seq \l__tag_mc_botmarks_seq + { \prg_return_false: } + { \prg_return_true: } + } + +\prg_new_conditional:Npnn \__tag_check_if_mc_tmb_missing: { T,F,TF } + { + \bool_if:nTF + { + \str_if_eq_p:ee {\seq_item:Nn \l__tag_mc_firstmarks_seq {1}}{e-} + || + \str_if_eq_p:ee {\seq_item:Nn \l__tag_mc_firstmarks_seq {1}}{b+} + } + { \prg_return_true: } + { \prg_return_false: } + } + +\prg_new_conditional:Npnn \__tag_check_if_mc_tme_missing: { T,F,TF } + { + \str_if_eq:eeTF {\seq_item:Nn \l__tag_mc_botmarks_seq {1}}{b+} + { \prg_return_true: } + { \prg_return_false: } + } %% File: tagpdf-user.dtx + \NewDocumentCommand \tagpdfsetup { m } { \keys_set:nn { __tag / setup } { #1 } @@ -581,6 +617,49 @@ } \keys_define:nn { __tag / show } { + mc-marks .choice: , + mc-marks / show .code:n = + { + \__tag_mc_get_marks: + \__tag_check_if_mc_in_galley:TF + { + \iow_term:n {Marks~from~this~page:~} + } + { + \iow_term:n {Marks~from~a~previous~page:~} + } + \seq_show:N \l__tag_mc_firstmarks_seq + \seq_show:N \l__tag_mc_botmarks_seq + \__tag_check_if_mc_tmb_missing:T + { + \iow_term:n {BDC~missing~on~this~page!} + } + \__tag_check_if_mc_tme_missing:T + { + \iow_term:n {EMC~missing~on~this~page!} + } + }, + mc-marks / use .code:n = + { + \__tag_mc_get_marks: + \__tag_check_if_mc_in_galley:TF + { Marks~from~this~page:~} + { Marks~from~a~previous~page:~} + \seq_use:Nn \l__tag_mc_firstmarks_seq {,~}\quad + \seq_use:Nn \l__tag_mc_botmarks_seq {,~}\quad + \__tag_check_if_mc_tmb_missing:T + { + BDC~missing~ + } + \__tag_check_if_mc_tme_missing:T + { + EMC~missing + } + }, + mc-marks .default:n = show + } +\keys_define:nn { __tag / show } + { struct-stack .choice: ,struct-stack / log .code:n = \seq_log:N \g__tag_struct_tag_stack_seq ,struct-stack / show .code:n = \seq_show:N \g__tag_struct_tag_stack_seq @@ -610,7 +689,8 @@ } \bool_new:N \l__tag_para_bool \bool_new:N \l__tag_para_show_bool -\int_new:N \g__tag_para_int +\int_new:N \g__tag_para_begin_int +\int_new:N \g__tag_para_end_int \keys_define:nn { __tag / setup } { paratagging .bool_set:N = \l__tag_para_bool, @@ -619,13 +699,13 @@ \AddToHook{para/begin} { - \int_gincr:N \g__tag_para_int \bool_if:NT \l__tag_para_bool { + \int_gincr:N \g__tag_para_begin_int \tag_struct_begin:n {tag=P} \bool_if:NT \l__tag_para_show_bool { \tag_mc_begin:n{artifact} - \llap{\color_select:n{red}\tiny\int_use:N\g__tag_para_int\ } + \llap{\color_select:n{red}\tiny\int_use:N\g__tag_para_begin_int\ } \tag_mc_end: } \tag_mc_begin:n {tag=P} @@ -635,17 +715,119 @@ { \bool_if:NT \l__tag_para_bool { + \int_gincr:N \g__tag_para_end_int \tag_mc_end: \bool_if:NT \l__tag_para_show_bool { \tag_mc_begin:n{artifact} - \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_int} + \rlap{\color_select:n{red}\tiny\ \int_use:N\g__tag_para_end_int} \tag_mc_end: } \tag_struct_end: } } +\AddToHook{enddocument/info} + { + \int_compare:nNnF {\g__tag_para_begin_int}={\g__tag_para_end_int} + { + \msg_error:nnxx + {tag} + {para-hook-count-wrong} + {\int_use:N\g__tag_para_begin_int} + {\int_use:N\g__tag_para_end_int} + } + } +\AddToHook{begindocument/before} + { + \bool_if:NF \g__tag_mode_lua_bool + { + \cs_if_exist:NT \@kernel@before@footins + { + \tl_put_right:Nn \@kernel@before@footins + { \__tag_add_missing_mcs_to_stream:Nn \footins {footnote} } + \tl_put_right:Nn \@kernel@before@cclv + { + \__tag_check_typeout_v:n {====>~In~\token_to_str:N \@makecol\c_space_tl\the\c@page} + \__tag_add_missing_mcs_to_stream:Nn \@cclv {main} + } + \tl_put_right:Nn \@mult@ptagging@hook + { + \__tag_check_typeout_v:n {====>~In~\string\page@sofar} + \process@cols\mult@gfirstbox + { + \__tag_add_missing_mcs_to_stream:Nn \count@ {multicol} + } + \__tag_add_missing_mcs_to_stream:Nn \mult@rightbox {multicol} + } + } + } + } \newcommand\tagpdfparaOn {\bool_set_true:N \l__tag_para_bool} \newcommand\tagpdfparaOff{\bool_set_false:N \l__tag_para_bool} +\NewDocumentCommand\tagpdfsuppressmarks{m} + {{\use:c{__tag_mc_disable_marks:} #1}} +\cs_new_protected:Npn\__tag_hook_kernel_before_head:{} +\cs_new_protected:Npn\__tag_hook_kernel_after_head:{} +\cs_new_protected:Npn\__tag_hook_kernel_before_foot:{} +\cs_new_protected:Npn\__tag_hook_kernel_after_foot:{} + +\AddToHook{begindocument} + { + \cs_if_exist:NT \@kernel@before@head + { + \tl_put_right:Nn \@kernel@before@head {\__tag_hook_kernel_before_head:} + \tl_put_left:Nn \@kernel@after@head {\__tag_hook_kernel_after_head:} + \tl_put_right:Nn \@kernel@before@foot {\__tag_hook_kernel_before_foot:} + \tl_put_left:Nn \@kernel@after@foot {\__tag_hook_kernel_after_foot:} + } + } + +\bool_new:N \g__tag_saved_in_mc_bool +\cs_new_protected:Npn \__tag_exclude_headfoot_begin: + { + \bool_set_false:N \l__tag_para_bool + \bool_if:NTF \g__tag_mode_lua_bool + { + \tag_mc_end_push: + } + { + \bool_gset_eq:NN \g__tag_saved_in_mc_bool \g__tag_in_mc_bool + \bool_gset_false:N \g__tag_in_mc_bool + } + \tag_mc_begin:n {artifact} + } +\cs_new_protected:Npn \__tag_exclude_headfoot_end: + { + \tag_mc_end: + \bool_if:NTF \g__tag_mode_lua_bool + { + \tag_mc_begin_pop:n{} + } + { + \bool_gset_eq:NN \g__tag_in_mc_bool\g__tag_saved_in_mc_bool + } + } + +\keys_define:nn { __tag / setup } + { + exclude-header-footer .choice:, + exclude-header-footer / true .code:n = + { + \cs_set_eq:NN \__tag_hook_kernel_before_head: \__tag_exclude_headfoot_begin: + \cs_set_eq:NN \__tag_hook_kernel_before_foot: \__tag_exclude_headfoot_begin: + \cs_set_eq:NN \__tag_hook_kernel_after_head: \__tag_exclude_headfoot_end: + \cs_set_eq:NN \__tag_hook_kernel_after_foot: \__tag_exclude_headfoot_end: + }, + exclude-header-footer / false .code:n = + { + \cs_set_eq:NN \__tag_hook_kernel_before_head: \prg_do_nothing: + \cs_set_eq:NN \__tag_hook_kernel_before_foot: \prg_do_nothing: + \cs_set_eq:NN \__tag_hook_kernel_after_head: \prg_do_nothing: + \cs_set_eq:NN \__tag_hook_kernel_after_foot: \prg_do_nothing: + }, + exclude-header-footer .default:n = true, + exclude-header-footer .initial:n = true + } + \hook_gput_code:nnn {pdfannot/link/URI/before} {tagpdf} @@ -808,6 +990,14 @@ { \tl_set:Nn \l__tag_mc_artifact_type_tl { Pagination } }, + __artifact-type / pagination/header .code:n = + { + \tl_set:Nn \l__tag_mc_artifact_type_tl { Pagination/Subtype/Header } + }, + __artifact-type / pagination/footer .code:n = + { + \tl_set:Nn \l__tag_mc_artifact_type_tl { Pagination/Subtype/Footer } + }, __artifact-type / layout .code:n = { \tl_set:Nn \l__tag_mc_artifact_type_tl { Layout } @@ -1567,6 +1757,8 @@ \newcounter { g__tag_struct_abs_int } \int_gzero:N \c@g__tag_struct_abs_int \__tag_seq_new:N \g__tag_struct_objR_seq + +\__tag_prop_new:N \g__tag_struct_cont_mc_prop \seq_new:N \g__tag_struct_stack_seq \seq_gpush:Nn \g__tag_struct_stack_seq {0} \seq_new:N \g__tag_struct_tag_stack_seq @@ -1646,20 +1838,31 @@ { g__tag_struct_0_prop } { Namespaces } { \pdf_object_ref:n { __tag/tree/namespaces } } +\cs_new:Npn \__tag_struct_mcid_dict:n #1 %#1 MCID absnum + { + << + /Type \c_space_tl /MCR \c_space_tl + /Pg + \c_space_tl + \pdf_pageobject_ref:n { \__tag_ref_value:enn{mcid-#1}{tagabspage}{1} } + /MCID \c_space_tl \__tag_ref_value:enn{mcid-#1}{tagmcid}{1} + >> + } \cs_new_protected:Npn \__tag_struct_kid_mc_gput_right:nn #1 #2 %#1 structure num, #2 MCID absnum% { \__tag_seq_gput_right:cx { g__tag_struct_kids_#1_seq } { - << - /Type \c_space_tl /MCR \c_space_tl - /Pg - \c_space_tl - \pdf_pageobject_ref:n { \__tag_ref_value:enn{mcid-#2}{tagabspage}{1} } - /MCID \c_space_tl \__tag_ref_value:enn{mcid-#2}{tagmcid}{1} - >> + \__tag_struct_mcid_dict:n {#2} + } + \__tag_seq_gput_right:cn + { g__tag_struct_kids_#1_seq } + { + \prop_item:Nn \g__tag_struct_cont_mc_prop {#2} } } +\cs_generate_variant:Nn \__tag_struct_kid_mc_gput_right:nn {nx} + \cs_new_protected:Npn\__tag_struct_kid_struct_gput_right:nn #1 #2 %#1 num of parent struct, #2 kid struct { \__tag_seq_gput_right:cx @@ -1700,6 +1903,18 @@ \cs_generate_variant:Nn\__tag_struct_exchange_kid_command:N { c } \cs_new_protected:Npn \__tag_struct_fill_kid_key:n #1 %#1 is the struct num { + \bool_if:NF\g__tag_mode_lua_bool + { + \seq_clear:N \l__tag_tmpa_seq + \seq_map_inline:cn { g__tag_struct_kids_#1_seq } + { \seq_put_right:Nx \l__tag_tmpa_seq { ##1 } } + %\seq_show:c { g__tag_struct_kids_#1_seq } + %\seq_show:N \l__tag_tmpa_seq + \seq_remove_all:Nn \l__tag_tmpa_seq {} + %\seq_show:N \l__tag_tmpa_seq + \seq_gset_eq:cN { g__tag_struct_kids_#1_seq } \l__tag_tmpa_seq + } + \int_case:nnF { \seq_count:c @@ -1874,18 +2089,6 @@ }, alttext .code:n = % Alt property { - \str_set_convert:Nnon - \l__tag_tmpa_str - { #1 } - { default } - { utf16/hex } - \__tag_prop_gput:cnx - { g__tag_struct_\int_eval:n {\c@g__tag_struct_abs_int}_prop } - { Alt } - { <\l__tag_tmpa_str> } - }, - alttext-o .code:n = % Alt property - { \str_set_convert:Noon \l__tag_tmpa_str { #1 } @@ -1898,18 +2101,6 @@ }, actualtext .code:n = % ActualText property { - \str_set_convert:Nnon - \l__tag_tmpa_str - { #1 } - { default } - { utf16/hex } - \__tag_prop_gput:cnx - { g__tag_struct_\int_eval:n {\c@g__tag_struct_abs_int}_prop } - { ActualText } - { <\l__tag_tmpa_str>} - }, - actualtext-o .code:n = % ActualText property - { \str_set_convert:Noon \l__tag_tmpa_str { #1 } |