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.sty367
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'.