%% %% This is file `latex-lab-testphase-table.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% latex-lab-table.dtx (with options: `package') %% %% This is a generated file. %% %% Copyright 2021-2023 LaTeX Project %% %% This file was generated from file(s) of the `LaTeX-lab Bundle'. %% ------------------------------------------------------------------------------------ %% %% It may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c %% of this license or (at your option) any later version. %% The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.3c or later is part of all distributions of LaTeX %% version 2008 or later. %% %% This file may only be distributed together with a copy of the LaTeX %% `LaTeX-lab Bundle'. You may however distribute the `LaTeX-lab Bundle' %% without such generated files. %% %% The newest sources can be found below %% %% https://github.com/latex3/latex2e/required/latex-lab %% %% where one can also log issues in case there are any. %% %% %% File: latex-lab-table.dtx (C) Copyright 2023-2024 LaTeX Project \def\ltlabtbldate{2024-05-25} \def\ltlabtblversion{0.85i} \ProvidesExplPackage {latex-lab-testphase-table} {\ltlabtbldate} {\ltlabtblversion} {Code related to the tagging of tables} \RequirePackage{array} \tl_new:N \l__tbl_celltag_tl \tl_set:Nn \l__tbl_celltag_tl {TD} \tl_new:N \l__tbl_pcelltag_tl \tl_set:Nn \l__tbl_pcelltag_tl {TD} \tl_new:N \l__tbl_rowtag_tl \tl_set:Nn \l__tbl_rowtag_tl {TR} \tl_new:N \l__tbl_tabletag_tl \tl_set:Nn \l__tbl_tabletag_tl {Table} \tl_new:N \l__tbl_cellattribute_tl \tl_set:Nn \l__tbl_cellattribute_tl {} \tl_new:N \l__tbl_rowattribute_tl \tl_set:Nn \l__tbl_rowattribute_tl {} \clist_new:N \l__tbl_tmpa_clist \tl_new:N \l__tbl_tmpa_tl \NewSocketPlug{tagsupport/tbl/cell/begin}{TD} { \__tbl_show_curr_cell_data: \tag_struct_begin:n { tag =\l__tbl_celltag_tl, attribute-class =\l__tbl_cellattribute_tl } \seq_gput_right:Ne \g__tbl_struct_cur_seq { \tag_get:n {struct_num} } \int_step_inline:nn { \g__tbl_span_tl - 1 } { \seq_gput_right:Ne \g__tbl_struct_cur_seq { -\tag_get:n {struct_num} } } \tag_mc_begin:n{} } \NewSocketPlug{tagsupport/tbl/cell/end}{TD} { \tag_mc_end: \tag_struct_end: } \NewSocketPlug{tagsupport/tbl/pcell/begin}{TDpbox} { \__tbl_show_curr_cell_data: \tag_struct_begin:n { tag =\l__tbl_pcelltag_tl, attribute-class =\l__tbl_cellattribute_tl } \seq_gput_right:Ne \g__tbl_struct_cur_seq { \tag_get:n {struct_num} } \int_step_inline:nn { \g__tbl_span_tl - 1 } { \seq_gput_right:Ne \g__tbl_struct_cur_seq { -\tag_get:n {struct_num} } } \tagpdfparaOn \tl_set:Nn \l__tag_para_main_tag_tl {Div} } \NewSocketPlug{tagsupport/tbl/pcell/end}{TDpbox} { \tag_struct_end: } \NewSocketPlug{tagsupport/tbl/row/begin}{TR} { \seq_gclear:N \g__tbl_struct_cur_seq \tag_struct_begin:n { tag =\l__tbl_rowtag_tl, attribute-class=\l__tbl_rowattribute_tl } \seq_gput_right:Ne \g__tbl_struct_rows_seq { \tag_get:n {struct_num} } } \NewSocketPlug{tagsupport/tbl/row/end}{TR} { \tag_if_active:T { \__tbl_add_missing_cells: \seq_gput_right:Ne \g__tbl_struct_cells_seq { \seq_use:Nn \g__tbl_struct_cur_seq {,} } \int_compare:nNnTF { \g__tbl_row_int } = { \seq_count:N \g__tbl_struct_cells_seq } { \__tbl_trace:n {==>~ stucture~stored~for~row~\int_use:N\g__tbl_row_int :~ \seq_use:Nn \g__tbl_struct_cur_seq {,} } } { \ERRORtbl/row } % should not happen ... \tag_struct_end: } } \NewSocketPlug{tagsupport/tbl/init}{Table} { \tag_if_active:T { \bool_set_false:N \l__tag_para_bool \__tbl_init_struct_data: } } \NewSocketPlug{tagsupport/tbl/finalize}{Table} { \__tbl_set_header_rows: \__tbl_restore_struct_data: } \NewSocketPlug{tagsupport/tbl/longtable/init}{Table} { \seq_gclear:N\g__tbl_struct_rows_seq \seq_gclear:N\g__tbl_struct_cells_seq \seq_gclear:N\g__tbl_struct_cur_seq \seq_gclear:N\g__tbl_LT@firsthead_rows_seq \seq_gclear:N\g__tbl_LT@head_rows_seq \seq_gclear:N\g__tbl_LT@lastfoot_rows_seq \seq_gclear:N\g__tbl_LT@foot_rows_seq } \NewSocketPlug{tagsupport/tbl/longtable/finalize}{Table} { \bool_lazy_and:nnTF { \seq_if_empty_p:N \g__tbl_LT@head_rows_seq } { \seq_if_empty_p:N \g__tbl_LT@firsthead_rows_seq } { \__tbl_set_header_rows: } { \seq_if_empty:NTF \g__tbl_LT@firsthead_rows_seq { \clist_set:Ne \l__tbl_header_rows_clist {\seq_use:Nn \g__tbl_LT@head_rows_seq {,}} \__tbl_set_header_rows: } { \clist_set:Ne \l__tbl_header_rows_clist { \seq_use:Nn \g__tbl_LT@firsthead_rows_seq {,} } \__tbl_set_header_rows: \pdf_version_compare:NnTF < {2.0} { \seq_map_inline:Nn \g__tbl_LT@head_rows_seq { \seq_gset_item:cnn {g__tag_struct_kids_ \g__tbl_struct_table_tl _seq} { ##1 } {} \tl_set:Ne \l__tbl_tmpa_tl { \seq_item:Nn\g__tbl_struct_rows_seq {##1} } \prop_if_exist:cT { g__tag_struct_ \l__tbl_tmpa_tl _prop } { %\prop_gremove:cn {g__tag_struct_ \l__tbl_tmpa_tl _prop} {P} } } } { \seq_map_inline:Nn \g__tbl_LT@head_rows_seq { \tl_set:Ne \l__tbl_tmpa_tl { \seq_item:Nn\g__tbl_struct_rows_seq {##1} } \prop_if_exist:cT { g__tag_struct_ \l__tbl_tmpa_tl _prop } { \exp_args:No \__tag_struct_prop_gput:nnn {\l__tbl_tmpa_tl} {S}{/Artifact} } } } } } \bool_lazy_and:nnF { \seq_if_empty_p:N \g__tbl_LT@foot_rows_seq } { \seq_if_empty_p:N \g__tbl_LT@lastfoot_rows_seq } { \seq_if_empty:NTF \g__tbl_LT@lastfoot_rows_seq { \seq_map_inline:Nn \g__tbl_LT@foot_rows_seq { \tl_set:Ne \l__tbl_tmpa_tl { \seq_item:cn {g__tag_struct_kids_ \g__tbl_struct_table_tl _seq} {##1} } \seq_gset_item:cnn {g__tag_struct_kids_ \g__tbl_struct_table_tl _seq} { ##1 } {} \seq_gput_right:cV {g__tag_struct_kids_ \g__tbl_struct_table_tl _seq} \l__tbl_tmpa_tl } } { \seq_map_inline:Nn \g__tbl_LT@lastfoot_rows_seq { \tl_set:Ne \l__tbl_tmpa_tl { \seq_item:cn {g__tag_struct_kids_ \g__tbl_struct_table_tl _seq} {##1} } \seq_gset_item:cnn {g__tag_struct_kids_ \g__tbl_struct_table_tl _seq} { ##1 } {} \seq_gput_right:cV {g__tag_struct_kids_ \g__tbl_struct_table_tl _seq} \l__tbl_tmpa_tl } \pdf_version_compare:NnTF < {2.0} { \seq_map_inline:Nn \g__tbl_LT@foot_rows_seq { \seq_gset_item:cnn {g__tag_struct_kids_ \g__tbl_struct_table_tl _seq} { ##1 } {} \tl_set:Ne \l__tbl_tmpa_tl { \seq_item:Nn\g__tbl_struct_rows_seq {##1} } \prop_if_exist:cT { g__tag_struct_ \l__tbl_tmpa_tl _prop } { %\prop_gremove:cn {g__tag_struct_ \l__tbl_tmpa_tl _prop} {P} } } } { \seq_map_inline:Nn \g__tbl_LT@foot_rows_seq { \tl_set:Ne \l__tbl_tmpa_tl { \seq_item:Nn\g__tbl_struct_rows_seq {##1} } \prop_if_exist:cT { g__tag_struct_ \l__tbl_tmpa_tl _prop } { \exp_args:No\__tag_struct_prop_gput:nnn {\l__tbl_tmpa_tl} {S}{/Artifact} } } } } } } \NewSocketPlug{tagsupport/tbl/longtable/head}{Table} { \tagmcbegin{artifact} \tag_mc_reset_box:N\LT@head \tagmcend } \NewSocketPlug{tagsupport/tbl/longtable/foot}{Table} { \tagmcbegin{artifact} \tag_mc_reset_box:N \LT@foot \tagmcend } \NewSocketPlug{tagsupport/tbl/hmode/begin}{Table} { \tag_mc_end_push: \bool_lazy_and:nnT { \bool_if_exist_p:N \l__tag_para_bool } { \l__tag_para_bool } { \tag_struct_end:n { text } } \tag_struct_begin:n {tag=\l__tbl_tabletag_tl} \tl_gset:Ne \g__tbl_struct_table_tl { \tag_get:n {struct_num} } } \NewSocketPlug{tagsupport/tbl/hmode/end}{Table} { \tag_struct_end: \bool_lazy_and:nnT { \bool_if_exist_p:N \l__tag_para_bool } { \l__tag_para_bool } { \tag_struct_begin:n { tag=\l__tag_para_tag_tl } } \tag_mc_begin_pop:n{} } \NewSocketPlug{tagsupport/tbl/vmode/begin}{Table} { \tag_struct_begin:n {tag=\l__tbl_tabletag_tl} \tl_gset:Ne \g__tbl_struct_table_tl { \tag_get:n {struct_num} } } \NewSocketPlug{tagsupport/tbl/vmode/end}{Table} { \tag_struct_end: \par } \NewSocketPlug{tagsupport/tbl/colspan}{code} { \int_compare:nNnT {#1}>{1} { \prop_get:NeNF \g__tag_attr_entries_prop {colspan-\int_eval:n{#1}} \l__tbl_tmpa_tl { \__tag_attr_new_entry:ee {colspan-\int_eval:n{#1}} {/O /Table /ColSpan~\int_eval:n{#1}} } \tl_set:Ne \l__tbl_cellattribute_tl {colspan-\int_eval:n{#1}} } } \tag_if_active:T { \cs_generate_variant:Nn \__tag_attr_new_entry:nn {ee} } \AddToHook{cmd/array/before}{\__tag_tbl_disable:} \cs_new_protected:Npn \__tag_tbl_disable: { \AssignSocketPlug{tagsupport/tbl/cell/begin}{noop} \AssignSocketPlug{tagsupport/tbl/cell/end}{noop} \AssignSocketPlug{tagsupport/tbl/pcell/begin}{noop} \AssignSocketPlug{tagsupport/tbl/pcell/end}{noop} \AssignSocketPlug{tagsupport/tbl/row/begin}{noop} \AssignSocketPlug{tagsupport/tbl/row/end}{noop} \AssignSocketPlug{tagsupport/tbl/init}{noop} \AssignSocketPlug{tagsupport/tbl/finalize}{noop} \AssignSocketPlug{tagsupport/tbl/longtable/init}{noop} \AssignSocketPlug{tagsupport/tbl/longtable/head}{noop} \AssignSocketPlug{tagsupport/tbl/longtable/foot}{noop} \AssignSocketPlug{tagsupport/tbl/longtable/finalize}{noop} \AssignSocketPlug{tagsupport/tbl/hmode/begin}{noop} \AssignSocketPlug{tagsupport/tbl/hmode/end}{noop} \AssignSocketPlug{tagsupport/tbl/vmode/begin}{noop} \AssignSocketPlug{tagsupport/tbl/vmode/end}{noop} \AssignSocketPlug{tagsupport/tbl/colspan}{noop} } \cs_new_protected:Npn \__tag_tbl_enable: { \AssignSocketPlug{tagsupport/tbl/cell/begin}{TD} \AssignSocketPlug{tagsupport/tbl/cell/end}{TD} \AssignSocketPlug{tagsupport/tbl/pcell/begin}{TDpbox} \AssignSocketPlug{tagsupport/tbl/pcell/end}{TDpbox} \AssignSocketPlug{tagsupport/tbl/row/begin}{TR} \AssignSocketPlug{tagsupport/tbl/row/end}{TR} \AssignSocketPlug{tagsupport/tbl/init}{Table} \AssignSocketPlug{tagsupport/tbl/finalize}{Table} \AssignSocketPlug{tagsupport/tbl/longtable/head}{Table} \AssignSocketPlug{tagsupport/tbl/longtable/foot}{Table} \AssignSocketPlug{tagsupport/tbl/longtable/init}{Table} \AssignSocketPlug{tagsupport/tbl/longtable/finalize}{Table} \AssignSocketPlug{tagsupport/tbl/hmode/begin}{Table} \AssignSocketPlug{tagsupport/tbl/hmode/end}{Table} \AssignSocketPlug{tagsupport/tbl/vmode/begin}{Table} \AssignSocketPlug{tagsupport/tbl/vmode/end}{Table} \AssignSocketPlug{tagsupport/tbl/colspan}{code} } \keys_define:nn { __tag / setup } { table/tagging .choices:nn = { true, on } { \__tag_tbl_enable: }, table/tagging .choices:nn = { false, off } { \__tag_tbl_disable: }, table/tagging .choice:, table/tagging / presentation .code:n = { \__tag_tbl_enable: \tl_set:Nn\l__tbl_rowtag_tl {NonStruct} \tl_set:Nn\l__tbl_pcelltag_tl {NonStruct} \tl_set:Nn\l__tbl_celltag_tl {text} \tl_set:Nn\l__tbl_tabletag_tl {Div} \clist_clear:N \l__tbl_header_rows_clist }, table/tagging .default:n = true, table/tagging .initial:n = true } \keys_define:nn { __tag / setup } { table-tagging .meta:n = {table/tagging={#1}} } \AddToHook{begindocument} { \tag_if_active:T { \tagpdfsetup { role/new-attribute = {TH-col}{/O /Table /Scope /Column}, role/new-attribute = {TH-row}{/O /Table /Scope /Row}, role/new-attribute = {TH-both}{/O /Table /Scope /Both}, } \seq_gput_left:Ne\g__tag_attr_class_used_seq {\pdf_name_from_unicode_e:n{TH-col}} \seq_gput_left:Ne\g__tag_attr_class_used_seq {\pdf_name_from_unicode_e:n{TH-row}} \seq_gput_left:Ne\g__tag_attr_class_used_seq {\pdf_name_from_unicode_e:n{TH-both}} } } \clist_new:N \l__tbl_header_rows_clist \cs_new_protected:Npn \__tbl_set_header_rows: { \clist_map_inline:Nn \l__tbl_header_rows_clist { \clist_set:Ne\l__tbl_tmpa_clist { \seq_item:Nn \g__tbl_struct_cells_seq {##1} } \clist_map_inline:Nn \l__tbl_tmpa_clist { \prop_if_exist:cT { g__tag_struct_####1_prop } { \__tag_struct_prop_gput:nnn{ ####1 }{S}{/TH} \prop_get:cnNTF { g__tag_struct_####1_prop } { C } \l__tbl_tmpa_tl {\__tag_struct_prop_gput:nne{ ####1 }{C}{[/TH-col~\l__tbl_tmpa_tl]} } {\__tag_struct_prop_gput:nnn{ ####1 }{C}{/TH-col}} } } } } \keys_define:nn { __tag / setup } { table/header-rows .clist_set:N = \l__tbl_header_rows_clist, table-header-rows .meta:n = {table/header-rows={#1}} } \cs_new_protected:Npn \__tbl_show_curr_cell_data: { \__tbl_trace:n { ==>~ current~cell~data:~ \int_use:N \g__tbl_row_int , \int_use:N \g__tbl_col_int , \g__tbl_span_tl } } \NewSocket{tbl/celldata/missingcount}{1} \NewSocketPlug{tbl/celldata/missingcount}{code}{\tbl_count_missing_cells:n{#1}} \AssignSocketPlug{tbl/celldata/missingcount}{code} \cs_new:Npn \__tbl_add_missing_cells: { \int_compare:nNnT \g__tbl_missing_cells_int > 0 { \__tbl_trace:n {==>~ ~Inserting~\int_use:N \g__tbl_missing_cells_int \space additional~cell(s)~into~previous~row:} \int_step_inline:nn { \g__tbl_missing_cells_int } { \UseTaggingSocket{tbl/cell/begin} \UseTaggingSocket{tbl/cell/end} } } } \tl_new:N \g__tbl_struct_table_tl \tl_new:N \l__tbl_saved_struct_table_tl \seq_new:N \g__tbl_struct_rows_seq \seq_new:N \l__tbl_saved_struct_rows_seq \seq_new:N \g__tbl_struct_cells_seq \seq_new:N \l__tbl_saved_struct_cells_seq \seq_new:N \g__tbl_struct_cur_seq \seq_new:N \l__tbl_saved_struct_cur_seq \cs_new_protected:Npn \__tbl_init_struct_data: { \tl_set_eq:NN \l__tbl_saved_struct_table_tl \g__tbl_struct_table_tl \seq_set_eq:NN \l__tbl_saved_struct_rows_seq \g__tbl_struct_rows_seq \seq_set_eq:NN \l__tbl_saved_struct_cells_seq \g__tbl_struct_cells_seq \seq_set_eq:NN \l__tbl_saved_struct_cur_seq \g__tbl_struct_cur_seq \seq_gclear:N\g__tbl_struct_rows_seq \seq_gclear:N\g__tbl_struct_cells_seq \seq_gclear:N\g__tbl_struct_cur_seq } \cs_new_protected:Npn \__tbl_restore_struct_data: { \tl_gset_eq:NN \g__tbl_struct_table_tl \l__tbl_saved_struct_table_tl \seq_gset_eq:NN \g__tbl_struct_rows_seq \l__tbl_saved_struct_rows_seq \seq_gset_eq:NN \g__tbl_struct_cells_seq\l__tbl_saved_struct_cells_seq \seq_gset_eq:NN \g__tbl_struct_cur_seq \l__tbl_saved_struct_cur_seq } \def\__tbl_patch_LT@makecaption#1#2#3{% \LT@mcol\LT@cols c{% % test can go after merge \str_if_exist:cT { l__socket_tagsupport/parbox/before_plug_str } { \AssignSocketPlug{tagsupport/parbox/before}{noop} \AssignSocketPlug{tagsupport/parbox/after}{noop} } \hbox to\z@{\hss\parbox[t]\LTcapwidth{% \reset@font \tag_stop:n{caption} \sbox\@tempboxa{#1{#2:~}#3}% \tag_start:n{caption} \ifdim\wd\@tempboxa>\hsize #1{#2:~}#3% \else \hbox to\hsize{\hfil#1{#2:~}#3\hfil}% \fi \endgraf\vskip\baselineskip}% \hss}}} \AddToHook{package/longtable/after} { \cs_set_eq:NN \LT@makecaption\__tbl_patch_LT@makecaption } \endinput %% %% End of file `latex-lab-testphase-table.sty'.