summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/README.md9
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/ex-attribute.pdfbin0 -> 13941 bytes
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/ex-attribute.tex63
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-koma.pdf12
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-koma.tex11
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-memoir.pdf1329
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-memoir.tex252
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/ex-softhyphen.pdfbin5918 -> 5913 bytes
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/ex-spaceglyph-listings.pdfbin0 -> 3967 bytes
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/ex-spaceglyph-listings.tex21
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/ex-tagpdf-template.pdfbin12455 -> 4337 bytes
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/tagpdf.pdfbin308208 -> 320144 bytes
-rw-r--r--Master/texmf-dist/doc/latex/tagpdf/tagpdf.tex144
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-attr-code.sty110
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-checks-code.sty5
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-luatex.def6
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-generic.sty2
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-lua.sty2
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-shared.sty2
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-pdftex.def2
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-roles-code.sty2
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-space-code.sty45
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-struct-code.sty8
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty35
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf-user.sty9
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf.lua119
-rw-r--r--Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty21
27 files changed, 2134 insertions, 75 deletions
diff --git a/Master/texmf-dist/doc/latex/tagpdf/README.md b/Master/texmf-dist/doc/latex/tagpdf/README.md
index 7519cf76fb9..dc19d1ee52c 100644
--- a/Master/texmf-dist/doc/latex/tagpdf/README.md
+++ b/Master/texmf-dist/doc/latex/tagpdf/README.md
@@ -1,6 +1,6 @@
#tagpdf — A package to create tagged pdf
-Packageversion: 0.3
-Packagedate: 2018/08/06
+Packageversion: 0.50
+Packagedate: 2019/01/04
Author: Ulrike Fischer
## License
@@ -16,8 +16,11 @@ The tagpdf package may be modified and distributed under the terms and condition
- tagpdf-mc-code-shared.sty (internal code)
- tagpdf-mc-code-generic.sty (internal code)
- tagpdf-mc-code-lua.sty (internal code)
-- tagpdf-stuct-code.sty (internal code)
+- tagpdf-struct-code.sty (internal code)
- tagpdf-tree-code.sty (internal code)
+- tagpdf-space-code.sty (internal code)
+- tagpdf-attr-code.sty (internal code)
+- tagpdf-checks-code.sty (internal code)
- tagpdf-user.sty (user commands)
- tagpdf-pdftex.def (pdftex specific code)
- tagpdf-luatex.def (luatex specific code)
diff --git a/Master/texmf-dist/doc/latex/tagpdf/ex-attribute.pdf b/Master/texmf-dist/doc/latex/tagpdf/ex-attribute.pdf
new file mode 100644
index 00000000000..f2044989c3a
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/tagpdf/ex-attribute.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/tagpdf/ex-attribute.tex b/Master/texmf-dist/doc/latex/tagpdf/ex-attribute.tex
new file mode 100644
index 00000000000..df0325025e9
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/tagpdf/ex-attribute.tex
@@ -0,0 +1,63 @@
+% !Mode:: "TeX:DE:UTF-8:Main"
+\documentclass{scrartcl}
+\usepackage[english]{babel}
+\usepackage{tagpdf}
+\tagpdfsetup{activate-all,uncompress}
+
+\ifluatex\else
+\pdfcatalog{/Lang (en-UK)}
+\pdfinfo {/Title (Title)}
+\fi
+
+\tagpdfsetup
+{
+ newattribute = {TH-col} { <</Owner /Table /Scope /Column>> },
+ newattribute = {TH-row} { <</Owner /Table /Scope /Row>> },
+ newattribute = {TH-both}{ <</Owner /Table /Scope /Both>> },
+ newattribute = {Lay-borderdotted}{ <</Owner /Layout /Borderstyle /Dotted >> },
+}
+\begin{document}
+\pagestyle{empty} %
+\tagstructbegin{tag=Document}
+
+\tagstructbegin{tag=Table}
+\begin{center}
+\begin{tabular}{ l | c | }
+\hline
+\tagstructbegin{tag=THead}
+ \tagstructbegin{tag=TR}
+ \tagstructbegin{tag=TH,attribute= {TH-both,Lay-borderdotted}}
+ \tagmcbegin{tag=TH}
+ h1
+ \tagmcend
+ \tagstructend &
+ \tagstructbegin{tag=TH,attribute-class= {TH-col,Lay-borderdotted}}
+ \tagmcbegin{tag=TH}
+ h2
+ \tagmcend
+ \tagstructend
+ \tagstructend %TR
+ \tagstructend %Thead
+ \\ \hline
+ \tagstructbegin{tag=TBody}
+ \tagstructbegin{tag=TR}
+ \tagstructbegin{tag=TD}
+ \tagmcbegin{tag=TD}
+ r1
+ \tagmcend
+ \tagstructend %TD
+&
+ \tagstructbegin{tag=TD}
+ \tagmcbegin{tag=TD}
+ h2
+ \tagmcend
+ \tagstructend
+ \tagstructend %TR
+ \tagstructend %TBody
+ \\ \hline
+ \end{tabular}
+\end{center}
+\tagstructend
+
+\tagstructend
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-koma.pdf b/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-koma.pdf
index e75c8e7d216..2c110dba72a 100644
--- a/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-koma.pdf
+++ b/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-koma.pdf
@@ -1193,12 +1193,12 @@ endobj
endobj
66 0 obj
<<
-/Producer (MiKTeX pdfTeX-1.40.19)
+/Producer (pdfTeX-1.40.19)
/Creator (TeX)
-/CreationDate (D:20180806192039+02'00')
-/ModDate (D:20180806192039+02'00')
+/CreationDate (D:20181227235701+01'00')
+/ModDate (D:20181227235701+01'00')
/Trapped /False
-/PTEX.Fullbanner (This is MiKTeX-pdfTeX 2.9.6668 (1.40.19))
+/PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018/W32TeX) kpathsea version 6.3.0)
>>
endobj
xref
@@ -1274,7 +1274,7 @@ trailer
<< /Size 67
/Root 65 0 R
/Info 66 0 R
-/ID [<D5F0F02AEB96408AC9CC20B0806114F4> <D5F0F02AEB96408AC9CC20B0806114F4>] >>
+/ID [<9624AA459A7E0DC11985D5B868AC2526> <9624AA459A7E0DC11985D5B868AC2526>] >>
startxref
-78916
+78961
%%EOF
diff --git a/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-koma.tex b/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-koma.tex
index 5558f9f2852..d2918d006d1 100644
--- a/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-koma.tex
+++ b/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-koma.tex
@@ -11,7 +11,6 @@
\documentclass{scrbook}
\usepackage[english]{babel}
-
\usepackage{tagpdf}
\tagpdfifpdftexT
@@ -112,11 +111,11 @@
\ExplSyntaxOn
\prop_new:N \g_tag_section_level_prop
-\prop_put:Nnn \g_tag_section_level_prop {chapter}{H1}
-\prop_put:Nnn \g_tag_section_level_prop {section}{H2}
-\prop_put:Nnn \g_tag_section_level_prop {subsection}{H3}
-\prop_put:Nnn \g_tag_section_level_prop {subsubsection}{H4}
-\prop_put:Nnn \g_tag_section_level_prop {paragraph}{H5}
+\prop_gput:Nnn \g_tag_section_level_prop {chapter}{H1}
+\prop_gput:Nnn \g_tag_section_level_prop {section}{H2}
+\prop_gput:Nnn \g_tag_section_level_prop {subsection}{H3}
+\prop_gput:Nnn \g_tag_section_level_prop {subsubsection}{H4}
+\prop_gput:Nnn \g_tag_section_level_prop {paragraph}{H5}
\renewcommand{\chapterlinesformat}[3]
{
diff --git a/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-memoir.pdf b/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-memoir.pdf
new file mode 100644
index 00000000000..490aa5616aa
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-memoir.pdf
@@ -0,0 +1,1329 @@
+%PDF-1.5
+%
+24 0 obj
+<<
+/Length 5552
+>>
+stream
+BT
+/F29 20.6625 Tf 126.795 632.338 Td [(Con)30(te)-1(n)30(ts)]TJ
+ET
+/Lbl <</MCID 0 >> BDC
+BT
+/F30 9.9626 Tf 126.795 570.57 Td [(1)]TJ
+ET
+EMC
+/P <</MCID 1 >> BDC
+BT
+/F30 9.9626 Tf 141.738 570.57 Td [(T)96(est)-383(c)31(hapter)]TJ
+ET
+EMC
+/Reference <</MCID 2 >> BDC
+BT
+/F30 9.9626 Tf 460.793 570.57 Td [(2)]TJ
+ET
+EMC
+/Lbl <</MCID 3 >> BDC
+BT
+/F27 9.9626 Tf 141.738 558.615 Td [(1.1)]TJ
+ET
+EMC
+/P <</MCID 4 >> BDC
+BT
+/F27 9.9626 Tf 164.653 558.615 Td [(T)83(est)-333(section)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 222.26 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 230.008 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 237.756 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 245.504 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 253.252 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 261 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 268.748 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 276.496 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 284.244 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 291.991 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 299.739 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 307.487 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 315.235 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 322.983 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 330.731 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 338.479 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 346.227 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 353.975 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 361.723 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 369.471 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 377.219 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 384.967 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 392.714 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 400.462 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 408.21 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 415.958 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 423.706 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 431.454 558.615 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 439.202 558.615 Td [(.)]TJ
+ET
+EMC
+/Reference <</MCID 5 >> BDC
+BT
+/F27 9.9626 Tf 461.54 558.615 Td [(2)]TJ
+ET
+EMC
+/Lbl <</MCID 6 >> BDC
+BT
+/F27 9.9626 Tf 164.653 546.659 Td [(1.1.1)]TJ
+ET
+EMC
+/P <</MCID 7 >> BDC
+BT
+/F27 9.9626 Tf 196.533 546.659 Td [(T)83(est)-333(subsection)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 268.748 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 276.496 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 284.244 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 291.991 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 299.739 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 307.487 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 315.235 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 322.983 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 330.731 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 338.479 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 346.227 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 353.975 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 361.723 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 369.471 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 377.219 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 384.967 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 392.714 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 400.462 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 408.21 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 415.958 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 423.706 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 431.454 546.659 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 439.202 546.659 Td [(.)]TJ
+ET
+EMC
+/Reference <</MCID 8 >> BDC
+BT
+/F27 9.9626 Tf 461.54 546.659 Td [(2)]TJ
+ET
+EMC
+/Lbl <</MCID 9 >> BDC
+BT
+/F27 9.9626 Tf 196.533 534.704 Td [(1.1.1.1)]TJ
+ET
+EMC
+/P <</MCID 10 >> BDC
+BT
+/F27 9.9626 Tf 237.38 534.704 Td [(T)83(est)-333(subsubsection)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 322.983 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 330.731 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 338.479 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 346.227 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 353.975 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 361.723 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 369.471 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 377.219 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 384.967 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 392.714 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 400.462 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 408.21 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 415.958 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 423.706 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 431.454 534.704 Td [(.)]TJ
+ET
+EMC
+/Artifact BMC
+BT
+/F27 9.9626 Tf 439.202 534.704 Td [(.)]TJ
+ET
+EMC
+/Reference <</MCID 11 >> BDC
+BT
+/F27 9.9626 Tf 461.54 534.704 Td [(2)]TJ
+ET
+EMC
+
+endstream
+endobj
+8 0 obj
+<<
+/Type /Page
+/Contents 24 0 R
+/Resources 23 0 R
+/MediaBox [0 0 595.276 841.89]
+/StructParents 0/Tabs/S
+/Parent 28 0 R
+>>
+endobj
+23 0 obj
+<<
+/Font << /F29 25 0 R /F30 26 0 R /F27 27 0 R >>
+/ProcSet [ /PDF /Text ]
+>>
+endobj
+38 0 obj
+<<
+/Length 766
+>>
+stream
+BT
+/F32 17.2154 Tf 126.795 635.327 Td [(Chapter)-359(1)]TJ/F29 20.6625 Tf 0 -44.832 Td [(T)88(est)-353(c)29(hapter)]TJ
+ET
+/H2 <</MCID 0 >> BDC
+BT
+/F34 11.9552 Tf 126.795 536.199 Td [(1.1)-1125(T)94(est)-375(section)]TJ
+ET
+EMC
+/P <</MCID 1 >> BDC
+BT
+/F27 9.9626 Tf 126.795 514.378 Td [(test)]TJ
+ET
+EMC
+/H3 <</MCID 2 >> BDC
+BT
+/F36 10.9091 Tf 126.795 486.888 Td [(1.1.1)-1142(T)95(est)-381(subsection)]TJ
+ET
+EMC
+/P <</MCID 3 >> BDC
+BT
+/F27 9.9626 Tf 126.795 468.498 Td [(test)]TJ
+ET
+EMC
+/H4 <</MCID 4 >> BDC
+BT
+/F30 9.9626 Tf 126.795 442.603 Td [(1.1.1.1)-1149(T)95(est)-383(subsubsection)]TJ
+ET
+EMC
+/P <</MCID 5 >> BDC
+BT
+/F27 9.9626 Tf 126.795 424.213 Td [(test)]TJ
+ET
+EMC
+/H2 <</MCID 6 >> BDC
+BT
+/F34 11.9552 Tf 126.795 394.754 Td [(Starred)-375(section)]TJ
+ET
+EMC
+
+endstream
+endobj
+30 0 obj
+<<
+/Type /Page
+/Contents 38 0 R
+/Resources 37 0 R
+/MediaBox [0 0 595.276 841.89]
+/StructParents 1/Tabs/S
+/Parent 28 0 R
+>>
+endobj
+37 0 obj
+<<
+/Font << /F32 39 0 R /F29 25 0 R /F34 40 0 R /F27 27 0 R /F36 41 0 R /F30 26 0 R >>
+/ProcSet [ /PDF /Text ]
+>>
+endobj
+2 0 obj
+<< /Nums [0 [ 7 0 R 9 0 R 10 0 R 12 0 R 13 0 R 14 0 R 16 0 R 17 0 R 18 0 R 20 0 R 21 0 R 22 0 R ]
+1 [ 29 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R ]
+] >>
+endobj
+3 0 obj
+<<>>
+endobj
+4 0 obj
+<< /Type /StructElem /S /Document /P 1 0 R /K [5 0 R 29 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R]>>
+endobj
+5 0 obj
+<< /Type /StructElem /S /TOC /P 4 0 R /K [6 0 R 11 0 R 15 0 R 19 0 R]>>
+endobj
+6 0 obj
+<< /Type /StructElem /S /TOCI /P 5 0 R /K [7 0 R 9 0 R 10 0 R]>>
+endobj
+7 0 obj
+<< /Type /StructElem /S /Lbl /P 6 0 R /K <</Type /MCR /Pg 8 0 R /MCID 0>>>>
+endobj
+9 0 obj
+<< /Type /StructElem /S /P /P 6 0 R /K <</Type /MCR /Pg 8 0 R /MCID 1>>>>
+endobj
+10 0 obj
+<< /Type /StructElem /S /Reference /P 6 0 R /K <</Type /MCR /Pg 8 0 R /MCID 2>>>>
+endobj
+11 0 obj
+<< /Type /StructElem /S /TOCI /P 5 0 R /K [12 0 R 13 0 R 14 0 R]>>
+endobj
+12 0 obj
+<< /Type /StructElem /S /Lbl /P 11 0 R /K <</Type /MCR /Pg 8 0 R /MCID 3>>>>
+endobj
+13 0 obj
+<< /Type /StructElem /S /P /P 11 0 R /K <</Type /MCR /Pg 8 0 R /MCID 4>>>>
+endobj
+14 0 obj
+<< /Type /StructElem /S /Reference /P 11 0 R /K <</Type /MCR /Pg 8 0 R /MCID 5>>>>
+endobj
+15 0 obj
+<< /Type /StructElem /S /TOCI /P 5 0 R /K [16 0 R 17 0 R 18 0 R]>>
+endobj
+16 0 obj
+<< /Type /StructElem /S /Lbl /P 15 0 R /K <</Type /MCR /Pg 8 0 R /MCID 6>>>>
+endobj
+17 0 obj
+<< /Type /StructElem /S /P /P 15 0 R /K <</Type /MCR /Pg 8 0 R /MCID 7>>>>
+endobj
+18 0 obj
+<< /Type /StructElem /S /Reference /P 15 0 R /K <</Type /MCR /Pg 8 0 R /MCID 8>>>>
+endobj
+19 0 obj
+<< /Type /StructElem /S /TOCI /P 5 0 R /K [20 0 R 21 0 R 22 0 R]>>
+endobj
+20 0 obj
+<< /Type /StructElem /S /Lbl /P 19 0 R /K <</Type /MCR /Pg 8 0 R /MCID 9>>>>
+endobj
+21 0 obj
+<< /Type /StructElem /S /P /P 19 0 R /K <</Type /MCR /Pg 8 0 R /MCID 10>>>>
+endobj
+22 0 obj
+<< /Type /StructElem /S /Reference /P 19 0 R /K <</Type /MCR /Pg 8 0 R /MCID 11>>>>
+endobj
+29 0 obj
+<< /Type /StructElem /S /H2 /P 4 0 R /K <</Type /MCR /Pg 30 0 R /MCID 0>>>>
+endobj
+31 0 obj
+<< /Type /StructElem /S /P /P 4 0 R /K <</Type /MCR /Pg 30 0 R /MCID 1>>>>
+endobj
+32 0 obj
+<< /Type /StructElem /S /H3 /P 4 0 R /K <</Type /MCR /Pg 30 0 R /MCID 2>>>>
+endobj
+33 0 obj
+<< /Type /StructElem /S /P /P 4 0 R /K <</Type /MCR /Pg 30 0 R /MCID 3>>>>
+endobj
+34 0 obj
+<< /Type /StructElem /S /H4 /P 4 0 R /K <</Type /MCR /Pg 30 0 R /MCID 4>>>>
+endobj
+35 0 obj
+<< /Type /StructElem /S /P /P 4 0 R /K <</Type /MCR /Pg 30 0 R /MCID 5>>>>
+endobj
+36 0 obj
+<< /Type /StructElem /S /H2 /P 4 0 R /K <</Type /MCR /Pg 30 0 R /MCID 6>>>>
+endobj
+1 0 obj
+<< /Type /StructTreeRoot /K 4 0 R /ParentTree 2 0 R /RoleMap 3 0 R>>
+endobj
+43 0 obj
+[317.4 571.2 571.2 571.2 571.2 571.2 571.2 571.2 571.2 571.2 571.2 571.2 317.4 317.4 888.5 888.5 888.5 539.5 888.5 862.3 812 825 875.4 749.7 718 897.8 892.9 426.8 589.9 894.1 686.3 1083.2 892.9 858 780.2 858 853.2 634.7 794.5 877.6 862.3 1179.6 862.3 862.3 698.1 317.4 571.2 317.4 698.1 888.5 317.4 555.4 634.7 507.8 634.7 522.3 349.1 571.2 634.7 317.4 349.1 602.9 317.4 951.9 634.7 571.2 634.7 602.9 467.9 450.7 444.3 634.7]
+endobj
+44 0 obj
+[312.4 562.4 562.4 562.4 562.4 562.4 562.4 562.4 562.4 562.4 562.4 562.4 312.4 312.4 874.8 874.8 874.8 531.1 874.8 849.3 799.6 812.3 862.1 738.2 707 884 879.4 418.9 580.9 880.6 675.8 1066.9 879.4 844.7 768.3 844.7 838.9 624.8 782.2 864.4 849.3 1161.8 849.3 849.3 687.3 312.4 562.4 312.4 687.3 874.8 312.4 546.7 624.8 499.9 624.8 513.2 343.7 562.4 624.8 312.4 343.7 593.6 312.4 937.3 624.8 562.4 624.8 593.6 459.4 443.6 437.4]
+endobj
+45 0 obj
+[539.5 539.5 539.5 539.5 539.5 539.5 539.5 539.5 539.5 299.7 299.7 839.2 839.2 839.2 509.5 839.2 814.3 766.8 779.2 826.7 707.7 677.7 847.9 843.4 394.7 557 844.2 647.8 1023.2 843.4 810.1 736.8 810.1 799.3 599.4 750.1 828.8 814.3 1114 814.3 814.3 659.3 299.7 539.5 299.7 659.3 839.2 299.7 539.5 599.4 479.5 599.4 489.1 329.7 539.5 599.4 299.7 329.7 569.4 299.7 899.1 599.4 539.5 599.4 569.4 435.5 425.6 419.6]
+endobj
+46 0 obj
+[277.7 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 277.7 277.7 777.6 777.6 777.6 472.1 777.6 749.8 708.2 722 763.7 680.4 652.6 784.5 749.8 361 513.8 777.6 624.8 916.4 749.8 777.6 680.4 777.6 735.9 555.4 722 749.8 749.8 1027.5 749.8 749.8 611 277.7 499.9 277.7 611 777.6 277.7 499.9 555.4 444.3 555.4 444.3 305.5 499.9 555.4 277.7 305.5 527.7 277.7 833.1 555.4 499.9 555.4 527.7 391.6 394.3 388.8 555.4]
+endobj
+47 0 obj
+[319.4 574.9 574.9 574.9 574.9 574.9 574.9 574.9 574.9 574.9 574.9 574.9 319.4 319.4 894.2 894.2 894.2 542.9 894.2 869.2 817.9 830.4 881.7 755.4 723.4 903.9 899.8 436 594.3 901.2 691.5 1091.4 899.8 863.7 785.9 863.7 862.3 638.7 799.8 884.5 869.2 1188.6 869.2 869.2 702.6 319.4 574.9 319.4 702.6 894.2 319.4 558.9 638.7 511 638.7 527 351.3 574.9 638.7 319.4 351.3 606.8 319.4 958.1 638.7 574.9 638.7 606.8 473.5 453.5 447.1 638.7]
+endobj
+48 0 obj
+[766.7 813.3 696.1 666.6 834.2 829.7 388.1 547.9 830.5 637.1 1006.6 829.7 796.9 724.8 796.9 784.2 589.7 737.9 815.3 801 1095.8 801 801 648.7 294.9 530.8 294.9 648.7 825.6 294.9 530.8 589.7 471.8 589.7 479.9 324.4 530.8 589.7 294.9 324.4 560.3 294.9 884.6 589.7 530.8 589.7 560.3 426.4 418.7 412.8]
+endobj
+49 0 obj
+<<
+/Length1 727
+/Length2 13428
+/Length3 0
+/Length 14155
+>>
+stream
+%!FontType1-1.0: SFBX1000 0.3
+%%CreationDate: Wed Sep 12 2001
+% Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
+% See the file COPYING (GNU General Public License) for license conditions.
+% Converted from METAFONT EC/TC and LH fonts:
+% ecbx1000, tcbx1000, labx1000, lbbx1000, lcbx1000, rxbx1000.
+11 dict begin
+/FontInfo 6 dict dup begin
+/version (0.3) def
+/FullName (Computer Modern Bold Extended) def
+/FamilyName (Computer Modern) def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/Weight (Bold) def
+end readonly def
+/FontName /ATQFDO+SFBX1000 def
+/Encoding StandardEncoding def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] def
+/FontBBox{-229 -316 1737 939}readonly def
+currentdict end
+currentfile eexec
+oc;j~EЪ+`U+1;[ihd_Tw ρb=I"ae ̌!]#g~Q^VmcNtقP*4Jq=G1`ސnG)]'Z e+hb? %_hpZjC\W'[1cBgos ֗/fV2L
+o f&}Jx/_45N'\F WK\}I!T5`{{(?^]#ݺ0 Ifh p9DO7kfA}/ 8]o6a ہp6nuDg"wOϖlhҘWuCNo ĪCn:_:EU [3Bh/)&D:H5*ybIZ$um-휍B\xMEk)<mHU4";a6VbeJ։. W`=L쨕Oǜ<rk?RgdQp4+ZaD8xX坽Mp-&k<)Ūjr>Hj;3cHôs͠S>9w~}LCzi*~7
+بD.ɳe]w=.Us*'LiN] D1l3XǶZvzaO~bAbT%K<vȸc\x@%NH3{cϊ
+sbWwuTf
+u­@QAcibna1vL64!1;wi.ij9z+[Wd&h\73DOGT@Q1enۉ
+J}[pX=WZ]JW`s8{1.Q@H 'b:EO-TmH=q&޷L5+[weW{'quD7Ϛ$4΍;p
+"u?ceP.˜Uu8n}L︒ בV Z
+b&w
+t,/`#
+$,tMD{}ԞͮdQR-kK0louDuC5%=YMs1 GK_/"aN1~B˼w38{S
+<x~4VlQJSQ'~7ɢ\
+(۲&rA̬?Q2'^\6}<a_\tN KbtY>'=33h<cF'L2AWFY^d~r*qXń+m2[%EQt
+{~={>>Ug좄EUEpǠ5atd
+I6sQN(e7(WU|P#Co"|%Z=uy1O{ҞJ4k.cdfɮlq e"ri6Ld:7/4ibxj"=`v(bœUu6Ks$dZnܟwkW)kL -!jxhj OM/(_YZ8d
+zjY"*"oNM؆ Q'ZG?k%X%TjӶ
+tqYw(&V{$y֠*Fs^ aqPkQZ1/ \u^NG=O"kTU:^ 陂
+͜6r:o4=u9|P]jm*`^ݭ4k2*hWM+QV[+罁 f/;^&bffv⁏vQqG5)s:}x}&+ ¢1[sq5Ia
+m5J
+>fC0Hݰy:s['|)QyO~NdQ$r*|E 8L@ uh@`dA>5YE"sV[n:,yNDʦ)^w.AׇG=
+,ma8B`J|B*2m9}]%*7kCw$ bھ
+ӉWe 7v (HCc]":L,J`W7oEL T[( ީxQH|ȜE!JLq8kg
+k÷M}xͯlVlΚgPO9Opc2=R\-qڽ4^=SJ>&#,cK%$p_n]~>T:RZ sQtģq򣛱fP@]1t |њO83$Qe}:.4u<$SG@#gG=alRecwy&rZa6 Yb%d4Ɉm^ o~(^/⼡U5vE*!ᘂِaZ22:Uqv rѕ tYORHC3y:rj`GD
+x jՌN?1;Lİ )rjIrgwgs'q̨4Iv{Ngtц17P^'chx U^϶y.3LDfb`ЕOh=@dT;q~0Ɔ %kϯ=z*3@!o&"/D+Ke_LWv %J M\V7CJAiZaBN
+-.!wpLPdW.\.v; Sd a֊AvY39p_i#[K⯴
+Ӎ)lFE&vyj[G77Sj(q/Ɔ
+uoxj1<0k>h#yDw#+-Uĉ̴(*[
+sch(z5US!Mphe^_xFXNH[TYiEqFظ^Dp`#QE}VU9rKs}^4i,i #4FWv&iZ${!dP~6
+l `D4@8j{ A_aU3 V ǹIU2ZEC{^=vb2%gwe7|T rXG<k)cw -du<mm_ :Y }lN9͗ew^."]O7WgiR&JmViq$zP8Nc{phS荑9ܒƫ8'E@r:6|J,ǮAˉ::Xnմ#pxvrT7z cg e,Dv^|8wt9Z]ƭʄ [um%"vRc*M##͖Xx'g"WS:Kkrk Ιyc[Pc V߽RlQn֏+zg:9xb5nG ]!< ?c
+)wqO VK9Kq~6*zCFcHȈ*-2jxfGՄZR<"ԝ/W2ٴJTKnsCM{huJus|?X<^W{lR$FƇA3/%ha.kTAYJ Pz#͟B<؎Gh2]1,ۋH%b,2{Ę^)%"kٟ3#xhja)e0APey=UBiڰ܆
+V0g
+P}OAw%3pQT>L}=zhYL[VUUf78B_0}烃ꅊ⡿z\!X^hmMnˌ=
+V8hn[s1P̩e_d#Oejos+ 4ׂCKm](`8
+P vt\.[ul0%یE Fܐ7%1%7
+TAj7T .BU]S!'2 ^-yхBRy #2Wx"?;ӥSCxRY5[
+Ð1txl(<lݡC pb[vP)(#ҤR(ۤ=iyS#/YE`s[dE`-5I`DV7ာXק y!H4aLEA΁9<os̊/kyi&%3fY_\9|?i}#QrTN^XHo93EZ7=m|՝Y4NW<9y6zb*^uR]~ٓ$ʍJ~cqt|(x&D,گ]=&mY,Ok@]rO ?u׶e=LHu)o\Ms6!z@-`8$1ȴ4Zp(H
+k)o
+0T, ;:;ljٍZ)PbF.#dfSHN%DPxG2yb˛ҲgϕR[`Qu(۷`[(A]]MSŻJO拾 t8vO2-Ze"y>au!+?+E2x4fT<rEW9<h|^IFLC5%Vax~:D\r±~A.Vc7I($ώ%@[,-d+v$F?e!횐d?9C4.\~
+s-{tY<%Dءa%|Ttqx8/IfkɩTP@zZ4GUP:!
+tgs3 $~<FGFiӡɊU0._}yt]3$uuFU0jB맄O("O_Ҹؑʣ\ +0Jsb$/Y*l+~ɼo~ۗҳ8σ!U͙`.Ud1=&z%guTa,7/vhtTC˜ah:Jzk$t8fR$= Wדeh& )Bk?7y,kjS^73hqVS~}9{1ǀq%ɫj*Rq>F+ܮp As ;4~
+
+lL#=/a]@u?̻E밆`5ӿb>"g.+(I'퇄qYhKW3ry:8
+X|\{Qzv~ٙ6#a'$a!zD I7NqI wKr~T/ լm=ZcP_͕zAJ.gm kp[e[yOBC !Bb*w\k$s ck9XJ_c$ls(K?8{-!
+3-! ,53ʜ߻\Vd<}~cI,RPNښZ{ BL&wo])uE6C5Fue
+Y;.??ީnmCy| \w!hX;ȓ=b >o;5ٮS?keë:2ϾNJek6Y<WKIR#/cf9JR?iYBQ>(Li} D\dMo(L9
+_qP<Dvsp8p6uaC1dVd% }7
+endstream
+endobj
+50 0 obj
+<<
+/Type /FontDescriptor
+/FontName /ATQFDO+SFBX1000
+/Flags 4
+/FontBBox [-229 -316 1737 939]
+/Ascent 690
+/CapHeight 690
+/Descent -194
+/ItalicAngle 0
+/StemV 50
+/XHeight 444
+/CharSet (/T/a/b/c/e/h/i/n/o/one/p/period/r/s/t/two/u)
+/FontFile 49 0 R
+>>
+endobj
+51 0 obj
+<<
+/Length1 727
+/Length2 15563
+/Length3 0
+/Length 16290
+>>
+stream
+%!FontType1-1.0: SFBX1095 0.3
+%%CreationDate: Wed Sep 12 2001
+% Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
+% See the file COPYING (GNU General Public License) for license conditions.
+% Converted from METAFONT EC/TC and LH fonts:
+% ecbx1095, tcbx1095, labx1095, lbbx1095, lcbx1095, rxbx1095.
+11 dict begin
+/FontInfo 6 dict dup begin
+/version (0.3) def
+/FullName (Computer Modern Bold Extended) def
+/FamilyName (Computer Modern) def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/Weight (Bold) def
+end readonly def
+/FontName /ZGATEE+SFBX1095 def
+/Encoding StandardEncoding def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] def
+/FontBBox{-227 -316 1723 930}readonly def
+currentdict end
+currentfile eexec
+oc;j~EЪ+`U+1;[ihd_Tw ρb=I"ae ̌!]#g~Q^VmcNtقP*4Jq=G1`ސnG)]'Z e+hb? %_hpZa2+m
+@\ X8m6| 3 6[`G6.{6Q?* >Ip#d )kӖN%\ɡ<nE07cPQ/4WG`]F9w8ғC+N
+~b;l/p´]B6i_qK 'hi%EҘ bv_QѿT[ɟ>]T׮RBX`-֫{ûζ0MRJ0izKUU1Ԍd` H2);J[vnHdyG^}c#5W)Mi?Auso bo86 =\2uz,"vOpNhmPa6b?3+(p VS39۾>!HߍUYye",XU唟MZnUp\xVH{% jl?)jl}"!$K9%{u`X6QSE0K^*T i[yn L&C9nhΕGʃFY1K@j7CDmmuÅ LG/4G6H5Ly&}',gr"+F{)+W)}N)VncYM렚Qi41 c;cCX#2CӯunW3llsh׆]Յ'*2 dd$5}l!M#Ҳ 5RDy_<2a
+ .)a̳2Ggqg$WXlHطVU:|Qx nUl|T" 8`>Ѫu{es0IxB.ԗ݋,?qhmQa'qb5mGu(+ed=ۧASw^08٪ pTwxAD5/LA):,"{@_uBc_Z༹{4]f 3Dki+_l3x7dC&d@m
+
+-=!f ha: ^BogsyPc_tF?C-MKUE0!w' &|eKtEzp`@Rxb2{V .0Uf/x6Ws@rc“ DA0ZFg-ZnmGLK ٔ#z%VXcRqjh7'T\aIGLG@kZA(*kooF$;xH/*[;!Ŕ҃aG">`w)b ysrH}mkVo5lG_?VŢ}xaf_q `>N!U9U`퐴$Hv+ww7Tl$>ڏa<r;
+⟗XxwZ֌cϨQ zUI&KM5a씧sLJiEk=j* ..><
+?zo'I(HRM2SeG]9Qa EdAa rb.:33 &̅3</?x=5٣; jϲ1ݪ'mF+E|EZvR5;7~jdr"!#.x-boū
+
++Z>t1:'?ݼ+[1uYQڷ\Aɯ([V<|NJA\z<cV7 *
+[,BDt,ol:Dz˰tﮃ[u3yf wVb<X7A1&:Ǒ2ܥ$ Oؤ!vN==fVqթ*a
+9E+t xêʼL<8?ܣuT/EXt=nhmf|w~r s
+hI,JT Y
+ݞ*j &q^3>hsJ-p,"uu-KG+^#~qiɻ=a"1|}%3pQT>L}=sk%!o/qn.0Ǘ/m/Sx{L~Ue3\ 8a7УbD!/]PD
+d=5+WYn*5@
+z!4/8osk2Ҧa2 H͋~AXJE^ϓdBh5>,։3-R$.W)3"$%o TK)ޭF\sU8JҨS,I-z,f-b[1ZOh<6Zx_ZS>UfD@d3PMN1~c ВcxWvC+H
+k:./W
+I97px=Y/HmmnQS+T:؟ZJD8(MeXqjzvV >(=55p= M&xݠ6R 05E‹?_ m")ܔFah NQ +&tp[a
+Q jl?)jl}o:<!Me\תՄ<{!9 9xq5
+i/Br
+~"-b4偶7Lm̀JSq~=|`wi~(I=N1<~]yj#E"պ ?c-B_ԐQ/3 '+ Z^ "Z^=Za͘ <+Nnte^RqU%Y#b(G *u IT–
+VLܙ0M6XppsLm!JTF{'\w8Wj+WU1i7k`$jw_P(c߭!m&o_ØAX/ ~S8gr9H#?)}tLp+̷e2pĈa掜"@TlQ~&lVP{"-!ҚTJߞܺYS|E( M|?6mfE' 2m+Pq5_;a ~\짡bv0Uq z[j_2džq?.{dOi[3b ` KW5T3lH+D(zc<9:AuI%Ӭ\ T )x$Mnص&]0@:eHyԳ
+>R݉^4ttm=t-SS=R=`Cx>DU
+:r\ S;Ve J J`Ycx$*yc/Η8.
+Xաy>A 0tbHE,0 zc/fHl<"#Nƚ :}@jbZ;F4&>uX}4n|)$y'T̂>GKX 3vR ͝װXK
+qFQ:fP Wj8e9EV(S@/KG*y&fh16e;-64qכ>0WBH~b"&X^'/'1`Mx|FZU+)]hO@|'k)%5ϛG }qNC¶ h)mV:ҵ]KQ9
+^ }hgk0GǴ¤  ћD)W.'7Ht/ ^Sb{=? \ KRZݙd9g$x-otV8\ >odX'ޭe5ZY^V+wT3ak`JŢr1ߑm#@0>ˎb/ty|C73Kg`SA~4ǂ.HJ/&B!2CG2v)xhZ[}XS'@Nפ?:2%fj#(<`l_ [nWpL)vG+e
+\}W=쒔 7tYgoǧI
+x>Ս2[!uqƻ?ocl^F&И(i̎Fdޒ_@̙xcvFo*ȑxnVzމPjƹ21_6J"`uFZS} 6-LvqtBzU~ jh_cYAVW:yvbC4 Z)i/nZ
+
+ݖ4|zp?x琻f(Dؙ;D WFaY2I`Qi yf8Ѝ><A6{ >0^<3X<>h'%L-RUXDl:7IA3_ev淕Ttp;ג : 1r6cr/ubJb&k̤qB w7@;UTkNmk7S"5hyȮ?@F+<hŨO?$?4\4Qu_ &̅3</?|t`&%ah7}ΫX)oB2̶a%#J~3*?,3yMSz²'h0 HnXn|tB,d)qf 7%?PqO~$Fe'wjOyV6e~-bB:?\wXau9ɼwί@mSʸ8^uX`85ɉ|(} Mj}Gf")^V8|!=M/LQQL?w 4zI1z_ω}sz"=k|0;3WE0M]d=~[XJI4rXM3+1򤄰掲s\d3. T6Ui-m>fm؂[mEl}×Z]Vr\sJ5U 4ؼG؎ÂȱޞaCg:A$K$RIDƠ+$4fӴ٤7nd|\w}ٵ#E֝T\usp~s,v"Lbgyu-8cDOWwU@?BH<HU̕ک{zE6JG,*ɲׯWvWC!C0^O)?e/d ԏVugˊN`|P7ju)h@=B0, KZy^h"dF^Ćlm+rV[%QLu#sbE[GO^n%dzE4 @ KὫJ#NSЂ|#Tr^x2*K&}~el)"{!126 㷪 TӅ?N2DS{U8Ғ͈&ۺv=gY{+#Aa)-Iѯ<P
+8٦I23Z5!q~dg B>ʞY2t塖kt4̾0"gE r*KvNUȹ;*DQDQ^~o` zIRx;rZpH&u[Q[HЯW;]NM2D7}kT]Okʡ쫹rN:aH.X#|'/MKΆSG<q2z1Nicībd)f
+mm)|\1ԣxwa䢻^ݪF%iyfFL`ul
+ܑӻ8$w]"g~`IƋ˲}8)
+9rg /F:9W\Z;zO=*z2|FEYT^#Āǟބ$69sg':- Yq2&)lE&6Q 'N
+ C5rD)qLMMc`*MU ~BQNʨ[W#clC=UèUHv^[R#Ba`)OGد#b!qYPiQF}[ fYlޓAOStBL^DlD*O!d%̍ĩx.w%
+ad+z({4,lavI8m<QBr}H!xeRVNSb7}Iǯ= aFq:i b
+ +G6enZv&AMm-s<JкGEqsgy":_z.NRI#T);cSt{'?@"…3
+bjޅ;es
+gC]No=v
+5]S1@P@ϑe99mN~YxգsS\٥,lgjHSiuUjx3G, JzE{<~nPDZf3Wwm" 3.H,
+e٥]DA{%^X2$٪|kcDR3? t~i9UZ EayVnb2 *lMX ,s|[i&egb_FL}Q> βH$uaD"'oe*c7DՎJ^tj}|xY~]X:)4j_U"A#5!'|e3 mՊG?7c66QReV U?TMg֨2X nߪ~Kz]-wLWBIz)Vw3xrEsR uS.Ͼ‘VgtEe .PBOBTC|[ |_0׌V,C߫ &*UO'* [e!
+
+bO̺ĽF1xOh~a3;ZH@͡;уO4k{u><s3x9,v`eH
+Ŗ3"2<|Gyω9*FA<Ob\TN@L%P~9䫃%F sy4DƊR)=5Ђ =DHViBS[:ě8$ 2'=nA2rEskeѴVф{ڿp;bƙ~)k|y1yLVB{Fh j 7gIR3yVЊZ(;ۊ.JUlZ( U@<9{F/ɯh,{1@ǭ0.#C2Uۿ'k
+yT;4L r )Y㰨wY K*+'uI (2Op9(d2[bzɷVPCk,\\"wEw'1)tw0Lbv|Mv1CIk:H(8ߢ&c/QW:ip i=rTS:R{~#\~wv
+
+ew ~1.m߬nᷧ(Kv.1'g E0:j[lEr<J9ŠMf-Ў2wI"f{25 Ă%[|gO,
+1]
+ROgM,
+YAZ&JʯwȈlT2eOűA_?V"U0k`tA[mGW
+P/YkIxKULϞ;H֭eڽE*LZR(srrs߅Og~`n|_ ՔY_1+7Mfs)<"nD01=?nR<ֳkeIWՙϵ#z*>-hZB5hA;NN]ݑ5'K=sXt$Va3tJG.LO߮ F\䖤t*"t:es
+endstream
+endobj
+52 0 obj
+<<
+/Type /FontDescriptor
+/FontName /ZGATEE+SFBX1095
+/Flags 4
+/FontBBox [-227 -316 1723 930]
+/Ascent 690
+/CapHeight 690
+/Descent -194
+/ItalicAngle 0
+/StemV 50
+/XHeight 444
+/CharSet (/T/b/c/e/i/n/o/one/period/s/t/u)
+/FontFile 51 0 R
+>>
+endobj
+53 0 obj
+<<
+/Length1 727
+/Length2 11578
+/Length3 0
+/Length 12305
+>>
+stream
+%!FontType1-1.0: SFBX1200 0.3
+%%CreationDate: Wed Sep 12 2001
+% Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
+% See the file COPYING (GNU General Public License) for license conditions.
+% Converted from METAFONT EC/TC and LH fonts:
+% ecbx1200, tcbx1200, labx1200, lbbx1200, lcbx1200, rxbx1200.
+11 dict begin
+/FontInfo 6 dict dup begin
+/version (0.3) def
+/FullName (Computer Modern Bold Extended) def
+/FamilyName (Computer Modern) def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/Weight (Bold) def
+end readonly def
+/FontName /LLLFWP+SFBX1200 def
+/Encoding StandardEncoding def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] def
+/FontBBox{-223 -316 1694 925}readonly def
+currentdict end
+currentfile eexec
+oc;j~EЪ+`U+1;[ihd_Tw ρb=I"ae ̌!]#g~Q^VmcNtقP*4Jq=G1`ސnG)]'Z e+hb? %_hpZa2+m
+2SIe]
+ebV|B-{=X4 Q鷴jQP/=Hτh= Ӧ=qtLK6iU*ATA@4G<%m? mn0;*uM ѮK]);y&m#i^vcW+,љ<]hl^B5ULC{8M0ck;72Mu3$v2m1r
+N Yb8zS;O@#vhC]>#Oë"x($ L8l6|<Sۀ6<\xQz}'*ޓ
+2u4_Jޝ[E
+nCpi.U)e|Qle
++c?8imLf:)friꃿ79e02B%{l,/ )yӪǼL@7[C^#\EY2B/>_f][Qm~/b6v=P[[rr0
+&Wx0 zF
+ a~,"ze;)ge\1I<Y[S񺀡#c4Jqn0_NAōrwtQ@ekqEiCj
+i/޺*wQFhWIBn?GElNJl(Uܒ;0Naty"M g7 Q}sShEe0cDܻէ @vz?Qʺӈ]
+S캟z[T%B)qnWGK2WJDuĵΛȞx)‘LWZ.YPZJ7n>~D=$2j!GA~7}D\<l/w`&[`\CBoD蜥%H]v{Ljox1I>)vOݐ Ú!S{Ub鴿ΌPHק.Zg<w5q hY/$0#zd8B u|Rf5A =#KZf'r~a|H[ʝe1 'ԒmCMd(ɌFѻtI Q\<g
+!{²8m<QE:}cC^թ+! Y(
+ `j,ug׏v+KB8rtS 7t{K-ǭ4s7݋U_$RM{4.{ 2]HFyP K̔M Hjr"{ -Iph݈)=ɶ zLA%. sH}DtErY]Иë
+}NM ܜA7|*fw٨dt-_=Ut
+B[Aa(ƖyI'o]֩4`؃K̳a@A0X%o"5۪5& tX ]-l[)|q;?uE1Y%
+ەx:ݾct
+H4OVC00W/{~ )Y㰨w_KcNrON"w،(rmKе
+9/wQNO;@I$~@%|tH)njE5k
+ڵ!;O5Ydڙ6 `a?@kSo}p1AxJ~/Ȃ>N'R2
+[JWi:l}mA [J[P(ũ5?QnV\^+S9TJl}!i[GL>gh2^X&P ůxudԚu^6ym>]ˏff12€`_H ,$]9wav JA 8 >K}_pPNJ74+N+Wöld>7EG) we$@$XKqă,1d$UjWɎp&P?ʞY5 Bߏ"QzCk
+X;?[jĉnvҪR]m; CP'nh*7e; !fk9N."G&i3x ANO~ۇ
+6v[lF #&Ըvpa4=dc3,evFagѫw;oh4)! lx|z5lSV[(=&lOjT)gO~F;p[z>%{RY>a]+KԌ#]jy/z8ש]A&qVWXvXHN3H?sGG0v+1m "=wћy$EnP+BhًD# Kgxi󔲌@Ӝy7ura\
+^TbZ@݄uoC
+ d#4}ԋ,
+`hPp֢:O84!}~\QNpa|I.21@]{rA팤n"ɭq7^p,EoU퇵zc© 4=IFj5.bt%g`Vhz'Kz1Mi|f}z:Vd E2'?_Ǹ\7@AEsw}CFD %P/Xݣ=2
+C82(<+
+̚. :SMH:Y)lZRO&,M.yVo}l(Dbn[)/Pw\oXq.Hy2"/*'шG͑Ge > Qg0efx;%_WrߦwWI]
+Stɐ!kO8/)o MGhfKGg6 OaD_wBʲ!\VxJ-R0Bh]ǛXxI$塍'3gO
+b["١Y0\(݆"قXHWk˞2ٮ>fV"!]\E#~$A_|*DpwmvįB @
+c5؆Q_auԈI9:Nned W`+DŽ(D K;є;M֜ɢyCxj;Iݚ CٟW>~o,'EZ{G#{; c2v5Hfl
+\㈛!ʞARK8a=dSmHCޮu36hwXٝK>6淹QNO^"30Ĺ;/Ý䛽(П;&K<3Sn+f#Jr
+W[*
+0/t鑶C4(Jյ|?kLW Z>8~%o5վj kWwz1NS!7緗nܠifcm !ĵNZ“EY-Q
+1ɐ)-)
+,+:##]
+oHG !Y7E8
+\u0ʁ@piȟi}u#sT<7 e3$_} K]]bQ<>O`R (r˘{`a*
+:aIܜNU&idBv\%T"[ zX~GL @vӊ+ӽ^][
+?j&n
+Q(^jC 3lG}&(H
+uNDPTxxAq,aok,EKsTVJ$GQ</9v[Ya2l>Hq5+ZIT@~?ddŨ
+dFxX> P{=c ?Ƭ$.0zݴt 4$qm%i<yJ~-j2JU(gì?wMB&3]i^7#h]TF:  %}k"00Mx<~! pO׆Jۚe =liJܺMo4 ;xRy~wbNOP"8`j IdsJ:~ V=Pp 88|(ѰyzxDT5g>q xB= Є9`j*YϕZ3WAu+? ъwUM(K.5(w!TA)u(oJ'$Ce@IOolg,
+:3h.T+Y5Cxn9zft♱-;CRKE^xu)W羜m &[IS$&ϸhK _(hCI
+o|t+¬׭ w8#yPJU AΈ|u22[Dmln#z4;>c}L/Gq; 簎:.
+Π^Nm} <.(ڜ`Qle:[(VJb }ʔRG\+d}sm\ȹ!".8?N|mn,Dq:L%]=m
+ [5(N,eCL(ޝe3k;5O,&DN2)lȲF*)<
+snk} {98f Eʵwo+jLѴqڧ;fDhfQ%)'bs:Q
+mF;a7q8G :]~PgtED_A!73XzpGV868Xt|t>ˇ g(oj's
+_?U MhS'+7
+]FSU&`<DKbIyTI&#Cr|p @׻)0P]P3' 0Bi+<Ya>5rA7պ#toV"ƲWb(
+!,7X/PNW]ݦPu
+endstream
+endobj
+54 0 obj
+<<
+/Type /FontDescriptor
+/FontName /LLLFWP+SFBX1200
+/Flags 4
+/FontBBox [-223 -316 1694 925]
+/Ascent 690
+/CapHeight 690
+/Descent -194
+/ItalicAngle 0
+/StemV 50
+/XHeight 444
+/CharSet (/S/T/a/c/d/e/i/n/o/one/period/r/s/t)
+/FontFile 53 0 R
+>>
+endobj
+55 0 obj
+<<
+/Length1 727
+/Length2 10601
+/Length3 0
+/Length 11328
+>>
+stream
+%!FontType1-1.0: SFBX1728 0.3
+%%CreationDate: Wed Sep 12 2001
+% Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
+% See the file COPYING (GNU General Public License) for license conditions.
+% Converted from METAFONT EC/TC and LH fonts:
+% ecbx1728, tcbx1728, labx1728, lbbx1728, lcbx1728, rxbx1728.
+11 dict begin
+/FontInfo 6 dict dup begin
+/version (0.3) def
+/FullName (Computer Modern Bold Extended) def
+/FamilyName (Computer Modern) def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/Weight (Bold) def
+end readonly def
+/FontName /PMWZTJ+SFBX1728 def
+/Encoding StandardEncoding def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] def
+/FontBBox{-213 -316 1617 918}readonly def
+currentdict end
+currentfile eexec
+oc;j~EЪ+`U+1;[ihd_Tw ρb=I"ae ̌!]#g~Q^VmcNtقP*4Jq=G1`ސnG)]'Z e+hb? %_hpZa2+m
+V•8dC+lnчg|V8HՉ6 QD;u* rzJo}5_Gd&5ׅ麶MuPwV#@~[O'@%/(:eeeu_'"ڍEq^DCӧ=m&>FDdȪ\lNRkPO&Eq!זv- {{:+1W{E^"`} vk.<7
+b&w
+m7HM7?>ɽQ,7oZ?
+8 >OKN872˳;X0a;&H<:׆EUsĝb)Z41I9v{\BfLxvսTj\̬Pwd73dNGWsҝndlšMsªa"BF@N#ZEd>jLN96a _kn2ݨ8WV$ಳhOnV %{d0.03unmްn1<Q%FS+0gϜ8=9͚E/"<i`diޕ`ʍ"J^_FPpR} ,莧q 6[4}4l7#}\H"{=5 Y2yF4r LӘi^q-QoP}wL)(+Lj%`p߹5*ӌVC'f2D,BTbX1qTz',ltz`I.h5([U$\ruH%;A#yzTxh&{i}zr1:uͦb*~*u"zdDL,WLjQ"BQʤp>LBĭvK|p{~:YxmL<D=t=Uo.f_Q{^ 1[{ԗ I-@n
+4,ҢJ>ˌ8{VBV lh
+M'je?P)8m6>ʩۍEroCr$!< qrډ8q fȑhq٤=e[%I 4Xy~"H6i_b&&2пې>t<!e-ԡt<:DX _{=(/]g
+Q]&j3fYɚa^ bgO zV ^
+JK\
+1DȬW*I+xrzԵ\K+ ,^ԀyӎuW,ΰO(o>&Aw]DK
+&Va`F1/X|K&%)Wp /y{au"T)X\̅ԓ[!QЄNVz 28/ux_@Zl@ <7Z~dS7U1N܅a04Jsw欸g|7u/9VUVsL wPv*.@O UTme)89Z8ӲpǴbT_RGì߫>@+$uWҼgo
+=Kɩ`c/#NyLӡ{=jnjpt =g o(|q|?%֛FILŭga@Rj
+2#E7r׸rLE(ڳ;T:X4Ea'. k~#O 1G˅Jt޵F1r QC|ffkxy!JӉQ*|(ᬊyϘ9)|:Doc@$ڵK%2LIP?Nc x3IsRӆ0FZJ~ZT
+dh/ HQ~ڊ¬7WfsqƖעZdFh#׮T<7ZYٖ{/a!qS:g#zX?d`sk>j}[Aq7'$C\x9wc
+ 'A!8%qiP}g[mTƛs
+ZW3t?x!. OG:^U<T#BwXjp ݇RV(K*[v Kإ.=M
+1!&jk
+~IY
+[Pcm1+r^5z?K
+Ӱ(p2 [brRs=lfő&ԸYt:gj'W84LC9^-Q38yW͒K A8K௷RpRxq~Ź3\cײ-r|U)Xxfiu(FGw*i%9J\ UV|j}oƟ#? E@@Q@2ԧ
+p'v)g /g΄ \Ӗ qfL?ɉ2v-#1Eu1U%&~=˳`GMTԄ
+
+b텆`LGwfN{|X"9vw)UdI@qU4ZO(>D˗tocq.q<~nPDZf(ճw0x0kߚͱ$ȽGpb5a2Ń>76KX*n'0͕D"l[fu*HaOI'}Y4+3VyږG`6f;2}+vө@OQ٬MVcJ47ova!ܖ1@f ȝ c|%[x>tg4Hg"GʎJ$N:D-BSC0Ki~CޭNx Fp
+c
+M_
+K>R'ea'ȏ|^>)@`nu;~qiɻ=a"1~TCָ!H#ƌ:w,p,O#WcVC9/oV̯n2H߭m *15!y.cջ[5lȟ`P >~GHkǕf+brP~r% ZOl / =XIiҌ?FR ѻȓTczG̢44ZeA˔}!K/ycdz@&tLu49 ha_JK^xV|("p^KT*!
+9C3Smڻࢅ2{/*_V_/:8hdnz|%.Y'ҴeNW(z%J4I֜ɢyCxmK[v_ (ps~?@MSW/m)pQx nUl|_ѽu)Y[ը7]QJ[pmp/́&}7v,P`iBu7l (B6,theDY"RTm9NNvtmFÙžmE=dt1NczGZ5Z_|~]5@Nck7oc'efR7@Hc'q72q74vbr1}TC/+L%_t^$llYCa<^"؇%":!JD-A!%ps`9љAJWNUq<ŇE-i"&se'V=\j-,{K{>Qph"BN@n{6K[# YN`+mvUxIF֞ x*zc%6<~0
+Vs/\37nKB4urZQ;ۼ)4oRԚty9<T)HL85Z y\bq+.f8•/D";YAㄶnU͟fHkJ"@Y_Cݶaƹ&W`N^4l1q8
+%z;G YU.<eYW_-[OF//']䆚#Bw޴]H?jB8ؗǟOÂ 6w|Eu.[?NjKЪK\ӽfB#;v=c<n%j\_t
+}Gp'ɧy`6&ͿNrc`«uA3+UZrS^Q _J}c_ ==y򺄲iV㫡L".<oG#:[*FQLrr5g٦\AՀ;/4"A
+2 VIրeګsO> (sثZYȩnxJmU^|B [iV@)P)tt ԭJ% 4P~&%N{^ZEWU Cv$A>i(sE߹-j.'YfPr%"1%7@TeTbPގ:!:&<m],<yvm,eau-!(dʲ܉UcV2
+XBo@fK~k|n߼F}pӗwKIz= ĪRJ/es+A)OpAd_<F0;:-QN _,Vzǡ]vwX*OK6 1ta6'IӘEOǕNw{p@-Y?$z Mw<89Mu0cY1d|\ڸ'sqqg3:}w$lϓ#L!<^DE9=bP}oe-AohV2Չ6~muB%v^*/7O[ݗS,Av,;!q;!U x}3r҃LoIROfy+8UK~HlUm1 R-;YSy .eCw||JM
+endstream
+endobj
+56 0 obj
+<<
+/Type /FontDescriptor
+/FontName /PMWZTJ+SFBX1728
+/Flags 4
+/FontBBox [-213 -316 1617 918]
+/Ascent 690
+/CapHeight 690
+/Descent -194
+/ItalicAngle 0
+/StemV 50
+/XHeight 444
+/CharSet (/C/a/e/h/one/p/r/t)
+/FontFile 55 0 R
+>>
+endobj
+57 0 obj
+<<
+/Length1 727
+/Length2 10510
+/Length3 0
+/Length 11237
+>>
+stream
+%!FontType1-1.0: SFBX2074 0.3
+%%CreationDate: Wed Sep 12 2001
+% Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
+% See the file COPYING (GNU General Public License) for license conditions.
+% Converted from METAFONT EC/TC and LH fonts:
+% ecbx2074, tcbx2074, labx2074, lbbx2074, lcbx2074, rxbx2074.
+11 dict begin
+/FontInfo 6 dict dup begin
+/version (0.3) def
+/FullName (Computer Modern Bold Extended) def
+/FamilyName (Computer Modern) def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/Weight (Bold) def
+end readonly def
+/FontName /EBFMTC+SFBX2074 def
+/Encoding StandardEncoding def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] def
+/FontBBox{-208 -316 1589 921}readonly def
+currentdict end
+currentfile eexec
+oc;j~EЪ+`U+1;[ihd_Tw ρb=I"ae ̌!]#g~Q^VmcNtقP*4Jq=G1`ސnG)]'Z e+hb? %_hpZa2+m
+8)a8Xe;pOѭT[Ufb4N+nэZޚvd~[B2V$02&\4D9<ץ"stݫ /kX^3FRq}[ bI
+iB*SHj`z.on+.GE>B?3 JXPM_jma9` >Go\^RE q.g9eKN;3O8
+tC T|IpYAv)s:}x}&g<LB#UVȐ_MȧhW@gxK~\
+4~4kԅvΠ\H] iKC!P2mQ^#T+친so&MrD\S .>bPt*xFRBq"8Ɖ?9D*qr~{M3psvT+Ƭi=i$m|p%fW%cNMHS}Fދo$?_z"y"U6,"&M-gR\5܏Q3^pݦE2ToonĬ۞ ^'Hᾟ7{Z̴ꃤ˻3+p8K L3y/6Ѧ.v;g_kθFMҵzH!qY*8|q@ZYo9ˌss4$8Z%_Dgf,YihSGN{8> v̱y#P]D}v nUCgW9Wf9
+ՄUGtaȤf J ?(D򈎻@~vR^a{8lO3{1@0/*5G=MOKm'od/.oX VPH5-NZҙi#~E?Ze'޴c.'? wIC7d284`jKu]%lǁTNN/&>c1]JbAqzCڢz|D )dO qc$6mi I ?_@M9=7ٲH
+
+(j ۏ^<[l(hqr u)`[&g
+ J+>fj=S?6(9ml'5R
+ECE1dCTch
+/xld
+zF.=h0\?)@΋5iVK]6@v_Ä୽*l2Yq򄱽@B,e;,'37g$\-;<g9QzXiuАU@EFJ=q%-)' J@392f!5cKz!Њ.3]{цϰ)j& P[z&/2`Fƨ*._ ,Bf_垑Ҵ刃}M,˝23=SPT(f
+A"%ACЌ=DmC6{Lpso]6u <
+
+[ngebhrΊ:H//5%DX#!pgfp)Gyx,x a:YSO Vړ#*X˶b(>J\; MnԱӶIV
+@S jz.]V=(AQEe߁&İUm8Pb.:
+f+brP~r#
+ ev>ĵ
+E7sVgy7_L-U0(#S U)5 A(υ+{F#wc̏ʗvrCXN۱%^R:wHyV#=\5QUS;C6&+_4†\
+}#^BJ\*'>@)l1;GqiP}g[mTƛ`EG=yZjUf3rKC.G
+@Mh4]uϰ;`.fT^=BD&C_W I`vRh"„1+L\v4%ˮykޙV,0& gxcĄvA4>:Buo؉wt>Ow}Et:WX-Q )<$A:CB8?
+fm-  |eEI WvR0#[TGQ_sg UYO,L;E|K02iKcZxɴrsEsp3_NTx/qo\(QzfeaA1lXlƞsr1uOL m8%Cq\Z,8cbNMl
+jUI _^N"B;:xb~~EŷB .D{[M|SY3=XZ͗ZJm)HpfCPI#.HntX)X%
+[B
+ NGnTSC˫#8r!
+.^@ X^xV)"@r섗unxUɅ{'Ì&`+1nv5|y\Ze٭%ǏTw|ASzW(GʁˇL2aFM!~- 0<P=n:xޚNu0C\-yh_7 u˹ jTI*
+_|o"kOZ`6[GvI5%vA': ͷ,  SOyqdkL]bōt~,54BZ4(X;hU@)(ч/ɏ"~gP
+>@pUڡSf|~9 s/vP^ʜMo
+0G`@3W?=_">t? ;
+f݉+E=nO]֜تnH[,7%t;%I &g;(|cltW69Z(zLycoJ?.ur@P`6!z3cx }4Utnnݤ|= ?UusjGA}q7#kqBمh
+i 5j]rD,VSg\9&<"7P '@lj% ImY#w,8W^w9aA pݹ^b˿IoM&oލl$8 t#k q?}1d= $i0l+ttSR֭/r ރigkF0B߉zҚ"L
+yؽPJ=\ribsŝ8~SP^[J]h` n:œ>۝k6[C^#\Eb&UӰc$*P@ReGߖ*rsԚ2񟔹eHpcL/BrA^*&A'IT fŮw&;P4 Qkzט]}a#H սt^z9)vo&x0KCZs)b:,ϠQJHrƹh<+v4pۦY8yr.z,P
+ Z)!=Y`Zz<Pto/_ +nZMe咃ױSYz md*a6u
+7<K ݥkz(㈆y~޽Nw
+< պA5_ Fu0M#*T_kFJ lw+48 <믋aڤQܹDI@ bl[Orn تmp…[
+CrG ҌW
+JW>p(ԋ: <aTz~'l
+0o|c|s\׫)ޥkgPk w2ʠ~L(~!U^1%.h=/<d9 )G#=XAmDۣ!꺆ЀXwYyc2܎Q"&h 1A N+di+O9P&cv'K#*Ҙ㩈~=bڅAS0m<>[X'G>En5slcs}mX',o`oz :`HS@lx+Yq\t>MT^APU-sCAH,d^1ੇlq?ص  ̜Z>A2bӝZ??>
+c\rɮ׻!5CuV\.hZXfg[ᖞ&k!R]ˍ',4Ina4(ztw+•z.; ;[poܓFYQlFՒJj [) 2Ht06|q="٠ eQT=
+)H7`bm1(baN]3Ež8L.
+Ĺh`ڹMA1+pR V!t!dlىҹ3 Jp!a3^79ϠBF ?Z 5p+kTAI
+m cjE5(~P~4R-sӎ_e:R̾*V%&I܋ԂXNowY}Y9X~X`<:^+Z0^,jʟe
+iK@Y&hgKFϥq̵mr), d5K{z81,BY@dClbkw][Eȅ
+xX.1ư9}b( "C?^FyZ_0vk8S/uOim!L
+ %'/䥗 Ɯu.I9;ug&JtWCo/LG_#^$;6saq9A
+& `
+USy?'5r,7/+mzgv!/͒?W.~Y75K2$FTAK@ձ= Q:BrJH7ad$8!lβշ7N:7rYޱS.|y|z(
+80SKnw3G3mO~֊\ʢֈ<U4Xs마wzwMXK2+# o!Q4jCq} '&܅6~a`(6{,%3|G)piŇ_)+jV|;Ⱥ~ݑY>Ԡ%LvO5
+endstream
+endobj
+58 0 obj
+<<
+/Type /FontDescriptor
+/FontName /EBFMTC+SFBX2074
+/Flags 4
+/FontBBox [-208 -316 1589 921]
+/Ascent 690
+/CapHeight 690
+/Descent -194
+/ItalicAngle 0
+/StemV 50
+/XHeight 444
+/CharSet (/C/T/a/c/e/h/n/o/p/r/s/t)
+/FontFile 57 0 R
+>>
+endobj
+59 0 obj
+<<
+/Length1 721
+/Length2 10748
+/Length3 0
+/Length 11469
+>>
+stream
+%!FontType1-1.0: SFRM1000 0.3
+%%CreationDate: Wed Sep 12 2001
+% Copyright (c) 2001 Vladimir Volovich <vvv@vsu.ru>.
+% See the file COPYING (GNU General Public License) for license conditions.
+% Converted from METAFONT EC/TC and LH fonts:
+% ecrm1000, tcrm1000, larm1000, lbrm1000, lcrm1000, rxrm1000.
+11 dict begin
+/FontInfo 6 dict dup begin
+/version (0.3) def
+/FullName (Computer Modern Roman) def
+/FamilyName (Computer Modern) def
+/ItalicAngle 0 def
+/isFixedPitch false def
+/Weight (Medium) def
+end readonly def
+/FontName /TWDYZY+SFRM1000 def
+/Encoding StandardEncoding def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] def
+/FontBBox{-189 -321 1456 937}readonly def
+currentdict end
+currentfile eexec
+oc;j~EЪ+`U+1;[ihd_Tw ρb=I"ae ̌!]#g~Q^VmcNtقP*4Jq=G1`ސnG)]'Z e+hb? %_hpYg3 WbnswJkF*凉9i%$W:4&pn~YTn!z[jR:_*ޫ2kc⋸)F5kނ*.&
+ 򳪢k}c,U#^Y
+i^SK
+jcFj<̘1lߚQ@Ƕ%3JedsNSm_kT9I vHx5\
+-"_AEh;3pL[^<\e-k}y hZΥ&6e뎴xGebo9A?ɧ[ѢX!p=v@:lnT^T cؗ 4 ˶+ܟDȌ), #S<׽RNTIY>X}tV4>=*y@Ru"C0]yN_傜¦V:jœc'dqWѐƂW_P3I܃*S7`~%14
+C/"zOo6e#utPB5`zS 2^]wv"3-> Sn天M2gSt>z.aR~51G~"YjJySnV
+MHȼ#O&~S^nyų ;F
+dL`|4
+ ]!jѺ=Nx x$1tE]\ߎNx]l/)
+zG?e bԬ(+H~ c|+_,\Xg+ְƹLiFU
+/PgxZ !m&o]h+
+1#)e=4O$ZŅ4b5`'dD\r5']1Xo a]WIj#:TnRvI1S~B݋!m3,W/a{Ą"7_B⬡㼹C3n&Y$G
+ կ]K۰+sԘt53ěҸlp}
+R+ofyc ȹhluG11N`)6ҵ]KQ9
+P.QB(SWdܟ8:&B3<0]~,/RLWZdߵ!1`48JkSY=
+Ʊ}x%2? WB-
+\n1]#l O~b7M ?#>)g& f:4{Jy*%AyϚI$s-!ĿSm_ݦskt*IwB>
+ҁmCև .qR-[\n4u)? 8lBfCכB6 lICl
+ְFK@4wYnS]Y nl WX tc
+YaD5"1ETmNat 6V#;F\Z}mKk)rmn\ ͍[H+@^nY~C&Mo
+U ъ,G\ I`ꙔwhZ0i@+CnH׭fx LVN=(q/#U,e?UwO`z{C|LS.Z_cUI_B[Өu{ޤrUHSfdKT,5E`ЕN.7"!Z-T1xML=
+hd,xjΐBCoxV߂~m!W45w|\R
+Hd%
+jabLP^҂%¿4LZo .W;Yx1@;I
+
+DEDhA[?{k䕸 }*ᡃ}F<6kU\P"7?؆TWb/)r6QDݩy3n,D| !$,y1Yj&ulvv薖> 'LgE%҃TU$ 8lVhW<M:poU~k0R*YsAĕv p|yn.1Xo-7`},Id9[G%ps-{z]` 7~ة ~Ka= G+e:<!Me!F+L?,Ś, u}s7yWJ낡'se&#;Biœc'dqWѐ%+r:؟/ ϱ$6}^pZp*O&O; d)3kqyf#_m+JqQ< 5%%̽A: lRU/hߏzdpv(2{9;B-7_.v_zEWK{ÈbOd Hq 9i
+!5KqcSw mj!0g>[OźY>
+~jubPDMd^{Qo}Dpft&.)sɖӧ/0+q<q0l&i[WC"4r<1GvuJκǃ$:"643 )E""|rL6.WyF6 0WBH~b%pU3vh=dp,Zôn-K$GN=If
+53ɒ;ڙ:[{o[ȂqN#+X*&!8)u@  Ks4O3{iƻ-N㒰6>?5fE߁6tLԆ
+Acl̙?{Uj g(TXlDFzӍi
+RL1 <|:2dT9Y2((;tYޘK
+]-\FwXW1P7+HL 44lfٵJPh}Hƞ@RXA'6CZvݟ~{7݋U_$9\-/>$W j&B-L@|gj|n9\ZW:2*R
+5Cpt yiRh_UB T'NHhnU O^ٔ Z򲅫<x/ SD1VS_5V'~WF{(АX\̅ٝ-t
+FvNJ.sf]/T#hl/]_c8i?ãR%/yU:=,մh%U4I,/cIW֖̐p9-&NhP[&+8b},hcͦ}ہXLҙ'?Àز[ QJ@o,G G%Wյs5Ó1[{$L܉5Ʌޜ߻6$9*~zA.6P򜡆r$9XΝɃu!׺PDN+
+
+_/-8+C;h6j宿|G~
+endstream
+endobj
+60 0 obj
+<<
+/Type /FontDescriptor
+/FontName /TWDYZY+SFRM1000
+/Flags 4
+/FontBBox [-189 -321 1456 937]
+/Ascent 689
+/CapHeight 689
+/Descent -194
+/ItalicAngle 0
+/StemV 50
+/XHeight 430
+/CharSet (/T/b/c/e/i/n/o/one/period/s/t/two/u)
+/FontFile 59 0 R
+>>
+endobj
+42 0 obj
+<<
+/Type /Encoding
+/Differences [46/period 49/one/two 67/C 83/S/T 97/a/b/c/d/e 104/h/i 110/n/o/p 114/r/s/t/u]
+>>
+endobj
+26 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/BaseFont /ATQFDO+SFBX1000
+/FontDescriptor 50 0 R
+/FirstChar 46
+/LastChar 117
+/Widths 47 0 R
+/Encoding 42 0 R
+>>
+endobj
+41 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/BaseFont /ZGATEE+SFBX1095
+/FontDescriptor 52 0 R
+/FirstChar 46
+/LastChar 117
+/Widths 43 0 R
+/Encoding 42 0 R
+>>
+endobj
+40 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/BaseFont /LLLFWP+SFBX1200
+/FontDescriptor 54 0 R
+/FirstChar 46
+/LastChar 116
+/Widths 44 0 R
+/Encoding 42 0 R
+>>
+endobj
+39 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/BaseFont /PMWZTJ+SFBX1728
+/FontDescriptor 56 0 R
+/FirstChar 49
+/LastChar 116
+/Widths 45 0 R
+/Encoding 42 0 R
+>>
+endobj
+25 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/BaseFont /EBFMTC+SFBX2074
+/FontDescriptor 58 0 R
+/FirstChar 67
+/LastChar 116
+/Widths 48 0 R
+/Encoding 42 0 R
+>>
+endobj
+27 0 obj
+<<
+/Type /Font
+/Subtype /Type1
+/BaseFont /TWDYZY+SFRM1000
+/FontDescriptor 60 0 R
+/FirstChar 46
+/LastChar 117
+/Widths 46 0 R
+/Encoding 42 0 R
+>>
+endobj
+28 0 obj
+<<
+/Type /Pages
+/Count 2
+/Kids [8 0 R 30 0 R]
+>>
+endobj
+61 0 obj
+<<
+/Type /Catalog
+/Pages 28 0 R
+/Lang (en-US)
+/MarkInfo <</Marked true>>/StructTreeRoot 1 0 R
+>>
+endobj
+62 0 obj
+<<
+/Producer (pdfTeX-1.40.19)
+/Creator (TeX)
+/CreationDate (D:20180807165718+02'00')
+/ModDate (D:20180807165718+02'00')
+/Trapped /False
+/PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018/W32TeX) kpathsea version 6.3.0)
+>>
+endobj
+xref
+0 63
+0000000000 65535 f
+0000009451 00000 n
+0000006952 00000 n
+0000007125 00000 n
+0000007145 00000 n
+0000007265 00000 n
+0000007352 00000 n
+0000007432 00000 n
+0000005626 00000 n
+0000007523 00000 n
+0000007612 00000 n
+0000007710 00000 n
+0000007793 00000 n
+0000007886 00000 n
+0000007977 00000 n
+0000008076 00000 n
+0000008159 00000 n
+0000008252 00000 n
+0000008343 00000 n
+0000008442 00000 n
+0000008525 00000 n
+0000008618 00000 n
+0000008710 00000 n
+0000005764 00000 n
+0000000015 00000 n
+0000091685 00000 n
+0000091045 00000 n
+0000091845 00000 n
+0000092005 00000 n
+0000008810 00000 n
+0000006683 00000 n
+0000008902 00000 n
+0000008993 00000 n
+0000009085 00000 n
+0000009176 00000 n
+0000009268 00000 n
+0000009359 00000 n
+0000006822 00000 n
+0000005858 00000 n
+0000091525 00000 n
+0000091365 00000 n
+0000091205 00000 n
+0000090916 00000 n
+0000009535 00000 n
+0000009977 00000 n
+0000010419 00000 n
+0000010843 00000 n
+0000011284 00000 n
+0000011730 00000 n
+0000012044 00000 n
+0000026297 00000 n
+0000026559 00000 n
+0000042947 00000 n
+0000043197 00000 n
+0000055600 00000 n
+0000055854 00000 n
+0000067280 00000 n
+0000067517 00000 n
+0000078852 00000 n
+0000079095 00000 n
+0000090662 00000 n
+0000092070 00000 n
+0000092183 00000 n
+trailer
+<< /Size 63
+/Root 61 0 R
+/Info 62 0 R
+/ID [<AB0C51409A0DF8A0D879D9A5D16B028A> <AB0C51409A0DF8A0D879D9A5D16B028A>] >>
+startxref
+92450
+%%EOF
diff --git a/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-memoir.tex b/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-memoir.tex
new file mode 100644
index 00000000000..26399df9854
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/tagpdf/ex-patch-sectioning-memoir.tex
@@ -0,0 +1,252 @@
+% !Mode:: "TeX:DE:UTF-8:Main"
+
+\documentclass[a4paper,oneside]{memoir}
+\settocdepth{subsubsection}
+\setsecnumdepth{subsubsection}
+
+\usepackage[english]{babel}
+
+
+\usepackage{tagpdf}
+
+\tagpdfifpdftexT
+ {
+ %set language / can also be done with hyperref
+ \pdfcatalog{/Lang (en-US)}
+ \usepackage[T1]{fontenc}
+ }
+
+\tagpdfifluatexT
+ {
+ %set language / can also be done with hyperref
+ \pdfextension catalog{/Lang (en-US)}
+ \usepackage{fontspec}
+ \usepackage{luacode}
+ }
+
+
+\tagpdfsetup{tabsorder=structure,
+ activate-all,
+ uncompress
+ }
+
+\usepackage{lipsum}%\textheight3cm
+
+\usepackage{etoolbox}
+
+\ifdef\cfttocbeforelisthook{
+ \appto\cfttocbeforelisthook{\tagstructbegin{tag=TOC}}%\noindent TOC\par}
+}{
+ \csdef\cfttocbeforelisthook{\tagstructbegin{tag=TOC}}%\noindent TOC\par}
+}
+\ifdef\cfttocafterlisthook{
+ \appto\cfttocafterlisthook{\tagstructend}%\noindent /TOC\par}
+}{
+ \csdef\cfttocafterlisthook{\tagstructend}%\noindent /TOC\par}
+}
+
+\def\M{{\fontsize{3pt}{3pt}\sffamily\selectfont NN}}
+
+%what about unnumbered entries in the toc??????
+\appto\cftchapterpresnum{%
+ \tagstructbegin{tag=TOCI}% is there a better place? what about unnumbered entries?
+ \tagstructbegin{tag=Lbl}%
+ \tagmcbegin{tag=Lbl}%
+}
+\appto\cftchapteraftersnum{%
+ \tagmcend
+ \tagstructend}
+
+\appto\cftsectionpresnum{%
+ \tagstructbegin{tag=TOCI}% is there a better place? what about unnumbered entries?
+ \tagstructbegin{tag=Lbl}%
+ \tagmcbegin{tag=Lbl}%
+}
+\appto\cftsectionaftersnum{%
+ \tagmcend
+ \tagstructend}
+
+\appto\cftsubsectionpresnum{%
+ \tagstructbegin{tag=TOCI}% is there a better place? what about unnumbered entries?
+ \tagstructbegin{tag=Lbl}%
+ \tagmcbegin{tag=Lbl}%
+ }
+\appto\cftsubsectionaftersnum{%
+ \tagmcend
+ \tagstructend}
+\appto\cftsubsubsectionpresnum{%
+ \tagstructbegin{tag=TOCI}% is there a better place? what about unnumbered entries?
+ \tagstructbegin{tag=Lbl}%
+ \tagmcbegin{tag=Lbl}%
+}
+\appto\cftsubsubsectionaftersnum{%
+ \tagmcend
+ \tagstructend}
+
+%begin of entry
+\appto\cftchapteraftersnumb{%
+ \tagstructbegin{tag=P}%
+ \tagmcbegin{tag=P}}
+\appto\cftsectionaftersnumb{%
+ \tagstructbegin{tag=P}%
+ \tagmcbegin{tag=P}}
+\appto\cftsubsectionaftersnumb{%
+ \tagstructbegin{tag=P}%
+ \tagmcbegin{tag=P}}
+\appto\cftsubsubsectionaftersnumb{%
+ \tagstructbegin{tag=P}%
+ \tagmcbegin{tag=P}}
+
+%end of entry
+\pretocmd\cftchapterfillnum{%
+ \tagmcend
+ \tagstructend
+}{}{}
+\pretocmd\cftsectionfillnum{
+ \tagmcend
+ \tagstructend}{}{}
+\pretocmd\cftsubsectionfillnum{
+ \tagmcend
+ \tagstructend}{}{}
+\pretocmd\cftsubsubsectionfillnum{%
+ \tagmcend
+ \tagstructend}{}{}
+
+
+\makeatletter
+\patchcmd\cftchapterformatpnum{\cftchapterpagefont #1}{%
+ %\llap{\M pnum}%
+ \tagstructbegin{tag=Reference}%
+ \tagmcbegin{tag=Reference}
+ \cftchapterpagefont #1%
+ %\rlap{\M pnum}%
+ \tagmcend
+ \tagstructend
+ \tagstructend %for /TOCI. is there a better place?
+}{}{}
+\patchcmd\cftsectionformatpnum{\@nameuse{cftsectionpagefont}#1}{%
+ %\llap{\M pnum}%
+ \tagstructbegin{tag=Reference}%
+ \tagmcbegin{tag=Reference}
+ \@nameuse{cftsectionpagefont}#1%
+ %\rlap{\M pnum}%
+ \tagmcend
+ \tagstructend
+ \tagstructend %for /TOCI. is there a better place?
+}{}{\typeout{patch failed}}
+\patchcmd\cftsubsectionformatpnum{\@nameuse{cftsubsectionpagefont}#1}{%
+ %\llap{\M}%
+ \tagstructbegin{tag=Reference}%
+ \tagmcbegin{tag=Reference}
+ \@nameuse{cftsubsectionpagefont}#1%
+ %\rlap{\M}%
+ \tagmcend
+ \tagstructend
+ \tagstructend %for /TOCI. is there a better place?
+}{}{\typeout{patch failed}}
+
+\patchcmd\cftsubsubsectionformatpnum{\@nameuse{cftsubsubsectionpagefont}#1}{%
+ %\llap{\M}%
+ \tagstructbegin{tag=Reference}%
+ \tagmcbegin{tag=Reference}
+ \@nameuse{cftsubsubsectionpagefont}#1%
+ %\rlap{\M}%
+ \tagmcend
+ \tagstructend
+ \tagstructend %for /TOCI. is there a better place?
+}{}{\typeout{patch failed}}
+
+
+% section is typeset using \M@sect
+\ExplSyntaxOn
+\prop_new:N \g_tag_section_level_prop
+\prop_put:Nnn \g_tag_section_level_prop {chapter}{H1}
+\prop_put:Nnn \g_tag_section_level_prop {section}{H2}
+\prop_put:Nnn \g_tag_section_level_prop {Starredsection}{H2}
+\prop_put:Nnn \g_tag_section_level_prop {subsection}{H3}
+\prop_put:Nnn \g_tag_section_level_prop {subsubsection}{H4}
+\prop_put:Nnn \g_tag_section_level_prop {paragraph}{H5}
+\ExplSyntaxOff
+\patchcmd\M@sect{#9\@@par}{%
+ %this place could be used for something between number and text
+ #9%
+ \tagmcend
+ \tagstructend
+ \@@par%
+}{}{}
+
+% section* use \@ssect, but memoir redefines it a little before
+% calling the kernel version
+
+\ExplSyntaxOn
+\patchcmd\@ssect{\@mem@old@ssect{#1}{#2}{#3}{#4}{#5}}{%
+ \@mem@old@ssect{#1}{#2}{#3}{#4}{%
+ \tagstructbegin{tag=H2}% how to get level???
+ \tagmcbegin {tag=H2}% how to get level???
+ #5
+ \tagmcend
+ \tagstructend}%
+}{}{}
+
+% section numbers are typeset using \@seccntformat
+
+
+\pretocmd\@seccntformat{%
+ \tagstructbegin{tag=\prop_item:Nn\g_tag_section_level_prop{#1}}%
+ \tagmcbegin {tag=\prop_item:Nn\g_tag_section_level_prop{#1}}
+}{}{}
+\ExplSyntaxOff
+% could be used to insert something after the number ...
+%\patchcmd\@seccntformat{\endcsname}{%
+% \endcsname\rlap{\M}%
+%}{}{}
+
+\renewcommand{\cftdot}{\tagmcbegin{artifact}.\tagmcend}
+
+\makeatother
+ % I don't want to handle header/footer now
+\pagestyle{empty}
+\makeevenfoot{plain}{}{}{}
+\makeoddfoot{plain}{}{}{}
+
+
+%% missing yet: chapter titles
+\begin{document}
+
+\tagstructbegin{tag=Document}
+
+\tableofcontents*
+
+\chapter{Test chapter}
+
+\section{Test section}
+
+ \tagstructbegin{tag=P}
+ \tagmcbegin{tag=P}
+test
+ \tagmcend
+ \tagstructend
+
+
+\subsection{Test subsection}
+
+ \tagstructbegin{tag=P}
+ \tagmcbegin{tag=P}
+test
+ \tagmcend
+ \tagstructend
+
+\subsubsection{Test subsubsection}
+
+ \tagstructbegin{tag=P}
+ \tagmcbegin{tag=P}
+test
+ \tagmcend
+ \tagstructend
+
+\section*{Starred section}
+
+\tagstructend
+\end{document}
+
+
diff --git a/Master/texmf-dist/doc/latex/tagpdf/ex-softhyphen.pdf b/Master/texmf-dist/doc/latex/tagpdf/ex-softhyphen.pdf
index 693ecaa3432..a239393fd90 100644
--- a/Master/texmf-dist/doc/latex/tagpdf/ex-softhyphen.pdf
+++ b/Master/texmf-dist/doc/latex/tagpdf/ex-softhyphen.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/tagpdf/ex-spaceglyph-listings.pdf b/Master/texmf-dist/doc/latex/tagpdf/ex-spaceglyph-listings.pdf
new file mode 100644
index 00000000000..b1c04868120
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/tagpdf/ex-spaceglyph-listings.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/tagpdf/ex-spaceglyph-listings.tex b/Master/texmf-dist/doc/latex/tagpdf/ex-spaceglyph-listings.tex
new file mode 100644
index 00000000000..d45dab10e7b
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/tagpdf/ex-spaceglyph-listings.tex
@@ -0,0 +1,21 @@
+% !Mode:: "TeX:DE:UTF-8:Main"
+\documentclass{article}
+\usepackage{amsmath}
+\usepackage[ngerman]{babel}
+\usepackage{tagpdf,listings}
+\makeatletter
+%\def\lst@outputspace{\pdffakespace\ } %not so good
+% this here works fine with luatex, if the font has a space glyph:
+\def\lst@visiblespace{\lst@ttfamily{\char32}{\char32}}
+% with pdftex this could work
+%\def\lst@visiblespace{\lst@ttfamily{\pdffakespace\ }{\pdffakespace\ }}
+\tagpdfsetup{activate-all,uncompress,interwordspace=on,show-spaces,log=v}
+\begin{document}\pagestyle{empty}
+\tagstructbegin{tag=Document}
+\tagmcbegin{tag=P}
+\begin{lstlisting}[showspaces]
+aaa aaa xxxx
+\end{lstlisting}
+\tagmcend
+\tagstructend
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/tagpdf/ex-tagpdf-template.pdf b/Master/texmf-dist/doc/latex/tagpdf/ex-tagpdf-template.pdf
index 07932412295..36b9eb24875 100644
--- a/Master/texmf-dist/doc/latex/tagpdf/ex-tagpdf-template.pdf
+++ b/Master/texmf-dist/doc/latex/tagpdf/ex-tagpdf-template.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/tagpdf/tagpdf.pdf b/Master/texmf-dist/doc/latex/tagpdf/tagpdf.pdf
index 1a2efc07462..8445518add8 100644
--- a/Master/texmf-dist/doc/latex/tagpdf/tagpdf.pdf
+++ b/Master/texmf-dist/doc/latex/tagpdf/tagpdf.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/tagpdf/tagpdf.tex b/Master/texmf-dist/doc/latex/tagpdf/tagpdf.tex
index 5b377f40058..7aa7d9d3aa3 100644
--- a/Master/texmf-dist/doc/latex/tagpdf/tagpdf.tex
+++ b/Master/texmf-dist/doc/latex/tagpdf/tagpdf.tex
@@ -1,10 +1,9 @@
% !Mode:: "TeX:DE:UTF-8:Main"
\makeatletter
-\def\UlrikeFischer@package@version{0.3}
-\def\UlrikeFischer@package@date{2018/08/06}
+\def\UlrikeFischer@package@version{0.50}
+\def\UlrikeFischer@package@date{2019/01/04}
\makeatother
\documentclass[DIV=12,parskip=half-,bibliography=totoc]{scrartcl}
-\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage[autostyle]{csquotes}
@@ -145,6 +144,11 @@ In this version I improved the handling of alternative and actual text. See sect
I no longer try to (pdf-)escape the tag names: it is a bit unclear how to do it at best with luatex. This will perhaps later change again.
+\subsection{Changes in 0.5}
+I added code to handle attributes and attribute classes, see section~\ref{sec:attributes} and corrected a small number of code errors.
+
+I added code to add \enquote{real} space glyphs to the pdf, see section \ref{sec:spacechars}.
+
\section{Setup}
\minisec{Activation needed!}
@@ -172,19 +176,23 @@ The command should be normally used only in the preamble (for a few keys it coul
The key-val list understands the following keys:
\begin{description}
-\item[\PrintKeyName{activate-mc} ] Boolean, initially false. Activates the code related to marked content.
+\item[\PrintKeyName{activate-all}] Boolean, initially false. Activates everything, that's normally the sensible thing to do.
+\item[\PrintKeyName{activate-mc}] Boolean, initially false. Activates the code related to marked content.
\item[\PrintKeyName{activate-struct}] Boolean, initially false. Activates the code related to structures. Should be used only if \PrintKeyName{activate-mc} has been used too.
\item[\PrintKeyName{activate-tree}] Boolean, initially false. Activates the code related to trees. Should be used only if the two other keys has been used too.
-\item[\PrintKeyName{activate-all}] Boolean, initially false. Activates everything, that normally the sensible thing to do.
-\item[\PrintKeyName{add-new-tag}] See section \ref{sec:new-tag} for a description.
-\item[\PrintKeyName{check-tags}] Boolean, initially true. Activates some safety checks (but doesn't very much currently. It will perhaps be merged with the log-level key).
+\item[\PrintKeyName{add-new-tag}] Allows to define new tag names, see section \ref{sec:new-tag} for a description.
+\item[\PrintKeyName{check-tags}] Boolean, initially true. Activates some safety checks (but doesn't do very much currently. It will perhaps be merged with the log-level key).
\item[\PrintKeyName{compresslevel}] Value is an integer between 0 and 9. It sets both the pdfcompresslevel and the pdfobjcompresslevel.
\item[\PrintKeyName{inputencoding}] Some keys convert their value and so need to know the encoding of the file. The default encoding is utf8. When using pdflatex you can switch to another encoding with this key. The value should be one of names allowed by \texttt{l3str}. There is no checking that the name is valid (I don't think that it sensible to use something else than utf8).
+\item[\PrintKeyName{interwordspace}] Choice key, possible values are \PrintKeyName{true}/""\PrintKeyName{on} and \PrintKeyName{false}/\PrintKeyName{off}. The key activates/deactivates the insertion of space glyphs, see section~\ref{sec:spacechars}.
\item[\PrintKeyName{log}] Choice key, possible values \PrintKeyName{none}, \PrintKeyName{v}, \PrintKeyName{vv}, \PrintKeyName{vvv}, \PrintKeyName{all}. Setups the log level. Changing the value affects currently mostly the luamode: \enquote{higher} values gives more messages in the log. The current levels and messages have been setup in a quite ad-hoc manner and will need improvement.
+\item[\PrintKeyName{newattribute}] This key takes two arguments and declares an attribute. See \ref{sec:attributes}.
+\item[\PrintKeyName{show-spaces}] Boolean.\marginnote{luamode} That's a debug option, it helps to see where space glyph will be inserted if \PrintKeyName{interwordspace} is activated.
\item[\PrintKeyName{tabsorder}] Choice key, possible values are \PrintKeyName{row}, \PrintKeyName{column}, \PrintKeyName{structure}, \PrintKeyName{none}. This decides if a \verb+/Tabs+ value is written to the dictionary of the page objects. Not really needed for tagging itself, but one of the things you probably need for accessibility checks. So I added it. Currently the tabsorder is the same for all pages. Perhaps this should be changed \ldots.
-\item[\PrintKeyName{tagunmarked}] Boolean,\marginnote{luamode} initially true. When this boolean is true, the lua code will try to mark everything that has not been marked yet as an artifact. The benefit is that one doesn't have to mark up every deco rule oneself. The danger is that it perhaps marks things that shouldn't be marked -- it hasn't been tested yet with complicated documents containing annotations etc.
+\item[\PrintKeyName{tagunmarked}] Boolean,\marginnote{luamode} initially true. When this boolean is true, the lua code will try to mark everything that has not been marked yet as an artifact. The benefit is that one doesn't have to mark up every deco rule oneself. The danger is that it perhaps marks things that shouldn't be marked -- it hasn't been tested yet with complicated documents containing annotations etc. See also section~\ref{sec:lazy} for a discussion about automatic tagging.
\item[\PrintKeyName{uncompress}] Equivalent to using \texttt{compresslevel=0}.
+
\end{description}
\section{Tagging}
@@ -206,7 +214,7 @@ stream
endstream
\end{lstlisting}
-From this stream one can extract the characters and their placement on the page but not their semantic meaning (the first line is actually a section heading, the last the page number). And while in the example the order is correct there is actually no garanty that the stream contains the text in the order it should be read.
+From this stream one can extract the characters and their placement on the page but not their semantic meaning (the first line is actually a section heading, the last the page number). And while in the example the order is correct there is actually no guaranty that the stream contains the text in the order it should be read.
Tagging means to enrich the pdf with information about the \emph{semantic} meaning and the \emph{reading order}. (Tagging can do more, one can also store all sorts of layout information like font properties and indentation with tags. But as I already wrote this package concentrates on the part of tagging that is needed to improve accessibility.)
@@ -216,7 +224,7 @@ Tagging means to enrich the pdf with information about the \emph{semantic} meani
To tag a pdf three tasks must be carried out:
\begin{enumerate}
-\item \textbf{The mark-content-task}:\marginnote{mc-task} The document must add \enquote{labels} to the page stream which allows to identify and reference the various chunks of text and other content. This is the most difficult part of tagging -- both for the document writer but also for the package code. At first there can be quite many chunks as every one is a leaf node of the structure and so often a rather small unit. At second the chunks must be defined page-wise -- and this is not easy when you don't know where the page breaks are. At last some text is created automatically, e.g. the toc, references, citations, list numbers etc and it is not always easy to mark them correctly.
+\item \textbf{The mark-content-task}:\marginnote{mc-task} The document must add \enquote{labels} to the page stream which allows to identify and reference the various chunks of text and other content. This is the most difficult part of tagging -- both for the document writer but also for the package code. At first there can be quite many chunks as every one is a leaf node of the structure and so often a rather small unit. At second the chunks must be defined page-wise -- and this is not easy when you don't know where the page breaks are. Also in a standard document a lot text is created automatically, e.g. the toc, references, citations, list numbers etc and it is not always easy to mark them correctly.
\item \textbf{The structure-task}:\marginnote{struct-task} The document must declare the structure. This means marking the start and end of semantically connected portions of the document (correctly nested as a tree). This too means some work for the document writer, but less than for the mc-task: at first quite often the mc-task and the structure-task can be combined, e.g. when you mark up a list number or a tabular cell or a section header; at second one doesn't have to worry about page breaks so quite often one can patch standard environments to declare the structure. On the other side a number of structures end in \LaTeX\ only implicitly -- e.g. an item ends at the next item, so getting the pdf structure right still means that additional mark up must be added.
@@ -336,10 +344,10 @@ This sounds easy. But there are quite a number of traps.
\item The literals are inserted directly and not at shipout. This means that due to the asynchronous page breaking of \TeX\ the MCID-number can be wrong even if the counter is reset at every page (this package uses in generic mode a label-ref-system to get around this problem. This sadly means that three compilations are needed until everything has settled down).
- \item There exist environments that process their content more than once -- examples are \texttt{align} and \texttt{tabularx}.
+ \item There exist environments which process their content more than once -- examples are \texttt{align} and \texttt{tabularx}.
So one has to check for doublettes and holes in the counting system.
- \item Pdf is a page oriented format. And this means that the start and the end marker must be on the same page \ldots\ \emph{so what to do with normal paragraphs that split over pages??}. This question will be handled in subsection~\ref{sec:splitpara}.
+ \item Pdf is a page oriented format. And this means that the start and the end marker must be on the same page \ldots\ \emph{so what to do with normal paragraphs that split over pages??}. This question will be discussed in subsection~\ref{sec:splitpara}.
\end{enumerate}
\subsubsection{Generic mode versus lua mode in the mc-task}
@@ -352,7 +360,7 @@ This means that quite a number of problems mentioned above are not relevant for
\item Pagebreaks between start and end of the marker are \emph{not} a problem. So you can mark a complete paragraph. If a pagebreak occur directly after an start marker or before an end marker this can lead to empty chunks in the pdf and so bloat up pdf a bit, but this is imho not really a problem (compared to the size increase by the rest of the tagging).
\item The commands don't insert literals directly and so affect line and page breaking much less.
\item The numbering of the MCID are done at shipout, so no label/ref system is needed.
-\item The code can do some marking automatically. Currently everything that has not been marked up by the document is marked as artifact. This can probably be extended and improved.
+\item The code can do some marking automatically. Currently everything that has not been marked up by the document is marked as artifact.
\end{enumerate}
\subsubsection{Commands to mark content and chunks}
@@ -370,7 +378,7 @@ Such markers should not be nested. The command will warn you if this happens.
The key-val list understands the following keys:
\begin{description}
- \item[\PrintKeyName{tag}] This is required, unless you use the \PrintKeyName{artifact} key. The value of the key is normally one of the standard type listed in section \ref{sec:new-tag}. It is possible to setup new tags, see the same section. The value of the key is expanded, so it can be a command. The expansion is passed unchanged to the pdf, so it should with a starting slash give a valid pdf name (some ascii with numbers like \texttt{H4} is fine).
+ \item[\PrintKeyName{tag}] This is required, unless you use the \PrintKeyName{artifact} key. The value of the key is normally one of the standard type listed in section \ref{sec:new-tag} (without a slash at the begin, this is added by the code). It is possible to setup new tags, see the same section. The value of the key is expanded, so it can be a command. The expansion is passed unchanged to the pdf, so it should with a starting slash give a valid pdf name (some ascii with numbers like \texttt{H4} is fine).
\item[\PrintKeyName{artifact}] This will setup the marked content as an artifact. The key should be used for content that should be ignored. The key can take one of the values \PrintKeyName{pagination}, \PrintKeyName{layout}, \PrintKeyName{page}, \PrintKeyName{background} and \PrintKeyName{notype} (this is the default). Text in the header and footer should be marked with \PrintKeyName{artifact=pagination}.
@@ -380,13 +388,13 @@ The key-val list understands the following keys:
The\marginnote{lua mode only} lua mode will mark up everything unmarked as \texttt{artifact=notype}. You can suppress this behaviour by setting the tagpdfsetup key \texttt{tagunmarked} to false. See section \ref{ssec:setup}.
- \item[\PrintKeyName{stash}] Normally marked content will be stored in the \enquote{current} structure. This may not be what you want. As an example you may perhaps want to put a marginnote behind or before the paragraph it is in the tex-code. With this boolean key the content is marked but not stored in the kid-key of the current structure.
+ \item[\PrintKeyName{stash}] Normally marked content will be stored in the \enquote{current} structure. This may not be what you want. As an example you may perhaps want to put a marginnote behind or before the paragraph it is in the tex-code. With this boolean key the content is marked but not stored in the kid-key of the current structure.
\item[\PrintKeyName{label}] This key sets a label by which you can call the marked content later in another structure (if it has been stashed with the previous key). Internally the label name will start with \texttt{tagpdf-}.
- \item[\PrintKeyName]{alttext}] This key inserts an \texttt{/Alt} value in the property dictionary of the BDC operator. See section~\ref{sec:alttext}. The value is handled as verbatim string, commands are not expanded.
+ \item[\PrintKeyName{alttext}] This key inserts an \texttt{/Alt} value in the property dictionary of the BDC operator. See section~\ref{sec:alttext}. The value is handled as verbatim string, commands are not expanded.
- \item[\PrintKeyName]{alttext-o} This key inserts an \texttt{/Alt} value in the property dictionary of the BDC operator. See section~\ref{sec:alttext}. The value is handled as verbatim string like the key \PrintKeyName]{alttext} but expanded once (the \texttt{o} refers to the \texttt{o} type in expl3). That means that you do something like this:
+ \item[\PrintKeyName{alttext-o}] This key inserts an \texttt{/Alt} value in the property dictionary of the BDC operator. See section~\ref{sec:alttext}. The value is handled as verbatim string like the key \PrintKeyName{alttext} but expanded once (the \texttt{o} refers to the \texttt{o} type in expl3). That means that you can do something like this:
\begin{lstlisting}
\newcommand\myalttext{\frac{a}{b}}
@@ -395,9 +403,9 @@ The key-val list understands the following keys:
and it will insert \verb+\frac{a}{b}+ (hex encoded) in the pdf.
- \item[\PrintKeyName]{actualtext}] This key inserts an \texttt{/ActualText} value in the property dictionary of the BDC operator. See section~\ref{sec:alttext}. The value is handled as verbatim string, commands are not expanded.
+ \item[\PrintKeyName{actualtext}] This key inserts an \texttt{/ActualText} value in the property dictionary of the BDC operator. See section~\ref{sec:alttext}. The value is handled as verbatim string, commands are not expanded.
- \item[\PrintKeyName]{actualtext-o} This key inserts an \texttt{/ActualText} value in the property dictionary of the BDC operator. See section~\ref{sec:alttext}. The value is handled as verbatim string like the key \PrintKeyName]{actualtext} but expanded once (the \texttt{o} refers to the \texttt{o} type in expl3). That means that you do something like this:
+ \item[\PrintKeyName{actualtext-o}] This key inserts an \texttt{/ActualText} value in the property dictionary of the BDC operator. See section~\ref{sec:alttext}. The value is handled as verbatim string like the key \PrintKeyName{actualtext} but expanded once (the \texttt{o} refers to the \texttt{o} type in expl3). That means that you can do something like this:
\begin{lstlisting}
\newcommand\myactualtext{X}
@@ -406,7 +414,7 @@ The key-val list understands the following keys:
and it will insert \verb+X+ (hex encoded) in the pdf.
- \item[\PrintKeyName{raw}] This key allows you to add more entries to the properties dictionary. The value must be correct, low-level pdf. E.g. \verb+raw=/Alt (Hello)+ will insert an alternative Text. (I will probably add keys for \texttt{/Alt} and \texttt{/Actualtext} later, but I haven't made up my mind regarding the encoding yes).
+ \item[\PrintKeyName{raw}] This key allows you to add more entries to the properties dictionary. The value must be correct, low-level pdf. E.g. \verb+raw=/Alt (Hello)+ will insert an alternative Text.
\end{description}
\ExplSyntaxOn
@@ -537,9 +545,9 @@ The key-val list understands the following keys:
\item[\PrintKeyName{tag}] This is required. The value of the key is normally one of the standard type listed in section \ref{sec:new-tag}. It is possible to setup new tags/types, see the same section.
\item[\PrintKeyName{stash}] Normally a new structure inserts itself as a kid into the currently active structure. This key prohibits this. The structure is nevertheless from now on \enquote{the current active structure} and parent for following marked content and structures.
\item[\PrintKeyName{label}] This key sets a label by which you can use the structure later in another structure. Internally the label name will start with \texttt{tagpdfstruct-}.
- \item[\PrintKeyName{alttext}] This key inserts an \texttt{/Alt} value in the dictionary of structure object. See section~\ref{sec:alttext}. The value is handled as verbatim string and hex encoded.
+ \item[\PrintKeyName{alttext}] This key inserts an \texttt{/Alt} value in the dictionary of structure object, see section~\ref{sec:alttext}. The value is handled as verbatim string and hex encoded.
- \item[\PrintKeyName{alttext-o}] This key inserts an \texttt{/Alt} value in the dictionary of structure object. See section~\ref{sec:alttext}. The value is handled as verbatim string like the key \PrintKeyName]{alttext} but expanded once (the \texttt{o} refers to the \texttt{o} type in expl3). That means that you do something like this:
+ \item[\PrintKeyName{alttext-o}] This key inserts an \texttt{/Alt} value in the dictionary of a structure object, see section~\ref{sec:alttext}. The value is handled as verbatim string like the key \PrintKeyName{alttext} but expanded once (the \texttt{o} refers to the \texttt{o} type in expl3). That means that you can do something like this:
\begin{lstlisting}
\newcommand\myalttext{\frac{a}{b}}
@@ -548,9 +556,9 @@ The key-val list understands the following keys:
and it will insert \verb+\frac{a}{b}+ (hex encoded) in the pdf.
- \item[\PrintKeyName{actualtext}] This key inserts an \texttt{/ActualText} value in the dictionary of structure object. See section~\ref{sec:alttext}. The value is handled as verbatim string, commands are not expanded.
+ \item[\PrintKeyName{actualtext}] This key inserts an \texttt{/ActualText} value in the dictionary of structure object, see section~\ref{sec:alttext}. The value is handled as verbatim string, commands are not expanded.
- \item[\PrintKeyName{actualtext-o}] This key inserts an \texttt{/ActualText} value in the dictionary of structure object. See section~\ref{sec:alttext}. The value is handled as verbatim string like the key \PrintKeyName]{actualtext} but expanded once (the \texttt{o} refers to the \texttt{o} type in expl3). That means that you do something like this:
+ \item[\PrintKeyName{actualtext-o}] This key inserts an \texttt{/ActualText} value in the dictionary of structure object, see section~\ref{sec:alttext}. The value is handled as verbatim string like the key \PrintKeyName{actualtext} but expanded once (the \texttt{o} refers to the \texttt{o} type in expl3). That means that you can do something like this:
\begin{lstlisting}
\newcommand\myactualtext{X}
@@ -558,11 +566,20 @@ The key-val list understands the following keys:
\end{lstlisting}
and it will insert \verb+X+ (hex encoded) in the pdf.
+ \item[\PrintKeyName{attribute}] This key takes as argument a comma list of attribute names (use braces to protect the commas from the external key-val parser) and allows to add one or more attribute dictionary entries in the structure object. As an example
+ \begin{lstlisting}
+ \tagstructbegin{tag=TH,attribute= TH-row}
+ \end{lstlisting}. See also section~\ref{sec:attributes}.
+ \item[\PrintKeyName{attribute-class}] This key takes as argument a comma list of attribute names (use braces to protect the commas from the external key-val parser) and allows to add one or more attribute classes to the structure object. As an example
+ \begin{lstlisting}
+ \tagstructbegin{tag=TH,attribute-class= TH-row}
+ \end{lstlisting}. See also section~\ref{sec:attributes}.
+
\item[\PrintKeyName{title}] This key allows to set the dictionary entry \texttt{/Title} in the structure object.
The value is handled as verbatim string and hex encoded. Commands are not expanded.
\item[\PrintKeyName{title-o}] This key allows to set the dictionary entry \texttt{/Title} in the structure object.
The value is expanded once and then handled as verbatim string like the \PrintKeyName{title} key.
- \end{description}
+\end{description}
\ExplSyntaxOn
@@ -570,7 +587,7 @@ The key-val list understands the following keys:
\DescribeMacro\uftag_struct_end:
\ExplSyntaxOff
-This ends a structure. They don't end a group and it doesn't matter if they are in another group as the starting commands.
+These commands end a structure. They don't end a group and it doesn't matter if they are in another group as the starting commands.
\ExplSyntaxOn
\DescribeMacro\tagstructuse{<label>}
@@ -583,6 +600,40 @@ These commands insert a structure previously stashed away as kid into the curren
A document should have at least one structure which contains the whole document. A suitable tag is \texttt{Document} or \texttt{Article}. I'm considering to automatically inserting it.
+\subsubsection{Attributes and attribute classes}\label{sec:attributes}
+
+Structure Element can have so-called attributes. A single attribute is a dictionary\footnote{or a stream but this is currently not supported by the package as I don't know an use-case} with at least the required key \verb+/Owner+ which describes the scope the attribute applies too.
+As an example here an attribute that can be attached to tabular header (type TH) and adds the info that the header is a column header:
+\begin{lstlisting}
+<</Owner /Table /Scope /Column>>
+\end{lstlisting}
+
+One or more such attributes can be attached to a structure element. It is also possible to store such an attribute under a symbolic name in a so-called \enquote{ClassedMap} and then to attached references to such classes to a structure.
+
+To use such attributes you must at first declare it in \verb+\tagpdfsetup+ with the key \texttt{newattribute}. This key takes two argument, a name and the content of the attribute.
+The name should be a sensible key name, the content a dictionary.
+\begin{lstlisting}
+\tagpdfsetup
+ {
+ newattribute =
+ {TH-col}{<</Owner /Table /Scope /Column>>},
+ newattribute =
+ {TH-row}{<</Owner /Table /Scope /Row>>},
+ }
+\end{lstlisting}
+
+Attributes are only written to the pdf when used, so it is not a problem to predeclare a number of standard attributes.
+
+It is your responsability that the content of the dictionary is valid pdf and that the values are sensible!
+
+Attributes can then be used with the key \PrintKeyName{attribute} or \PrintKeyName{attribute-class} which both take a comma list of attribute names as argument\footnote{That's not really a sensible example}:
+\begin{lstlisting}
+\tagstructbegin{tag=TH,
+ attribute-class= {TH-row,TH-col},
+ attribute = {TH-row,TH-col},
+ }
+\end{lstlisting}
+
\subsection{Task 3: tree Management}
When all the document content has been correctly marked and the data for the trees has been collected they must be flushed to the pdf. This is done automatically (if the package has been activated) with the following command in \verb+\AfterEndDocument+:
@@ -591,13 +642,13 @@ When all the document content has been correctly marked and the data for the tre
\DescribeMacro\uftag_finish_structure:
\ExplSyntaxOff
-This will hopefully write all the needed objects and values to the pdf. (Beside the already mentioned \texttt{StructTreeRoot} and \texttt{StructElem} objects, additionally a so-called \texttt{ParentTree} is needed which records the parents of all the marked contents bits, a \texttt{Rolemap} and a few more values and dictionaries).
+This will hopefully write all the needed objects and values to the pdf. (Beside the already mentioned \texttt{StructTreeRoot} and \texttt{StructElem} objects, additionally a so-called \texttt{ParentTree} is needed which records the parents of all the marked contents bits, a \texttt{Rolemap}, perhaps a \texttt{ClassMap} and object for the attributes, and a few more values and dictionaries).
I'm not quite sure if this shouldn't be a really internal command.
\subsection{A fully marked up document body}
-The following shows the marking need for a section, a sentence and a list with two items. It is obvious that one wouldn't want to do like this for real documents. If tagging should be usable, the commands must be hidden as much as possible inside suitable \LaTeX\ commands and enviroments.
+The following shows the marking needed for a section, a sentence and a list with two items. It is obvious that one wouldn't like to have to do this for real documents. If tagging should be usable, the commands must be hidden as much as possible inside suitable \LaTeX\ commands and enviroments.
\begin{lstlisting}
\begin{document}
@@ -649,6 +700,16 @@ The following shows the marking need for a section, a sentence and a list with t
\end{document}
\end{lstlisting}
+\subsection{Lazy and automatic tagging}\label{sec:lazy}
+
+A number of features of pdf readers need a fully tagged pdf. As an example screen readers tend to ignore alternative text (see section~\ref{sec:alttext}) if the pdf is not fully tagged. Also reflowing a pdf only works for me (even if real space chars are in the pdf) if the pdf is fully tagged.
+
+This means that even if you don't care about a proper structure you should try to add at least some minimal tagging. With pdflatex this is not easy due to the page break problem. But with lualatex you can use an \texttt{Document} structure and inside it rather large mc-chunks. This minimizes the needed work.
+
+One could ask if in lua mode the code couldn't try to mark up unmarked parts e.g. as P-type chunks, like it marks them up as artifacts currently. Sadly this is not so easy, as it is quite difficult to reliably identify the structure and the place in the kids array where such chunks belongs too. I also don't think that it is really needed. It is not so difficult to define user macros which e.g. opens a structure and start an mc-chunk or which close an open mc-chunk before issuing the next \verb+\tagmcbegin+.
+
+
+
\section{Alternative text, ActualText and text-to-speech software}\label{sec:alttext}
The pdf format allows to add alternative text through the \PrintKeyName{/Alt} and the \PrintKeyName{/ActualText} key\footnote{There is also the \PrintKeyName{/E} key for acronyms but I will ignore it for now}. Both can be added either to the marked content in the page stream or to the object describing the structure.
@@ -685,7 +746,27 @@ Their meaning can be looked up in the pdf-reference\footnote{\url{https://wwwima
New tags can be defined in the setup command with the key \texttt{add-new-tag}. It takes a value consisting of two names separated by a slash. The first is the new name, the second a known (e.g. a standard) tag it should be mapped too. Example:
-\Macro\tagpdfsetup{add-new-type = section/H1}
+\Macro\tagpdfsetup{add-new-tag = section/H1}
+
+
+
+\section{\enquote{Real} space glyphs}\label{sec:spacechars}
+
+TeX uses only spaces (horizontal movements) to separate words. That means that a pdf reader has to use some heuristic when copying text or reflowing the text to decide if a space is meant as a word boundary or e.g. as a kerning. Accessible document should use real space glyphs (U+0032) from a font in such places.
+
+With the key \PrintKeyName{interwordspace} you can activate such space glyphs.
+
+With pdftex this will simply call the primitive \verb+\pdfinterwordspaceon+. pdftex will then insert at various places a char from a font called dummy-space. Attention! This means that at every space there are additional font switches in the pdf: from the current font to the dummy-space font and back again. This will make the pdf larger. As \verb+\pdfinterwordspaceon+ is a primitive function it can't be fine tuned or adapted. You can only turn it on and off and insert manually such a space glyph with \verb+\pdffakespace+.
+
+With luatex (in luamode) interwordspace is implemented with a lua-function which is inserted in two callbacks and marks up the places where it seems sensible to inter a space glyph. Later in the process (when also the mc-markers are inserted) the space glyphs are injected -- the code will take the glyph from the current font if this has a space glyph or switch to the default latin modern font. The current code works reasonable well in normal text.
+
+The key \PrintKeyName{show-spaces} will show lines at the places where in lua mode spaces are inserted and so can help you to find problematic places. For listings -- which have a quite specific handling of spaces -- you can find a suggestion in the example \texttt{ex-space-glyph-listings}.
+
+\emph{Attention:} Even with real spaces copy\& pasting of code doesn't need to give the correct results: you get spaces but not necessarly the right number of spaces. The pdf viewers I tried all copied four real space glyphs as one space. I only got the four spaces with the export to text or xml in the AdobePro.
+
+\DescribeMacro\pdffakespace
+
+This is in pdftex a primitive. It inserts the dummy space glyph. \pkg{tagpdf} defines this command also for luatex -- attention if can perhaps insert break points.
@@ -702,13 +783,11 @@ New tags can be defined in the setup command with the key \texttt{add-new-tag}.
\end{verbatim}
and perhaps some\verb+\pdfglyphtounicode+ commands.
\item Hard and soft hyphen must be distinct.
- \item Spaces between words should be space glyphs and not only a horizontal movement.
+ \item Spaces between words should be space glyphs and not only a horizontal movement. See section~\ref{sec:spacechars}.
\item Various small infos must be present in the catalog dictionary, info dictionary and the page dictionaries, e.g. metadata like title.
\end{itemize}
If suitable I will add code for this tasks to this packages. But some of them can also be done already with existing packages like hyperref, hyperxmp, pdfx.
-
-
\section{To-do}
\begin{itemize}
\item Add commands and keys to enable/disable the checks.
@@ -720,7 +799,6 @@ New tags can be defined in the setup command with the key \texttt{add-new-tag}.
\item Examples
\item Write more Tests
\item Write more Tests
-\item \enquote{Fake spaces}
\item Unicode
\item Hyphenation char
\item Think about included (tagged) pdf. Can one handle them?
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-attr-code.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-attr-code.sty
new file mode 100644
index 00000000000..986a2ca9ca5
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-attr-code.sty
@@ -0,0 +1,110 @@
+\ProvidesExplPackage {tagpdf-attr-code} {2019/01/04} {0.50}
+ {part of tagpdf - code related to attributes and attribute classes}
+
+% the obj is written in tagpdf-tree-code.
+
+\seq_new:N \g__uftag_attr_class_used_seq
+\prop_new:N \g__uftag_attr_objnum_prop %will contain obj num of used attributes
+
+\prop_new:N \g__uftag_attr_entries_prop
+\tl_new:N \g__uftag_attr_class_content_tl
+\tl_new:N \l__uftag_attr_objtmp_tl
+\tl_new:N \l__uftag_attr_value_tl
+
+
+\cs_new_protected:Nn \__uftag_attr_new_entry:nn %#1:name, #2: content
+ {
+ \prop_gput:Nnn \g__uftag_attr_entries_prop
+ {#1}{#2}
+ }
+
+\keys_define:nn { uftag / setup }
+ {
+ newattribute .code:n =
+ {
+ \__uftag_attr_new_entry:nn #1
+ }
+ }
+
+
+% the key for the structure:
+\keys_define:nn { uftag / struct }
+{
+ attribute-class .code:n =
+ {
+ \clist_set:No \l_tmpa_clist { #1 }
+ \seq_set_from_clist:NN \l_tmpa_seq \l_tmpa_clist
+ \seq_map_inline:Nn \l_tmpa_seq
+ {
+ \prop_if_in:NnF \g__uftag_attr_entries_prop {##1}
+ {
+ \msg_error:nnn { uftag } { attr-unknown } { ##1 }
+ }
+ \seq_gput_left:Nn\g__uftag_attr_class_used_seq { ##1}
+ }
+ \seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq
+ {
+ /##1
+ }
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \int_compare:nT { \seq_count:N \l_tmpa_seq > 1 }{[}
+ \seq_use:Nn \l_tmpb_seq { \c_space_tl }
+ \int_compare:nT { \seq_count:N \l_tmpa_seq > 1 }{]}
+ }
+ \int_compare:nT { \seq_count:N \l_tmpa_seq > 0 }
+ {
+ \__uftag_prop_gput:cnx
+ { g__uftag_struct_\int_eval:n {\c@g__uftag_struct_abs_int}_prop }
+ { C }
+ { \l_tmpa_tl }
+ %\prop_show:c { g__uftag_struct_\int_eval:n {\c@g__uftag_struct_abs_int}_prop }
+ }
+ }
+}
+
+\keys_define:nn { uftag / struct }
+ {
+ attribute .code:n = % A property (attribute, value currently a dictionary)
+ {
+ \clist_set:No \l_tmpa_clist { #1 }
+ \seq_set_from_clist:NN \l_tmpa_seq \l_tmpa_clist
+ \tl_set:Nx \l__uftag_attr_value_tl
+ {
+ \int_compare:nT { \seq_count:N \l_tmpa_seq > 1 }{[}
+ }
+ \seq_map_inline:Nn \l_tmpa_seq
+ {
+ \prop_if_in:NnF \g__uftag_attr_entries_prop {##1}
+ {
+ \msg_error:nnn { uftag } { attr-unknown } { ##1 }
+ }
+ \prop_if_in:NnF \g__uftag_attr_objnum_prop {##1}
+ {
+ \__uftag_pdfreserveobjnum:N \l_tmpa_tl
+ \__uftag_pdfuseobjnum:Nx \l_tmpa_tl
+ {
+ \prop_item:Nn\g__uftag_attr_entries_prop {##1}
+ }
+ \prop_gput:NnV \g__uftag_attr_objnum_prop {##1} {\l_tmpa_tl}
+ }
+ \tl_put_right:Nx \l__uftag_attr_value_tl
+ {
+ \c_space_tl
+ \prop_item:Nn \g__uftag_attr_objnum_prop {##1}
+ \c_space_tl 0 \c_space_tl R
+ }
+ % \tl_show:N \l__uftag_attr_value_tl
+ }
+ \tl_put_right:Nx \l__uftag_attr_value_tl
+ {
+ \int_compare:nT { \seq_count:N \l_tmpa_seq > 1 }{]}
+ }
+ % \tl_show:N \l__uftag_attr_value_tl
+ \__uftag_prop_gput:cnx
+ { g__uftag_struct_\int_eval:n {\c@g__uftag_struct_abs_int}_prop }
+ { A }
+ { \l__uftag_attr_value_tl }
+ },
+ }
+\endinput
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-checks-code.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-checks-code.sty
index cd0ee0d70ab..83822187ffb 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-checks-code.sty
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-checks-code.sty
@@ -1,4 +1,4 @@
-\ProvidesExplPackage {tagpdf-checks-code} {2018/08/06} {0.3}
+\ProvidesExplPackage {tagpdf-checks-code} {2019/01/04} {0.50}
{part of tagpdf - code related to checks and messages}
@@ -19,6 +19,9 @@
\msg_new:nnn {uftag} {struct-used-twice} { structure~with~label~#1~has~already~been~used}
\msg_new:nnn {uftag} {struct-label-unknown} { structure~with~label~#1~is~unknown~rerun}
+% attributes
+\msg_new:nnn {uftag} {attr-unknown} { attribute~#1~is~unknown}
+
%Roles
\msg_new:nnn {uftag} {role-missing} { tag~#1~has~no~role~assigned }
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-luatex.def b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-luatex.def
index cee2e931e9a..f9085e96fbf 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-luatex.def
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-luatex.def
@@ -1,8 +1,10 @@
-\ProvidesExplFile {tagpdf-luatex.def} {2018/08/06} {0.3}
+\ProvidesExplFile {tagpdf-luatex.def} {2019/01/04} {0.50}
{tagpdf driver for luatex}
\newattribute \g__uftag_mc_type_attr %the value represent the type
\newattribute \g__uftag_mc_cnt_attr %will hold the \c@g__uftag_MCID_abs_int value
+\newattribute \g__uftag_interwordspace_attr
+\newattribute \g__uftag_interwordfont_attr
% The lua code
\directlua { tagpdf=require('tagpdf.lua') }
@@ -11,7 +13,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% needed for \str_set_convert:Nnon
-\tl_new:N \g__uftag_inputencoding_tl
+\tl_new:N \g__uftag_inputencoding_tl
\tl_gset:Nn \g__uftag_inputencoding_tl {}
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-generic.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-generic.sty
index b8839782ca1..a26fd0fa3ad 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-generic.sty
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-generic.sty
@@ -1,4 +1,4 @@
-\ProvidesExplPackage {tagpdf-mc-code-generic} {2018/08/06} {0.3}
+\ProvidesExplPackage {tagpdf-mc-code-generic} {2019/01/04} {0.50}
{part of tagpdf - code related to marking chunks - generic mode}
% for the label system
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-lua.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-lua.sty
index eeee1bd80a8..5ae1c51f6ec 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-lua.sty
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-lua.sty
@@ -1,4 +1,4 @@
-\ProvidesExplPackage {tagpdf-mc-code-lua} {2018/08/06} {0.3}
+\ProvidesExplPackage {tagpdf-mc-code-lua} {2019/01/04} {0.50}
{tagpdf - mc code only for the luamode }
% the two attibutes are defined in the driver file.
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-shared.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-shared.sty
index 173967b945d..789059f4249 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-shared.sty
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-mc-code-shared.sty
@@ -1,4 +1,4 @@
-\ProvidesExplPackage {tagpdf-mc-code-shared} {2018/08/06} {0.3}
+\ProvidesExplPackage {tagpdf-mc-code-shared} {2019/01/04} {0.50}
{part of tagpdf - code related to marking chunks - code shared by generic and luamode }
% I use a latex counter for the absolute count, so that it is added to
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-pdftex.def b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-pdftex.def
index af9382748e6..19d5bd926c5 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-pdftex.def
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-pdftex.def
@@ -1,4 +1,4 @@
-\ProvidesExplFile {tagpdf-pdftex.def} {2018/08/06} {0.3}
+\ProvidesExplFile {tagpdf-pdftex.def} {2019/01/04} {0.50}
{tagpdf driver for pdftex}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-roles-code.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-roles-code.sty
index bd8c680f963..47c55a640f8 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-roles-code.sty
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-roles-code.sty
@@ -1,4 +1,4 @@
-\ProvidesExplPackage {tagpdf-roles-code} {2018/08/06} {0.3}
+\ProvidesExplPackage {tagpdf-roles-code} {2019/01/04} {0.50}
{part of tagpdf - code related to roles and structure names}
\__uftag_seq_new:N \g__uftag_role_tags_seq %to get names from numbers
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-space-code.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-space-code.sty
new file mode 100644
index 00000000000..7e8c5337010
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-space-code.sty
@@ -0,0 +1,45 @@
+\ProvidesExplPackage {tagpdf-space-code} {2019/01/04} {0.50}
+ {part of tagpdf - code related to real space chars}
+% luatex uses an attribute (declared in the driver file) and some luacode in tagpdf.lua
+% perhaps I will split the code by engine in the future
+
+\sys_if_engine_pdftex:T
+{
+ \pdfglyphtounicode{space}{0020}
+ \keys_define:nn { uftag / setup }
+ {
+ interwordspace .choices:nn = { true, on } { \pdfinterwordspaceon },
+ interwordspace .choices:nn = { false, off }{ \pdfinterwordspaceon },
+ show-spaces .bool_set:N = \l__uftag_showspaces_bool
+ }
+
+}
+
+
+\sys_if_engine_luatex:T
+{
+ \keys_define:nn { uftag / setup }
+ {
+ interwordspace .choices:nn = { true, on }
+ { \directlua{uftag.func.markspaceon()} },
+
+ interwordspace .choices:nn = { false, off }
+ {\directlua{uftag.func.markspaceoff()} },
+ show-spaces .choice:,
+ show-spaces / true .code:n = {\directlua{uftag.trace.showspaces=true}},
+ show-spaces / false .code:n = {\directlua{uftag.trace.showspaces=nil}},
+ show-spaces .default:n = true
+ }
+ \cs_new_protected:Nn \__uftag_fakespace:
+ {
+ \group_begin:
+ \setattribute\g__uftag_interwordspace_attr{1}
+ \setattribute\g__uftag_interwordfont_attr{\directlua{tex.print(\the\catcodetable@latex, font.current())}}
+ \skip_horizontal:n{\c_zero_skip}
+ \group_end:
+ }
+}
+
+
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-struct-code.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-struct-code.sty
index 898f33a7115..c6da45cd34c 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-struct-code.sty
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-struct-code.sty
@@ -1,4 +1,4 @@
-\ProvidesExplPackage {tagpdf-struct-code} {2018/08/06} {0.3}
+\ProvidesExplPackage {tagpdf-struct-code} {2019/01/04} {0.50}
{part of tagpdf - code related to storing structure}
% I will use a latex counter for the structure count
@@ -41,8 +41,7 @@
% when the entries are created (title,lange,alt,E,actualtext)
-\seq_new:N \c__uftag_struct_StructTreeRoot_entries_seq
-\seq_set_from_clist:Nn \c__uftag_struct_StructTreeRoot_entries_seq
+\seq_const_from_clist:Nn \c__uftag_struct_StructTreeRoot_entries_seq
{%p. 857/858
Type, % always /StructTreeRoot
K, % kid, dictionary or array of dictionaries
@@ -53,8 +52,7 @@
ClassMap
}
-\seq_new:N \c__uftag_struct_StructElem_entries_seq
-\seq_set_from_clist:Nn \c__uftag_struct_StructElem_entries_seq
+\seq_const_from_clist:Nn \c__uftag_struct_StructElem_entries_seq
{%p 858 f
Type, %always /StructElem
S, %tag/type
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty
index d30b82a004e..b9667b43f75 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-tree-code.sty
@@ -1,4 +1,4 @@
-\ProvidesExplPackage {tagpdf-tree-code} {2018/08/06} {0.3}
+\ProvidesExplPackage {tagpdf-tree-code} {2019/01/04} {0.50}
{part of tagpdf - code related to writing trees and dictionaries to the pdf}
%this does the actual finishing:
@@ -123,11 +123,44 @@
}
}
+%classmap, should only be written, if values has been used
+
+\cs_new_protected:Nn \__uftag_tree_class_write_map:
+ {
+ \tl_gclear:N \g__uftag_attr_class_content_tl
+ \seq_gremove_duplicates:N \g__uftag_attr_class_used_seq
+ \seq_set_map:NNn \l_tmpa_seq \g__uftag_attr_class_used_seq
+ {
+ /##1\c_space_tl
+ \prop_item:Nn \g__uftag_attr_entries_prop
+ {##1}
+ }
+ \tl_gset:Nx \g__uftag_attr_class_content_tl
+ {
+ \seq_use:Nn \l_tmpa_seq
+ { \iow_newline: }
+ }
+ \tl_if_empty:NF \g__uftag_attr_class_content_tl
+ {
+ \__uftag_pdfreserveobjnum:N \l_tmpa_tl
+ \tl_const:Nx \c__uftag_tree_obj_classmap_tl { \l_tmpa_tl }
+ \__uftag_pdfuseobjnum:Nx \c__uftag_tree_obj_classmap_tl
+ { <<\g__uftag_attr_class_content_tl>> }
+
+ \__uftag_prop_gput:cnx
+ { g__uftag_struct_0_prop }
+ { ClassMap }
+ { \c__uftag_tree_obj_classmap_tl\c_space_tl0\c_space_tl R }
+ }
+ }
+
+
\cs_new:Nn \uftag_finish_structure:
{
\__uftag_pdfcatalog:n {^^J/MarkInfo\c_space_tl<</Marked\c_space_tl true>> }
\__uftag_tree_write_parenttree:
\__uftag_tree_write_rolemap:
+ \__uftag_tree_class_write_map:
\__uftag_tree_write_structelements:
\__uftag_tree_write_structtreeroot:
}
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-user.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-user.sty
index 1b01e1521b6..c4a16b29420 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf-user.sty
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf-user.sty
@@ -1,4 +1,4 @@
-\ProvidesExplPackage {tagpdf-user} {2018/08/06} {0.3}
+\ProvidesExplPackage {tagpdf-user} {2019/01/04} {0.50}
{tagpdf - user commands}
\NewDocumentCommand \tagpdfsetup { m }
@@ -84,6 +84,13 @@
}
}
+\sys_if_engine_luatex:T
+{
+ \NewDocumentCommand\pdffakespace { }
+ {
+ \__uftag_fakespace:
+ }
+}
\endinput
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf.lua b/Master/texmf-dist/tex/latex/tagpdf/tagpdf.lua
index 0bd8c1441ca..c0262626181 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf.lua
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf.lua
@@ -1,5 +1,5 @@
--- Packageversion: 0.3
--- Packagedate: 2018/08/06
+-- Packageversion: 0.50
+-- Packagedate: 2019/01/04
-- tagpdf.lua
-- Ulrike Fischer
@@ -42,16 +42,21 @@ functions
uftag.func.mark_shipout (): a wrapper around the core function which inserts the last EMC
uftag.func.fill_parent_tree_line (page): outputs the entries of the parenttree for this page
uftag.func.output_parenttree(): outputs the content of the parenttree
+ uftag.func.markspaceon(), uftag.func.markspaceoff(): (de)activates the marking of positions for space chars
uftag.trace.show_mc_data (num): shows uftag.mc[num]
uftag.trace.show_all_mc_data (max): shows a maximum about mc's
uftag.trace.show_seq: shows a sequence (array)
uftag.trace.show_struct_data (num): shows data of structure num
uftag.trace.show_prop: shows a prop
uftag.trace.log
+ uftag.trace.showspaces : boolean
--]]
-local mctypeattributeid = luatexbase.registernumber ("g__uftag_mc_type_attr")
-local mccntattributeid = luatexbase.registernumber ("g__uftag_mc_cnt_attr")
+local mctypeattributeid = luatexbase.registernumber ("g__uftag_mc_type_attr")
+local mccntattributeid = luatexbase.registernumber ("g__uftag_mc_cnt_attr")
+local iwspaceattributeid = luatexbase.registernumber ("g__uftag_interwordspace_attr")
+local iwfontattributeid = luatexbase.registernumber ("g__uftag_interwordfont_attr")
+
local catlatex = luatexbase.registernumber("catcodetable@latex")
local tagunmarkedbool= token.create("g__uftag_tagunmarked_bool")
@@ -63,11 +68,13 @@ local tableinsert = table.insert
local nodeid = node.id
local nodecopy = node.copy
local nodegetattribute = node.get_attribute
+local nodesetattribute = node.set_attribute
local nodenew = node.new
local nodetail = node.tail
local nodeslide = node.slide
local noderemove = node.remove
local nodetraverseid = node.traverse_id
+local nodetraverse = node.traverse
local nodeinsertafter = node.insert_after
local nodeinsertbefore = node.insert_before
local pdfpageref = pdf.pageref
@@ -77,6 +84,7 @@ local VLIST = node.id("vlist")
local RULE = node.id("rule")
local DISC = node.id("disc")
local GLUE = node.id("glue")
+local GLYPH = node.id("glyph")
local KERN = node.id("kern")
local PENALTY = node.id("penalty")
local LOCAL_PAR = node.id("local_par")
@@ -146,6 +154,88 @@ local function __uftag_insert_bdc_node (head,current,tag,dict)
return head
end
+-- this is for debugging the space chars
+local function __uftag_show_spacemark (head,current,color,height)
+ local markcolor = color or "1 0 0"
+ local markheight = height or 10
+ local pdfstring = node.new("whatsit","pdf_literal")
+ pdfstring.data =
+ string.format("q "..markcolor.." RG "..markcolor.." rg 0.4 w 0 %g m 0 %g l S Q",-3,markheight)
+ head = node.insert_after(head,current,pdfstring)
+ return head
+end
+
+--[[ a function to mark up places where real space chars should be inserted
+ it only sets an attribute.
+--]]
+
+local function __uftag_mark_spaces (head)
+ local inside_math = false
+ for n in nodetraverse(head) do
+ local id = n.id
+ if id == GLYPH then
+ local glyph = n
+ if glyph.next and (glyph.next.id == GLUE)
+ and not inside_math and (glyph.next.width >0)
+ then
+ nodesetattribute(glyph.next,iwspaceattributeid,1)
+ nodesetattribute(glyph.next,iwfontattributeid,glyph.font)
+ -- for debugging
+ if uftag.trace.showspaces then
+ __uftag_show_spacemark (head,glyph)
+ end
+ end
+ elseif id == PENALTY then
+ local glyph = n
+ -- uftag.trace.log ("PENALTY ".. n.subtype.."VALUE"..n.penalty,3)
+ if glyph.next and (glyph.next.id == GLUE)
+ and not inside_math and (glyph.next.width >0) and n.subtype==0
+ then
+ nodesetattribute(glyph.next,iwspaceattributeid,1)
+ -- nodesetattribute(glyph.next,iwfontattributeid,glyph.font)
+ -- for debugging
+ if uftag.trace.showspaces then
+ __uftag_show_spacemark (head,glyph)
+ end
+ end
+ elseif id == MATH then
+ inside_math = (n.subtype == 0)
+ end
+ end
+ return head
+end
+
+local function __uftag_activate_mark_space ()
+ if not luatexbase.in_callback ("pre_linebreak_filter","markspaces") then
+ luatexbase.add_to_callback("pre_linebreak_filter",__uftag_mark_spaces,"markspaces")
+ luatexbase.add_to_callback("hpack_filter",__uftag_mark_spaces,"markspaces")
+ end
+end
+
+uftag.func.markspaceon=__uftag_activate_mark_space
+
+local function __uftag_deactivate_mark_space ()
+ if luatexbase.in_callback ("pre_linebreak_filter","markspaces") then
+ luatexbase.remove_from_callback("pre_linebreak_filter","markspaces")
+ luatexbase.remove_from_callback("hpack_filter","markspaces")
+ end
+end
+--
+uftag.func.markspaceoff=__uftag_deactivate_mark_space
+
+local default_space_char = node.new(GLYPH)
+local default_fontid = font.id("TU/lmr/m/n/10")
+default_space_char.char = 32
+default_space_char.font = default_fontid
+
+local function __uftag_insert_space_char (head,n,fontid)
+ if luaotfload.aux.slot_of_name(fontid,"space") then
+ local space
+ -- head, space = node.insert_before(head, n, ) -- Set the right font
+ -- n.width = n.width - space.width
+ -- space.attr = n.attr
+ end
+end
--[[
Now follows the core function
@@ -179,6 +269,7 @@ function uftag.func.mark_page_elements (box,mcpagecnt,mccntprev,mcopen,name,mcty
end
for n in node.traverse(head) do
local mccnt, mctype, tag = __uftag_get_mc_cnt_type_tag (n)
+ local spaceattr = nodegetattribute(n,iwspaceattributeid) or -1
uftag.trace.log ("NODE ".. node.type(node.getid(n)).." MC"..tostring(mccnt).." => TAG "..tostring(mctype).." => " .. tostring(tag),3)
if n.id == HLIST
then -- enter the hlist
@@ -187,10 +278,26 @@ function uftag.func.mark_page_elements (box,mcpagecnt,mccntprev,mcopen,name,mcty
elseif n.id == VLIST then -- enter the vlist
mcopen,mcpagecnt,mccntprev,mctypeprev=
uftag.func.mark_page_elements (n,mcpagecnt,mccntprev,mcopen,"INTERNAL VLIST",mctypeprev)
- elseif n.id == GLUE then -- glue is ignored
+ elseif n.id == GLUE then -- at glue real space chars are inserted, for the rest it is ignored
+ -- for debugging
+ if uftag.trace.showspaces and spaceattr==1 then
+ __uftag_show_spacemark (head,n,"0 1 0")
+ end
+ if spaceattr==1 then
+ local space
+ local space_char = node.copy(default_space_char)
+ local curfont = nodegetattribute(n,iwfontattributeid)
+ uftag.trace.log ("FONT ".. tostring(curfont),3)
+ if curfont and luaotfload.aux.slot_of_name(curfont,"space") then
+ space_char.font=curfont
+ end
+ head, space = node.insert_before(head, n, space_char) --
+ n.width = n.width - space.width
+ space.attr = n.attr
+ end
elseif n.id == LOCAL_PAR then -- local_par is ignored
elseif n.id == PENALTY then -- penalty is ignored
- elseif n.id == KERN then -- kern is ignored
+ elseif n.id == KERN then -- kern is ignored
else
-- math is currently only logged.
-- we could mark the whole as math
diff --git a/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty b/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty
index cc91ad5cee1..1c1b7740037 100644
--- a/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty
+++ b/Master/texmf-dist/tex/latex/tagpdf/tagpdf.sty
@@ -1,7 +1,15 @@
\RequirePackage{expl3}[2018/06/14]
+%\RequirePackage[enable-debug]{expl3}[2018/06/14]
-\ProvidesExplPackage {tagpdf} {2018/08/06} {0.3}
+\ProvidesExplPackage {tagpdf} {2019/01/04} {0.50}
{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 }
+ }
% storing internal names to my name space:
\cs_set_eq:NN \__uftag_tex_pdffeedback:D \tex_pdffeedback:D
@@ -33,8 +41,8 @@
\RequirePackage{atbegshi}
\RequirePackage{zref-base,zref-lastpage}
\RequirePackage{etoolbox}
-\RequirePackage{pdfescape}
-\RequirePackage{pdftexcmds}
+%\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 }
@@ -59,7 +67,7 @@
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_set:N = \g__uftag_check_tags_bool,
+ 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 }},
@@ -155,7 +163,7 @@
\cs_generate_variant:Nn \__uftag_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}
+\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}
@@ -176,6 +184,7 @@
\RequirePackage { tagpdf-user }
\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
@@ -187,5 +196,5 @@
}
\RequirePackage { tagpdf-struct-code }
-
+\RequirePackage { tagpdf-space-code }
\endinput