diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty | 367 |
1 files changed, 218 insertions, 149 deletions
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty index 4163494d313..71daeab6935 100644 --- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty +++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty @@ -1,179 +1,247 @@ -\RequirePackage{expl3}[2019/07/01] -%\RequirePackage[enable-debug]{expl3}[2018/06/14] +%% +%% This is file `tagpdf.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% tagpdf.dtx (with options: `package') +%% +%% 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.dtx +\ProvidesExplPackage {tagpdf} {2021/02/23} {0.80} + { A package to experiment with pdf tagging } + +\bool_if:nF + { + \bool_lazy_and_p:nn + {\cs_if_exist_p:N \pdfmanagement_if_active_p:} + { \pdfmanagement_if_active_p: } + } + { %error for now, perhaps warning later. + \PackageError{tagpdf} + { + PDF~resource~management~is~no~active!\MessageBreak + tagpdf~will~no~work. + } + { + Activate~it~with \MessageBreak + \string\RequirePackage{pdfmanagement-testphase}\MessageBreak + \string\DeclareDocumentMetadata{<options>}\MessageBreak + before~\string\documentclass + } + } -\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 } - } + { + \prop_gput:Nnn \g_msg_module_name_prop { tag }{ 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 +\cs_set_eq:NN \__tag_tex_global:D \tex_global:D %%% package options -\bool_new:N\g__uftag_mode_lua_bool +\bool_new:N\g__tag_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 } +\DeclareOption {luamode} { \sys_if_engine_luatex:T { \bool_gset_true:N \g__tag_mode_lua_bool } } +\DeclareOption {genericmode}{ \bool_gset_false:N\g__tag_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 } - +\RequirePackage{l3ref-tmp} + %================ + % temporary code + % =============== + % faking the LastPage label: + \cs_new_protected:Npn \__tag_lastpagelabel: + { + \legacy_if:nT { @filesw } + { + \exp_args:NNnx \exp_args:NNx\iow_now:Nn \@auxout + { + \token_to_str:N \newlabeldata + {__tag_LastPage} + { + {abspage} { \int_use:N \g_shipout_readonly_int} + {tagmcabs}{ \int_use:N \c@g__tag_MCID_abs_int } + } + } + } + } -%%% 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} + \AddToHook{enddocument/afterlastpage} + {\__tag_lastpagelabel:} + % a command to override the general default. See issue in ref + \cs_if_exist:NF \ref_value:nnn + { + \cs_new:Npn \ref_value:nnn #1#2#3 + { + \exp_args:Nee + \__ref_value:nnn + { \tl_to_str:n {#1} } { \tl_to_str:n {#2} } {#3} + } + \cs_new:Npn \__ref_value:nnn #1#2#3 + { + \tl_if_exist:cTF { g__ref_label_ #1 _ #2 _tl } + { \tl_use:c { g__ref_label_ #1 _ #2 _tl } } + { + % test if attribute exist at all? + #3 + } + } + } -%%% 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 = + %============= + % attributes + %============= +\ref_attribute_gset:nnnn {tagstruct} {0}{now} { \int_use:N \c@g__tag_struct_abs_int } +\ref_attribute_gset:nnnn {tagstructobj} {}{now} + { + \exp_args:Ne + \pdf_object_if_exist:nT {c__tag_struct_ \int_use:N \c@g__tag_struct_abs_int _obj} + { + \pdf_object_ref:e{c__tag_struct_ \int_use:N \c@g__tag_struct_abs_int _obj} + } + } + % replace by abspage?? +\ref_attribute_gset:nnnn {tagabspage}{0}{shipout}{ \int_use:N \g_shipout_readonly_int } +\ref_attribute_gset:nnnn {tagmcabs } {0}{now} { \int_use:N \c@g__tag_MCID_abs_int } +\ref_attribute_gset:nnnn {tagmcid } {0}{now} { \int_use:N \g__tag_MCID_tmp_bypage_int } +\clist_const:Nn \c__tag_refmc_clist {tagabspage,tagmcabs,tagmcid} %mc is new!! +\clist_const:Nn \c__tag_refstruct_clist {tagstruct,tagstructobj} +\cs_generate_variant:Nn \ref_label:nn { nv } +\cs_new_protected:Npn \__tag_ref_label:nn #1 #2 %#1 label, #2 name of list mc or struct + { + \@bsphack + \ref_label:nv {#1}{c__tag_ref#2_clist} + \@esphack + } +\cs_new:Npn \__tag_ref_value:nnn #1 #2 #3 %#1 label, #2 attribute, #3 default + { + \ref_value:nnn {#1}{#2}{#3} + } +\cs_new:Npn \__tag_ref_value_lastpage:nn #1 #2 { - \sys_if_engine_pdftex:T - { \tl_gset:Nn \g__uftag_inputencoding_tl { #1 } } - }, -} + \ref_value:nnn {__tag_LastPage}{#1}{#2} + } -% 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_generate_variant:Nn \__tag_ref_label:nn {en} +\cs_generate_variant:Nn \__tag_ref_value:nnn {enn} -%\cs_set_eq:NN \__uftag_pdf_escape_string:n \EdefEscapeString -%\cs_set_eq:NN \__uftag_pdf_escape_name:Nn \EdefEscapeName +\RequirePackage{etoolbox} -%escape command. They are backend specific as \pdf@escapehex would ignore most chars -%outside the "pdflatex" range +\cs_generate_variant:Nn \str_set_convert:Nnnn {Nonn, Noon, Nnon } +%%% tagpdfsetup, +%%% TODO: checks need to be improved +\int_new:N \l__tag_loglevel_int +\tl_new:N \l__tag_tree_tabs_order_tl +\keys_define:nn { __tag / setup } + { + activate-mc .bool_gset:N = \g__tag_active_mc_bool, + activate-tree .bool_gset:N = \g__tag_active_tree_bool, + activate-struct .bool_gset:N = \g__tag_active_struct_bool, + activate-all .meta:n ={activate-mc,activate-tree,activate-struct}, + check-tags .bool_gset:N = \g__tag_check_tags_bool, + check-tags .initial:n = true, + 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 / 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 }}, + tagunmarked .bool_gset:N = \g__tag_tagunmarked_bool, + tagunmarked .initial:n = true, + tabsorder .choice:, + tabsorder / row .code:n = %{\tl_set:Nn \l__tag_tree_tabs_order_tl {/Tabs/R}}, + \pdfmanagement_add:nnn { Page } {Tabs}{/R}, + tabsorder / column .code:n = %{\tl_set:Nn \l__tag_tree_tabs_order_tl {/Tabs/C}}, + \pdfmanagement_add:nnn { Page } {Tabs}{/C}, + tabsorder / structure .code:n = %{\tl_set:Nn \l__tag_tree_tabs_order_tl {/Tabs/S}}, + \pdfmanagement_add:nnn { Page } {Tabs}{/S}, + tabsorder / none .code:n = %{\tl_set:Nn \l__tag_tree_tabs_order_tl {}}, + \pdfmanagement_remove:nn {Page} {Tabs}, + tabsorder .initial:n = structure, + uncompress .code:n = {\pdf_uncompress: }, + } +\hook_gput_code:nnn{begindocument}{tagpdf} + { + \bool_if:NT \g__tag_active_struct_bool + { + \pdfmanagement_add:nnn { Catalog / MarkInfo } { Marked } { true } + } + } -% 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: { } +\cs_new:Nn \__tag_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 - } +\hook_gput_code:nnn + { shipout/before } + { tagpdf/cnt } + { + \__tag_finish_page_hook: + %\int_gincr:N \g__tag_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 - } + { %lets try with xelatex ... + %\PackageError { tagpdf } { xelatex~is~not~supported~-~aborting } {} + %\tex_endinput:D + \file_input:n {tagpdf-pdftex.def} + } \sys_if_engine_luatex:T - { - \file_input:n {tagpdf-luatex.def} - } + { + \file_input:n {tagpdf-luatex.def} + } \sys_if_engine_pdftex:T - { - \file_input:n {tagpdf-pdftex.def} - } + { + \file_input:n {tagpdf-pdftex.def} + } \sys_if_output_dvi:T - { - \PackageError { tagpdf } { dvi~output~is~not~supported~-~aborting }{} - \tex_endinput:D - } + { + %\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 \__tag_prop_gput:Nnn { Nxn , Nxx, Nnx , cnn, cxn, cnx, cno} +\cs_generate_variant:Nn \__tag_seq_gput_right:Nn { Nx , No, cn, cx } +\cs_generate_variant:Nn \__tag_prop_new:N { c } +\cs_generate_variant:Nn \__tag_seq_new:N { c } +\cs_generate_variant:Nn \__tag_seq_show:N { c } +\cs_generate_variant:Nn \__tag_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 } + +\cs_generate_variant:Nn \pdffile_embed_stream:nnn {nxx,oxx} +\cs_generate_variant:Nn \pdf_object_ref:n {e} + +\tl_new:N \g__tag_tmpa_tl +\tl_new:N \l__tag_tmpa_tl +\tl_new:N \l__tag_tmpb_tl +\tl_new:N \l__tag_tmpc_tl +\tl_new:N \l__tag_tmpd_tl +\tl_new:N \l__tag_tmpe_tl +\str_new:N \l__tag_tmpa_str + +\cs_new:Nn\__tag_prop_count:nn { + 1 } %% Loading the tagpdf sub packages \RequirePackage { tagpdf-checks-code } @@ -181,16 +249,17 @@ \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 } % - } +\bool_if:NTF \g__tag_mode_lua_bool + { + \RequirePackage {tagpdf-mc-code-lua} + } + { + \RequirePackage { tagpdf-mc-code-generic } % + } \RequirePackage { tagpdf-struct-code } \RequirePackage { tagpdf-space-code } -\endinput +%% +%% +%% End of file `tagpdf.sty'. |