diff options
Diffstat (limited to 'macros/latex/contrib/tagpdf')
33 files changed, 1515 insertions, 893 deletions
diff --git a/macros/latex/contrib/tagpdf/README.md b/macros/latex/contrib/tagpdf/README.md index 9602302c2a..992f30d43d 100644 --- a/macros/latex/contrib/tagpdf/README.md +++ b/macros/latex/contrib/tagpdf/README.md @@ -1,6 +1,6 @@ #tagpdf — A package to create tagged pdf -Packageversion: 0.99c -Packagedate: 2024/06/20 +Packageversion: 0.99g +Packagedate: 2024/10/27 Author: Ulrike Fischer, LaTeX Project Team ## License diff --git a/macros/latex/contrib/tagpdf/ex-AF-file.pdf b/macros/latex/contrib/tagpdf/ex-AF-file.pdf index 37673eac26..76dc573775 100644 --- a/macros/latex/contrib/tagpdf/ex-AF-file.pdf +++ b/macros/latex/contrib/tagpdf/ex-AF-file.pdf @@ -1,11 +1,11 @@ %PDF-2.0 %ÌÕÁÔÅØÐÄÆ 22 0 obj -<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<</ModDate (D:20240620175033+02'00') /Size 151 /CheckSum (4C0D15859D9BA750E65BE6F420DEA972) >> /Length 151 >> +<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<</ModDate (D:20241027223455+01'00') /Size 151 /CheckSum (B5205D91E2A02C84B9BAA9C16AD1CF1C) >> /Length 151 >> stream %% LaTeX2e file `example-input-file.tex' %% generated by the `filecontents' environment -%% from source `ex-AF-file' on 2024/06/20. +%% from source `ex-AF-file' on 2024/10/27. %% Additional info! @@ -15,7 +15,7 @@ endobj << /Type /Filespec /AFRelationship /Unspecified /F (example-input-file.tex) /UF <FEFF006500780061006D0070006C0065002D0069006E007000750074002D00660069006C0065002E007400650078> /EF<</F 22 0 R/UF 22 0 R>> >> endobj 25 0 obj -<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20240620) >> /Length 19 >> +<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20241027) >> /Length 19 >> stream Bär with teh shirt endstream @@ -24,7 +24,7 @@ endobj << /Type /Filespec /AFRelationship /Supplement /F (tag-AFfile1.txt) /UF <FEFF007400610067002D0041004600660069006C00650031002E007400780074> /EF<</F 25 0 R/UF 25 0 R>> >> endobj 28 0 obj -<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20240620) >> /Length 4 >> +<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20241027) >> /Length 4 >> stream Duck endstream @@ -33,7 +33,7 @@ endobj << /Type /Filespec /AFRelationship /Supplement /F (tag-AFfile2.txt) /UF <FEFF007400610067002D0041004600660069006C00650032002E007400780074> /EF<</F 28 0 R/UF 28 0 R>> >> endobj 31 0 obj -<< /Type /Metadata /Subtype /XML /Length 11382 >> +<< /Type /Metadata /Subtype /XML /Length 11713 >> stream <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> @@ -88,6 +88,12 @@ stream <pdfaProperty:category>internal</pdfaProperty:category> <pdfaProperty:description>Year of standard</pdfaProperty:description> </rdf:li> + <rdf:li rdf:parseType="Resource"> + <pdfaProperty:name>rev</pdfaProperty:name> + <pdfaProperty:valueType>Integer</pdfaProperty:valueType> + <pdfaProperty:category>internal</pdfaProperty:category> + <pdfaProperty:description>Revision year of standard</pdfaProperty:description> + </rdf:li> </rdf:Seq> </pdfaSchema:property> </rdf:li> @@ -242,17 +248,17 @@ stream </dc:language> <dc:date> <rdf:Seq> - <rdf:li>2024-06-20T17:50:54+02:00</rdf:li> + <rdf:li>2024-10-27T22:35:14+01:00</rdf:li> </rdf:Seq> </dc:date> <dc:format>application/pdf</dc:format> <dc:source>ex-AF-file.tex</dc:source> <xmp:CreatorTool>LaTeX</xmp:CreatorTool> - <xmp:CreateDate>2024-06-20T17:50:54+02:00</xmp:CreateDate> - <xmp:ModifyDate>2024-06-20T17:50:54+02:00</xmp:ModifyDate> - <xmp:MetadataDate>2024-06-20T17:50:54+02:00</xmp:MetadataDate> + <xmp:CreateDate>2024-10-27T22:35:14+01:00</xmp:CreateDate> + <xmp:ModifyDate>2024-10-27T22:35:14+01:00</xmp:ModifyDate> + <xmp:MetadataDate>2024-10-27T22:35:14+01:00</xmp:MetadataDate> <xmpMM:DocumentID>uuid:38d5a844-2217-4081-87cc-b2129dc357a6</xmpMM:DocumentID> - <xmpMM:InstanceID>uuid:9859f422-c856-46c6-8928-4dfab5f8790c</xmpMM:InstanceID> + <xmpMM:InstanceID>uuid:b9c8533e-5926-4169-80c5-4f19662d574b</xmpMM:InstanceID> <prism:complianceProfile>three</prism:complianceProfile> <prism:pageCount>1</prism:pageCount> </rdf:Description> @@ -347,7 +353,7 @@ endobj << /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 18 0 R >> endobj 19 0 obj -<< /Type /Namespace /NS (data:,15379C35-DB3-5B3E-89A5-42149DCFB2F) >> +<< /Type /Namespace /NS (data:,B984A37A-6119-D29A-79BA-2F544DD34796) >> endobj 8 0 obj [ 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R ] @@ -449,59 +455,59 @@ endobj << /Type /Catalog /Pages 36 0 R /MarkInfo 37 0 R/Lang (de-DE)/Metadata 31 0 R/StructTreeRoot 5 0 R >> endobj 46 0 obj -<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20240620175054+02'00')/ModDate (D:20240620175054+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> +<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20241027223514+01'00')/ModDate (D:20241027223514+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> endobj xref 0 47 0000000002 65535 f -0000013544 00000 n +0000013875 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000016360 00000 n -0000013627 00000 n -0000013838 00000 n -0000015790 00000 n -0000014417 00000 n +0000016693 00000 n +0000013958 00000 n +0000014169 00000 n +0000016123 00000 n +0000014748 00000 n 0000000012 00000 f -0000014485 00000 n +0000014816 00000 n 0000000014 00000 f -0000014555 00000 n +0000014886 00000 n 0000000020 00000 f -0000015318 00000 n -0000014636 00000 n -0000015596 00000 n -0000015425 00000 n -0000015703 00000 n +0000015649 00000 n +0000014967 00000 n +0000015927 00000 n +0000015756 00000 n +0000016034 00000 n 0000000000 00000 f -0000015851 00000 n +0000016184 00000 n 0000000020 00000 n 0000000382 00000 n -0000015964 00000 n +0000016297 00000 n 0000000603 00000 n 0000000758 00000 n -0000016096 00000 n +0000016429 00000 n 0000000943 00000 n 0000001083 00000 n -0000016228 00000 n +0000016561 00000 n 0000001268 00000 n -0000013481 00000 n -0000013346 00000 n -0000012740 00000 n -0000020113 00000 n -0000020467 00000 n -0000013591 00000 n -0000013684 00000 n -0000013801 00000 n -0000016480 00000 n -0000018929 00000 n -0000016666 00000 n -0000019150 00000 n -0000020267 00000 n -0000020529 00000 n -0000020647 00000 n +0000013812 00000 n +0000013677 00000 n +0000013071 00000 n +0000020446 00000 n +0000020800 00000 n +0000013922 00000 n +0000014015 00000 n +0000014132 00000 n +0000016813 00000 n +0000019262 00000 n +0000016999 00000 n +0000019483 00000 n +0000020600 00000 n +0000020862 00000 n +0000020980 00000 n trailer -<< /Size 47 /Root 45 0 R /Info 46 0 R /ID [ <CB0601DB4D9A68774E7E29190E0D5823> <CB0601DB4D9A68774E7E29190E0D5823> ] >> +<< /Size 47 /Root 45 0 R /Info 46 0 R /ID [ <913D8F5840CCF3ABCB73EC03D2084997> <913D8F5840CCF3ABCB73EC03D2084997> ] >> startxref -20870 +21203 %%EOF diff --git a/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf b/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf Binary files differindex 8bbbbcc16c..e0cb9ec4fd 100644 --- a/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf +++ b/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf diff --git a/macros/latex/contrib/tagpdf/ex-attribute.pdf b/macros/latex/contrib/tagpdf/ex-attribute.pdf index 172ce02990..4ff4f1b87d 100644 --- a/macros/latex/contrib/tagpdf/ex-attribute.pdf +++ b/macros/latex/contrib/tagpdf/ex-attribute.pdf @@ -7,7 +7,7 @@ endobj << <</O /Layout /Borderstyle /Dotted >> >> endobj 21 0 obj -<< /Type /Metadata /Subtype /XML /Length 11384 >> +<< /Type /Metadata /Subtype /XML /Length 11715 >> stream <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> @@ -62,6 +62,12 @@ stream <pdfaProperty:category>internal</pdfaProperty:category> <pdfaProperty:description>Year of standard</pdfaProperty:description> </rdf:li> + <rdf:li rdf:parseType="Resource"> + <pdfaProperty:name>rev</pdfaProperty:name> + <pdfaProperty:valueType>Integer</pdfaProperty:valueType> + <pdfaProperty:category>internal</pdfaProperty:category> + <pdfaProperty:description>Revision year of standard</pdfaProperty:description> + </rdf:li> </rdf:Seq> </pdfaSchema:property> </rdf:li> @@ -216,17 +222,17 @@ stream </dc:language> <dc:date> <rdf:Seq> - <rdf:li>2024-06-20T17:51:49+02:00</rdf:li> + <rdf:li>2024-10-27T22:36:03+01:00</rdf:li> </rdf:Seq> </dc:date> <dc:format>application/pdf</dc:format> <dc:source>ex-attribute.tex</dc:source> <xmp:CreatorTool>LaTeX</xmp:CreatorTool> - <xmp:CreateDate>2024-06-20T17:51:49+02:00</xmp:CreateDate> - <xmp:ModifyDate>2024-06-20T17:51:49+02:00</xmp:ModifyDate> - <xmp:MetadataDate>2024-06-20T17:51:49+02:00</xmp:MetadataDate> + <xmp:CreateDate>2024-10-27T22:36:03+01:00</xmp:CreateDate> + <xmp:ModifyDate>2024-10-27T22:36:03+01:00</xmp:ModifyDate> + <xmp:MetadataDate>2024-10-27T22:36:03+01:00</xmp:MetadataDate> <xmpMM:DocumentID>uuid:7a9cf910-1c19-429a-8f24-339c62d8a57f</xmpMM:DocumentID> - <xmpMM:InstanceID>uuid:d4b89449-5e1d-43cf-83af-3903105d1b3f</xmpMM:InstanceID> + <xmpMM:InstanceID>uuid:eb6f1c74-38b0-4da0-8890-bd15f425cf65</xmpMM:InstanceID> <prism:complianceProfile>three</prism:complianceProfile> <prism:pageCount>1</prism:pageCount> </rdf:Description> @@ -450,51 +456,51 @@ endobj << /Type /Catalog /Pages 26 0 R /MarkInfo 27 0 R/Lang (de_DE)/Metadata 21 0 R/StructTreeRoot 5 0 R >> endobj 38 0 obj -<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/Title (Title)/CreationDate (D:20240620175149+02'00')/ModDate (D:20240620175149+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> +<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/Title (Title)/CreationDate (D:20241027223603+01'00')/ModDate (D:20241027223603+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> endobj xref 0 39 0000000002 65535 f -0000012845 00000 n +0000013176 00000 n 0000000003 00000 f 0000000004 00000 f 0000000008 00000 f -0000014965 00000 n -0000012928 00000 n -0000013247 00000 n +0000015296 00000 n +0000013259 00000 n +0000013578 00000 n 0000000000 00000 f -0000013953 00000 n -0000014038 00000 n -0000014130 00000 n -0000014214 00000 n -0000014304 00000 n +0000014284 00000 n +0000014369 00000 n +0000014461 00000 n +0000014545 00000 n +0000014635 00000 n 0000000020 00000 n 0000000071 00000 n -0000014433 00000 n -0000014573 00000 n -0000014657 00000 n -0000014747 00000 n -0000014856 00000 n +0000014764 00000 n +0000014904 00000 n +0000014988 00000 n +0000015078 00000 n +0000015187 00000 n 0000000132 00000 n -0000012758 00000 n -0000012616 00000 n -0000011606 00000 n -0000017305 00000 n -0000017659 00000 n -0000012892 00000 n -0000012992 00000 n -0000013210 00000 n -0000013826 00000 n -0000015083 00000 n -0000016261 00000 n -0000015160 00000 n -0000015234 00000 n -0000016497 00000 n -0000017459 00000 n -0000017721 00000 n -0000017839 00000 n +0000013089 00000 n +0000012947 00000 n +0000011937 00000 n +0000017636 00000 n +0000017990 00000 n +0000013223 00000 n +0000013323 00000 n +0000013541 00000 n +0000014157 00000 n +0000015414 00000 n +0000016592 00000 n +0000015491 00000 n +0000015565 00000 n +0000016828 00000 n +0000017790 00000 n +0000018052 00000 n +0000018170 00000 n trailer -<< /Size 39 /Root 37 0 R /Info 38 0 R /ID [ <658202793A4D39DC44497E1203173F04> <658202793A4D39DC44497E1203173F04> ] >> +<< /Size 39 /Root 37 0 R /Info 38 0 R /ID [ <36576E9D2D1E9F3A4955814A51D0B45A> <36576E9D2D1E9F3A4955814A51D0B45A> ] >> startxref -18076 +18407 %%EOF diff --git a/macros/latex/contrib/tagpdf/ex-formula-problem.pdf b/macros/latex/contrib/tagpdf/ex-formula-problem.pdf index 9ac7a851bc..626ef81ffc 100644 --- a/macros/latex/contrib/tagpdf/ex-formula-problem.pdf +++ b/macros/latex/contrib/tagpdf/ex-formula-problem.pdf @@ -30,7 +30,7 @@ endobj << /ExtGState 1 0 R /Font << /F15 15 0 R >> /ProcSet [ /PDF /Text ] >> endobj 19 0 obj -<< /Type /Metadata /Subtype /XML /Length 11390 >> +<< /Type /Metadata /Subtype /XML /Length 11721 >> stream <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> @@ -85,6 +85,12 @@ stream <pdfaProperty:category>internal</pdfaProperty:category> <pdfaProperty:description>Year of standard</pdfaProperty:description> </rdf:li> + <rdf:li rdf:parseType="Resource"> + <pdfaProperty:name>rev</pdfaProperty:name> + <pdfaProperty:valueType>Integer</pdfaProperty:valueType> + <pdfaProperty:category>internal</pdfaProperty:category> + <pdfaProperty:description>Revision year of standard</pdfaProperty:description> + </rdf:li> </rdf:Seq> </pdfaSchema:property> </rdf:li> @@ -239,17 +245,17 @@ stream </dc:language> <dc:date> <rdf:Seq> - <rdf:li>2024-06-20T17:52:18+02:00</rdf:li> + <rdf:li>2024-10-27T22:36:28+01:00</rdf:li> </rdf:Seq> </dc:date> <dc:format>application/pdf</dc:format> <dc:source>ex-formula-problem.tex</dc:source> <xmp:CreatorTool>LaTeX</xmp:CreatorTool> - <xmp:CreateDate>2024-06-20T17:52:18+02:00</xmp:CreateDate> - <xmp:ModifyDate>2024-06-20T17:52:18+02:00</xmp:ModifyDate> - <xmp:MetadataDate>2024-06-20T17:52:18+02:00</xmp:MetadataDate> + <xmp:CreateDate>2024-10-27T22:36:28+01:00</xmp:CreateDate> + <xmp:ModifyDate>2024-10-27T22:36:28+01:00</xmp:ModifyDate> + <xmp:MetadataDate>2024-10-27T22:36:28+01:00</xmp:MetadataDate> <xmpMM:DocumentID>uuid:8eb2ce1d-b2ec-440a-8bc2-73733eb3eeb0</xmpMM:DocumentID> - <xmpMM:InstanceID>uuid:b48ac58a-5b57-46ab-8ab8-087479364eeb</xmpMM:InstanceID> + <xmpMM:InstanceID>uuid:e5a9c002-c48f-4b02-8deb-4c97d9905cec</xmpMM:InstanceID> <prism:complianceProfile>three</prism:complianceProfile> <prism:pageCount>2</prism:pageCount> </rdf:Description> @@ -425,46 +431,46 @@ endobj << /Type /Catalog /Pages 16 0 R /MarkInfo 23 0 R/Lang (de-DE)/Metadata 19 0 R/StructTreeRoot 5 0 R >> endobj 33 0 obj -<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20240620175218+02'00')/ModDate (D:20240620175218+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> +<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20241027223628+01'00')/ModDate (D:20241027223628+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> endobj xref 0 34 0000000002 65535 f -0000012816 00000 n +0000013147 00000 n 0000000003 00000 f 0000000004 00000 f 0000000008 00000 f -0000014379 00000 n -0000012899 00000 n -0000013137 00000 n +0000014710 00000 n +0000013230 00000 n +0000013468 00000 n 0000000000 00000 f -0000013716 00000 n -0000013823 00000 n -0000013929 00000 n +0000014047 00000 n +0000014154 00000 n +0000014260 00000 n 0000000637 00000 n 0000000502 00000 n 0000000020 00000 n -0000018463 00000 n -0000018817 00000 n -0000014041 00000 n -0000014147 00000 n +0000018794 00000 n +0000019148 00000 n +0000014372 00000 n +0000014478 00000 n 0000000724 00000 n -0000012729 00000 n -0000012594 00000 n -0000012204 00000 n -0000012863 00000 n -0000012969 00000 n -0000013100 00000 n -0000014480 00000 n -0000017236 00000 n -0000014681 00000 n -0000014757 00000 n -0000017472 00000 n -0000018617 00000 n -0000018886 00000 n -0000019004 00000 n +0000013060 00000 n +0000012925 00000 n +0000012535 00000 n +0000013194 00000 n +0000013300 00000 n +0000013431 00000 n +0000014811 00000 n +0000017567 00000 n +0000015012 00000 n +0000015088 00000 n +0000017803 00000 n +0000018948 00000 n +0000019217 00000 n +0000019335 00000 n trailer -<< /Size 34 /Root 32 0 R /Info 33 0 R /ID [ <4A2EBD4B9A1971E2BAF6A530303DF07B> <4A2EBD4B9A1971E2BAF6A530303DF07B> ] >> +<< /Size 34 /Root 32 0 R /Info 33 0 R /ID [ <E8E46712CBF433CAE23978E436BFCC76> <E8E46712CBF433CAE23978E436BFCC76> ] >> startxref -19227 +19558 %%EOF diff --git a/macros/latex/contrib/tagpdf/ex-list.pdf b/macros/latex/contrib/tagpdf/ex-list.pdf index 2346b0398a..a577247275 100644 --- a/macros/latex/contrib/tagpdf/ex-list.pdf +++ b/macros/latex/contrib/tagpdf/ex-list.pdf @@ -1,7 +1,7 @@ %PDF-1.7 %ÌÕÁÔÅØÐÄÆ 48 0 obj -<< /Type /Metadata /Subtype /XML /Length 11376 >> +<< /Type /Metadata /Subtype /XML /Length 11707 >> stream <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> @@ -56,6 +56,12 @@ stream <pdfaProperty:category>internal</pdfaProperty:category> <pdfaProperty:description>Year of standard</pdfaProperty:description> </rdf:li> + <rdf:li rdf:parseType="Resource"> + <pdfaProperty:name>rev</pdfaProperty:name> + <pdfaProperty:valueType>Integer</pdfaProperty:valueType> + <pdfaProperty:category>internal</pdfaProperty:category> + <pdfaProperty:description>Revision year of standard</pdfaProperty:description> + </rdf:li> </rdf:Seq> </pdfaSchema:property> </rdf:li> @@ -210,17 +216,17 @@ stream </dc:language> <dc:date> <rdf:Seq> - <rdf:li>2024-06-20T17:52:47+02:00</rdf:li> + <rdf:li>2024-10-27T22:36:54+01:00</rdf:li> </rdf:Seq> </dc:date> <dc:format>application/pdf</dc:format> <dc:source>ex-list.tex</dc:source> <xmp:CreatorTool>LaTeX</xmp:CreatorTool> - <xmp:CreateDate>2024-06-20T17:52:47+02:00</xmp:CreateDate> - <xmp:ModifyDate>2024-06-20T17:52:47+02:00</xmp:ModifyDate> - <xmp:MetadataDate>2024-06-20T17:52:47+02:00</xmp:MetadataDate> + <xmp:CreateDate>2024-10-27T22:36:54+01:00</xmp:CreateDate> + <xmp:ModifyDate>2024-10-27T22:36:54+01:00</xmp:ModifyDate> + <xmp:MetadataDate>2024-10-27T22:36:54+01:00</xmp:MetadataDate> <xmpMM:DocumentID>uuid:4c749825-1de7-414c-879f-29e4d0bef66e</xmpMM:DocumentID> - <xmpMM:InstanceID>uuid:843c5ce9-108a-49d8-86ef-881382f178ee</xmpMM:InstanceID> + <xmpMM:InstanceID>uuid:5dbd46c1-55e1-44e2-8203-75ae3977078e</xmpMM:InstanceID> <prism:complianceProfile>three</prism:complianceProfile> <prism:pageCount>1</prism:pageCount> </rdf:Description> @@ -654,85 +660,85 @@ endobj << /Type /Catalog /Pages 54 0 R /MarkInfo 55 0 R/Lang (en)/Metadata 48 0 R/StructTreeRoot 5 0 R >> endobj 72 0 obj -<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20240620175247+02'00')/ModDate (D:20240620175247+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> +<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20241027223654+01'00')/ModDate (D:20241027223654+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> endobj xref 0 73 0000000002 65535 f -0000013509 00000 n +0000013840 00000 n 0000000003 00000 f 0000000004 00000 f 0000000008 00000 f -0000019047 00000 n -0000013592 00000 n -0000014431 00000 n +0000019378 00000 n +0000013923 00000 n +0000014762 00000 n 0000000000 00000 f -0000015228 00000 n -0000015329 00000 n -0000015405 00000 n -0000015481 00000 n -0000015568 00000 n -0000015675 00000 n -0000015765 00000 n -0000015875 00000 n -0000015959 00000 n -0000016047 00000 n -0000016170 00000 n -0000016260 00000 n -0000016370 00000 n -0000016454 00000 n -0000016542 00000 n -0000016665 00000 n -0000016752 00000 n -0000016863 00000 n -0000016953 00000 n -0000017063 00000 n -0000017147 00000 n -0000017235 00000 n -0000017358 00000 n -0000017448 00000 n -0000017558 00000 n -0000017642 00000 n -0000017730 00000 n -0000017853 00000 n -0000017940 00000 n -0000018055 00000 n -0000018145 00000 n -0000018255 00000 n -0000018339 00000 n -0000018427 00000 n -0000018550 00000 n -0000018640 00000 n -0000018751 00000 n -0000018835 00000 n -0000018923 00000 n +0000015559 00000 n +0000015660 00000 n +0000015736 00000 n +0000015812 00000 n +0000015899 00000 n +0000016006 00000 n +0000016096 00000 n +0000016206 00000 n +0000016290 00000 n +0000016378 00000 n +0000016501 00000 n +0000016591 00000 n +0000016701 00000 n +0000016785 00000 n +0000016873 00000 n +0000016996 00000 n +0000017083 00000 n +0000017194 00000 n +0000017284 00000 n +0000017394 00000 n +0000017478 00000 n +0000017566 00000 n +0000017689 00000 n +0000017779 00000 n +0000017889 00000 n +0000017973 00000 n +0000018061 00000 n +0000018184 00000 n +0000018271 00000 n +0000018386 00000 n +0000018476 00000 n +0000018586 00000 n +0000018670 00000 n +0000018758 00000 n +0000018881 00000 n +0000018971 00000 n +0000019082 00000 n +0000019166 00000 n +0000019254 00000 n 0000000020 00000 n -0000013410 00000 n -0000013268 00000 n -0000011486 00000 n -0000029174 00000 n -0000022222 00000 n -0000029528 00000 n -0000013556 00000 n -0000013712 00000 n -0000014394 00000 n -0000015023 00000 n -0000019165 00000 n -0000021124 00000 n -0000019297 00000 n -0000019371 00000 n -0000021358 00000 n -0000022373 00000 n -0000022570 00000 n -0000027709 00000 n -0000022906 00000 n -0000023029 00000 n -0000027945 00000 n -0000029328 00000 n -0000029590 00000 n -0000029705 00000 n +0000013741 00000 n +0000013599 00000 n +0000011817 00000 n +0000029505 00000 n +0000022553 00000 n +0000029859 00000 n +0000013887 00000 n +0000014043 00000 n +0000014725 00000 n +0000015354 00000 n +0000019496 00000 n +0000021455 00000 n +0000019628 00000 n +0000019702 00000 n +0000021689 00000 n +0000022704 00000 n +0000022901 00000 n +0000028040 00000 n +0000023237 00000 n +0000023360 00000 n +0000028276 00000 n +0000029659 00000 n +0000029921 00000 n +0000030036 00000 n trailer -<< /Size 73 /Root 71 0 R /Info 72 0 R /ID [ <14B40F363BE2C4EFB96EAE91DC2CE4F7> <14B40F363BE2C4EFB96EAE91DC2CE4F7> ] >> +<< /Size 73 /Root 71 0 R /Info 72 0 R /ID [ <9FE5893F47078D523BBE8D61D50ED061> <9FE5893F47078D523BBE8D61D50ED061> ] >> startxref -29928 +30259 %%EOF diff --git a/macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.pdf b/macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.pdf index 70cfe5e793..8d41c002bd 100644 --- a/macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.pdf +++ b/macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.pdf @@ -34,7 +34,7 @@ endobj << /ExtGState 1 0 R /Font << /F15 13 0 R >> /ProcSet [ /PDF /Text ] >> endobj 15 0 obj -<< /Type /Metadata /Subtype /XML /Length 11401 >> +<< /Type /Metadata /Subtype /XML /Length 11732 >> stream <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> @@ -89,6 +89,12 @@ stream <pdfaProperty:category>internal</pdfaProperty:category> <pdfaProperty:description>Year of standard</pdfaProperty:description> </rdf:li> + <rdf:li rdf:parseType="Resource"> + <pdfaProperty:name>rev</pdfaProperty:name> + <pdfaProperty:valueType>Integer</pdfaProperty:valueType> + <pdfaProperty:category>internal</pdfaProperty:category> + <pdfaProperty:description>Revision year of standard</pdfaProperty:description> + </rdf:li> </rdf:Seq> </pdfaSchema:property> </rdf:li> @@ -243,17 +249,17 @@ stream </dc:language> <dc:date> <rdf:Seq> - <rdf:li>2024-06-20T17:53:22+02:00</rdf:li> + <rdf:li>2024-10-27T22:37:16+01:00</rdf:li> </rdf:Seq> </dc:date> <dc:format>application/pdf</dc:format> <dc:source>ex-mc-manual-para-split-obsolete.tex</dc:source> <xmp:CreatorTool>LaTeX</xmp:CreatorTool> - <xmp:CreateDate>2024-06-20T17:53:22+02:00</xmp:CreateDate> - <xmp:ModifyDate>2024-06-20T17:53:22+02:00</xmp:ModifyDate> - <xmp:MetadataDate>2024-06-20T17:53:22+02:00</xmp:MetadataDate> + <xmp:CreateDate>2024-10-27T22:37:16+01:00</xmp:CreateDate> + <xmp:ModifyDate>2024-10-27T22:37:16+01:00</xmp:ModifyDate> + <xmp:MetadataDate>2024-10-27T22:37:16+01:00</xmp:MetadataDate> <xmpMM:DocumentID>uuid:c33d64b4-96ec-4e48-8f27-0b3edc831547</xmpMM:DocumentID> - <xmpMM:InstanceID>uuid:36712ce3-22f3-4c4a-8418-0427448d178a</xmpMM:InstanceID> + <xmpMM:InstanceID>uuid:46f4a0dd-bede-45aa-8ac4-70841977b423</xmpMM:InstanceID> <prism:complianceProfile>three</prism:complianceProfile> <prism:pageCount>2</prism:pageCount> </rdf:Description> @@ -413,12 +419,12 @@ endobj << /Type /Catalog /Pages 14 0 R /Lang (de)/Metadata 15 0 R >> endobj 25 0 obj -<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20240620175322+02'00')/ModDate (D:20240620175322+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> +<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20241027223716+01'00')/ModDate (D:20241027223716+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> endobj xref 0 26 0000000002 65535 f -0000016851 00000 n +0000017182 00000 n 0000000003 00000 f 0000000004 00000 f 0000000005 00000 f @@ -427,24 +433,24 @@ xref 0000000008 00000 f 0000000000 00000 f 0000002976 00000 n -0000016645 00000 n +0000016976 00000 n 0000003094 00000 n 0000000020 00000 n -0000023472 00000 n -0000023826 00000 n +0000023803 00000 n +0000024157 00000 n 0000003181 00000 n -0000016764 00000 n -0000014672 00000 n -0000016898 00000 n -0000022021 00000 n -0000017205 00000 n -0000017280 00000 n -0000022257 00000 n -0000023626 00000 n -0000023894 00000 n -0000023972 00000 n +0000017095 00000 n +0000015003 00000 n +0000017229 00000 n +0000022352 00000 n +0000017536 00000 n +0000017611 00000 n +0000022588 00000 n +0000023957 00000 n +0000024225 00000 n +0000024303 00000 n trailer -<< /Size 26 /Root 24 0 R /Info 25 0 R /ID [ <2A141E41EDA78C2ADA31A952D041C439> <2A141E41EDA78C2ADA31A952D041C439> ] >> +<< /Size 26 /Root 24 0 R /Info 25 0 R /ID [ <021868C517E246E72695F327A79C7F3F> <021868C517E246E72695F327A79C7F3F> ] >> startxref -24195 +24526 %%EOF diff --git a/macros/latex/contrib/tagpdf/ex-softhyphen.pdf b/macros/latex/contrib/tagpdf/ex-softhyphen.pdf index 5f96db2bdb..5c2df8897b 100644 --- a/macros/latex/contrib/tagpdf/ex-softhyphen.pdf +++ b/macros/latex/contrib/tagpdf/ex-softhyphen.pdf @@ -1,7 +1,7 @@ %PDF-1.7 %ÌÕÁÔÅØÐÄÆ 14 0 obj -<< /Type /Metadata /Subtype /XML /Length 11382 >> +<< /Type /Metadata /Subtype /XML /Length 11713 >> stream <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> @@ -56,6 +56,12 @@ stream <pdfaProperty:category>internal</pdfaProperty:category> <pdfaProperty:description>Year of standard</pdfaProperty:description> </rdf:li> + <rdf:li rdf:parseType="Resource"> + <pdfaProperty:name>rev</pdfaProperty:name> + <pdfaProperty:valueType>Integer</pdfaProperty:valueType> + <pdfaProperty:category>internal</pdfaProperty:category> + <pdfaProperty:description>Revision year of standard</pdfaProperty:description> + </rdf:li> </rdf:Seq> </pdfaSchema:property> </rdf:li> @@ -210,17 +216,17 @@ stream </dc:language> <dc:date> <rdf:Seq> - <rdf:li>2024-06-20T17:53:55+02:00</rdf:li> + <rdf:li>2024-10-27T22:37:38+01:00</rdf:li> </rdf:Seq> </dc:date> <dc:format>application/pdf</dc:format> <dc:source>ex-softhyphen.tex</dc:source> <xmp:CreatorTool>LaTeX</xmp:CreatorTool> - <xmp:CreateDate>2024-06-20T17:53:55+02:00</xmp:CreateDate> - <xmp:ModifyDate>2024-06-20T17:53:55+02:00</xmp:ModifyDate> - <xmp:MetadataDate>2024-06-20T17:53:55+02:00</xmp:MetadataDate> + <xmp:CreateDate>2024-10-27T22:37:38+01:00</xmp:CreateDate> + <xmp:ModifyDate>2024-10-27T22:37:38+01:00</xmp:ModifyDate> + <xmp:MetadataDate>2024-10-27T22:37:38+01:00</xmp:MetadataDate> <xmpMM:DocumentID>uuid:aa82e685-4098-469d-861c-3c45dfc700c7</xmpMM:DocumentID> - <xmpMM:InstanceID>uuid:9c8a342f-f758-4367-8d05-7621809f3e05</xmpMM:InstanceID> + <xmpMM:InstanceID>uuid:c020fac8-bd8b-4093-88a3-079e4416672a</xmpMM:InstanceID> <prism:complianceProfile>three</prism:complianceProfile> <prism:pageCount>1</prism:pageCount> </rdf:Description> @@ -393,43 +399,43 @@ endobj << /Type /Catalog /Pages 19 0 R /MarkInfo 20 0 R/Lang (de)/Metadata 14 0 R/StructTreeRoot 5 0 R >> endobj 30 0 obj -<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20240620175355+02'00')/ModDate (D:20240620175355+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> +<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20241027223738+01'00')/ModDate (D:20241027223738+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> endobj xref 0 31 0000000002 65535 f -0000012360 00000 n +0000012691 00000 n 0000000003 00000 f 0000000004 00000 f 0000000008 00000 f -0000013738 00000 n -0000012443 00000 n -0000012661 00000 n +0000014069 00000 n +0000012774 00000 n +0000012992 00000 n 0000000000 00000 f -0000013253 00000 n -0000013346 00000 n -0000013432 00000 n -0000013542 00000 n -0000013628 00000 n +0000013584 00000 n +0000013677 00000 n +0000013763 00000 n +0000013873 00000 n +0000013959 00000 n 0000000020 00000 n -0000012273 00000 n -0000012138 00000 n -0000011492 00000 n -0000017687 00000 n -0000018051 00000 n -0000012407 00000 n -0000012493 00000 n -0000012624 00000 n -0000013839 00000 n -0000016487 00000 n -0000013993 00000 n -0000014167 00000 n -0000016727 00000 n -0000017846 00000 n -0000018113 00000 n -0000018228 00000 n +0000012604 00000 n +0000012469 00000 n +0000011823 00000 n +0000018018 00000 n +0000018382 00000 n +0000012738 00000 n +0000012824 00000 n +0000012955 00000 n +0000014170 00000 n +0000016818 00000 n +0000014324 00000 n +0000014498 00000 n +0000017058 00000 n +0000018177 00000 n +0000018444 00000 n +0000018559 00000 n trailer -<< /Size 31 /Root 29 0 R /Info 30 0 R /ID [ <5BCC76B86A64606D9B117AF50FFA18AE> <5BCC76B86A64606D9B117AF50FFA18AE> ] >> +<< /Size 31 /Root 29 0 R /Info 30 0 R /ID [ <2884F9E61D000E3EB4AD37FF6613925D> <2884F9E61D000E3EB4AD37FF6613925D> ] >> startxref -18451 +18782 %%EOF diff --git a/macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf b/macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf index 21b11b9346..3766768619 100644 --- a/macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf +++ b/macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf @@ -1,7 +1,7 @@ %PDF-1.5 %ÌÕÁÔÅØÐÄÆ 10 0 obj -<< /Type /Metadata /Subtype /XML /Length 11391 >> +<< /Type /Metadata /Subtype /XML /Length 11722 >> stream <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> @@ -56,6 +56,12 @@ stream <pdfaProperty:category>internal</pdfaProperty:category> <pdfaProperty:description>Year of standard</pdfaProperty:description> </rdf:li> + <rdf:li rdf:parseType="Resource"> + <pdfaProperty:name>rev</pdfaProperty:name> + <pdfaProperty:valueType>Integer</pdfaProperty:valueType> + <pdfaProperty:category>internal</pdfaProperty:category> + <pdfaProperty:description>Revision year of standard</pdfaProperty:description> + </rdf:li> </rdf:Seq> </pdfaSchema:property> </rdf:li> @@ -210,17 +216,17 @@ stream </dc:language> <dc:date> <rdf:Seq> - <rdf:li>2024-06-20T17:54:22+02:00</rdf:li> + <rdf:li>2024-10-27T22:37:59+01:00</rdf:li> </rdf:Seq> </dc:date> <dc:format>application/pdf</dc:format> <dc:source>ex-spaceglyph-listings.tex</dc:source> <xmp:CreatorTool>LaTeX</xmp:CreatorTool> - <xmp:CreateDate>2024-06-20T17:54:22+02:00</xmp:CreateDate> - <xmp:ModifyDate>2024-06-20T17:54:22+02:00</xmp:ModifyDate> - <xmp:MetadataDate>2024-06-20T17:54:22+02:00</xmp:MetadataDate> + <xmp:CreateDate>2024-10-27T22:37:59+01:00</xmp:CreateDate> + <xmp:ModifyDate>2024-10-27T22:37:59+01:00</xmp:ModifyDate> + <xmp:MetadataDate>2024-10-27T22:37:59+01:00</xmp:MetadataDate> <xmpMM:DocumentID>uuid:acdc2435-bf29-4e54-8d09-1c9b6dc32038</xmpMM:DocumentID> - <xmpMM:InstanceID>uuid:ad8487cb-8dcc-4cab-8542-55106010deec</xmpMM:InstanceID> + <xmpMM:InstanceID>uuid:75cddc90-a6a9-482a-8325-37e09bb2ef3c</xmpMM:InstanceID> <prism:complianceProfile>three</prism:complianceProfile> <prism:pageCount>1</prism:pageCount> </rdf:Description> @@ -354,39 +360,39 @@ endobj << /Type /Catalog /Pages 15 0 R /MarkInfo 16 0 R/Lang (de)/Metadata 10 0 R/StructTreeRoot 5 0 R >> endobj 26 0 obj -<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20240620175422+02'00')/ModDate (D:20240620175422+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> +<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20241027223759+01'00')/ModDate (D:20241027223759+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> endobj xref 0 27 0000000002 65535 f -0000012007 00000 n +0000012338 00000 n 0000000003 00000 f 0000000004 00000 f 0000000008 00000 f -0000012886 00000 n -0000012090 00000 n -0000012233 00000 n +0000013217 00000 n +0000012421 00000 n +0000012564 00000 n 0000000000 00000 f -0000012812 00000 n +0000013143 00000 n 0000000020 00000 n -0000011920 00000 n -0000011785 00000 n -0000011501 00000 n -0000015069 00000 n -0000015423 00000 n -0000012054 00000 n -0000012125 00000 n -0000012196 00000 n -0000012987 00000 n -0000014053 00000 n -0000013042 00000 n -0000013117 00000 n -0000014289 00000 n -0000015223 00000 n -0000015485 00000 n -0000015600 00000 n +0000012251 00000 n +0000012116 00000 n +0000011832 00000 n +0000015400 00000 n +0000015754 00000 n +0000012385 00000 n +0000012456 00000 n +0000012527 00000 n +0000013318 00000 n +0000014384 00000 n +0000013373 00000 n +0000013448 00000 n +0000014620 00000 n +0000015554 00000 n +0000015816 00000 n +0000015931 00000 n trailer -<< /Size 27 /Root 25 0 R /Info 26 0 R /ID [ <50A5738B4CABF76A4CC27558811B7E58> <50A5738B4CABF76A4CC27558811B7E58> ] >> +<< /Size 27 /Root 25 0 R /Info 26 0 R /ID [ <F17259B217182DBF90C1A855FBD46F7D> <F17259B217182DBF90C1A855FBD46F7D> ] >> startxref -15823 +16154 %%EOF diff --git a/macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf b/macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf index 7c9c135bf7..03e8187342 100644 --- a/macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf +++ b/macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf @@ -1,7 +1,7 @@ %PDF-1.7 %ÌÕÁÔÅØÐÄÆ 20 0 obj -<< /Type /Metadata /Subtype /XML /Length 11390 >> +<< /Type /Metadata /Subtype /XML /Length 11721 >> stream <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> @@ -56,6 +56,12 @@ stream <pdfaProperty:category>internal</pdfaProperty:category> <pdfaProperty:description>Year of standard</pdfaProperty:description> </rdf:li> + <rdf:li rdf:parseType="Resource"> + <pdfaProperty:name>rev</pdfaProperty:name> + <pdfaProperty:valueType>Integer</pdfaProperty:valueType> + <pdfaProperty:category>internal</pdfaProperty:category> + <pdfaProperty:description>Revision year of standard</pdfaProperty:description> + </rdf:li> </rdf:Seq> </pdfaSchema:property> </rdf:li> @@ -210,17 +216,17 @@ stream </dc:language> <dc:date> <rdf:Seq> - <rdf:li>2024-06-20T17:54:47+02:00</rdf:li> + <rdf:li>2024-10-27T22:38:20+01:00</rdf:li> </rdf:Seq> </dc:date> <dc:format>application/pdf</dc:format> <dc:source>ex-structure-obsolete.tex</dc:source> <xmp:CreatorTool>LaTeX</xmp:CreatorTool> - <xmp:CreateDate>2024-06-20T17:54:47+02:00</xmp:CreateDate> - <xmp:ModifyDate>2024-06-20T17:54:47+02:00</xmp:ModifyDate> - <xmp:MetadataDate>2024-06-20T17:54:47+02:00</xmp:MetadataDate> + <xmp:CreateDate>2024-10-27T22:38:20+01:00</xmp:CreateDate> + <xmp:ModifyDate>2024-10-27T22:38:20+01:00</xmp:ModifyDate> + <xmp:MetadataDate>2024-10-27T22:38:20+01:00</xmp:MetadataDate> <xmpMM:DocumentID>uuid:bf5e4a2b-cfa9-4fc5-878c-8f9d2ee95445</xmpMM:DocumentID> - <xmpMM:InstanceID>uuid:971e1e25-37c4-4af9-8523-72714a87dea7</xmpMM:InstanceID> + <xmpMM:InstanceID>uuid:2f0d3560-6ba5-4289-8a7d-631646751146</xmpMM:InstanceID> <prism:complianceProfile>three</prism:complianceProfile> <prism:pageCount>1</prism:pageCount> </rdf:Description> @@ -526,56 +532,56 @@ endobj << /Type /Catalog /Pages 26 0 R /MarkInfo 27 0 R/Lang (de)/Metadata 20 0 R/StructTreeRoot 5 0 R >> endobj 43 0 obj -<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20240620175447+02'00')/ModDate (D:20240620175447+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> +<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20241027223820+01'00')/ModDate (D:20241027223820+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> endobj xref 0 44 0000000002 65535 f -0000012794 00000 n +0000013125 00000 n 0000000003 00000 f 0000000004 00000 f 0000000008 00000 f -0000014930 00000 n -0000012877 00000 n -0000013226 00000 n +0000015261 00000 n +0000013208 00000 n +0000013557 00000 n 0000000000 00000 f -0000013818 00000 n -0000013903 00000 n -0000014001 00000 n -0000014109 00000 n -0000014217 00000 n -0000014306 00000 n -0000014396 00000 n -0000014506 00000 n -0000014618 00000 n -0000014708 00000 n -0000014818 00000 n +0000014149 00000 n +0000014234 00000 n +0000014332 00000 n +0000014440 00000 n +0000014548 00000 n +0000014637 00000 n +0000014727 00000 n +0000014837 00000 n +0000014949 00000 n +0000015039 00000 n +0000015149 00000 n 0000000020 00000 n -0000012695 00000 n -0000012560 00000 n -0000011500 00000 n -0000023013 00000 n -0000019779 00000 n -0000023361 00000 n -0000012841 00000 n -0000012955 00000 n -0000013189 00000 n -0000015031 00000 n -0000018510 00000 n -0000015280 00000 n -0000015355 00000 n -0000018746 00000 n -0000019933 00000 n -0000020133 00000 n -0000021901 00000 n -0000020270 00000 n -0000020346 00000 n -0000022135 00000 n -0000023164 00000 n -0000023423 00000 n -0000023538 00000 n +0000013026 00000 n +0000012891 00000 n +0000011831 00000 n +0000023344 00000 n +0000020110 00000 n +0000023692 00000 n +0000013172 00000 n +0000013286 00000 n +0000013520 00000 n +0000015362 00000 n +0000018841 00000 n +0000015611 00000 n +0000015686 00000 n +0000019077 00000 n +0000020264 00000 n +0000020464 00000 n +0000022232 00000 n +0000020601 00000 n +0000020677 00000 n +0000022466 00000 n +0000023495 00000 n +0000023754 00000 n +0000023869 00000 n trailer -<< /Size 44 /Root 42 0 R /Info 43 0 R /ID [ <ADB87D57539D5CE2A8FC3A4721B94DA0> <ADB87D57539D5CE2A8FC3A4721B94DA0> ] >> +<< /Size 44 /Root 42 0 R /Info 43 0 R /ID [ <7BB4C9B60D10544DA8B57870368C28A1> <7BB4C9B60D10544DA8B57870368C28A1> ] >> startxref -23761 +24092 %%EOF diff --git a/macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf b/macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf index 81423fede4..b523c18609 100644 --- a/macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf +++ b/macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf @@ -1,7 +1,7 @@ %PDF-2.0 %ÌÕÁÔÅØÐÄÆ 26 0 obj -<< /Type /Metadata /Subtype /XML /Length 11387 >> +<< /Type /Metadata /Subtype /XML /Length 11718 >> stream <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> @@ -56,6 +56,12 @@ stream <pdfaProperty:category>internal</pdfaProperty:category> <pdfaProperty:description>Year of standard</pdfaProperty:description> </rdf:li> + <rdf:li rdf:parseType="Resource"> + <pdfaProperty:name>rev</pdfaProperty:name> + <pdfaProperty:valueType>Integer</pdfaProperty:valueType> + <pdfaProperty:category>internal</pdfaProperty:category> + <pdfaProperty:description>Revision year of standard</pdfaProperty:description> + </rdf:li> </rdf:Seq> </pdfaSchema:property> </rdf:li> @@ -210,17 +216,17 @@ stream </dc:language> <dc:date> <rdf:Seq> - <rdf:li>2024-06-20T17:55:14+02:00</rdf:li> + <rdf:li>2024-10-27T22:38:43+01:00</rdf:li> </rdf:Seq> </dc:date> <dc:format>application/pdf</dc:format> <dc:source>ex-tagpdf-template.tex</dc:source> <xmp:CreatorTool>LaTeX</xmp:CreatorTool> - <xmp:CreateDate>2024-06-20T17:55:14+02:00</xmp:CreateDate> - <xmp:ModifyDate>2024-06-20T17:55:14+02:00</xmp:ModifyDate> - <xmp:MetadataDate>2024-06-20T17:55:14+02:00</xmp:MetadataDate> + <xmp:CreateDate>2024-10-27T22:38:43+01:00</xmp:CreateDate> + <xmp:ModifyDate>2024-10-27T22:38:43+01:00</xmp:ModifyDate> + <xmp:MetadataDate>2024-10-27T22:38:43+01:00</xmp:MetadataDate> <xmpMM:DocumentID>uuid:f320abfc-f6ab-4d12-8719-d176f4d947cf</xmpMM:DocumentID> - <xmpMM:InstanceID>uuid:898c4009-cc18-43c3-8fda-44ab8e28318c</xmpMM:InstanceID> + <xmpMM:InstanceID>uuid:56e7d257-35a4-49ae-8577-3c691372d233</xmpMM:InstanceID> <prism:complianceProfile>three</prism:complianceProfile> <prism:pageCount>1</prism:pageCount> </rdf:Description> @@ -307,7 +313,7 @@ endobj << /Type /Namespace /NS (https://www.latex-project.org/ns/book/2022) /RoleMapNS 18 0 R >> endobj 19 0 obj -<< /Type /Namespace /NS (data:,69C62BB9-6D5A-6FC9-FD75-56BC71E087F4) >> +<< /Type /Namespace /NS (data:,8E4C8AF-E27-DA88-5F3F-9A62E664EE8) >> endobj 8 0 obj [ 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R ] @@ -399,55 +405,55 @@ endobj << /Type /Catalog /Pages 31 0 R /MarkInfo 32 0 R/Lang (en)/Metadata 26 0 R/StructTreeRoot 5 0 R >> endobj 42 0 obj -<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20240620175514+02'00')/ModDate (D:20240620175514+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> +<< /Producer (luahbtex-1.18.0)/Creator (LaTeX)/CreationDate (D:20241027223843+01'00')/ModDate (D:20241027223843+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.18.0 (TeX Live 2024)) >> endobj xref 0 43 0000000002 65535 f -0000011929 00000 n +0000012260 00000 n 0000000003 00000 f 0000000004 00000 f 0000000010 00000 f -0000014805 00000 n -0000012012 00000 n -0000012222 00000 n -0000014240 00000 n -0000012865 00000 n +0000015133 00000 n +0000012343 00000 n +0000012553 00000 n +0000014568 00000 n +0000013196 00000 n 0000000012 00000 f -0000012933 00000 n +0000013264 00000 n 0000000014 00000 f -0000013003 00000 n +0000013334 00000 n 0000000020 00000 f -0000013766 00000 n -0000013084 00000 n -0000014044 00000 n -0000013873 00000 n -0000014151 00000 n +0000014097 00000 n +0000013415 00000 n +0000014375 00000 n +0000014204 00000 n +0000014482 00000 n 0000000000 00000 f -0000014301 00000 n -0000014398 00000 n -0000014485 00000 n -0000014572 00000 n -0000014671 00000 n +0000014629 00000 n +0000014726 00000 n +0000014813 00000 n +0000014900 00000 n +0000014999 00000 n 0000000020 00000 n -0000011866 00000 n -0000011731 00000 n -0000011497 00000 n -0000017426 00000 n -0000017780 00000 n -0000011976 00000 n -0000012053 00000 n -0000012185 00000 n -0000012801 00000 n -0000014942 00000 n -0000016383 00000 n -0000015029 00000 n -0000016604 00000 n -0000017580 00000 n -0000017842 00000 n -0000017957 00000 n +0000012197 00000 n +0000012062 00000 n +0000011828 00000 n +0000017754 00000 n +0000018108 00000 n +0000012307 00000 n +0000012384 00000 n +0000012516 00000 n +0000013132 00000 n +0000015270 00000 n +0000016711 00000 n +0000015357 00000 n +0000016932 00000 n +0000017908 00000 n +0000018170 00000 n +0000018285 00000 n trailer -<< /Size 43 /Root 41 0 R /Info 42 0 R /ID [ <E36FE13F3FA0066C1F9796E38E50018C> <E36FE13F3FA0066C1F9796E38E50018C> ] >> +<< /Size 43 /Root 41 0 R /Info 42 0 R /ID [ <2B6006DEEF35DD1A3F3AC9CAA0916125> <2B6006DEEF35DD1A3F3AC9CAA0916125> ] >> startxref -18180 +18508 %%EOF diff --git a/macros/latex/contrib/tagpdf/link-figure-input.tex b/macros/latex/contrib/tagpdf/link-figure-input.tex index ef07c33e95..1a1036d282 100644 --- a/macros/latex/contrib/tagpdf/link-figure-input.tex +++ b/macros/latex/contrib/tagpdf/link-figure-input.tex @@ -27,7 +27,7 @@ \NewDocumentCommand\balloon{m}{% \node[fit={(pic cs:#1-first) (pic cs:#1-end) ([yshift=7pt]pic cs:#1-end)},balloon](#1){};} -\begin{tikzpicture}[overlay,remember picture] +\begin{tikzpicture}[overlay,remember picture,alt={Illustration of link annotation structure}] \balloon{link} \balloon{structparent} \balloon{OBJR} @@ -45,7 +45,7 @@ \draw[ref] (kid)--(OBJR); \draw[ref] (OBJR)--(linkref); \end{tikzpicture} -\begin{lstlisting}[name=OBJR] +\begin{taglstlisting}[name=OBJR] *\tikzmark{link-first}*18 0 obj*\tikzmark{link-end}* %Link Object << /Type /Annot /Subtype/Link /Rect [ 196.109 494.573 399.167 506.831 ] @@ -67,4 +67,4 @@ endobj}; << /Nums [... *\tikzmark{pnum-first}*16*\tikzmark{pnum-end}* *\tikzmark{pref-first}*17 0 R*\tikzmark{pref-end}* ...] >> endobj -\end{lstlisting} +\end{taglstlisting} diff --git a/macros/latex/contrib/tagpdf/pac2024-report.png b/macros/latex/contrib/tagpdf/pac2024-report.png Binary files differnew file mode 100644 index 0000000000..4474bc989f --- /dev/null +++ b/macros/latex/contrib/tagpdf/pac2024-report.png diff --git a/macros/latex/contrib/tagpdf/pac2024-version.png b/macros/latex/contrib/tagpdf/pac2024-version.png Binary files differnew file mode 100644 index 0000000000..1bc12bdafe --- /dev/null +++ b/macros/latex/contrib/tagpdf/pac2024-version.png diff --git a/macros/latex/contrib/tagpdf/tagpdf-backend.dtx b/macros/latex/contrib/tagpdf/tagpdf-backend.dtx index 7e19e1e90f..5a957d64e3 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-backend.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-backend.dtx @@ -47,13 +47,13 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{implementation} % \begin{macrocode} %<@@=tag> %<*luatex> -\ProvidesExplFile {tagpdf-luatex.def} {2024-06-20} {0.99c} +\ProvidesExplFile {tagpdf-luatex.def} {2024-10-27} {0.99g} {tagpdf~driver~for~luatex} % \end{macrocode} % \section{Loading the lua} @@ -85,6 +85,7 @@ % \@@_seq_new:N, % \@@_prop_gput:Nnn, % \@@_seq_gput_right:Nn, +% \@@_seq_gput_left:Nn, % \@@_seq_item:cn, % \@@_prop_item:cn, % \@@_seq_show:N, @@ -114,7 +115,7 @@ \cs_set_protected:Npn \@@_prop_gput:Nnn #1 #2 #3 { \prop_gput:Nnn #1 { #2 } { #3 } - \lua_now:e { ltx.@@.tables.\cs_to_str:N#1 ["#2"] = "#3" } + \lua_now:e { ltx.@@.tables.\cs_to_str:N#1 ["#2"] = "\lua_escape:n{#3}" } } @@ -123,9 +124,18 @@ \seq_gput_right:Nn #1 { #2 } \lua_now:e { table.insert(ltx.@@.tables.\cs_to_str:N#1, "#2") } } - +% \end{macrocode} +% +% this inserts on the right of the lua table, but as the lua table is not used for kids +% this is ignored for now. +% \begin{macrocode} +\cs_set_protected:Npn \@@_seq_gput_left:Nn #1 #2 + { + \seq_gput_left:Nn #1 { #2 } + \lua_now:e { table.insert(ltx.@@.tables.\cs_to_str:N#1, "#2") } + } + %Hm not quite sure about the naming - \cs_set:Npn \@@_seq_item:cn #1 #2 { \lua_now:e { tex.print(ltx.@@.tables.#1[#2]) } @@ -164,8 +174,8 @@ local ProvidesLuaModule = { name = "tagpdf", - version = "0.99c", --TAGVERSION - date = "2024-06-20", --TAGDATE + version = "0.99g", --TAGVERSION + date = "2024-10-27", --TAGDATE description = "tagpdf lua code", license = "The LATEX Project Public License 1.3c" } @@ -252,6 +262,12 @@ local iwfontattributeid = luatexbase.new_attribute ("g_@@_interwordfont_attr") local tagunmarkedbool= token.create("g_@@_tagunmarked_bool") local truebool = token.create("c_true_bool") % \end{macrocode} +% with this token we can query the state of the softhyphen boolean +% and so detect if hyphens from hyphenation should be replaced by soft-hyphens. +% \begin{macrocode} +local softhyphenbool = token.create("g_@@_softhyphen_bool") +% \end{macrocode} + % Now a number of local versions from global tables. % Not all is perhaps needed, most node variants were copied from lua-debug. % \begin{macrocode} @@ -286,6 +302,9 @@ local KERN = node.id("kern") local PENALTY = node.id("penalty") local LOCAL_PAR = node.id("local_par") local MATH = node.id("math") + +local explicit_disc = 1 +local regular_disc = 3 % \end{macrocode} % Now we setup the main table structure. ltx is used by other latex code too! % \begin{macrocode} @@ -1267,6 +1286,80 @@ function ltx.@@.func.output_parenttree (abspage) end % \end{macrocode} % \end{macro} +% +% \begin{macro} +% { +% process_softhyphen_pre +% process_softhyphen_post +% } +% First some local definitions. Since these are only needed locally everything gets wrapped into a block. +% \begin{macrocode} +do + local properties = node.get_properties_table() + local is_soft_hyphen_prop = 'tagpdf.rewrite-softhyphen.is_soft_hyphen' + local hyphen_char = 0x2D + local soft_hyphen_char = 0xAD +% \end{macrocode} +% +% A lookup table to test if the font supports the soft hyphen glyph. +% \begin{macrocode} + local softhyphen_fonts = setmetatable({}, {__index = function(t, fid) + local fdir = identifiers[fid] + local format = fdir and fdir.format + local result = (format == 'opentype' or format == 'truetype') + local characters = fdir and fdir.characters + result = result and (characters and characters[soft_hyphen_char]) ~= nil + t[fid] = result + return result + end}) +% \end{macrocode} +% +% A pre shaping callback to mark hyphens as being hyphenation hyphens. +% This runs before shaping to avoid affecting hyphens moved into +% discretionaries during shaping. +% \begin{macrocode} + local function process_softhyphen_pre(head, _context, _dir) + if softhyphenbool.mode ~= truebool.mode then return true end + for disc, sub in node.traverse_id(DISC, head) do + if sub == explicit_disc or sub == regular_disc then + for n, _ch, _f in node.traverse_char(disc.pre) do + local props = properties[n] + if not props then + props = {} + properties[n] = props + end + props[is_soft_hyphen_prop] = true + end + end + end + return true + end + +% \end{macrocode} +% +% Finally do the actual replacement after shaping. No checking for double processing here +% since the operation is idempotent. +% \begin{macrocode} + local function process_softhyphen_post(head, _context, _dir) + if softhyphenbool.mode ~= truebool.mode then return true end + for disc, sub in node.traverse_id(DISC, head) do + for n, ch, fid in node.traverse_glyph(disc.pre) do + local props = properties[n] + if softhyphen_fonts[fid] and ch == hyphen_char and props and props[is_soft_hyphen_prop] then + n.char = soft_hyphen_char + props.glyph_info = nil + end + end + end + return true + end + + luatexbase.add_to_callback('pre_shaping_filter', process_softhyphen_pre, 'tagpdf.rewrite-softhyphen') + luatexbase.add_to_callback('post_shaping_filter', process_softhyphen_post, 'tagpdf.rewrite-softhyphen') +end +% \end{macrocode} +% \end{macro} +% % \begin{macrocode} %</lua> % \end{macrocode} diff --git a/macros/latex/contrib/tagpdf/tagpdf-checks.dtx b/macros/latex/contrib/tagpdf/tagpdf-checks.dtx index 345b2e35ba..cb81541ad1 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-checks.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-checks.dtx @@ -48,7 +48,7 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{documentation} % \section{Commands} @@ -331,11 +331,12 @@ % \begin{macrocode} %<@@=tag> %<*header> -\ProvidesExplPackage {tagpdf-checks-code} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-checks-code} {2024-10-27} {0.99g} {part of tagpdf - code related to checks, conditionals, debugging and messages} %</header> % \end{macrocode} % \section{Messages} +% % \subsection{Messages related to mc-chunks} % \begin{macro}{mc-nested} % This message is issue is a mc is opened before the previous has been closed. @@ -454,6 +455,18 @@ { closing~structure~#1~tagged~\use:e{\prop_item:cn{g_@@_struct_#1_prop}{S}} } % \end{macrocode} % \end{macro} +% +% \begin{macro}{struct-Ref-unknown} +% This message is issued at the end, when the Ref keys are updated. +% TODO: in debug mode it should report more info about the structure. +% \begin{macrocode} +\msg_new:nnn { tag } {struct-Ref-unknown} + { + #1~has~no~related~structure.\\ + /Ref~not~updated. + } +% \end{macrocode} +% \end{macro} % \begin{macro}{tree-struct-still-open} % Message issued at the end if there are beside Root other % open structures on the stack. @@ -752,7 +765,7 @@ \cs_new_protected:Npn \@@_check_struct_used:n #1 %#1 label { \prop_get:cnNT - {g_@@_struct_\@@_property_ref:enn{tagpdfstruct-#1}{tagstruct}{unknown}_prop} + {g_@@_struct_\property_ref:enn{tagpdfstruct-#1}{tagstruct}{unknown}_prop} {P} \l_@@_tmpa_tl { @@ -773,7 +786,7 @@ \msg_error:nnn { tag } {role-missing} {#1} } { - \prop_get:NnNTF \g_@@_role_tags_NS_prop {#2} \l_tmpa_tl + \prop_get:NnNTF \g_@@_role_tags_NS_prop {#2} \l_@@_tmpa_tl { \int_compare:nNnT {\l_@@_loglevel_int} > { 0 } { @@ -795,7 +808,7 @@ \msg_error:nnn { tag } {role-missing} {#1} } { - \prop_get:cnNTF { g_@@_role_NS_#3_prop } {#2} \l_tmpa_tl + \prop_get:cnNTF { g_@@_role_NS_#3_prop } {#2} \l_@@_tmpa_tl { \int_compare:nNnT {\l_@@_loglevel_int} > { 0 } { @@ -928,7 +941,7 @@ \l_@@_tmpa_tl } { - \seq_clear:N \l_tmpa_seq + \seq_clear:N \l_@@_tmpa_seq \int_step_inline:nnnn {1} {1} @@ -940,7 +953,7 @@ { \int_compare:nT { - \@@_property_ref:enn + \property_ref:enn {mcid-####1} {tagabspage} {-1} @@ -948,17 +961,17 @@ ##1 } { - \seq_gput_right:Ne \l_tmpa_seq + \seq_gput_right:Ne \l_@@_tmpa_seq { Page##1-####1- - \@@_property_ref:enn + \property_ref:enn {mcid-####1} {tagmcid} {-1} } } } - \seq_show:N \l_tmpa_seq + \seq_show:N \l_@@_tmpa_seq } } % \end{macrocode} @@ -1124,24 +1137,24 @@ } } % \end{macrocode} -% This tracks tag stop and start. -% The tag-stop message should go before the int is increased. -% The tag-start message after the int is decreased. +% This tracks tag suspend and resume. +% The tag-suspend message should go before the int is increased. +% The tag-resume message after the int is decreased. % \begin{macrocode} -\msg_new:nnn { tag / debug } {tag-stop} +\msg_new:nnn { tag / debug } {tag-suspend} { \int_if_zero:nTF {#1} - {Tagging~stopped} - {Tagging~(not)~stopped~(already~inactive)}\\ + {Tagging~suspended} + {Tagging~(not)~suspended~(already~inactive)}\\ level:~#1~==>~\int_eval:n{#1+1}\tl_if_empty:nF{#2}{,~label:~#2}~[\msg_line_context:] } -\msg_new:nnn { tag / debug } {tag-start} +\msg_new:nnn { tag / debug } {tag-resume} { \int_if_zero:nTF {#1} - {Tagging~restarted} - {Tagging~(not)~restarted}\\ + {Tagging~resumed} + {Tagging~(not)~resumed}\\ level:~\int_eval:n{#1+1}~==>~#1\tl_if_empty:nF{#2}{,~label:~#2}~[\msg_line_context:] } % \end{macrocode} diff --git a/macros/latex/contrib/tagpdf/tagpdf-code.pdf b/macros/latex/contrib/tagpdf/tagpdf-code.pdf Binary files differindex 4dd216d1a9..9da9be69b0 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-code.pdf +++ b/macros/latex/contrib/tagpdf/tagpdf-code.pdf diff --git a/macros/latex/contrib/tagpdf/tagpdf-code.tex b/macros/latex/contrib/tagpdf/tagpdf-code.tex index b483b96974..df05b99a30 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-code.tex +++ b/macros/latex/contrib/tagpdf/tagpdf-code.tex @@ -28,9 +28,18 @@ % The next line is needed so that \GetFileInfo will be able to pick up % version data. +\usepackage{iftex} +%until l3doc is corrected +\ifluatex +\usepackage[TU]{fontenc} +\ttfamily + \DeclareFontShape{TU}{lmtt}{m}{it} + {<-> \UnicodeFontFile{lmmonoslant10-regular}{}}{} +\fi \usepackage{longtable} \usepackage{tagpdf} -\makeatletter + +\input{tagpdf-docelements} %\def\@setupverbvisiblespace{} %\def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi % \bgroup @@ -38,13 +47,12 @@ % \verbatim@font\@noligs % \language\l@nohyphenation % \@ifstar\@verb\@verb} -\makeatother \begin{document} \GetFileInfo{tagpdf.sty} \title{% - \pkg{tagpdf} -- A package to experiment with pdf tagging% + \pkg{tagpdf} -- \LaTeX{} kernel code for PDF tagging% \thanks{This file describes \fileversion, last revised \filedate.}% } diff --git a/macros/latex/contrib/tagpdf/tagpdf-data.dtx b/macros/latex/contrib/tagpdf/tagpdf-data.dtx index f07e5db3ed..9d4045e52d 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-data.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-data.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{documentation} % This files contains a various data files which are read in @@ -61,7 +61,7 @@ % latex-lab has also a namespace module, which takes precedence! % \begin{macrocode} %<*ns-latex> -%% \ProvidesExplFile {tagpdf-ns-latex.def} {2024-06-20} {0.99c} +%% \ProvidesExplFile {tagpdf-ns-latex.def} {2024-10-27} {0.99g} %% {latex} {https://www.latex-project.org/ns/dflt/2022}{} title, Title, pdf2, part, Title, pdf2, @@ -93,7 +93,7 @@ text, P, pdf2, % It is bound to change % \begin{macrocode} %<*ns-latex-book> -%% \ProvidesExplFile {tagpdf-ns-latex-book.def} {2024-06-20} {0.99c} +%% \ProvidesExplFile {tagpdf-ns-latex-book.def} {2024-10-27} {0.99g} %% {latex-book} {https://www.latex-project.org/ns/book/2022}{} chapter, H1,pdf2, section, H2,pdf2, @@ -107,7 +107,7 @@ subparagraph, H6,pdf2, % \section{The pdf namespace data} % \begin{macrocode} %<*ns-pdf> -%% \ProvidesExplFile {tagpdf-ns-pdf.def} {2024-06-20} {0.99c} +%% \ProvidesExplFile {tagpdf-ns-pdf.def} {2024-10-27} {0.99g} %% {pdf} {http://iso.org/pdf/ssn}{} StructTreeRoot,StructTreeRoot,pdf,D, Document,Document,pdf,D, @@ -175,7 +175,7 @@ Strong,Span,pdf,I, % \section{The pdf 2.0 namespace data} % \begin{macrocode} %<*ns-pdf2> -%% \ProvidesExplFile {tagpdf-ns-pdf2.def} {2024-06-20} {0.99c} +%% \ProvidesExplFile {tagpdf-ns-pdf2.def} {2024-10-27} {0.99g} %% {pdf2} {http://iso.org/pdf2/ssn}{} StructTreeRoot,StructTreeRoot,pdf2,D, Document,Document,pdf2,D, @@ -232,7 +232,7 @@ Strong,Strong,pdf2,I, % \section{The mathml namespace data} % \begin{macrocode} %<*ns-mathml> -%% \ProvidesExplFile {tagpdf-ns-mathml.def} {2024-06-20} {0.99c} +%% \ProvidesExplFile {tagpdf-ns-mathml.def} {2024-10-27} {0.99g} % {mathml}{http://www.w3.org/1998/Math/MathML}{} abs,abs,mathml, and,and,mathml, @@ -467,7 +467,7 @@ xor,xor,mathml, % This will perhaps change in future. % \begin{macrocode} %<*parent-child> -%% \ProvidesExplFile {tagpdf-parent-child.csv} {2024-06-20} {0.99c} +%% \ProvidesExplFile {tagpdf-parent-child.csv} {2024-10-27} {0.99g} ,,,StructTreeRoot,Document,Art,Part,Div,Sect,BlockQuote,NonStruct,TOC,TOCI,Index,Private,Quote,Note,Reference,BibEntry,P,Hn,H,Lbl,Code,Span,Link,Annot,Form,Ruby,RB,RT,RP,Warichu,WT,WP,L,LI,LBody,Table,TR,TH,TD,THead,TBody,TFoot,Caption,Figure,Formula,MC Document,both,document level,1,0..n,∅,‡,‡,∅,0..n,‡,∅,∅,∅,0..n,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅ Art,1.7,grouping,∅,0..n,∅,‡,‡,0..n,0..n,‡,∅,∅,∅,0..n,∅,0..n,∅,∅,∅,0..1,0..1,∅,∅,∅,0..n,0..n,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,0..n,∅,∅,0..n,0..n,∅,∅,∅,0..n,0..n,∅,∅ @@ -522,7 +522,7 @@ MC,both,---,∅,∅,∅,∅,∅,∅,0..n,‡,∅,∅,∅,0..n,0..n,0..n,0..n,0.. % This will perhaps change in future. % \begin{macrocode} %<*parent-child-2> -%% \ProvidesExplFile {tagpdf-parent-child-2.csv} {2024-06-20} {0.99c} +%% \ProvidesExplFile {tagpdf-parent-child-2.csv} {2024-10-27} {0.99g} ,,,StructTreeRoot,Document,DocumentFragment,Art,Part,Div,Sect,Aside,BlockQuote,NonStruct,TOC,TOCI,Index,Private,Title,Sub,Quote,Note,Reference,BibEntry,P,Hn,H,Lbl,Code,Em,Strong,Span,Link,Annot,Form,Ruby,RB,RT,RP,Warichu,WT,WP,FENote,L,LI,LBody,Table,TR,TH,TD,THead,TBody,TFoot,Caption,Figure,Formula,math,mathml,Artifact,MC Document,both,document level,1,0..n,0..n,∅,‡,‡,∅,0..n,0..n,‡,∅,∅,∅,0..n,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,0..n,∅ DocumentFragment,2.0,document level,∅,0..n,0..n,0..n,‡,‡,0..n,0..n,0..n,‡,∅,∅,∅,0..n,∅,∅,∅,∅*,∅,∅,∅,∅,∅,∅,∅*,∅,∅,∅,∅*,∅*,∅,∅,∅,∅,∅,∅,∅,∅,∅*,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅*,∅,∅,∅,∅,0..n,∅ diff --git a/macros/latex/contrib/tagpdf/tagpdf-docelements.tex b/macros/latex/contrib/tagpdf/tagpdf-docelements.tex new file mode 100644 index 0000000000..c388889aa1 --- /dev/null +++ b/macros/latex/contrib/tagpdf/tagpdf-docelements.tex @@ -0,0 +1,2 @@ +\ProvideDocElement[printtype=\textit{struct key},idxtype=key,idxgroup=Structure keys]{Structkeydecl}{structkeydecl} +\ProvideDocElement[printtype=\textit{setup key},idxtype=key,idxgroup=Setup keys]{Setupkeydecl}{setupkeydecl} diff --git a/macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx b/macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx index 0cef27fd3b..aef94ed20d 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{documentation} % \end{documentation} @@ -55,11 +55,11 @@ % \begin{macrocode} %<@@=tag> %<*generic> -\ProvidesExplPackage {tagpdf-mc-code-generic} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-mc-code-generic} {2024-10-27} {0.99g} {part of tagpdf - code related to marking chunks - generic mode} %</generic> %<*debug> -\ProvidesExplPackage {tagpdf-debug-generic} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-debug-generic} {2024-10-27} {0.99g} {part of tagpdf - debugging code related to marking chunks - generic mode} %</debug> % \end{macrocode} @@ -573,14 +573,14 @@ % \end{macrocode} % revert the attribute: % \begin{macrocode} - \@@_property_gset:nnnn {tagmcid } { now } + \property_gset:nnnn {tagmcid } { now } {0} { \int_use:N \g_@@_MCID_tmp_bypage_int } \cs_new_protected:Npn \@@_mc_bdc_mcid:nn #1 #2 { \int_gincr:N \c@g_@@_MCID_abs_int \tl_set:Ne \l_@@_mc_ref_abspage_tl { - \@@_property_ref:enn %3 args + \property_ref:enn %3 args { mcid-\int_use:N \c@g_@@_MCID_abs_int } diff --git a/macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx b/macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx index 7dd309c5f5..7e794c2166 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{implementation} % The code is split into three parts: code shared by all engines, @@ -86,11 +86,11 @@ % \begin{macrocode} %<@@=tag> %<*luamode> -\ProvidesExplPackage {tagpdf-mc-code-lua} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-mc-code-lua} {2024-10-27} {0.99g} {tagpdf - mc code only for the luamode } %</luamode> %<*debug> -\ProvidesExplPackage {tagpdf-debug-lua} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-debug-lua} {2024-10-27} {0.99g} {part of tagpdf - debugging code related to marking chunks - lua mode} %</debug> % \end{macrocode} diff --git a/macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx b/macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx index c96fd8c4c8..0ba0b26bfb 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{documentation} % \section{Public Commands} @@ -181,7 +181,7 @@ % \begin{macrocode} %<@@=tag> %<*header> -\ProvidesExplPackage {tagpdf-mc-code-shared} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-mc-code-shared} {2024-10-27} {0.99g} {part of tagpdf - code related to marking chunks - code shared by generic and luamode } %</header> @@ -328,7 +328,7 @@ { \@@_check_if_active_struct:T { - \tl_set:Ne \l_@@_tmpa_tl { \@@_property_ref:nnn{tagpdf-#1}{tagmcabs}{} } + \tl_set:Ne \l_@@_tmpa_tl { \property_ref:nnn{tagpdf-#1}{tagmcabs}{} } \tl_if_empty:NTF\l_@@_tmpa_tl { \msg_warning:nnn {tag} {mc-label-unknown} {#1} @@ -365,12 +365,12 @@ \tag_mc_end_push: \tag_mc_begin:n {artifact=#1} \group_begin: - \tag_stop:n{artifact-group} + \tag_suspend:n{artifact-group} } \cs_set_protected:Npn \tag_mc_artifact_group_end: { - \tag_start:n{artifact-group} + \tag_resume:n{artifact-group} \group_end: \tag_mc_end: \tag_mc_begin_pop:n{} diff --git a/macros/latex/contrib/tagpdf/tagpdf-roles.dtx b/macros/latex/contrib/tagpdf/tagpdf-roles.dtx index 80f9da0f6b..ae93943491 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-roles.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-roles.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{documentation} % \begin{function} @@ -98,7 +98,7 @@ % \begin{macrocode} %<@@=tag> %<*header> -\ProvidesExplPackage {tagpdf-roles-code} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-roles-code} {2024-10-27} {0.99g} {part of tagpdf - code related to roles and structure names} %</header> % \end{macrocode} @@ -1301,12 +1301,12 @@ tag-namespace=user, role-namespace=, %so that we can test for it. #1 - }{@@/tag-role}\l_tmpa_tl - \tl_if_empty:NF \l_tmpa_tl + }{@@/tag-role}\l_@@_tmpa_tl + \tl_if_empty:NF \l_@@_tmpa_tl { - \exp_args:NNno \seq_set_split:Nnn \l_tmpa_seq { / } {\l_tmpa_tl/} - \tl_set:Ne \l_@@_role_tag_tmpa_tl { \seq_item:Nn \l_tmpa_seq {1} } - \tl_set:Ne \l_@@_role_role_tmpa_tl { \seq_item:Nn \l_tmpa_seq {2} } + \exp_args:NNno \seq_set_split:Nnn \l_@@_tmpa_seq { / } {\l_@@_tmpa_tl/} + \tl_set:Ne \l_@@_role_tag_tmpa_tl { \seq_item:Nn \l_@@_tmpa_seq {1} } + \tl_set:Ne \l_@@_role_role_tmpa_tl { \seq_item:Nn \l_@@_tmpa_seq {2} } } \tl_if_empty:NT \l_@@_role_role_namespace_tmpa_tl { diff --git a/macros/latex/contrib/tagpdf/tagpdf-space.dtx b/macros/latex/contrib/tagpdf/tagpdf-space.dtx index a29c8f0fb3..51b7fb5eb4 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-space.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-space.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{documentation} % \begin{function}{activate/space (setup-key),interwordspace (deprecated)} @@ -66,7 +66,7 @@ % \begin{macrocode} %<@@=tag> %<*header> -\ProvidesExplPackage {tagpdf-space-code} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-space-code} {2024-10-27} {0.99g} {part of tagpdf - code related to real space chars} %</header> % \end{macrocode} @@ -78,6 +78,7 @@ % \begin{macro}{activate/spaces (setup-key),interwordspace (deprecated),show-spaces (deprecated)} % \begin{macrocode} %<*package> +\bool_new:N\l_@@_showspaces_bool \keys_define:nn { @@ / setup } { activate/spaces .choice:, diff --git a/macros/latex/contrib/tagpdf/tagpdf-struct.dtx b/macros/latex/contrib/tagpdf/tagpdf-struct.dtx index 963852b1fc..e4405ad92f 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-struct.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-struct.dtx @@ -27,6 +27,7 @@ \usepackage{array,booktabs,caption} \hypersetup{pdfauthor=Ulrike Fischer, pdftitle=tagpdf-tree module (tagpdf)} +\input{tagpdf-docelements} \begin{document} \DocInput{\jobname.dtx} \end{document} @@ -46,7 +47,7 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{documentation} % \section{Public Commands} @@ -120,10 +121,22 @@ % the third the value. Currently the only keyword is \texttt{ref} which updates % the Ref key (an array) % \end{function} +% +% \begin{function}{\tag_struct_gput_ref:nnn} +% \begin{syntax} +% \cs{tag_struct_gput_ref:nnn}\Arg{structure number}\Arg{keyword}\Arg{value} +% \end{syntax} +% This is an user interface to add a Ref key to an +% existing structure. The target structure doesn't have to exist yet +% but can be addressed by label, destname or even num. +% \meta{keyword} is currently either \texttt{label}, \texttt{dest} +% or \texttt{num}. The value is then either a label name, the name of a destination +% or a structure number. +% \end{function} % % \section{Public keys} % \subsection{Keys for the structure commands} -% \begin{function}{tag (struct-key)} +% \begin{structkeydecl}{tag} % This is required. The value of the key is normally one of the % standard types listed in the main tagpdf documentation. % It is possible to setup new tags/types. @@ -132,15 +145,15 @@ % Currently the names spaces |pdf|, |pdf2|, |mathml| and |user| are defined. % This allows to use a different name space than % the one connected by default to the tag. But normally this should not be needed. -% \end{function} -% \begin{function}{stash (struct-key)} +% \end{structkeydecl} +% \begin{structkeydecl}{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. -% \end{function} -% \begin{function}{label (struct-key)} +% \end{structkeydecl} +% \begin{structkeydecl}{label} % This key sets a label by which % one can refer to the structure. It is e.g. % used by \cs{tag_struct_use:n} (where a real label is actually not @@ -149,55 +162,63 @@ % Internally the label name will start with \texttt{tagpdfstruct-} and it stores % the two attributes |tagstruct| (the structure number) and |tagstructobj| (the % object reference). -% \end{function} -% \begin{function}{parent (struct-key)} +% \end{structkeydecl} +% \begin{structkeydecl}{parent} % By default a structure is added as kid to the currently active structure. % With the parent key one can choose another parent. The value is a structure number which % must refer to an already existing, previously created structure. Such a structure % number can for example be have been stored with \cs{tag_get:n}, but one can also use % a label on the parent structure and then use % \cs{property_ref:nn}|{tagpdfstruct-label}{tagstruct}| to retrieve it. -% \end{function} -% \begin{function}{title (struct-key),title-o (struct-key)} +% \end{structkeydecl} +% \begin{structkeydecl}{firstkey} +% If this key is used the structure is added at the left of the kids of +% the parent structure (if the structure is not stashed). +% This means that it will be the first kid of the structure +% (unless some later structure uses the key too). +% \end{structkeydecl} +% \begin{structkeydecl}{title,title-o} % This keys 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. |title-o| will expand the value once. -% \end{function} +% \end{structkeydecl} % -% \begin{function}{alt (struct-key)} +% \begin{structkeydecl}{alt} % This key inserts an \texttt{/Alt} value in the dictionary of structure object. % The value is handled as verbatim string and hex encoded. % The value will be expanded first once. If it is empty, nothing will happen. -% \end{function} -% \begin{function}{actualtext (struct-key)} +% \end{structkeydecl} +% \begin{structkeydecl}{actualtext} % This key inserts an \texttt{/ActualText} value in the dictionary of structure object. % The value is handled as verbatim string and hex encoded. % The value will be expanded first once. If it is empty, nothing will happen. -% \end{function} -% \begin{function}{lang (struct-key)} +% \end{structkeydecl} +% \begin{structkeydecl}{lang} % This key allows to set the language for a structure element. The value should be a bcp-identifier, % e.g. |de-De|. -% \end{function} -% \begin{function}{ref (struct-key)} +% \end{structkeydecl} +% \begin{structkeydecl}{ref} % This key allows to add references to other structure elements, % it adds the |/Ref| array to the structure. % The value should be a comma separated list of structure labels % set with the |label| key. e.g. |ref={label1,label2}|. -% \end{function} -% \begin{function}{E (struct-key)} +% \end{structkeydecl} +% \begin{structkeydecl}{E} % This key sets the |/E| key, the expanded form of an % abbreviation or an acronym % (I couldn't think of a better name, so I sticked to E). -% \end{function} -% \begin{function}{AF (struct-key),AFref (struct-key), -% AFinline (struct-key),AFinline-o (struct-key),texsource,mathml} +% \end{structkeydecl} +% \begin{structkeydecl}{AF,AFref, +% AFinline,AFinline-o,texsource,mathml} +% These keys handle associated files in the structure element. +% % \begin{syntax} % AF = \meta{object name}\\ % AFref = \meta{object reference}\\ % AF-inline = \meta{text content}\\ % \end{syntax} -% These keys allows to reference an associated file in the structure element. +% % The value \meta{object name} should be the name of an object pointing % to the \texttt{/Filespec} dictionary as expected by % |\pdf_object_ref:n| from a current \texttt{l3kernel}. @@ -209,15 +230,16 @@ % Future versions will perhaps extend this to more mime types, but it is % still a research task to find out what is really needed. % -% |texsource| is a special variant of |AF-inline-o| which embeds the file -% as |.tex| source with the |/AFrelationship| key set to |/Source|. It also sets the |/Desc| key -% to a (currently) fix text. +% |texsource| is a special variant of |AF-inline-o| which embeds the content +% as |.tex| source with the |/AFrelationship| key set to |/Source|. +% It also sets the |/Desc| key to a (currently) fix text. % -% |mathml| is a special variant of |AF-inline-o| which embeds the file +% |mathml| is a special variant of |AF-inline-o| which embeds the content % as |.xml| file with the |/AFrelationship| key set to |/Supplement|. % It also sets the |/Desc| key to a (currently) fix text. % -% The argument of |AF| is an object name referring an embedded file as declared for example with +% The argument of |AF| is an object name referring an embedded file as declared +% for example with % \cs{pdf_object_new:n} or with the l3pdffile module. |AF| expands its argument % (this allows e.g. to use some variable for automatic numbering) % and can be used more than once, to associate more than one file. @@ -231,9 +253,9 @@ % does not check if the reference is valid!} % % The inline keys can be used only once per structure. Additional calls are ignored. -% \end{function} +% \end{structkeydecl} % -% \begin{function}{attribute (struct-key)} +% \begin{structkeydecl}{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 @@ -243,16 +265,17 @@ % \end{verbatim} % Attribute names and their content must be declared first in \cs{tagpdfsetup}. % -% \end{function} +% \end{structkeydecl} % -% \begin{function}{attribute-class (struct-key)} +% \begin{structkeydecl}{attribute-class} % This key takes as argument a comma list of attribute class 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. % % Attribute class names and their content % must be declared first in \cs{tagpdfsetup}. -% \end{function} +% \end{structkeydecl} +% % \subsection{Setup keys} % \begin{function}{role/new-attribute (setup-key), newattribute (deprecated)} % \begin{syntax} @@ -272,20 +295,20 @@ % \end{verbatim} % % \end{function} -% \begin{function}{root-AF (setup-key)} +% \begin{setupkeydecl}{root-AF} % \begin{syntax} % root-AF = \meta{object name} % \end{syntax} % This key can be used in the setup command \cs{tagpdfsetup} and allows % to add associated files to the root structure. Like |AF| it can be used more than % once to add more than one file. -% \end{function} +% \end{setupkeydecl} % \end{documentation} % \begin{implementation} % \begin{macrocode} %<@@=tag> %<*header> -\ProvidesExplPackage {tagpdf-struct-code} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-struct-code} {2024-10-27} {0.99g} {part of tagpdf - code related to storing structure} %</header> % \end{macrocode} @@ -442,12 +465,16 @@ \tl_new:N \l_@@_struct_roletag_NS_tl % \end{macrocode} % \end{variable} -% \begin{variable}{\l_@@_struct_key_label_tl} -% This will hold the label value. +% \begin{variable}{\g_@@_struct_label_num_prop} +% This will hold for every structure label the associated +% structure number. The prop will allow to +% fill the /Ref key directly at the first compilation if the ref +% key is used. % \begin{macrocode} -\tl_new:N \l_@@_struct_key_label_tl +\prop_new_linked:N \g_@@_struct_label_num_prop % \end{macrocode} % \end{variable} + % \begin{variable}{\l_@@_struct_elem_stash_bool} % This will keep track of the stash status % \begin{macrocode} @@ -455,6 +482,15 @@ % \end{macrocode} % \end{variable} % +% \begin{variable}{\l_@@_struct_addkid_tl} +% This decides if a structure kid is added at the left or right of the parent. +% The default is \texttt{right}. +% \begin{macrocode} +\tl_new:N \l_@@_struct_addkid_tl +\tl_set:Nn \l_@@_struct_addkid_tl {right} +% \end{macrocode} +% \end{variable} + % \subsection{Variables used by tagging code of basic elements} % % \begin{variable}{\g_@@_struct_dest_num_prop} @@ -473,6 +509,7 @@ % This variable contains structures whose Ref key should be updated % at the end to point to structured related with this destination. % As this is probably need in other places too, it is not only a toc-variable. +% TODO: remove after 11/2024 release. % \begin{macrocode} \prop_new_linked:N \g_@@_struct_ref_by_dest_prop % \end{macrocode} @@ -696,16 +733,17 @@ /Type \c_space_tl /MCR \c_space_tl /Pg \c_space_tl - \pdf_pageobject_ref:n { \@@_property_ref:enn{mcid-#1}{tagabspage}{1} } - /MCID \c_space_tl \@@_property_ref:enn{mcid-#1}{tagmcid}{1} + \pdf_pageobject_ref:n { \property_ref:enn{mcid-#1}{tagabspage}{1} } + /MCID \c_space_tl \property_ref:enn{mcid-#1}{tagmcid}{1} >> } %</package> % \end{macrocode} % \begin{macrocode} %<*package|debug> -%<package>\cs_new_protected:Npn \@@_struct_kid_mc_gput_right:nn #1 #2 %#1 structure num, #2 MCID absnum% -%<debug>\cs_set_protected:Npn \@@_struct_kid_mc_gput_right:nn #1 #2 %#1 structure num, #2 MCID absnum% +%<package>\cs_new_protected:Npn \@@_struct_kid_mc_gput_right:nn #1 #2 +%<debug>\cs_set_protected:Npn \@@_struct_kid_mc_gput_right:nn #1 #2 +%#1 structure num, #2 MCID absnum% { \@@_seq_gput_right:ce { g_@@_struct_kids_#1_seq } @@ -733,8 +771,9 @@ % This commands adds a structure as kid. We only need to record the object % reference in the sequence. % \begin{macrocode} -%<package>\cs_new_protected:Npn\@@_struct_kid_struct_gput_right:nn #1 #2 %#1 num of parent struct, #2 kid struct -%<debug>\cs_set_protected:Npn\@@_struct_kid_struct_gput_right:nn #1 #2 %#1 num of parent struct, #2 kid struct +%<package>\cs_new_protected:Npn\@@_struct_kid_struct_gput_right:nn #1 #2 +%<debug>\cs_set_protected:Npn\@@_struct_kid_struct_gput_right:nn #1 #2 +%%#1 num of parent struct, #2 kid struct { \@@_seq_gput_right:ce { g_@@_struct_kids_#1_seq } @@ -747,10 +786,35 @@ %<debug> Struct~#2 %<debug> } } - %<package>\cs_generate_variant:Nn \@@_struct_kid_struct_gput_right:nn {ee} % \end{macrocode} % \end{macro} +% \begin{macro} +% { +% \@@_struct_kid_struct_gput_left:nn,\@@_struct_kid_struct_gput_left:ee +% } +% This commands adds a structure as kid one the left, so as first +% kid. We only need to record the object reference in the sequence. +% \begin{macrocode} +%<package>\cs_new_protected:Npn\@@_struct_kid_struct_gput_left:nn #1 #2 +%<debug>\cs_set_protected:Npn\@@_struct_kid_struct_gput_left:nn #1 #2 +%%#1 num of parent struct, #2 kid struct + { + \@@_seq_gput_left:ce + { g_@@_struct_kids_#1_seq } + { + \pdf_object_ref_indexed:nn { @@/struct }{ #2 } + } +%<debug> \seq_gput_left:cn +%<debug> { g_@@_struct_debug_kids_#1_seq } +%<debug> { +%<debug> Struct~#2 +%<debug> } + } +%<package>\cs_generate_variant:Nn \@@_struct_kid_struct_gput_left:nn {ee} +% \end{macrocode} +% \end{macro} +% % \begin{macro} % {\@@_struct_kid_OBJR_gput_right:nnn,\@@_struct_kid_OBJR_gput_right:eee} % At last the command to add an OBJR object. This has to write an object first. @@ -759,10 +823,11 @@ % object reference % % \begin{macrocode} -%<package>\cs_new_protected:Npn\@@_struct_kid_OBJR_gput_right:nnn #1 #2 #3 %#1 num of parent struct, -%<package> %#2 obj reference -%<package> %#3 page object reference +%<package>\cs_new_protected:Npn\@@_struct_kid_OBJR_gput_right:nnn #1 #2 #3 +%<package> +%<package> %<debug>\cs_set_protected:Npn\@@_struct_kid_OBJR_gput_right:nnn #1 #2 #3 +%%#1 num of parent struct,#2 obj reference,#3 page object reference { \pdf_object_unnamed_write:nn { dict } @@ -907,34 +972,47 @@ \tl_clear:N #2 \prop_map_inline:cn { g_@@_struct_#1_prop } { - \tl_put_right:Ne #2 - { % \end{macrocode} % Some keys needs the option to format the value, e.g. add brackets for an % array, we also need the option to ignore some entries in the properties. -% \begin{macrocode} - \cs_if_exist_use:cTF {@@_struct_format_##1:nn} - {{##1}{##2}} - {\c_space_tl/##1~##2} +% \begin{macrocode} + \cs_if_exist_use:cTF {@@_struct_format_##1:nnN} + { + {##1}{##2}#2 } - } + { + \tl_put_right:Ne #2 { \c_space_tl/##1~##2 } + } + } } % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_struct_format_rolemap:nn,\@@_struct_format_parentrole:nn} +% \begin{macro}{\@@_struct_format_rolemap:nnN,\@@_struct_format_parentrole:nnN} % This two entries should not end in the PDF. % \begin{macrocode} -\cs_new:Nn\@@_struct_format_rolemap:nn{} -\cs_new:Nn\@@_struct_format_parentrole:nn{} +\cs_new:Nn\@@_struct_format_rolemap:nnN{} +\cs_new:Nn\@@_struct_format_parentrole:nnN{} % \end{macrocode} % \end{macro} -% \begin{macro}{\@@_struct_format_Ref:nn} -% Ref is an array, we store only the content to be able to extend it -% so the formatting command adds the brackets: +% \begin{macro}{\@@_struct_format_Ref:nnN} +% Ref is an array, we store values as a clist of commands that must +% be executed here, the formatting has to add also brackets. +% % \begin{macrocode} -\cs_new:Nn\__tag_struct_format_Ref:nn{\c_space_tl/#1~[#2]} +\cs_new_protected:Nn\@@_struct_format_Ref:nnN + { + \tl_put_right:Nn #3 { ~/#1~[ } %] + \clist_map_inline:nn{ #2 } + { + ##1 #3 + } + \tl_put_right:Nn #3 + { %[ + \c_space_tl] + } + } % \end{macrocode} % \end{macro} % \begin{macro}{\@@_struct_write_obj:n} @@ -953,7 +1031,8 @@ % \begin{macrocode} \prop_get:cnNF { g_@@_struct_#1_prop } {P}\l_@@_tmpb_tl { - \prop_gput:cne { g_@@_struct_#1_prop } {P}{\pdf_object_ref_indexed:nn { @@/struct }{1}} + \prop_gput:cne { g_@@_struct_#1_prop } {P} + {\pdf_object_ref_indexed:nn { @@/struct }{1}} \prop_gput:cne { g_@@_struct_#1_prop } {S}{/Artifact} \seq_if_empty:cF {g_@@_struct_kids_#1_seq} { @@ -1005,8 +1084,9 @@ % \tag_struct_end: % \end{verbatim} % \begin{macrocode} -\cs_new_protected:Npn \@@_struct_insert_annot:nn #1 #2 %#1 object reference to the annotation/xform - %#2 structparent number +\cs_new_protected:Npn \@@_struct_insert_annot:nn #1 #2 + %#1 object reference to the annotation/xform + %#2 structparent number { \bool_if:NT \g_@@_active_struct_bool { @@ -1028,7 +1108,8 @@ #1 % } { - \pdf_pageobject_ref:n { \@@_property_ref:nnn {@tag@objr@page@#2 }{ tagabspage }{1} } + \pdf_pageobject_ref:n + { \property_ref:nnn {@tag@objr@page@#2 }{ tagabspage }{1} } } % add the parent obj number to the parent tree: \exp_args:Nne @@ -1037,7 +1118,8 @@ #2 } { - \pdf_object_ref_indexed:nn { @@/struct }{ \l_@@_struct_stack_parent_tmpa_tl } + \pdf_object_ref_indexed:nn + { @@/struct }{ \l_@@_struct_stack_parent_tmpa_tl } } % increase the int: \int_gincr:N \c@g_@@_parenttree_obj_int @@ -1112,7 +1194,8 @@ \socket_new:nn { tag/struct/tag }{1} \socket_new_plug:nnn { tag/struct/tag }{ latex-tags } { - \seq_set_split:Nne \l_@@_tmpa_seq { / } {#1/\prop_item:Ne\g__tag_role_tags_NS_prop{#1}} + \seq_set_split:Nne \l_@@_tmpa_seq { / } + {#1/\prop_item:Ne\g__tag_role_tags_NS_prop{#1}} \tl_gset:Ne \g_@@_struct_tag_tl { \seq_item:Nn\l_@@_tmpa_seq {1} } \tl_gset:Ne \g_@@_struct_tag_NS_tl{ \seq_item:Nn\l_@@_tmpa_seq {2} } \@@_check_structure_tag:N \g_@@_struct_tag_tl @@ -1120,10 +1203,12 @@ \socket_new_plug:nnn { tag/struct/tag }{ pdf-tags } { - \seq_set_split:Nne \l_@@_tmpa_seq { / } {#1/\prop_item:Ne\g_@@_role_tags_NS_prop{#1}} + \seq_set_split:Nne \l_@@_tmpa_seq { / } + {#1/\prop_item:Ne\g_@@_role_tags_NS_prop{#1}} \tl_gset:Ne \g_@@_struct_tag_tl { \seq_item:Nn\l_@@_tmpa_seq {1} } \tl_gset:Ne \g_@@_struct_tag_NS_tl{ \seq_item:Nn\l_@@_tmpa_seq {2} } - \@@_role_get:VVNN \g_@@_struct_tag_tl\g_@@_struct_tag_NS_tl\l_@@_tmpa_tl\l_@@_tmpb_tl + \@@_role_get:VVNN + \g_@@_struct_tag_tl \g_@@_struct_tag_NS_tl \l_@@_tmpa_tl \l_@@_tmpb_tl \tl_gset:Ne \g_@@_struct_tag_tl {\l_@@_tmpa_tl} \tl_gset:Ne \g_@@_struct_tag_NS_tl{\l_@@_tmpb_tl} \@@_check_structure_tag:N \g_@@_struct_tag_tl @@ -1131,24 +1216,32 @@ \socket_assign_plug:nn { tag/struct/tag } {latex-tags} % \end{macrocode} -% \begin{macro} +% \begin{structkeydecl} % { -% label (struct-key), -% stash (struct-key), -% parent (struct-key), -% tag (struct-key), -% title (struct-key), -% title-o (struct-key), -% alt (struct-key), -% actualtext (struct-key), -% lang (struct-key), -% ref (struct-key), -% E (struct-key) +% label, +% stash, +% parent, +% firstkid, +% tag, +% title, +% title-o, +% alt, +% actualtext, +% lang, +% ref, +% E % } % \begin{macrocode} \keys_define:nn { @@ / struct } { - label .tl_set:N = \l_@@_struct_key_label_tl, + label .code:n = + { + \prop_gput:Nee\g_@@_struct_label_num_prop + {#1}{\int_use:N \c@g_@@_struct_abs_int} + \@@_property_record:eV + {tagpdfstruct-#1} + \c_@@_property_struct_clist + }, stash .bool_set:N = \l_@@_struct_elem_stash_bool, parent .code:n = { @@ -1166,7 +1259,8 @@ { parent~key~ignored } } }, - parent .default:n = {-1}, + parent .default:n = {-1}, + firstkid .code:n = { \tl_set:Nn \l_@@_struct_addkid_tl {left} }, tag .code:n = % S property { \socket_use:nn { tag/struct/tag }{#1} @@ -1233,19 +1327,77 @@ { Lang } { (#1) } }, + } % \end{macrocode} -% Ref is an array, the brackets are added through the formatting command. +% \end{structkeydecl} +% Ref is rather special as it values are often +% known only at the end of the document. +% It therefore stores it values as +% clist of commands which are executed at the end of the document, +% when the structure elements are written. +% \begin{macro}{\@@_struct_Ref_obj:nN,\@@_struct_Ref_label:nN, +% \@@_struct_Ref_dest:nN,\@@_struct_Ref_num:nN} +% this commands are helper commands that are stored as clist +% in the Ref key of a structure. They are executed when the structure +% elements are written in \cs{@@_struct_write_obj}. They are used +% in \cs{@@_struct_format_Ref}. They allow to add a Ref by object reference, +% label, destname and structure number +% \begin{macrocode} +\cs_new_protected:Npn \@@_struct_Ref_obj:nN #1 #2 %#1 a object reference + { + \tl_put_right:Ne#2 + { + \c_space_tl#1 + } + } + +\cs_new_protected:Npn \@@_struct_Ref_label:nN #1 #2 %#1 a label + { + \prop_get:NnNTF \g_@@_struct_label_num_prop {#1} \l_@@_tmpb_tl + { + \tl_put_right:Ne#2 + { + \c_space_tl\tag_struct_object_ref:e{ \l_@@_tmpb_tl } + } + } + { + \msg_warning:nnn {tag}{struct-Ref-unknown}{Label~'#1'} + } + } +\cs_new_protected:Npn \@@_struct_Ref_dest:nN #1 #2 %#1 a dest name + { + \prop_get:NnNTF \g_@@_struct_dest_num_prop {#1} \l_@@_tmpb_tl + { + \tl_put_right:Ne#2 + { + \c_space_tl\tag_struct_object_ref:e{ \l_@@_tmpb_tl } + } + } + { + \msg_warning:nnn {tag}{struct-Ref-unknown}{Destination~'#1'} + } + } +\cs_new_protected:Npn \@@_struct_Ref_num:nN #1 #2 %#1 a structure number + { + \tl_put_right:Ne#2 + { + \c_space_tl\tag_struct_object_ref:e{ #1 } + } + } + +% \end{macrocode} +% \end{macro} +% \begin{structkeydecl}{ref,E,} % \begin{macrocode} +\keys_define:nn { @@ / struct } + { ref .code:n = % ref property { - \tl_clear:N\l_@@_tmpa_tl \clist_map_inline:on {#1} { - \tl_put_right:Ne \l_@@_tmpa_tl - {~\@@_property_ref:en{tagpdfstruct-##1}{tagstructobj} } + \tag_struct_gput:nne + {\int_use:N \c@g_@@_struct_abs_int}{ref_label}{ ##1 } } - \@@_struct_gput_data_ref:ee - { \int_use:N \c@g_@@_struct_abs_int } {\l_@@_tmpa_tl} }, E .code:n = % E property { @@ -1261,9 +1413,9 @@ }, } % \end{macrocode} -% \end{macro} -% \begin{macro}{AF (struct-key), AFref (struct-key), -% AFinline (struct-key),AFinline-o (struct-key)} +% \end{structkeydecl} +% +% \begin{structkeydecl}{AF, AFref,AFinline,AFinline-o,texsource,mathml} % keys for the AF keys (associated files). They use commands from l3pdffile! % The stream variants use txt as extension to get the mimetype. % TODO: check if this should be configurable. For math we will perhaps need another @@ -1314,7 +1466,8 @@ % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_struct_add_AF:nn #1 #2 % #1 struct num #2 object reference +\cs_new_protected:Npn \@@_struct_add_AF:nn #1 #2 +% #1 struct num #2 object reference { \tl_if_exist:cTF { @@ -1340,7 +1493,8 @@ { \pdf_object_if_exist:eTF {#1} { - \@@_struct_add_AF:ee { \int_use:N \c@g_@@_struct_abs_int }{\pdf_object_ref:e {#1}} + \@@_struct_add_AF:ee + { \int_use:N \c@g_@@_struct_abs_int }{\pdf_object_ref:e {#1}} \@@_struct_prop_gput:nne { \int_use:N \c@g_@@_struct_abs_int } { AF } @@ -1397,8 +1551,8 @@ } } % \end{macrocode} -% \end{macro} -% \begin{macro}{root-AF (setup-key)} +% \end{structkeydecl} +% \begin{setupkeydecl}{root-AF} % The root structure can take AF keys too, so we provide a key for it. % This key is used with |\tagpdfsetup|, not in a structure! % \begin{macrocode} @@ -1425,7 +1579,7 @@ }, } % \end{macrocode} -% \end{macro} +% \end{setupkeydecl} % \section{User commands} % We allow to set a language by default % \begin{macro}{\l_@@_struct_lang_tl} @@ -1481,13 +1635,6 @@ \g_@@_struct_tag_tl \g_@@_struct_tag_NS_tl \@@_check_structure_has_tag:n { \int_use:N \c@g_@@_struct_abs_int } - \tl_if_empty:NF - \l_@@_struct_key_label_tl - { - \@@_property_record:eV - {tagpdfstruct-\l_@@_struct_key_label_tl} - \c_@@_property_struct_clist - } % \end{macrocode} % The structure number of the parent is either taken from the stack or % has been set with the parent key. @@ -1613,7 +1760,7 @@ %record this structure as kid: %\tl_show:N \g_@@_struct_stack_current_tl %\tl_show:N \l_@@_struct_stack_parent_tmpa_tl - \@@_struct_kid_struct_gput_right:ee + \use:c { @@_struct_kid_struct_gput_ \l_@@_struct_addkid_tl :ee } { \l_@@_struct_stack_parent_tmpa_tl } { \g_@@_struct_stack_current_tl } %\prop_show:c { g_@@_struct_\g_@@_struct_stack_current_tl _prop } @@ -1706,16 +1853,16 @@ \@@_check_if_active_struct:T { \prop_if_exist:cTF - { g_@@_struct_\@@_property_ref:enn{tagpdfstruct-#1}{tagstruct}{unknown}_prop } % + { g_@@_struct_\property_ref:enn{tagpdfstruct-#1}{tagstruct}{unknown}_prop } % { \@@_check_struct_used:n {#1} %add the label structure as kid to the current structure (can be the root) \@@_struct_kid_struct_gput_right:ee { \g_@@_struct_stack_current_tl } - { \@@_property_ref:enn{tagpdfstruct-#1}{tagstruct}{1} } + { \property_ref:enn{tagpdfstruct-#1}{tagstruct}{1} } %add the current structure to the labeled one as parents \@@_prop_gput:cne - { g_@@_struct_\@@_property_ref:enn{tagpdfstruct-#1}{tagstruct}{1}_prop } + { g_@@_struct_\property_ref:enn{tagpdfstruct-#1}{tagstruct}{1}_prop } { P } { \pdf_object_ref_indexed:nn { @@/struct } { \g_@@_struct_stack_current_tl } @@ -1724,7 +1871,7 @@ % debug code % \begin{macrocode} %<debug> \prop_gput:cne -%<debug> { g_@@_struct_debug_\@@_property_ref:enn{tagpdfstruct-#1}{tagstruct}{1}_prop } +%<debug> { g_@@_struct_debug_\property_ref:enn{tagpdfstruct-#1}{tagstruct}{1}_prop } %<debug> { P } %<debug> { %<debug> parent~structure:~\g_@@_struct_stack_current_tl\c_space_tl=~ @@ -1736,7 +1883,7 @@ % the global tl-vars: % \begin{macrocode} \@@_struct_get_parentrole:eNN - {\@@_property_ref:enn{tagpdfstruct-#1}{tagstruct}{1}} + {\property_ref:enn{tagpdfstruct-#1}{tagstruct}{1}} \l_@@_tmpa_tl \l_@@_tmpb_tl \@@_check_parent_child:VVVVN @@ -1853,6 +2000,7 @@ \pdf_object_ref_indexed:nn {@@/struct}{ #1 } } \cs_generate_variant:Nn \tag_struct_object_ref:n {e} +%</package> % \end{macrocode} % % \end{macro} @@ -1864,10 +2012,18 @@ % adjusted to the key in question. % The first argument is the number of the structure, % the second a keyword referring to a function, -% the third the value. Currently the only keyword is \texttt{ref} which updates -% the Ref key (an array) -% \begin{macrocode} -\cs_new_protected:Npn \tag_struct_gput:nnn #1 #2 #3 +% the third the value. Currently the existing keywords are all related +% to the \texttt{Ref} key (an array). +% The keyword \texttt{ref} takes as value an explicit object reference to +% a structure. The keyword \texttt{ref_label} expects as value a label name (from +% a label set in a \cs{tagstructbegin} command). The keyword \texttt{ref_dest} +% expects a destination name set with \cs{MakeLinkTarget}. It then will refer to +% the structure in which this \cs{MakeLinkTarget} was used. At last +% the keyword \texttt{ref_num} expects a structure number. +% \begin{macrocode} +%<base>\cs_new_protected:Npn \tag_struct_gput:nnn #1 #2 #3{} +%<*package> +\cs_set_protected:Npn \tag_struct_gput:nnn #1 #2 #3 { \cs_if_exist_use:cF {@@_struct_gput_data_#2:nn} { %warning?? @@ -1880,22 +2036,47 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_struct_gput_data_ref:nn} +% \begin{macro}{\@@_struct_gput_data_ref_aux:nnn} % \begin{macrocode} %<*package> -\cs_new_protected:Npn \@@_struct_gput_data_ref:nn #1 #2 - % #1 receiving struct num, #2 list of object ref +\cs_new_protected:Npn \@@_struct_gput_data_ref_aux:nnn #1 #2 #3 + % #1 receiving struct num, #2 key word #3 value { - \prop_get:cnN - { g_@@_struct_#1_prop } - {Ref} - \l_@@_get_tmpc_tl - \@@_struct_prop_gput:nne - { #1 } - { Ref } - { \quark_if_no_value:NF\l_@@_get_tmpc_tl { \l_@@_get_tmpc_tl\c_space_tl }#2 } + \prop_get:cnNTF + { g_@@_struct_#1_prop } + {Ref} + \l_@@_get_tmpc_tl + { + \tl_put_right:No \l_@@_get_tmpc_tl + {\cs:w @@_struct_Ref_#2:nN \cs_end: {#3},} + } + { + \tl_set:No \l_@@_get_tmpc_tl + {\cs:w @@_struct_Ref_#2:nN \cs_end: {#3},} + } + \@@_struct_prop_gput:nno + { #1 } + { Ref } + { \l_@@_get_tmpc_tl } } -\cs_generate_variant:Nn \@@_struct_gput_data_ref:nn {ee} +\cs_new_protected:Npn \@@_struct_gput_data_ref:nn #1 #2 + { + \@@_struct_gput_data_ref_aux:nnn {#1}{obj}{#2} + } +\cs_new_protected:Npn \@@_struct_gput_data_ref_label:nn #1 #2 + { + \@@_struct_gput_data_ref_aux:nnn {#1}{label}{#2} + } +\cs_new_protected:Npn \@@_struct_gput_data_ref_dest:nn #1 #2 + { + \@@_struct_gput_data_ref_aux:nnn {#1}{dest}{#2} + } +\cs_new_protected:Npn \@@_struct_gput_data_ref_num:nn #1 #2 + { + \@@_struct_gput_data_ref_aux:nnn {#1}{num}{#2} + } + +\cs_generate_variant:Nn \@@_struct_gput_data_ref:nn {ee,no} % \end{macrocode} % \end{macro} % \begin{macro} @@ -1937,7 +2118,7 @@ % \section{Attributes and attribute classes} % \begin{macrocode} %<*header> -\ProvidesExplPackage {tagpdf-attr-code} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-attr-code} {2024-10-27} {0.99g} {part of tagpdf - code related to attributes and attribute classes} %</header> % \end{macrocode} @@ -2012,7 +2193,7 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{attribute-class (struct-key)} +% \begin{structkeydecl}{attribute-class} % attribute-class has to store the used attribute names so that % they can be added to the ClassMap later. % \begin{macrocode} @@ -2054,8 +2235,8 @@ } } % \end{macrocode} -% \end{macro} -% \begin{macro}{attribute (struct-key)} +% \end{structkeydecl} +% \begin{structkeydecl}{attribute} % \begin{macrocode} \keys_define:nn { @@ / struct } { @@ -2112,5 +2293,5 @@ } %</package> % \end{macrocode} -% \end{macro} +% \end{structkeydecl} % \end{implementation} diff --git a/macros/latex/contrib/tagpdf/tagpdf-tree.dtx b/macros/latex/contrib/tagpdf/tagpdf-tree.dtx index 04b9309597..36032d1799 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-tree.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-tree.dtx @@ -47,13 +47,13 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{implementation} % \begin{macrocode} %<@@=tag> %<*header> -\ProvidesExplPackage {tagpdf-tree-code} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-tree-code} {2024-10-27} {0.99g} {part of tagpdf - code related to writing trees and dictionaries to the pdf} %</header> % \end{macrocode} @@ -118,7 +118,7 @@ % \end{macrocode} % \end{variable} % -% \begin{macro}{viewer/startpage (setup-key)} +% \begin{macro}{viewer/startstructure (setup-key)} % We also need an option to setup the start structure. So we setup a key % which sets the variable to the current structure. This still requires % hyperref to do most of the job, this should perhaps be changed. @@ -367,11 +367,11 @@ { %mcid####1 \int_compare:nT - {\@@_property_ref:enn{mcid-####1}{tagabspage}{-1}=##1} %mcid is on current page + {\property_ref:enn{mcid-####1}{tagabspage}{-1}=##1} %mcid is on current page {% yes \prop_put:Nee \l_@@_tmpa_prop - {\@@_property_ref:enn{mcid-####1}{tagmcid}{-1}} + {\property_ref:enn{mcid-####1}{tagmcid}{-1}} {\prop_item:Nn \g_@@_mc_parenttree_prop {####1}} } } diff --git a/macros/latex/contrib/tagpdf/tagpdf-user.dtx b/macros/latex/contrib/tagpdf/tagpdf-user.dtx index 916ff041d0..86cd4aced0 100644 --- a/macros/latex/contrib/tagpdf/tagpdf-user.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf-user.dtx @@ -33,7 +33,8 @@ %</driver> % \fi % \title{^^A -% The \pkg{tagpdf-user} module\\ Code related to \LaTeX2e user commands and document commands ^^A +% The \pkg{tagpdf-user} module\\ +% Code related to \LaTeX2e user commands and document commands ^^A % \\ Part of the tagpdf package % } % @@ -46,7 +47,7 @@ % }^^A % } % -% \date{Version 0.99c, released 2024-06-20} +% \date{Version 0.99g, released 2024-10-27} % \maketitle % \begin{documentation} % \section{Setup commands} @@ -265,41 +266,53 @@ % \begin{syntax} % \cs{tag_socket_use:n} \Arg{socket name}\\ % \cs{tag_socket_use:nn} \Arg{socket name} \Arg{socket argument}\\ +% \cs{tag_socket_use:nn} \Arg{socket name} \Arg{socket argument} \Arg{socket argument}\\ +% \cs{tag_socket_use_expandable:n} \Arg{socket name}\\ % \cs{UseTaggingSocket} \Arg{socket name} \\ % \cs{UseTaggingSocket} \Arg{socket name} \Arg{socket argument}\\ +% \cs{UseTaggingSocket} \Arg{socket name} \Arg{socket argument}\Arg{socket argument}\\ % \end{syntax} % \end{function} - -% The next \LaTeX{} (2024-06-01) will use special sockets for the tagging. % -% These sockets will use names starting -% with \texttt{tagsupport/}. Usually, these sockets have exactly two -% plugs defined: \texttt{noop} (when no tagging is requested or -% tagging is not wanted for some reason) and -% a second plug that enables the tagging. There -% may be more, e.g., tagging with special debugging, etc., but right -% now it is usually just on or off. -% % Given that we sometimes have to suspend tagging, it would be fairly % inefficient to put different plugs into these sockets whenever that % happens. We therefore offer \cs{UseTaggingSocket} which is like -% \cs{UseSocket} except that the socket name is specified without -% \texttt{tagsupport/}, i.e., +% \cs{UseSocket} except that is expects a socket starting with +% \texttt{tagsupport/} but the socket name is specified without +% this prefix, i.e., % \begin{quote} % \verb=\UseTaggingSocket{foo}= $\to$ % \verb=\UseSocket{tagsupport/foo}= -% \end{quote} -% Beside being slightly shorter, the big advantage is that this way -% we can change \cs{UseTaggingSocket} to do nothing by switching a boolean -% instead of changing the plugs of the tagging support sockets back and forth. +% \end{quote}. +% +% Beside being slightly shorter, the big advantage is that this way +% we can change \cs{UseTaggingSocket} to do nothing by switching a boolean +% instead of changing the plugs of the tagging support sockets back and forth. % -% It is possible to use the tagging support sockets with -% \cs{UseSocket} directly, but in this case the socket remains active -% if e.g. \cs{SuspendTagging} is in force. There may be reasons for doing -% that but in general we expect to always use \cs{UseTaggingSocket}. +% Usually, these sockets have (beside the default plug defined for every socket) +% one additional plug defined and directly assigned. This plug is used when +% tagging is active. +% There may be more plugs, e.g., tagging with special debugging or special behaviour +% depending on the class or PDF version etc., but right now it is usually just on or off. % -% The L3 programming layer versions \cs{tag_socket_use:n} and -% \cs{tag_socket_use:nn} are slightly more efficient than +% When tagging is suspended they all have the same predefined behaviour: +% The sockets with zero arguments do nothing. The sockets with one argument +% gobble their argument. The sockets with two arguments +% will drop their first argument and pass the second unchanged. +% +% It is possible to use the tagging support sockets with +% \cs{UseSocket} directly, but in this case the socket remains active +% if e.g. \cs{SuspendTagging} is in force. There may be reasons for doing +% that but in general we expect to always use \cs{UseTaggingSocket}. +% +% For special cases like in some \cs{halign} contexts we need a fully expandable +% version of the commend. For these cases, \cs{UseExpandableTaggingSocket} can be +% used. To allow being expandable, it does not output any debugging information +% if \cs{DebugSocketsOn} is in effect and therefore should be avoided whenever possible. +% +% The L3 programming layer versions \cs{tag_socket_use_expandable:n}, \cs{tag_socket_use:n}, and +% \cs{tag_socket_use:nn}, \cs{tag_socket_use:nnn} +% are slightly more efficient than % \cs{UseTaggingSocket} because they do not have to determine how % many arguments the socket takes when disabling it. % \end{documentation} @@ -309,7 +322,7 @@ % \begin{macrocode} %<@@=tag> %<*header> -\ProvidesExplPackage {tagpdf-user} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-user} {2024-10-27} {0.99g} {tagpdf - user commands} %</header> % \end{macrocode} @@ -408,21 +421,29 @@ % \section{Socket support} % Until we can be sure that the kernel defines the commands we provide them before % redefining them: +% The expandable version will only work correctly after the 2024-11-01 release. % \begin{macrocode} %<*base> \providecommand\tag_socket_use:n[1]{} \providecommand\tag_socket_use:nn[2]{} +\providecommand\tag_socket_use:nnn[3]{} +\providecommand\tag_socket_use_expandable:n[1]{} +\providecommand\socket_use_expandable:nw [1] { + \use:c { __socket_#1_plug_ \str_use:c { l__socket_#1_plug_str } :w } +} \providecommand\UseTaggingSocket[1]{} +\providecommand\UseExpandableTaggingSocket[1]{} %</base> % \end{macrocode} % -% \begin{macro}{\tag_socket_use:n,\tag_socket_use:nn,\UseTaggingSocket} +% \begin{macro}{\tag_socket_use:n,\tag_socket_use:nn,\tag_socket_use:nnn,\UseTaggingSocket, +% \tag_socket_use_expandable:n,\UseExpandableTaggingSocket} % \begin{macrocode} %<*package> -\cs_set_protected:Npn \tag_socket_use:n #1 +\cs_set_protected:Npn \tag_socket_use:n #1 { \bool_if:NT \l_@@_active_socket_bool - { \UseSocket {tagsupport/#1} } + { \socket_use:n {tagsupport/#1} } } % \end{macrocode} % @@ -430,22 +451,58 @@ \cs_set_protected:Npn \tag_socket_use:nn #1#2 { \bool_if:NT \l_@@_active_socket_bool - { \UseSocket {tagsupport/#1} {#2} } + { \socket_use:nn {tagsupport/#1} {#2} } } % \end{macrocode} % % \begin{macrocode} +\cs_set_protected:Npn \tag_socket_use:nnn #1#2#3 + { + \bool_if:NT \l_@@_active_socket_bool + { \socket_use:nnn {tagsupport/#1} {#2} {#3} } + } +% \end{macrocode} +% \begin{macrocode} +\cs_set:Npn \tag_socket_use_expandable:n #1 + { + \bool_if:NT \l_@@_active_socket_bool + { \socket_use_expandable:n {tagsupport/#1} } + } +% \end{macrocode} +% \begin{macrocode} \cs_set_protected:Npn \UseTaggingSocket #1 { \bool_if:NTF \l_@@_active_socket_bool - { \UseSocket{tagsupport/#1} } + { \socket_use:nw {tagsupport/#1} } + { + \int_case:nnF + { \int_use:c { c__socket_tagsupport/#1_args_int } } + { + 0 \prg_do_nothing: + 1 \use_none:n + 2 \use_ii:nn +% \end{macrocode} +% We do not expect tagging sockets with more than one or two +% arguments, so for now we only provide those. +% \begin{macrocode} + } + \ERRORusetaggingsocket + } + } +% \end{macrocode} + +% \begin{macrocode} +\cs_set:Npn \UseExpandableTaggingSocket #1 + { + \bool_if:NTF \l_@@_active_socket_bool + { \socket_use_expandable:nw {tagsupport/#1} } { \int_case:nnF { \int_use:c { c__socket_tagsupport/#1_args_int } } { 0 \prg_do_nothing: 1 \use_none:n - 2 \use_none:nn + 2 \use_ii:nn % \end{macrocode} % We do not expect tagging sockets with more than one or two % arguments, so for now we only provide those. @@ -866,9 +923,9 @@ {\tagmcbegin{tag=Lbl}} {#1} } - \tag_stop:n{hangfrom} + \tag_suspend:n{hangfrom} \hangindent \wd\@tempboxa\noindent - \tag_start:n{hangfrom} + \tag_resume:n{hangfrom} \tagmcbegin{}\box\@tempboxa\tagmcend\tagstructend\tagmcbegin{} } } @@ -976,83 +1033,88 @@ % at some time) and a more sophisticated one that must % be used if the block code is used. % It is possible that we will need more variants, so -% we setup a socket so that the code can be easily switched. +% we setup a socket so that the code can be easily switched. +% This code should move into lttagging, so we add a test for +% the transition. % \begin{macrocode} -\socket_new:nn {tagsupport/para/begin}{0} -\socket_new:nn {tagsupport/para/end}{0} - -\socket_new_plug:nnn{tagsupport/para/begin}{plain} +\str_if_exist:cF { l__socket_tagsupport/para/begin_plug_str } { - \bool_if:NT \l_@@_para_bool + \socket_new:nn {tagsupport/para/begin}{0} + \socket_new:nn {tagsupport/para/end}{0} + + \socket_new_plug:nnn{tagsupport/para/begin}{plain} { - \bool_if:NF \l_@@_para_flattened_bool - { - \@@_gincr_para_main_begin_int: - \tag_struct_begin:n + \bool_if:NT \l_@@_para_bool + { + \bool_if:NF \l_@@_para_flattened_bool { - tag=\l_@@_para_main_tag_tl, + \@@_gincr_para_main_begin_int: + \tag_struct_begin:n + { + tag=\l_@@_para_main_tag_tl, + } + \@@_para_main_store_struct: } - \@@_para_main_store_struct: - } - \@@_gincr_para_begin_int: - \tag_struct_begin:n {tag=\l_@@_para_tag_tl} - \@@_check_para_begin_show:nn {green}{} - \tag_mc_begin:n {} - } - } -\socket_new_plug:nnn{tagsupport/para/begin}{block} - { - \bool_if:NT \l_@@_para_bool + \@@_gincr_para_begin_int: + \tag_struct_begin:n {tag=\l_@@_para_tag_tl} + \@@_check_para_begin_show:nn {green}{} + \tag_mc_begin:n {} + } + } + \socket_new_plug:nnn{tagsupport/para/begin}{block} { - \legacy_if:nF { @inlabel } + \bool_if:NT \l_@@_para_bool { - \@@_check_typeout_v:n - {==>~ @endpe = \legacy_if:nTF { @endpe }{true}{false} \on@line } - \legacy_if:nF { @endpe } - { - \bool_if:NF \l_@@_para_flattened_bool - { - \@@_gincr_para_main_begin_int: - \tag_struct_begin:n - { - tag=\l_@@_para_main_tag_tl, - attribute-class=\l_@@_para_main_attr_class_tl, - } - \@@_para_main_store_struct: + \legacy_if:nF { @inlabel } + { + \@@_check_typeout_v:n + {==>~ @endpe = \legacy_if:nTF { @endpe }{true}{false} \on@line } + \legacy_if:nF { @endpe } + { + \bool_if:NF \l_@@_para_flattened_bool + { + \@@_gincr_para_main_begin_int: + \tag_struct_begin:n + { + tag=\l_@@_para_main_tag_tl, + attribute-class=\l_@@_para_main_attr_class_tl, + } + \@@_para_main_store_struct: + } } - } - \@@_gincr_para_begin_int: - \@@_check_typeout_v:n {==>~increment~ P \on@line } - \tag_struct_begin:n - { - tag=\l_@@_para_tag_tl - ,attribute-class=\l_@@_para_attr_class_tl - } - \@@_check_para_begin_show:nn {green}{\PARALABEL} - \tag_mc_begin:n {} - } - } - } + \@@_gincr_para_begin_int: + \@@_check_typeout_v:n {==>~increment~ P \on@line } + \tag_struct_begin:n + { + tag=\l_@@_para_tag_tl + ,attribute-class=\l_@@_para_attr_class_tl + } + \@@_check_para_begin_show:nn {green}{\PARALABEL} + \tag_mc_begin:n {} + } + } + } % \end{macrocode} % there was no real difference between the original and % in the block variant, only a debug message. We therefore % define only a plain variant. % \begin{macrocode} -\socket_new_plug:nnn{tagsupport/para/end}{plain} - { - \bool_if:NT \l_@@_para_bool + \socket_new_plug:nnn{tagsupport/para/end}{plain} { - \@@_gincr_para_end_int: - \@@_check_typeout_v:n {==>~increment~ /P \on@line } - \tag_mc_end: - \@@_check_para_end_show:nn {red}{} - \tag_struct_end: - \bool_if:NF \l_@@_para_flattened_bool - { - \@@_gincr_para_main_end_int: - \tag_struct_end: - } - } + \bool_if:NT \l_@@_para_bool + { + \@@_gincr_para_end_int: + \@@_check_typeout_v:n {==>~increment~ /P \on@line } + \tag_mc_end: + \@@_check_para_end_show:nn {red}{} + \tag_struct_end: + \bool_if:NF \l_@@_para_flattened_bool + { + \@@_gincr_para_main_end_int: + \tag_struct_end: + } + } + } } % \end{macrocode} % By default we assign the plain plug: @@ -1166,7 +1228,7 @@ % \tagpdfparaOff % } % This two command switch para mode on and off. |\tagpdfsetup| could be used -% too but is longer. An alternative is |\tag_tool:n{para=false}| +% too but is longer. An alternative is |\tag_tool:n{para/tagging=false}| % \begin{macrocode} %<base>\newcommand\tagpdfparaOn {} %<base>\newcommand\tagpdfparaOff{} @@ -1246,11 +1308,11 @@ \bool_gset_false:N \g_@@_in_mc_bool } \tag_mc_begin:n {artifact} - \tag_stop:n{headfoot} + \tag_suspend:n{headfoot} } \cs_new_protected:Npn \@@_exclude_headfoot_end: { - \tag_start:n{headfoot} + \tag_resume:n{headfoot} \tag_mc_end: \bool_if:NTF \g_@@_mode_lua_bool { @@ -1277,12 +1339,12 @@ } \tag_struct_begin:n{tag=Artifact,attribute-class=@@/attr/#1} \tag_mc_begin:n {artifact=#1} - \tag_stop:n{headfoot} + \tag_suspend:n{headfoot} } \cs_new_protected:Npn \@@_exclude_struct_headfoot_end: { - \tag_start:n{headfoot} + \tag_resume:n{headfoot} \tag_mc_end: \tag_struct_end: \bool_if:NTF \g_@@_mode_lua_bool diff --git a/macros/latex/contrib/tagpdf/tagpdf.dtx b/macros/latex/contrib/tagpdf/tagpdf.dtx index e58570340e..eed54ca191 100644 --- a/macros/latex/contrib/tagpdf/tagpdf.dtx +++ b/macros/latex/contrib/tagpdf/tagpdf.dtx @@ -21,62 +21,128 @@ % https://github.com/latex3/tagpdf % % for those people who are interested. -% +%<*driver> +\DocumentMetadata{} +\documentclass{l3doc} +\usepackage{array,booktabs,caption} +\hypersetup{pdfauthor=Ulrike Fischer, + pdftitle=tagpdf (main module)} +\input{tagpdf-docelements} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> % \fi +% \title{^^A +% The \pkg{tagpdf} main module +% \\ Part of the tagpdf package +% } +% +% \author{^^A +% Ulrike Fischer\thanks +% {^^A +% E-mail: +% \href{mailto:fischer@troubleshooting-tex.de} +% {fischer@troubleshooting-tex.de}^^A +% }^^A +% } +% +% \date{Version 0.99g, released 2024-10-27} +% \maketitle% +% % \begin{documentation} -% \begin{function}{ -% \tag_stop:, \tag_start:, -% \tagstop, \tagstart } +% \begin{function}{\tag_suspend:n, \tag_resume:n,\tag_stop:n, \tag_start:n }% +% \begin{syntax} +% \cs{tag_suspend:n}\Arg{label}\\ +% \cs{tag_resume:n}\Arg{label}\\ +% \cs{tag_stop:n}\Arg{label} (\emph{deprecated})\\ +% \cs{tag_start:n}\Arg{label} (\emph{deprecated}) +% \end{syntax} % We need commands to stop tagging in some places. % They switches three local booleans and also stop the counting -% of paragraphs. If they are nested an inner \cs{tag_start:} will not -% restart tagging. +% of paragraphs. If they are nested an inner \cs{tag_resume:n} will not +% restart tagging. +% \meta{label} is only used in debugging messages to allow to follow the nesting +% and to identify which code is disabling the tagging. +% The label is not expanded so can be a single token, e.g. |\caption|. +% |\tag_suspend:n| and |\tag_resume:n| are the l3-layer variants of +% |\SuspendTagging| and |\ResumeTagging| and will be provided by the kernel +% in the next release. % \end{function} -% -% \begin{function}{\tag_stop:n, \tag_start:n }% -% \begin{syntax} -% \cs{tag_stop:n}\Arg{label} -% \cs{tag_start:n}\Arg{label}\\ -% \end{syntax} -% The commands with argument allow to give a label. This is only used -% in debugging messages to allow to follow the nesting. +% +% \begin{function}{ +% \tag_stop:, \tag_start:, +% \tagstop, \tagstart } +% \emph{deprecated} These are variants of the above commands +% without the debuging level. They are now deprecated and it +% is recommended to use the kernel command +% |\SuspendTagging|, |\ResumeTagging|, |\tag_suspend:n| and |\tag_resume:n| +% instead. % \end{function} % -% \begin{function}{activate/spaces (setup-key)} +% +% \begin{setupkeydecl}{activate/spaces} % |activate/spaces| activates the additional parsing needed for % interword spaces. It replaces the deprecated key |interwordspace|. -% \end{function} +% \end{setupkeydecl} % -% \begin{function}{activate/mc (setup-key), -% activate/tree (setup-key), -% activate/struct (setup-key), -% activate/all (setup-key), +% \begin{setupkeydecl}{activate/mc, % activate-mc (deprecated), +% } +% A key to to activate the marked content code. It should be used +% only in special cases, e.g. for debugging. +% \end{setupkeydecl} +% +% \begin{setupkeydecl}{ +% activate/tree, % activate-tree (deprecated), +% } +% This key activates the code that finalize the +% various trees. It should be used +% only in special cases, e.g. for debugging. +% \end{setupkeydecl} +% \begin{setupkeydecl}{ +% activate/struct, % activate-struct (deprecated), +% } +% This key activates the code for structures. +% It should be used +% only in special cases, e.g. for debugging. +% \end{setupkeydecl} +% +% \begin{setupkeydecl}{ +% activate/all, % activate-all (deprecated), % } -% Keys to activate the various tagging steps. -% \end{function} -%\begin{function}{activate/struct-dest (setup-key),no-struct-dest (deprecated)} +% This is a meta key for the three previous keys +% and is normally what should be used to activate tagging. +% \end{setupkeydecl} +% +%\begin{setupkeydecl}{activate/struct-dest,no-struct-dest (deprecated)} % The key allows to suppress the creation of structure destinations -% \end{function} +% \end{setupkeydecl} % -% \begin{function}{debug/log (setup-key)} +% \begin{setupkeydecl}{debug/log} % The |debug/log| key takes currently the values |none|, |v|, |vv|, |vvv|, |all|. % More details are in \texttt{tagpdf-checks}. -% \end{function} +% \end{setupkeydecl} % -% \begin{function}{activate/tagunmarked (setup-key), tagunmarked (deprecated) } +% \begin{setupkeydecl}{activate/tagunmarked, tagunmarked (deprecated) } % This key allows to set if (in luamode) unmarked text should be % marked up as artifact. The initial value is true. -% \end{function} +% \end{setupkeydecl} % -% \begin{function}{page/tabsorder (setup-key), tabsorder (deprecated)} +% \begin{setupkeydecl}{activate/softhyphen} +% This key allows to activates automatic handling of hyphens inserted +% by hyphenation. It only is used in luamode and replaces hyphens +% by U+00AD if the font supports this. +% \end{setupkeydecl} +% +% \begin{setupkeydecl}{page/tabsorder, tabsorder (deprecated)} % This sets the tabsorder on a page. The values are |row|, |column|, |structure| (default) % or |none|. Currently this is set more or less globally. More finer control can be % added if needed. -% \end{function} +% \end{setupkeydecl} % % \begin{function}{tagstruct,tagstructobj,tagabspage,tagmcabs,tagmcid} % These are attributes used by the label/ref system. @@ -87,8 +153,8 @@ % \begin{macrocode} %<@@=tag> %<*package> -\ProvidesExplPackage {tagpdf} {2024-06-20} {0.99c} - { A package to experiment with pdf tagging } +\ProvidesExplPackage {tagpdf} {2024-10-27} {0.99g} + { LaTeX kernel code for PDF tagging } \bool_if:nF { @@ -113,7 +179,7 @@ % \end{macrocode} %<*debug> % \begin{macrocode} -\ProvidesExplPackage {tagpdf-debug} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-debug} {2024-10-27} {0.99g} { debug code for tagpdf } \@ifpackageloaded{tagpdf}{}{\PackageWarning{tagpdf-debug}{tagpdf~not~loaded,~quitting}\endinput} % \end{macrocode} @@ -136,7 +202,7 @@ % we define a base package with dummy functions % \begin{macrocode} %<*base> -\ProvidesExplPackage {tagpdf-base} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdf-base} {2024-10-27} {0.99g} {part of tagpdf - provide base, no-op versions of the user commands } %</base> % \end{macrocode} @@ -185,34 +251,31 @@ } %</base> % \end{macrocode} -% \subsection{Indexed objects} -% 2024-04-11: Temporary code! Can be removed after the next expl3 release! +% \subsection{Patches related to Ref improvement} +% 2024-09-09: Temporary code. Can be removed when the latex-lab-footnote +% and latex-lab-toc code have been adapted to the better Ref handling. % \begin{macrocode} -\cs_if_free:NT \pdf_object_new_indexed:nn - { - \cs_generate_variant:Nn \pdf_object_new:n {e} - \cs_generate_variant:Nn \pdf_object_write:nnn {enn} - \cs_new_protected:Npn \pdf_object_new_indexed:nn #1 #2 - { - \pdf_object_new:e {#1/\int_eval:n{#2}} - } - \cs_new_protected:Npn \pdf_object_write_indexed:nnnn #1 #2 #3 #4 - { - \pdf_object_write:enn {#1/\int_eval:n{#2}}{#3}{#4} - } - \cs_generate_variant:Nn \pdf_object_write_indexed:nnnn {nnne} - \cs_new:Npn\pdf_object_ref_indexed:nn #1 #2 - { - \pdf_object_ref:e {#1/\int_eval:n{#2}} - } - \cs_new:Npn \__kernel_pdf_object_id_indexed:nn #1 #2 - { - \int_use:c - { c__pdf_object_ #1/\int_eval:n{#2} _int } - } - } - +%<*package> +\AddToHook{package/latex-lab-testphase-new-or-2/after} + { + \cs_set_protected:Npn \__fnote_gput_ref:nn #1 #2 %#1 the structure number receiving the ref #2 + { + \tag_struct_gput:nnn {#1}{ref_num}{#2} + } + } +\AddToHook{package/latex-lab-testphase-toc/after} + { + \cs_set_protected:Npn \g_@@_struct_ref_by_dest: + { + \prop_map_inline:Nn\g_@@_struct_ref_by_dest_prop + { + \tag_struct_gput:nnn {##1}{ref_dest}{##2} + } + } + } +%</package> % \end{macrocode} +% % \subsection{a LastPage label} % See also issue \#2 in Accessible-xref % \begin{macro}{\@@_lastpagelabel:} @@ -245,6 +308,7 @@ % { % \l_@@_tmpa_tl, % \l_@@_tmpb_tl, +% \l_@@_Ref_tmpa_tl, % \l_@@_get_tmpc_tl, % \l_@@_get_parent_tmpa_tl % \l_@@_get_parent_tmpb_tl @@ -261,6 +325,7 @@ % \begin{macrocode} \tl_new:N \l_@@_tmpa_tl \tl_new:N \l_@@_tmpb_tl +\tl_new:N \l_@@_Ref_tmpa_tl \tl_new:N \l_@@_get_tmpc_tl \tl_new:N \l_@@_get_parent_tmpa_tl \tl_new:N \l_@@_get_parent_tmpb_tl @@ -354,6 +419,13 @@ % \end{macrocode} % \end{variable} % +% \begin{variable}{\g_@@_softhyphen_bool} +% This boolean controls if the code should try to automatically +% handle hyphens from hyphenation. It is currently only used in luamode. +% \begin{macrocode} +\bool_new:N \g_@@_softhyphen_bool +% \end{macrocode} +% \end{variable} % \section{Variants of l3 commands} % \begin{macrocode} \prg_generate_conditional_variant:Nnn \pdf_object_if_exist:n {e}{T,F,TF} @@ -369,24 +441,10 @@ % \end{macrocode} % % \section{Label and Reference commands} -% To ease transition to properties we setup internal definition. They can be replaced -% by the property definitions once that is released. -% %** do it! -% \begin{macro}{\@@_property_new:nnnn,\@@_property_gset:nnnn,\@@_property_ref:nnn} -% At first a command to define new properties -% \begin{macrocode} - \cs_new_eq:NN \@@_property_new:nnnn \property_new:nnnn -% \end{macrocode} -% For the non-shipout code we need also the option to reset property -% \begin{macrocode} - \cs_new_eq:NN \@@_property_gset:nnnn \property_gset:nnnn -% \end{macrocode} -% The command to reference while giving a local default. -% \begin{macrocode} - \cs_new_eq:NN \@@_property_ref:nnn \property_ref:nnn - \cs_new_eq:NN \@@_property_ref:nn \property_ref:nn -% \end{macrocode} -% The command to record +% The code uses mostly the kernel properties but need a few local variants. +% \begin{macro}{\@@_property_record:nn} +% The command to record a property while preserving the spaces similar to the standard +% \cs{label}. % \begin{macrocode} \cs_new_protected:Npn \@@_property_record:nn #1#2 { @@ -398,8 +456,8 @@ % \end{macrocode} % And a few variants % \begin{macrocode} -\cs_generate_variant:Nn \@@_property_ref:nnn {enn} -\cs_generate_variant:Nn \@@_property_ref:nn {en} +\cs_generate_variant:Nn \property_ref:nnn {enn} +\cs_generate_variant:Nn \property_ref:nn {en} \cs_generate_variant:Nn \@@_property_record:nn {en,eV} % \end{macrocode} % \end{macro} @@ -410,7 +468,7 @@ % \begin{macrocode} \cs_new:Npn \@@_property_ref_lastpage:nn #1 #2 { - \@@_property_ref:nnn {@tag@LastPage}{#1}{#2} + \property_ref:nnn {@tag@LastPage}{#1}{#2} } % \end{macrocode} %\end{macro} @@ -427,21 +485,21 @@ % With mc-chunks we store the absolute page number |tagabspage|, % the absolute id |tagmcabc|, and the id on the page |tagmcid|. % \begin{macrocode} -\@@_property_new:nnnn +\property_new:nnnn { tagstruct } { now } - {0} { \int_use:N \c@g_@@_struct_abs_int } -\@@_property_new:nnnn { tagstructobj } { now } {} + {1} { \int_use:N \c@g_@@_struct_abs_int } +\property_new:nnnn { tagstructobj } { now } {} { \pdf_object_ref_indexed:nn { @@/struct } { \c@g_@@_struct_abs_int } } -\@@_property_new:nnnn +\property_new:nnnn { tagabspage } { shipout } {0} { \int_use:N \g_shipout_readonly_int } -\@@_property_new:nnnn { tagmcabs } { now } +\property_new:nnnn { tagmcabs } { now } {0} { \int_use:N \c@g_@@_MCID_abs_int } \flag_new:n { @@/mcid } -\@@_property_new:nnnn {tagmcid } { shipout } +\property_new:nnnn {tagmcid } { shipout } {0} { \flag_height:n { @@/mcid } } % \end{macrocode} @@ -469,6 +527,7 @@ \cs_set_eq:NN \@@_seq_new:N \seq_new:N \cs_set_eq:NN \@@_prop_gput:Nnn \prop_gput:Nnn \cs_set_eq:NN \@@_seq_gput_right:Nn \seq_gput_right:Nn +\cs_set_eq:NN \@@_seq_gput_left:Nn \seq_gput_left:Nn \cs_set_eq:NN \@@_seq_item:cn \seq_item:cn \cs_set_eq:NN \@@_prop_item:cn \prop_item:cn \cs_set_eq:NN \@@_seq_show:N \seq_show:N @@ -476,6 +535,7 @@ % cnx temporary needed for latex-lab-graphic code \cs_generate_variant:Nn \@@_prop_gput:Nnn { Nen , Nee, Nne , cnn, cen, cne, cno, cnx} \cs_generate_variant:Nn \@@_seq_gput_right:Nn { Ne , No, cn, ce } +\cs_generate_variant:Nn \@@_seq_gput_left:Nn { ce } \cs_generate_variant:Nn \@@_prop_new:N { c } \cs_generate_variant:Nn \@@_seq_new:N { c } \cs_generate_variant:Nn \@@_seq_show:N { c } @@ -487,6 +547,7 @@ % \section{General tagging commands} % % \begin{macro}{ +% \tag_suspend:n,\tag_resume:n, % \tag_stop:,\tag_start:, % \tag_stop:n,\tag_start:n} % We need commands to stop tagging in some places. @@ -495,7 +556,8 @@ % counter. Tagging only is only restarted at the outer level, % if the current level is 1. % The commands with argument allow to give a label. This is only used -% in debugging messages to allow to follow the nesting. +% in debugging messages to allow to follow the nesting. The label is +% not expand so can e.g. be a single command token. % % \begin{variable}{\l_@@_tag_stop_int} % When stop/start pairs are nested we do not want the inner @@ -512,7 +574,7 @@ % \begin{macrocode} \cs_set_protected:Npn \tag_stop: { -%<debug> \msg_note:nne {tag / debug }{tag-stop}{ \int_use:N \l_@@_tag_stop_int } +%<debug> \msg_note:nne {tag / debug }{tag-suspend}{ \int_use:N \l_@@_tag_stop_int } \int_incr:N \l_@@_tag_stop_int \bool_set_false:N \l_@@_active_struct_bool \bool_set_false:N \l_@@_active_mc_bool @@ -529,22 +591,24 @@ \bool_set_true:N \l_@@_active_socket_bool \@@_start_para_ints: } -%<debug> \msg_note:nne {tag / debug }{tag-start}{ \int_use:N \l_@@_tag_stop_int } +%<debug> \msg_note:nne {tag / debug }{tag-resume}{ \int_use:N \l_@@_tag_stop_int } } \cs_set_eq:NN\tagstop\tag_stop: \cs_set_eq:NN\tagstart\tag_start: % \end{macrocode} % \begin{macrocode} -\cs_set_protected:Npn \tag_stop:n #1 +\cs_set_protected:Npn \tag_suspend:n #1 { -%<debug> \msg_note:nnee {tag / debug }{tag-stop}{ \int_use:N \l_@@_tag_stop_int }{#1} +%<debug> \msg_note:nnee {tag / debug }{tag-suspend} +%<debug> { \int_use:N \l_@@_tag_stop_int }{\exp_not:n{#1}} \int_incr:N \l_@@_tag_stop_int \bool_set_false:N \l_@@_active_struct_bool \bool_set_false:N \l_@@_active_mc_bool \bool_set_false:N \l_@@_active_socket_bool \@@_stop_para_ints: } -\cs_set_protected:Npn \tag_start:n #1 +\cs_set_eq:NN \tag_stop:n \tag_suspend:n +\cs_set_protected:Npn \tag_resume:n #1 { \int_if_zero:nF { \l_@@_tag_stop_int } { \int_decr:N \l_@@_tag_stop_int } \int_if_zero:nT { \l_@@_tag_stop_int } @@ -553,9 +617,11 @@ \bool_set_true:N \l_@@_active_mc_bool \bool_set_true:N \l_@@_active_socket_bool \@@_start_para_ints: - } -%<debug> \msg_note:nnee {tag / debug }{tag-start}{ \int_use:N \l_@@_tag_stop_int }{#1} + } +%<debug> \msg_note:nnee {tag / debug }{tag-resume} +%<debug> { \int_use:N \l_@@_tag_stop_int }{\exp_not:n{#1}} } +\cs_set_eq:NN \tag_start:n \tag_resume:n %</package|debug> %<*base> \cs_new_protected:Npn \tag_stop:{} @@ -564,6 +630,11 @@ \cs_new_protected:Npn \tagstart{} \cs_new_protected:Npn \tag_stop:n #1 {} \cs_new_protected:Npn \tag_start:n #1 {} +% \end{macrocode} +% Until the commands are provided by the kernel we provide them here too +% \begin{macrocode} +\cs_set_eq:NN \tag_suspend:n \tag_stop:n +\cs_set_eq:NN \tag_resume:n \tag_start:n %</base> % \end{macrocode} % \end{macro} @@ -573,13 +644,13 @@ % % TODO: the log-levels must be sorted % -% \begin{macro} +% \begin{setupkeydecl} % { -% activate/mc (setup-key), -% activate/tree (setup-key), -% activate/struct (setup-key), -% activate/all (setup-key), -% activate/struct-dest (setup-key), +% activate/mc, +% activate/tree, +% activate/struct, +% activate/all, +% activate/struct-dest, % } % Keys to (globally) activate tagging. % |activate/spaces| activates the additional parsing needed for @@ -607,14 +678,14 @@ activate-all .default:n = true, no-struct-dest .bool_gset_inverse:N = \g_@@_active_struct_dest_bool, % \end{macrocode} -% \end{macro} -% \begin{macro}{debug/show (setup-key)} +% \end{setupkeydecl} +% \begin{setupkeydecl}{debug/show} % Subkeys/values are defined in various other places. % \begin{macrocode} debug/show .choice:, % \end{macrocode} -% \end{macro} -% \begin{macro}{debug/log (setup-key), debug/uncompress (setup-key), log (deprecated), uncompress (deprecated)} +% \end{setupkeydecl} +% \begin{setupkeydecl}{debug/log, debug/uncompress, log (deprecated), uncompress (deprecated)} % The |log| takes currently the values |none|, |v|, |vv|, |vvv|, |all|. % The description of the log levels is in tagpdf-checks. % \begin{macrocode} @@ -635,8 +706,8 @@ log .meta:n = {debug/log={#1}}, uncompress .code:n = { \pdf_uncompress: }, % \end{macrocode} -% \end{macro} -% \begin{macro}{activate/tagunmarked (setup-key),tagunmarked (deprecated)} +% \end{setupkeydecl} +% \begin{setupkeydecl}{activate/tagunmarked,tagunmarked (deprecated)} % This key allows to set if (in luamode) unmarked text should be % marked up as artifact. The initial value is true. % \begin{macrocode} @@ -647,8 +718,15 @@ % \begin{macrocode} tagunmarked .bool_gset:N = \g_@@_tagunmarked_bool, % \end{macrocode} -% \end{macro} -% \begin{macro}{page/tabsorder (setup-key),tabsorder (deprecated)} +% \end{setupkeydecl} +% \begin{setupkeydecl}{activate/softhyphen} +% This key activates (in luamode) the handling of soft hyphens. +% \begin{macrocode} + activate/softhyphen .bool_gset:N = \g_@@_softhyphen_bool, + activate/softhyphen .initial:n = true, +% \end{macrocode} +% \end{setupkeydecl} +% \begin{setupkeydecl}{page/tabsorder,tabsorder (deprecated)} % This sets the tabsorder on a page. The values are |row|, |column|, |structure| (default) % or |none|. Currently this is set more or less globally. More finer control can be % added if needed. @@ -669,7 +747,7 @@ tabsorder .meta:n = {page/tabsorder={#1}}, } % \end{macrocode} -% \end{macro} +% \end{setupkeydecl} % \section{loading of engine/more dependent code} % \begin{macrocode} \sys_if_engine_luatex:T diff --git a/macros/latex/contrib/tagpdf/tagpdf.pdf b/macros/latex/contrib/tagpdf/tagpdf.pdf Binary files differindex 04d46c2fbf..ec39e603a2 100644 --- a/macros/latex/contrib/tagpdf/tagpdf.pdf +++ b/macros/latex/contrib/tagpdf/tagpdf.pdf diff --git a/macros/latex/contrib/tagpdf/tagpdf.tex b/macros/latex/contrib/tagpdf/tagpdf.tex index ac1c33fa4a..e49d605b58 100644 --- a/macros/latex/contrib/tagpdf/tagpdf.tex +++ b/macros/latex/contrib/tagpdf/tagpdf.tex @@ -16,8 +16,8 @@ } \DebugBlocksOff \makeatletter -\def\UlrikeFischer@package@version{0.99c} -\def\UlrikeFischer@package@date{2024-06-20} +\def\UlrikeFischer@package@version{0.99g} +\def\UlrikeFischer@package@date{2024-10-27} \makeatother \documentclass[bibliography=totoc,a4paper]{article} @@ -99,7 +99,7 @@ in the \pkg{latex-lab} bundle for the Tagged PDF project (i.e., loaded by that c The package is developed and improved in parallel with the code in the \pkg{latex-lab} bundle (part of the core \LaTeX{} distribution), the \pkg{pdfmanagement-testphase} -package (the \LaTeX{} PDF management bundle) and the L3 programming layer (part of of the \LaTeX{} format). +package (the \LaTeX{} PDF management bundle) and the L3 programming layer (part of the \LaTeX{} format). That means you must ensure that all these components are up-to-date and in sync which each other. @@ -338,13 +338,15 @@ improvements and new features in the \LaTeX\ kernel, the latex-lab bundle and the \PDF\ management code and is now much better. Only a few structures---mostly some from currently unsupported packages--- still need manual tagging. But sadly the output of the validators don't quite reflect -the improvements. The documentation uses now \PDF~2.0 and PAC~2024 can't handle -this, it claims that the file is damaged. The Adobe validator has a bug and +the improvements. The documentation uses now \PDF~2.0 and while the newest +PAC~2024 can at least open the file it can not validate properly the file. For example +it complains about the tabular header cells as it doesn't follow attribute classes. +The Adobe validator has a bug and doesn't like the (valid) use of the \texttt{Lbl} tag for the section numbers (see figure~\ref{fig:adobe}). -But even if the documentation passed the tests of the validators: as +But even if the documentation would pass all the tests of the validators: as mentioned above passing a formal test doesn't mean that the content is really good and usable. The user commands used for the tagging and also some of the patches used are still rather crude. So there is lot space for improvement. @@ -354,8 +356,9 @@ Be aware that to create the tagged version a current lualatex-dev and a current version of the pdfmanagment-testphase package is needed. \end{tcolorbox} -\includegraphics[alt=PAC 3 report]{pac3} +\includegraphics[alt=PAC 2024 complains about PDF version]{pac2024-version} +\includegraphics[alt=PAC 2024 complains about table header cells]{pac2024-report} \begin{figure} @@ -504,6 +507,10 @@ The key-val list understands at least the following keys. More keys are defined least \PrintKeyName{activate/mc} has been used. The old name of the key |interwordspace| is still supported but deprecated. +\item[\PrintKeyName{activate/softhyphen}] Boolean. luamode only. + The key activates/deactivates the replacing of hard hyphens from hyphenation + by soft hyphens. By default this is activated. + \item[\PrintKeyName{role/new-tag}] Allows to define new tag names, see section \ref{sec:new-tag} for a description. @@ -721,11 +728,8 @@ To tag a \PDF{} three tasks must be carried out: \minisec{Page stream with marked content} -\tagpdfparaOff - -\tagstructbegin{tag=Figure,alt={Illustration of page stream with marked content},attribute=bbox}% -\tagmcbegin{tag=Figure}% -\begin{tikzpicture}[baseline=(a.north),node distance=2pt,remember picture] +\begin{tikzpicture}[baseline=(a.north),node distance=2pt,remember picture, +alt={Illustration of page stream with marked content}] \node(start){\ldots~\ldots~\ldots}; \node[draw,base right = of start](a) {mc-chunk 1}; \node[draw,base right = of a](b) {mc-chunk 2}; @@ -733,20 +737,13 @@ To tag a \PDF{} three tasks must be carried out: \node[draw,base right = of c](d) {mc-chunk 3}; \node[base right = of d] {\ldots~\ldots}; \end{tikzpicture} -\tagmcend\tagstructend - -\tagpdfparaOn \minisec{Structure} -\tagpdfparaOff \newlength\ydistance\setlength\ydistance{-0.8cm} -\tagstructbegin{tag=Figure,alt={Illustration of structure},attribute=bbox}% -\tagmcbegin{tag=Figure}% -\begin{tikzpicture}[remember picture,baseline=(root.north)] - +\begin{tikzpicture}[remember picture,baseline=(root.north),alt={Illustration of structure}] \node[draw,anchor=base west] (root) at (0,0) {Sect (start section)}; \node[draw,anchor=base west] at (0.3,\ydistance) {H (header section)}; \node[draw,anchor=base west](aref) at (0.6,2\ydistance){mc-chunk 1}; @@ -758,17 +755,12 @@ To tag a \PDF{} three tasks must be carried out: \node[draw,anchor=base west] at (0.3,8\ydistance){/P (end paragraph)}; \node[draw,anchor=base west] at (0,9\ydistance){/Sect (end section)}; \end{tikzpicture} - \begin{tikzpicture}[remember picture, overlay] \draw[->,red](aref)-|(a); \draw[->,red](bref)-|(b); \draw[->,red](cref)-|(c); \draw[->,red](dref)-|(d); - \end{tikzpicture} -\tagmcend\tagstructend - -\tagpdfparaOn \end{tcolorbox} @@ -1039,7 +1031,7 @@ The key-val list understands the following keys: 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 + the marked content \emph{later} in another structure (if it has been stashed with the previous key). Internally the label name will start with \texttt{tagpdf-}. @@ -1108,8 +1100,8 @@ the command, as the effect of the begin command ends with a new \begin{docCommands} { - {doc name=tagmcuse}, - {doc name=tag_mc_use:n} + {doc name=tagmcuse,doc parameter=\marg{label}}, + {doc name=tag_mc_use:n,doc parameter=\marg{label}} } \end{docCommands} @@ -1183,10 +1175,10 @@ This (expandable) command returns the values of some variables. Currently, the w \item \verb+struct_counter+: This returns a number and works also if only \pkg{tagpdf-base} has been loaded. It gives back the state of - the absolute structure counter and so number of the last structure + the absolute structure counter and so the number of the last structure that has been created. This can be used to detect if in a piece of code there are structure commands. Be aware that this is a \LaTeX{} - counter and so reset in some places. + counter and so is reset in some places. \item \verb+mc_counter+: This returns a number and works also if only \pkg{tagpdf-base} has been loaded. It gives back the state of the @@ -1283,13 +1275,8 @@ add the needed code. \begin{figure} -\tagpdfparaOff -\tagstructbegin{tag=Figure,alt={Illustration of link annotation structure},attribute=bbox}\tagmcbegin{tag=Figure} -\tagstop \input{link-figure-input} -\tagstart -\tagmcend\tagstructend \caption{Structure needed for a link annotation}\label{fig:linkannot} @@ -1712,22 +1699,27 @@ The key-val list understands the following keys: content and structures. \item[\PrintKeyName{label}] This key sets a label by which one can - refer to the structure. It is e.g. used by - \cs{tag\_struct\_use:n} (where a real label is actually not needed - as you can only use structures already defined), and by the |ref| - key (which can refer to future structures). Internally the label - name will start with \texttt{tagpdfstruct-} and it stores the two + refer to the structure. Currently the key writes a property whose + name starts with \texttt{tagpdfstruct-} to the aux-file with the two attributes \texttt{tagstruct} (the structure number) and - \texttt{tagstructobj} (the object reference). + \texttt{tagstructobj} (the object reference) but also stores the + name and the structure number into a prop for use in the current compilation. + The label is e.g. used by \cs{tag\_struct\_use:n} and by the |ref| + key (which can refer to future structures). \item[\PrintKeyName{parent}] With the parent key one can choose another parent. The value is a structure number which must refer to an already existing, previously created structure. Such a structure number can have been stored previously with \cs{tag\_get:n}, but one can also use a label on the parent structure and then use - \cs{ref\_value:nn}\verb+{tagpdfstruct-label}{tagstruct}+ to retrieve + \cs{property\_ref:nn}\verb+{tagpdfstruct-label}{tagstruct}+ to retrieve it. + \item[\PrintKeyName{firstkid}] If this key is used the structure is + added at the left of the kids of the parent structure (if the structure is not stashed). This means that it will be the first kid of the structure (unless some + later structure uses the key too). This can be needed e.g. for a caption as + the PDF reference requires it to be the first or last kid of its structure. + \item[\PrintKeyName{alt}] This key inserts an \texttt{/Alt} value in the dictionary of structure object, see section~\ref{sec:alt}. The value is handled as verbatim string and hex encoded. The value will be @@ -1865,7 +1857,9 @@ The key-val list understands the following keys: structure. The value should be a comma separated list of structure labels set with the |label| key. e.g. |ref={label1,label2}|. It can be used more than once in the - key/value argument and combines the references. + key/value argument and combines the references. See below + in section~\ref{sec:Refkey} for an extended discussion about the |/Ref| + array. \item[\PrintKeyName{E}] This key sets the |/E| key, the expanded form of an abbreviation or an acronym (I couldn't think of a @@ -1890,6 +1884,25 @@ These commands insert a structure previously stashed away as kid into the currently active structure. A structure should be used only once, if the structure already has a parent you will get a warning. +\subsubsection{Updating the \texttt{Ref} key in structures}\label{sec:Refkey} + +Structures that cross reference other structures, e.g. citation commands, table of +content entries, footnote require often a \texttt{Ref} key. \texttt{Ref} +can be added with the |ref| key of \cs{tagstructbegin} described above +but as it is a task that often has to be done automatically in code +there exist also a command that allows to extend the \texttt{Ref} key (and perhaps in future also other keys) later. +This command allows to add the value, the target structure of the \texttt{Ref} key, +with four methods: directly as object reference, through a label name set with the |label| key, through a destination name if a \cs{MakeLinkTarget} has been used in +the target structure---this also works if hyperref has not been loaded---and through +the structure number, which has been stored e.g. in a label. + +\begin{docCommands} + { + {doc name=tag_struct_gput:nnn,doc parameter=\marg{structurenumber}\marg{keyword}\marg{value}}, + }\end{docCommands} + +The allowed \meta{keywords} are \texttt{ref}, \texttt{ref\_label} \texttt{ref\_dest} +and \texttt{ref\_num}. \subsubsection{Root structure} @@ -2051,36 +2064,49 @@ or the output routine is called. \begin{docCommands} { - {doc name=tag_stop:}, - {doc name=tag_start:}, - {doc name=tagstop}, - {doc name=tagstart}, - {doc name=tag_stop:n,doc parameter=\marg{label}}, - {doc name=tag_start:n,doc parameter=\marg{label}} + {doc name=tag_suspend:n,doc parameter=\marg{label}}, + {doc name=tag_resume:n,doc parameter=\marg{label}} } \end{docCommands} -This commands stop and start tagging in the current group by switching +These commands suspend and resume tagging in the current group by switching \emph{local} booleans. They also stop the increasing of the counters which keep track of paragraphs if the correct wrapper commands are used. Restarting tagging is normally only needed if groups can't be used and then -must be done with care: |\tagstart| should normally only restart tagging if +must be done with care: |\tag_resume:n| should normally only restart tagging if the corresponding stop command actually stopped tagging. This is implement through a local counter which keeps track of the level. -The \meta{label} can be used to identify the command in debugging message. +The \meta{label} can be used to identify the command in debugging message. The label is not expanded and so can for example be a single command token. + +The commands are the L3-layer versions of |\SuspendTagging| and |\ResumeTagging| +and will be available in the kernel with the 2024 november release. \begin{taglstlisting} -\tag_stop:n{outer} +\tag_suspend:n{\outercommand} ... - \tag_stop:n{inner} + \tag_suspend:n{\innercommand} ... - \tag_start:n{inner} + \tag_resume:n{\innercommand} ... -\tag_start:n{outer} +\tag_resume:n{\outercommand} \end{taglstlisting} +\begin{docCommands} + { + {doc name=tag_stop:}, + {doc name=tag_start:}, + {doc name=tagstop}, + {doc name=tagstart}, + {doc name=tag_stop:n,doc parameter=\marg{label}}, + {doc name=tag_start:n,doc parameter=\marg{label}} + } +\end{docCommands} + +These commands are now deprecated in favor or |\tag_suspend:n| and |\tag_resume:n| +but are still provided for some time. + \subsection{Lazy and automatic tagging}\label{sec:lazy} @@ -2661,7 +2687,8 @@ already mentioned there are more requirements: is normally not a problem. With pdflatex it could need additional \verb+\pdfglyphtounicode+ commands. - \item Hard and soft hyphen must be distinct. + \item Hard and soft hyphen must be distinct. In luamode this is now handled through + the \texttt{activate/softhyphen} key. For pdftex no solution is known. \item Spaces between words should be space glyphs and not only a horizontal movement. See section~\ref{sec:spacechars}. @@ -3041,7 +3068,11 @@ cases building the structure should now need only two or three compilations. The new code requires a current pdfmanagement-testphase and is then used automatically if the new engines are detected. -\subsection{} +\subsection{Changes in version 0.99f} + +Deprecated |\tag_start:|, |\tag_stop:|, |\tag_stop:n| and +|\tag_start:n| in favor of |\tag_suspend:n| and |\tag_resume:n|. + \printbibliography[heading=bibintoc] @@ -3061,10 +3092,7 @@ examples and remarks easier to understand. \item[postfix notation] \PDF{} uses in various places postfix notation. This means that the operator is behind its arguments: -\tagpdfparaOff - -\tagstructbegin{tag=Figure,alt={Illustration of postfix notation},attribute=bbox}\tagmcbegin{tag=Figure} -\begin{tikzpicture}[baseline=(c.base)] +\begin{tikzpicture}[baseline=(c.base),alt={Illustration of postfix notation}] \node[arg](a1) {18}; \node[arg,right=of a1.east](a2) {0}; \node[operator,right= of a2.east](c) {obj}; @@ -3072,7 +3100,7 @@ examples and remarks easier to understand. \draw[->] (c.south) --++(0,-2mm) -| (a2); \end{tikzpicture} -\begin{tikzpicture}[baseline=(c.base)] +\begin{tikzpicture}[baseline=(c.base),alt={Illustration of postfix notation}] \node[arg](a1) {18}; \node[arg,right=of a1.east](a2) {0}; \node[operator,right= of a2.east](c) {R}; @@ -3081,7 +3109,7 @@ examples and remarks easier to understand. \end{tikzpicture} (a reference (operator R) to an object -\begin{tikzpicture}[baseline=(c.base)] +\begin{tikzpicture}[baseline=(c.base),alt={Illustration of postfix notation}] \node[arg](a1) {1}; \node[arg,right = of a1.east](a2) {0}; \node[arg,right = of a2.east](a3) {0}; @@ -3097,19 +3125,15 @@ examples and remarks easier to understand. \draw[->] (c.south) --++(0,-2mm) -|(a1); \end{tikzpicture} -\begin{tikzpicture}[baseline=(c.base)] +\begin{tikzpicture}[baseline=(c.base),alt={Illustration of postfix notation}] \node[arg](a1) {/P}; \node[arg,right = of a1.east](a2) {<</MCID 0>>}; \node[operator,right = of a2.east](c) {BDC}; \draw[->] (c.south) --++(0,-2mm) -| (a1); \draw[->] (c.south) --++(0,-2mm) -| (a2); \end{tikzpicture} -\tagmcend\tagstructend - -\tagpdfparaOn - \item[Names] \PDF{} knows a sort of variable called a \enquote{name}. Names start with a slash and may include any regular characters, but not delimiter or white-space characters. Uppercase @@ -3152,19 +3176,13 @@ examples and remarks easier to understand. \mbox{\texttt{[0 15 0 R (hello) <</Type /X>> [1 2 3]]}} -\tagpdfparaOff - - \tagstructbegin{tag=Figure,alt={Illustration of array},attribute=bbox}\tagmcbegin{tag=Figure} - \begin{tikzpicture}[baseline=(c.base)] + \begin{tikzpicture}[baseline=(c.base),alt={Illustration of array}] \node[arg](a1) {0}; \node[arg,right = of a1.east](a2) {15 0 R}; \node[arg,right = of a2.east](a3) {(hello)}; \node[arg,right = of a3.east](a4) {<</Type /X>>}; \node[arg,right = of a4.east](a5) {[1 2 3]}; \end{tikzpicture} -\tagmcend\tagstructend - -\tagpdfparaOn \item[Dictionaries] Dictionaries are enclosed by double angle diff --git a/macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty b/macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty index 936f8adacd..463790565c 100644 --- a/macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty +++ b/macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty @@ -1,5 +1,5 @@ %\RequirePackage[enable-debug]{expl3}[2018/06/14] -\ProvidesExplPackage {tagpdfdocu-patches} {2024-06-20} {0.99c} +\ProvidesExplPackage {tagpdfdocu-patches} {2024-10-27} {0.99g} {patches/commands for the tagpdf documentation} \RequirePackage{etoolbox,xpatch} @@ -82,10 +82,6 @@ % } \ExplSyntaxOff -% ======== tikzpicture ========== -% TODO this needs some investigation: it messes up the stack if one add paraOff - -\AddToHook{env/tikzpicture/begin}{} %======== tcolorbox ======== % We switch of paratagging at the begin and reenable it locally in before upper. @@ -138,22 +134,6 @@ % ======= footnote ======== % done in testphase code -% ======= bibliography ======== -% biblatex. Creates some empty mc-chunks. -% no internal patches, but redefining begentry/finentry is not safe. -% better hook is needed. - - -\def\blx@endbibliography{% - \csuse{blx@endenv@\blx@theenv}% - \blx@noitem - \blx@locallabelwidth@finish - \endgroup - \blx@bibnote\blx@thepostnote -% \endgroup - \expandafter\endgroup\if@endpe\@doendpe\fi -} - % ====== hyperref ======== % this should probably go into tagpdf, but it is related to % problem of pdf strings and context .... @@ -167,16 +147,147 @@ \let\tagstructend\relax }}{} -%====== picture ======= +%====== tikz picture ======= +% first draft to tag. The main problem is to handle paragraphs. One +\ExplSyntaxOn +\cs_new_protected:Npn\__tag_tikz_savepos:n #1 + { + \tex_savepos:D + \tikz@resetexpandcount% + \tikz@scan@one@point\pgfutil@firstofone(current~bounding~box.north~east)\relax + \pgf@pos@transform{\pgf@x}{\pgf@y}% + \property_record:nn{#1}{xpos,ypos,abspage} + \property_record:nn{#1-tr}{pgfx,pgfy} + \tikz@scan@one@point\pgfutil@firstofone(current~bounding~box.south~west)\relax + \pgf@pos@transform{\pgf@x}{\pgf@y}% + \property_record:nn{#1-bl}{pgfx,pgfy} + \tex_savepos:D + } +\cs_generate_variant:Nn \__tag_tikz_savepos:n {e} + +\NewProperty{pgfx}{now}{0} + { + \dim_compare:nNnTF {\dim_abs:n {\pgf@x}} > {15999pt} + { 0 } + { \dim_to_decimal_in_sp:n{\pgf@x} } + } +\NewProperty{pgfy}{now}{0} + { + \dim_compare:nNnTF {\dim_abs:n {\pgf@y}} > {15999pt} + { 0 } + { \dim_to_decimal_in_sp:n{\pgf@y} } + } + +\cs_new_protected:Npn \__tag_tikz_getbbox: + { + \int_gincr:N\g__tag_graphic_int + \tl_set:Ne\l__tag_graphic_currentlabel_tl {__tag_graphic_\int_use:N \g__tag_graphic_int} + \tl_gset:Ne\g__tag_graphic_lx_tl + { + \dim_to_decimal_in_bp:n + { \property_ref:een {\l__tag_graphic_currentlabel_tl}{xpos}{0}sp + + \property_ref:een {\l__tag_graphic_currentlabel_tl-bl}{pgfx}{0}sp + } + } + \tl_gset:Ne\g__tag_graphic_ly_tl + { + \dim_to_decimal_in_bp:n + { \property_ref:een {\l__tag_graphic_currentlabel_tl}{ypos}{0}sp + + \property_ref:een {\l__tag_graphic_currentlabel_tl-bl}{pgfy}{0}sp + } + } + \tl_gset:Ne\g__tag_graphic_ux_tl + { + \dim_to_decimal_in_bp:n + { \property_ref:een {\l__tag_graphic_currentlabel_tl}{xpos}{0}sp + + \property_ref:een {\l__tag_graphic_currentlabel_tl-tr}{pgfx}{0}sp + } + } + \tl_gset:Ne\g__tag_graphic_uy_tl + { + \dim_to_decimal_in_bp:n + { \property_ref:een {\l__tag_graphic_currentlabel_tl}{ypos}{0}sp + + \property_ref:een {\l__tag_graphic_currentlabel_tl-tr}{pgfy}{0}sp + } + } + } -% PAC3 complained that the BBox is missing, so we are cheating for now -% and add a fix size. -\tagpdfsetup - { - newattribute = - {bbox}{/O /Layout /BBox [0 0 100 100]} +\cs_new_protected:Npn \__tag_graphic_tikz_begin_picture: + { + \tag_mc_end_push: + \bool_if:NTF \l__tag_graphic_artifact_bool + { \tagmcbegin{artifact} } + { + \__tag_tikz_getbbox: + \tagstructbegin{tag=Figure,alt=\l__tag_graphic_alt_tl}\tagmcbegin{} + \__tag_prop_gput:cne + { g__tag_struct_\int_eval:n {\c@g__tag_struct_abs_int}_prop } + { A } + { + << + /O /Layout /BBox~ + [ + \g__tag_graphic_lx_tl\c_space_tl + \g__tag_graphic_ly_tl\c_space_tl + \g__tag_graphic_ux_tl\c_space_tl + \g__tag_graphic_uy_tl + ] + >> + } + \bool_if:NT\l__tag_graphic_debug_bool + { + \__tag_graphic_show_bbox:VVVVne + \g__tag_graphic_lx_tl + \g__tag_graphic_ly_tl + \g__tag_graphic_ux_tl + \g__tag_graphic_uy_tl + {red} + {\int_use:N\g__tag_graphic_int} + } + } + \SuspendTagging{tikz} } +\cs_new_protected:Npn \__tag_graphic_tikz_end_picture: + { + \ResumeTagging{tikz}\tagmcend + \bool_if:NF \l__tag_graphic_artifact_bool + { + \tagstructend + \__tag_tikz_savepos:e {__tag_graphic_\int_use:N \g__tag_graphic_int} + } + \tag_mc_begin_pop:n{} + } + +\tikzset + { + every~picture/.style= + { + artifact, + execute~at~begin~picture=\__tag_graphic_tikz_begin_picture:, + execute~at~end~picture=\__tag_graphic_tikz_end_picture: + } + } +\AddToHook{env/tikzpicture/before}{\leavevmode} + +\tikzset + { + alt/.code= + { + \bool_set_false:N \l__tag_graphic_artifact_bool + \tl_set:Nn \l__tag_graphic_alt_tl{#1} + } + } +\tikzset + { + artifact/.code= + \bool_set_true:N \l__tag_graphic_artifact_bool + } + +\ExplSyntaxOff + + + \endinput diff --git a/macros/latex/contrib/tagpdf/tagpdfsetup-keys.tex b/macros/latex/contrib/tagpdf/tagpdfsetup-keys.tex index 04f8b88aec..a02411c31f 100644 --- a/macros/latex/contrib/tagpdf/tagpdfsetup-keys.tex +++ b/macros/latex/contrib/tagpdf/tagpdfsetup-keys.tex @@ -12,7 +12,8 @@ new key name & old key name & value &type & defined in \\\midrul activate & activate & boolean &meta & tagpdf \\ activate/all & activate-all & boolean &meta & tagpdf\\ -activate/mc & activate-mc & boolean &bool & tagpdf\\ +activate/mc & activate-mc & boolean &bool & tagpdf\\ +activate/softhyphen & --- & boolean &bool & tagpdf \\ activate/spaces & interwordspace & boolean &code & tagpdf-space\\ activate/struct & activate-struct & boolean &bool & tagpdf\\ activate/struct-dest & no-struct-dest&boolean &bool & tagpdf\\ |