summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty')
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty265
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 }