summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-09-01 03:01:08 +0000
committerNorbert Preining <norbert@preining.info>2023-09-01 03:01:08 +0000
commita6340ee3ba0294ecd24259d39642d27d804187b2 (patch)
treecc82e5c3e6d1b796a6f2a530aea279ff238b556c /macros
parent7cda3a1cc32bd43dab837e2b73046dab2aeaec98 (diff)
CTAN sync 202309010301
Diffstat (limited to 'macros')
-rw-r--r--macros/context/contrib/context-handlecsv/VERSION2
-rw-r--r--macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/doc/context/third/presvoz/gvoz.pdfbin0 -> 39795 bytes
-rw-r--r--macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/doc/context/third/presvoz/presvoz.pdfbin0 -> 45582 bytes
-rw-r--r--macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/fonts/opentype/presvoz/Flechitas.otfbin0 -> 8276 bytes
-rw-r--r--macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/fonts/opentype/presvoz/iRaccoonShowBold.otfbin0 -> 305436 bytes
-rwxr-xr-xmacros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/gvoz.py574
-rw-r--r--macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/mtx-context-third-presvoz.tex798
-rw-r--r--macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/presvoz.mkxl183
-rw-r--r--macros/context/contrib/context-handlecsv/handlecsv-context-suite/doc/context/third/handlecsv/handlecsv.epubbin808121 -> 0 bytes
-rw-r--r--macros/context/contrib/context-handlecsv/handlecsv-context-suite/doc/context/third/handlecsv/handlecsv.pdfbin201450 -> 0 bytes
-rw-r--r--macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv-extra.lua151
-rw-r--r--macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv-tools.lua178
-rw-r--r--macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv.lua1403
-rw-r--r--macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv.tex29
-rw-r--r--macros/latex/contrib/highlightx/README.md8
-rw-r--r--macros/latex/contrib/highlightx/doc/highlightx-doc.pdfbin0 -> 167620 bytes
-rw-r--r--macros/latex/contrib/highlightx/doc/highlightx-doc.tex843
-rw-r--r--macros/latex/contrib/highlightx/tex/highlightx.sty328
-rw-r--r--macros/latex/contrib/huawei/huawei.dtx131
-rw-r--r--macros/latex/contrib/huawei/huawei.pdfbin808197 -> 809255 bytes
-rw-r--r--macros/latex/contrib/jwjournal/README.md54
-rw-r--r--macros/latex/contrib/jwjournal/jwjournal-demo-cn.pdfbin70876 -> 115307 bytes
-rw-r--r--macros/latex/contrib/jwjournal/jwjournal-demo-cn.tex14
-rw-r--r--macros/latex/contrib/jwjournal/jwjournal-demo-en.pdfbin34389 -> 75218 bytes
-rw-r--r--macros/latex/contrib/jwjournal/jwjournal-demo-en.tex10
-rw-r--r--macros/latex/contrib/jwjournal/jwjournal-demo-fr.pdfbin35287 -> 77570 bytes
-rw-r--r--macros/latex/contrib/jwjournal/jwjournal-demo-fr.tex10
-rw-r--r--macros/latex/contrib/jwjournal/jwjournal.cls79
-rw-r--r--macros/latex/contrib/siunitx/CHANGELOG.md19
-rw-r--r--macros/latex/contrib/siunitx/siunitx-angle.dtx44
-rw-r--r--macros/latex/contrib/siunitx/siunitx-code.pdfbin650000 -> 647812 bytes
-rw-r--r--macros/latex/contrib/siunitx/siunitx-complex.dtx42
-rw-r--r--macros/latex/contrib/siunitx/siunitx-compound.dtx25
-rw-r--r--macros/latex/contrib/siunitx/siunitx-number.dtx458
-rw-r--r--macros/latex/contrib/siunitx/siunitx-print.dtx52
-rw-r--r--macros/latex/contrib/siunitx/siunitx-quantity.dtx14
-rw-r--r--macros/latex/contrib/siunitx/siunitx-symbol.dtx2
-rw-r--r--macros/latex/contrib/siunitx/siunitx-table.dtx33
-rw-r--r--macros/latex/contrib/siunitx/siunitx-unit.dtx6
-rw-r--r--macros/latex/contrib/siunitx/siunitx.dtx11
-rw-r--r--macros/latex/contrib/siunitx/siunitx.pdfbin705590 -> 705662 bytes
-rw-r--r--macros/latex/contrib/tagpdf/README.md4
-rw-r--r--macros/latex/contrib/tagpdf/ex-AF-file.pdf108
-rw-r--r--macros/latex/contrib/tagpdf/ex-alt-actualtext.pdfbin33866 -> 34221 bytes
-rw-r--r--macros/latex/contrib/tagpdf/ex-attribute.pdf94
-rw-r--r--macros/latex/contrib/tagpdf/ex-formula-problem.pdf82
-rw-r--r--macros/latex/contrib/tagpdf/ex-list.pdf164
-rw-r--r--macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.pdf136
-rw-r--r--macros/latex/contrib/tagpdf/ex-softhyphen.pdf82
-rw-r--r--macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf74
-rw-r--r--macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf104
-rw-r--r--macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf106
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-backend.dtx8
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-checks.dtx34
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-code.pdfbin1606540 -> 1571495 bytes
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-data.dtx18
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx155
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx24
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx23
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-roles.dtx4
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-space.dtx4
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-struct.dtx111
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-tree.dtx9
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-user.dtx43
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf.dtx27
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf.pdfbin1077014 -> 1082447 bytes
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf.tex16
-rw-r--r--macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty2
-rw-r--r--macros/luatex/generic/luaotfload/NEWS6
-rw-r--r--macros/luatex/generic/luaotfload/README.md4
-rw-r--r--macros/luatex/generic/luaotfload/filegraph.pdfbin40007 -> 40007 bytes
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-colors.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-conf.pdfbin79696 -> 79551 bytes
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-configuration.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-database.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-dvi.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-embolden.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-fallback.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-features.lua38
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-filelist.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-define.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-init.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-latex.pdfbin506631 -> 506335 bytes
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-letterspace.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-loaders.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-log.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-main.tex6
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-multiscript.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-notdef.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-parsers.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-resolvers.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-scripts.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-status.lua60
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-suppress.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-szss.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.12
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.pdfbin77111 -> 76967 bytes
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tool.rst4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-tounicode.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload-unicode.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.conf.52
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.conf.rst4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.lua4
-rw-r--r--macros/luatex/generic/luaotfload/luaotfload.sty2
-rw-r--r--macros/luatex/generic/luaotfload/scripts-demo.pdfbin21682 -> 21682 bytes
-rw-r--r--macros/luatex/generic/luaotfload/shaper-demo-graphite.pdfbin8562 -> 8562 bytes
-rw-r--r--macros/luatex/generic/luaotfload/shaper-demo.pdfbin8478 -> 8478 bytes
115 files changed, 4344 insertions, 2837 deletions
diff --git a/macros/context/contrib/context-handlecsv/VERSION b/macros/context/contrib/context-handlecsv/VERSION
index 925bf6060c..a81cff9619 100644
--- a/macros/context/contrib/context-handlecsv/VERSION
+++ b/macros/context/contrib/context-handlecsv/VERSION
@@ -1 +1 @@
-2023-05-08
+2023-08-31
diff --git a/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/doc/context/third/presvoz/gvoz.pdf b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/doc/context/third/presvoz/gvoz.pdf
new file mode 100644
index 0000000000..06c4f78b97
--- /dev/null
+++ b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/doc/context/third/presvoz/gvoz.pdf
Binary files differ
diff --git a/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/doc/context/third/presvoz/presvoz.pdf b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/doc/context/third/presvoz/presvoz.pdf
new file mode 100644
index 0000000000..1e09286df2
--- /dev/null
+++ b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/doc/context/third/presvoz/presvoz.pdf
Binary files differ
diff --git a/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/fonts/opentype/presvoz/Flechitas.otf b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/fonts/opentype/presvoz/Flechitas.otf
new file mode 100644
index 0000000000..0107c921d2
--- /dev/null
+++ b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/fonts/opentype/presvoz/Flechitas.otf
Binary files differ
diff --git a/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/fonts/opentype/presvoz/iRaccoonShowBold.otf b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/fonts/opentype/presvoz/iRaccoonShowBold.otf
new file mode 100644
index 0000000000..487baf938b
--- /dev/null
+++ b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/fonts/opentype/presvoz/iRaccoonShowBold.otf
Binary files differ
diff --git a/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/gvoz.py b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/gvoz.py
new file mode 100755
index 0000000000..b7efcb3d2e
--- /dev/null
+++ b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/gvoz.py
@@ -0,0 +1,574 @@
+#!/usr/bin/env python3
+# coding: utf-8
+#
+# Copyright 2021-2022 (C) Pablo Rodríguez
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA or see <http://www.gnu.org/licenses/gpl.html>.
+
+import os, sys, shutil
+import xml.etree.ElementTree as ET
+import cairo
+import gi
+gi.require_version("Gtk", "3.0")
+gi.require_version("Gst", "1.0")
+from gi.repository import Gtk, Gdk, GObject, GLib, Gst, GdkPixbuf
+gi.require_version('Poppler', '0.18')
+from gi.repository import Poppler
+
+Gst.init(sys.argv)
+
+class gvoz:
+ def __init__(self):
+
+ self.execname = os.path.splitext(os.path.basename(sys.argv[0]))[0]
+ self.real_path = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0])))
+ self.program_version = "0.9.9.2"
+
+ if(len(sys.argv) < 2):
+ self.on_file_selection()
+ print("")
+ print(" " + self.execname + "-" + self.program_version
+ + " (https://gvoz.presvoz.tk)")
+ print(" Written by Pablo Rodríguez")
+ print(" Usage: " + self.execname + " presentation.pdf")
+ print("")
+
+ if len(sys.argv) > 1:
+ self.main_filename = sys.argv[1]
+ elif self.dialog_filename != "":
+ self.main_filename = self.dialog_filename
+
+ self.filename = os.path.splitext(self.main_filename)[0]
+
+ if os.path.splitext(self.main_filename)[1] != (".pdf" or ".PDF"):
+ self.pdffilename = os.path.splitext(self.main_filename)[0] + ".pdf"
+ if os.path.isfile(self.pdffilename) == False:
+ self.pdffilename = os.path.splitext(self.main_filename)[0] + ".PDF"
+ if os.path.isfile(self.pdffilename) == False:
+ self.on_file_selection()
+ elif os.path.isfile(self.pdffilename) == False:
+ self.on_file_selection()
+ else:
+ self.pdffilename = self.main_filename
+
+ self.define_soundtimesnames()
+
+ self.uri = Gst.filename_to_uri(os.path.abspath(self.pdffilename))
+
+ self.document = Poppler.Document.new_from_file(self.uri, None)
+ self.n_pages = self.document.get_n_pages()
+ self.page_selector = self.document.get_page(0)
+ self.current_page = 0
+
+ self.win = Gtk.Window()
+ self.win.set_icon_from_file(self.real_path + '/gvoz.svg')
+ self.doc_title = self.document.get_title() or "χαλεπὰ τὰ καλά"
+ self.win.set_title (self.execname + " — " + str(self.current_page + 1) + "/" + str(self.n_pages) + " — " + self.doc_title)
+
+ self.win.set_default_size(500, 500)
+ self.win.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
+
+ self.box = Gtk.Box()
+
+ self.area = Gtk.DrawingArea()
+ self.area.connect("draw", self.on_draw)
+
+ self.box.pack_start(self.area, True, True, 0)
+
+ self.win.add(self.box)
+ self.win.connect("destroy", Gtk.main_quit)
+ self.win.show_all()
+
+ self.win.connect('key-press-event', self.key_press_event)
+
+ self.width, self.height = self.win.get_size()
+ self.page_width, self.page_height= self.page_selector.get_size()
+
+ self.surface = cairo.ImageSurface(cairo.FORMAT_RGB24,
+ int(self.width),
+ int(self.height))
+
+ if sys.platform.startswith('win'):
+ self.player = Gst.parse_launch("wasapisrc low-latency=true ! audio/x-raw,format=F32LE ! wavenc ! filesink location=\"" + self.audiofilename + "\"")
+ else:
+ self.player = Gst.parse_launch("autoaudiosrc ! audio/x-raw,format=F32LE,rate=48000,channels=1 ! wavenc ! filesink location=\"" + self.audiofilename + "\"")
+
+ bus = self.player.get_bus()
+ bus.add_signal_watch()
+ bus.connect('message', self.on_message)
+
+ xmp = self.document.get_metadata()
+ if xmp != None and xmp != "":
+ xmp_root = ET.fromstring(xmp)
+ for language in xmp_root.findall(".//{http://purl.org/dc/elements/1.1/}language"):
+ doc_lang = language.text
+ else:
+ print("The PDF document has no language information")
+
+ title_separator = ". "
+
+ self.sound_metadata = { "title" : "The Title" }
+ self.sound_metadata["genre"] = "Other/Presentation"
+ self.sound_metadata["application-name"] = "GVoz"
+ self.sound_metadata["encoder"] = self.sound_metadata["application-name"]
+ self.sound_metadata["encoder-version"] = self.program_version
+ self.sound_metadata["datetime"] = Gst.DateTime.new_now_local_time()
+ self.sound_metadata["date"] = GLib.Date.new_dmy(self.sound_metadata["datetime"].get_day(),
+ self.sound_metadata["datetime"].get_month(), self.sound_metadata["datetime"].get_year())
+
+ try:
+ doc_lang
+ except NameError:
+ print("\n\"" + os.path.basename(self.pdffilename) +
+ "\" contains no language information.")
+ self.doc_lang = None
+ else:
+ if doc_lang != None and doc_lang != "":
+ self.sound_metadata["language-code"] = doc_lang
+ self.sound_metadata["language-name"] = GstTag.tag_get_language_name(language_code)
+ if doc_lang.startswith('en'):
+ title_separator = ": "
+ else:
+ title_separator = ". "
+
+ if self.document.get_subject() != None and self.document.get_subject() != "":
+ self.sound_metadata["comment"] = self.document.get_subject()
+ elif self.document.get_title() != None and self.document.get_title() != "":
+ self.sound_metadata["title"] = self.document.get_title()
+ if self.document.get_keywords() != None and self.document.get_keywords() != "":
+ self.sound_metadata["keywords"] = self.document.get_keywords()
+ if self.document.get_author() != None and self.document.get_author() != "":
+ self.sound_metadata["artist"] = self.document.get_author()
+ self.sound_metadata["copyright"] = "© " + str(self.sound_metadata["datetime"].get_year()) + " " + self.document.get_author()
+ else:
+ self.sound_metadata["copyright"] = "© " + str(self.sound_metadata["datetime"].get_year())
+
+ self.taglist = Gst.TagList.new_empty()
+
+ self.mp3_converter = Gst.parse_launch("filesrc location=\"" + self.audiofilename + "\" ! decodebin ! audioconvert ! audioresample ! lamemp3enc mono=true cbr=true target=bitrate bitrate=32 ! id3v2mux ! filesink location=\"" + self.mp3_audio + "\"")
+
+ mp3_bus = self.mp3_converter.get_bus()
+ mp3_bus.add_signal_watch()
+ mp3_bus.connect('message', self.on_mp3_message)
+
+ self.mp3_metadata = True
+
+ tagsetter = self.mp3_converter.get_by_interface(Gst.TagSetter)
+ for tag_key, tag_value in self.sound_metadata.items():
+ try:
+ self.taglist.add_value(Gst.TagMergeMode.REPLACE, tag_key, tag_value)
+ except ValueError:
+ print("WARNING: skipping tag %s; value %s is not valid" % (tag_key, tag_value))
+ if not self.taglist.is_empty() and self.mp3_metadata:
+ tagsetter.merge_tags(self.taglist, Gst.TagMergeMode.REPLACE_ALL)
+ print(type(self.mp3_metadata))
+ print(self.taglist.to_string() + "\n")
+ else:
+ print("<<<< WARNING: Could not find element to set tags. >>>")
+
+ # ~ self.opus_converter = Gst.parse_launch("filesrc location=\"" + self.audiofilename + "\" ! decodebin ! audioconvert ! audioresample ! opusenc audio-type=voice bitrate=16000 ! oggmux ! filesink location=\"" + self.opus_audio + "\"")
+
+ # ~ opus_bus = self.opus_converter.get_bus()
+ # ~ opus_bus.add_signal_watch()
+ # ~ opus_bus.connect('message', self.on_opus_message)
+
+ # ~ self.opus_metadata = True
+
+ # ~ tagsetter = self.opus_converter.get_by_interface(Gst.TagSetter)
+ # ~ if not self.taglist.is_empty() and self.opus_metadata:
+ # ~ tagsetter.merge_tags(self.taglist, Gst.TagMergeMode.REPLACE_ALL)
+ # ~ else:
+ # ~ print("<<<< WARNING: Could not find element to set tags. >>>")
+
+ self.use_presvoz = True
+
+ def on_message(self, bus, message):
+ t = message.type
+ if t == Gst.MessageType.EOS:
+ self.player.set_state(Gst.State.NULL)
+ # ~ Gtk.main_quit()
+ elif t == Gst.MessageType.ERROR:
+ err, debug = message.parse_error()
+ print ("Error: %s" % err, debug)
+ self.player.set_state(Gst.State.NULL)
+
+ def on_mp3_message(self, mp3_bus, message):
+ t = message.type
+ if t == Gst.MessageType.EOS:
+ self.mp3_converter.set_state(Gst.State.NULL)
+ self.generate_presentation()
+ Gtk.main_quit()
+ elif t == Gst.MessageType.ERROR:
+ err, debug = message.parse_error()
+ print ("Error: %s" % err, debug)
+ self.mp3_converter.set_state(Gst.State.NULL)
+
+ # ~ def on_opus_message(self, opus_bus, message):
+ # ~ t = message.type
+ # ~ if t == Gst.MessageType.EOS:
+ # ~ self.opus_converter.set_state(Gst.State.NULL)
+ # ~ Gtk.main_quit()
+ # ~ elif t == Gst.MessageType.ERROR:
+ # ~ err, debug = message.parse_error()
+ # ~ print ("Error: %s" % err, debug)
+ # ~ self.opus_converter.set_state(Gst.State.NULL)
+
+ def generate_presentation (self):
+ if shutil.which("context") != None and shutil.which("context") != "" and self.use_presvoz:
+ os.system("context --purgeall --extra=third-presvoz " + self.pdffilename)
+ if os.path.isfile(self.js_timesfilename):
+ os.remove(self.js_timesfilename)
+
+ def define_soundtimesnames (self):
+ if sys.platform.startswith('win'):
+ self.audiofilename = self.filename.replace("\\", "/") + "-audio.wav"
+ self.mp3_audio = self.filename.replace("\\", "/") + "-audio.mp3"
+ self.opus_audio = self.filename.replace("\\", "/") + "-audio.opus"
+ else:
+ self.audiofilename = self.filename + "-audio.wav"
+ self.mp3_audio = self.filename + "-audio.mp3"
+ self.opus_audio = self.filename + "-audio.opus"
+
+ self.times = []
+ self.timesfilename = self.filename + '-times.txt'
+ self.js_timesfilename = self.filename + '-times.js'
+
+ def on_metadata_info (self):
+ if self.document.get_title() != None and self.document.get_title() != "":
+ metadata_info = "\n<b>Title:</b> <i>" + self.document.get_title() + "</i>"
+ if self.document.get_author() != None and self.document.get_author() != "":
+ metadata_info += "\n\n<b>Author:</b> <i>" + self.document.get_author() + "</i>"
+ if self.document.get_subject() != None and self.document.get_subject() != "":
+ metadata_info += "\n\n<b>Comments:</b> <i>" + self.document.get_subject() + "</i>"
+ if self.document.get_keywords() != None and self.document.get_keywords() != "":
+ metadata_info += "\n\n<b>Keywords:</b> <i>" + self.document.get_keywords() + "</i>"
+ if self.doc_lang != None and self.doc_lang != "":
+ metadata_info += "\n\n<b>Language:</b> <i>" + self.sound_metadata['language-name'] + "</i>"
+ else:
+ metadata_info = "\nThe PDF document contains no metadata"
+
+
+ self.sound_metadata["comment"] = self.document.get_subject()
+ if self.document.get_author() != None and self.document.get_author() != "":
+ self.sound_metadata["artist"] = self.document.get_author()
+ self.sound_metadata["copyright"] = "© " + str(self.sound_metadata["datetime"].get_year()) + " " + self.document.get_author()
+ else:
+ self.sound_metadata["copyright"] = "© " + str(self.sound_metadata["datetime"].get_year())
+
+ dialog = Gtk.MessageDialog(
+ # ~ transient_for=self,
+ flags=0,
+ message_type=Gtk.MessageType.INFO,
+ buttons=Gtk.ButtonsType.OK,
+ text="Metadata from PDF Document",
+ )
+
+ dialog.format_secondary_text(metadata_info)
+
+ dialog.props.secondary_use_markup = True
+
+ dialog.run()
+
+ dialog.destroy()
+
+ def on_keys_info (self):
+ keys_info = "\n<b>space</b>\t\tGo to next slide and write its time"
+ keys_info += "\n\t\t\tThis starts and finishes sound recording"
+ keys_info += "\n\t\t\tAfter that, <i>PresVoz</i> will generate the presentation"
+ keys_info += "\n\n<b>a</b>\t\t\tAbout <i>GVoz</i>"
+ keys_info += "\n\n<b>c</b>\t\t\tDon’t generate PDF and <i>Flash</i> presentations with <i>PresVoz</i>"
+ keys_info += "\n\n<b>d</b>\t\t\tShow metadata imported from the PDF document"
+ keys_info += "\n\n<b>h</b>\t\t\tShow key information"
+ keys_info += "\n\n<b>m</b>\t\t\tEnable mouse–click to advance slides"
+ keys_info += "\n\n<b>p</b>\t\t\tPause / unpause sound and times recording"
+ keys_info += "\n\t\t\tWith paused recording, <i>GVoz</i> will exit full–screen"
+ keys_info += "\n\t\t\tWith recording started again, <i>GVoz</i> will go full–screen"
+ # ~ keys_info += "\n\n<b>x</b>\t\t\tRemove metadata in MP3 file\n\t\t\tTitle and author are read from the PDF document\n\t\t\tDates and times are set from the recording"
+ keys_info += "\n\n<b>q</b>\t\t\tQuit <i>GVoz</i> (presentation won’t be generated)"
+
+ dialog = Gtk.MessageDialog(
+ # ~ transient_for=self,
+ flags=0,
+ message_type=Gtk.MessageType.INFO,
+ buttons=Gtk.ButtonsType.OK,
+ text="Keyboard Info",
+ )
+ dialog.format_secondary_text(
+ keys_info
+ )
+
+ dialog.props.secondary_use_markup = True
+
+ dialog.run()
+
+ dialog.destroy()
+
+ def on_presvoz_info (self):
+ presvoz_info = "\nPresentation won’t be generated after sound and times recording."
+ presvoz_info += "\n\nIf you want to generate it, just use <i>Presvoz</i> after <i>GVoz</i> finishes."
+
+ dialog = Gtk.MessageDialog(
+ # ~ transient_for=self,
+ flags=0,
+ message_type=Gtk.MessageType.INFO,
+ buttons=Gtk.ButtonsType.OK,
+ text="Presentation Disabled",
+ )
+ dialog.format_secondary_text(
+ presvoz_info
+ )
+
+ dialog.props.secondary_use_markup = True
+
+ dialog.run()
+
+ dialog.destroy()
+
+ def on_mouse_info (self):
+ mouse_info = "\nMouse has been activated to advance slides."
+ mouse_info += "\n\nMouse–clicks have been enabled to advance slides."
+ mouse_info += "\n\nThere is no way to disable the mouse again."
+
+ dialog = Gtk.MessageDialog(
+ # ~ transient_for=self,
+ flags=0,
+ message_type=Gtk.MessageType.INFO,
+ buttons=Gtk.ButtonsType.OK,
+ text="Mouse Enabled",
+ )
+ dialog.format_secondary_text(mouse_info)
+
+ dialog.props.secondary_use_markup = True
+
+ dialog.run()
+
+ dialog.destroy()
+
+ def on_presvoz_presentation (self):
+ presvoz_presentation = "\nThe selected PDF document is already a presentation with voice."
+ presvoz_presentation += "\n\nPlease, select other PDF document not already generated by <i>PresVoz</i>."
+
+ dialog = Gtk.MessageDialog(
+ # ~ transient_for=self,
+ flags=0,
+ message_type=Gtk.MessageType.INFO,
+ buttons=Gtk.ButtonsType.OK,
+ text="<big><b><i>PresVoz</i> Presentation Detected</b></big>",
+ )
+
+ dialog.format_secondary_text(presvoz_presentation)
+
+ dialog.props.use_markup = True
+ dialog.props.secondary_use_markup = True
+
+ response = dialog.run()
+ if response == Gtk.ResponseType.OK:
+ self.on_file_selection()
+
+ dialog.run()
+
+ dialog.destroy()
+
+ def on_existing_files (self):
+ already_recorded_files = "\nVoice and times have already been recorded in a previous session."
+ already_recorded_files += "\n\nIf you proceed, <tt>" + os.path.basename(self.audiofilename) + "</tt> and <tt>" + os.path.basename(self.timesfilename) + "</tt> will be lost forever."
+ already_recorded_files += "\n\nIf you cancel, you will quit <i>GVoz</i>."
+ already_recorded_files += "\n\nIf you want to keep <tt>" + os.path.basename(self.audiofilename) + "</tt> and <tt>" + os.path.basename(self.timesfilename) + "</tt>, please quit and rename them or move them to another directory."
+ already_recorded_files += "\n\nDo you really want to proceed?\n"
+
+ dialog = Gtk.MessageDialog(
+ # ~ transient_for=self,
+ flags=0,
+ message_type=Gtk.MessageType.WARNING,
+ buttons=Gtk.ButtonsType.YES_NO,
+ text="Existing Sound and Times",
+ )
+
+ dialog.format_secondary_text(already_recorded_files)
+
+ dialog.set_default_response(Gtk.ResponseType.NO)
+
+ dialog.props.secondary_use_markup = True
+
+ response = dialog.run()
+ if response == Gtk.ResponseType.YES:
+ if os.path.isfile(self.audiofilename):
+ os.remove(self.audiofilename)
+ if os.path.isfile(self.timesfilename):
+ os.remove(self.timesfilename)
+ if os.path.isfile(self.mp3_audio):
+ os.remove(self.mp3_audio)
+ if os.path.isfile(self.opus_audio):
+ os.remove(self.opus_audio)
+ elif response == Gtk.ResponseType.NO:
+ Gtk.main_quit()
+
+ dialog.destroy()
+
+ def button_press_event(self, widget, event):
+ if event.button == 1:
+ self.record_and_advance()
+
+ def key_press_event(self, widget, event):
+ if event.keyval != Gdk.keyval_from_name("a"):
+ if event.keyval != Gdk.keyval_from_name("h"):
+ if event.keyval != Gdk.keyval_from_name("q"):
+ if event.keyval != Gdk.keyval_from_name("x"):
+ if event.keyval != Gdk.keyval_from_name("c"):
+ if event.keyval != Gdk.keyval_from_name("m"):
+ if event.keyval != Gdk.keyval_from_name("d"):
+ if self.player.get_state(0)[1] == Gst.State.NULL and self.current_page + 1 <= self.n_pages:
+ if os.path.exists(self.audiofilename) or os.path.exists(self.timesfilename):
+ self.on_existing_files()
+ elif self.document.get_subject() != None:
+ if self.document.get_subject().endswith('🤞🐞 – https://www.presvoz.tk'):
+ self.on_presvoz_presentation()
+ if event.keyval == Gdk.keyval_from_name("h"):
+ self.on_keys_info()
+ if event.keyval == Gdk.keyval_from_name("a"):
+ self.about_info()
+ if event.keyval == Gdk.keyval_from_name("q"):
+ if self.player.get_state(0)[1] == Gst.State.PLAYING or self.player.get_state(0)[1] == Gst.State.PAUSED:
+ self.player.set_state(Gst.State.NULL)
+ self.file_times.close()
+ if os.path.isfile(self.audiofilename):
+ self.mp3_converter.set_state(Gst.State.PLAYING)
+ self.win.set_title (self.execname + " — Converting sound to MP3 format…")
+ Gtk.main_quit()
+ if event.keyval == Gdk.keyval_from_name("x"):
+ self.mp3_metadata = False
+ self.opus_metadata = False
+ if event.keyval == Gdk.keyval_from_name("c"):
+ self.use_presvoz = False
+ self.on_presvoz_info()
+ if event.keyval == Gdk.keyval_from_name("d"):
+ self.on_metadata_info()
+ if event.keyval == Gdk.keyval_from_name("m"):
+ self.win.connect('button-press-event', self.button_press_event)
+ self.on_mouse_info()
+ if event.keyval == Gdk.keyval_from_name("p"):
+ if self.player.get_state(0)[1] == Gst.State.PLAYING:
+ self.win.unfullscreen()
+ self.win.set_title (self.execname + " — " + str(self.current_page + 1) + "/" + str(self.n_pages) + " — " + self.doc_title)
+ self.player.set_state(Gst.State.PAUSED)
+ elif self.player.get_state(0)[1] == Gst.State.PAUSED:
+ self.win.fullscreen()
+ self.player.set_state(Gst.State.PLAYING)
+ if event.keyval == Gdk.keyval_from_name("space"):
+ self.record_and_advance()
+
+ def record_and_advance(self):
+ if self.player.get_state(0)[1] == Gst.State.NULL and self.current_page + 1 <= self.n_pages:
+ self.win.fullscreen()
+ self.player.set_state(Gst.State.PLAYING)
+ self.file_times = open(self.timesfilename, 'w')
+ elif self.player.get_state(0)[1] == Gst.State.PLAYING:
+ if self.current_page + 1 < self.n_pages:
+ self.current_page += 1
+ self.page_selector = self.document.get_page(self.current_page)
+ self.area.set_size_request(int(self.width),int(self.height))
+ self.area.queue_draw()
+ self.file_times.write(str(int(self.player.get_pipeline_clock().get_time()/1000000)) + "\n")
+ elif self.current_page + 1 == self.n_pages:
+ self.win.unfullscreen()
+ self.win.set_title (self.execname + " — " + str(self.current_page + 1) + "/" + str(self.n_pages) + " — " + self.doc_title)
+ self.player.send_event(Gst.Event.new_eos())
+ self.file_times.write(str(int(self.player.get_pipeline_clock().get_time()/1000000)))
+ self.file_times.close()
+ self.current_page += 1
+ self.mp3_converter.set_state(Gst.State.PLAYING)
+ self.win.set_title (self.execname + " — Converting sound to MP3 format…")
+ if shutil.which("context") != None and shutil.which("context") != "" and self.use_presvoz:
+ self.win.set_title (self.execname + " — Generating presentation…")
+ # ~ self.opus_converter.set_state(Gst.State.PLAYING)
+ # ~ self.win.set_title (self.execname + " — Converting sound to Opus format…")
+
+ def on_file_selection(self):
+ dialog = Gtk.FileChooserDialog(
+ title="Please choose a PDF document", action=Gtk.FileChooserAction.OPEN
+ )
+ dialog.add_buttons(
+ Gtk.STOCK_CANCEL,
+ Gtk.ResponseType.CANCEL,
+ Gtk.STOCK_OPEN,
+ Gtk.ResponseType.OK,
+ )
+
+ self.add_filters(dialog)
+
+ response = dialog.run()
+ if response == Gtk.ResponseType.OK:
+ self.dialog_filename = dialog.get_filename()
+ self.pdffilename = self.dialog_filename
+ self.filename = os.path.splitext(self.dialog_filename)[0]
+ self.define_soundtimesnames()
+
+ dialog.destroy()
+
+ def add_filters(self, dialog):
+ filter_pdf = Gtk.FileFilter()
+ filter_pdf.set_name("PDF documents")
+ filter_pdf.add_mime_type("application/pdf")
+ dialog.add_filter(filter_pdf)
+
+ def on_draw(self, widget, cairo_context):
+ add_x = 0
+ add_y = 0
+
+ if (self.area.get_allocated_width()/self.page_width) < (self.area.get_allocated_height()/self.page_height):
+ self.scale = self.area.get_allocated_width()/self.page_width
+ add_y = (((self.area.get_allocated_height()-(self.page_height*self.scale))/2)/self.scale)
+ else:
+ self.scale = self.area.get_allocated_height()/self.page_height
+ add_x = (((self.area.get_allocated_width()-(self.page_width*self.scale))/2)/self.scale)
+
+ # ~ cr = Gdk.cairo_create(self.win.get_window()) # deprecated
+ # ~ cairo_context = cairo.Context(self.surface) # new, seems not required
+
+ cairo_context.set_source_surface(self.surface)
+ cairo_context.set_source_rgba(1, 1, 1)
+
+ if self.scale != 1:
+ cairo_context.scale(self.scale, self.scale)
+
+ cairo_context.translate(add_x, add_y)
+ cairo_context.rectangle(0, 0, self.page_width, self.page_height)
+ cairo_context.fill()
+ self.page_selector.render(cairo_context)
+
+ def about_info (self):
+ dialog = Gtk.AboutDialog()
+ dialog.set_program_name("GVoz")
+ dialog.set_version(self.program_version)
+ dialog.set_comments("Record and create presentations with voice")
+ dialog.set_website("https://gvoz.presvoz.tk")
+ dialog.set_website_label("https://gvoz.presvoz.tk")
+ dialog.set_authors(["Pablo Rodríguez"])
+ dialog.set_copyright("© 2021-2022 Pablo Rodríguez")
+ dialog.set_license_type(Gtk.License.GPL_2_0)
+ dialog.set_wrap_license = True
+ dialog.set_logo(GdkPixbuf.Pixbuf.new_from_file(self.real_path + "/gvoz.svg"))
+ dialog.connect('response', lambda dialog, data: dialog.destroy())
+ dialog.show_all()
+
+ def gtk_main_quit(self, widget, event):
+ Gtk.main_quit()
+
+ def main(self):
+ Gtk.main()
+
+gv = gvoz()
+gv.main()
diff --git a/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/mtx-context-third-presvoz.tex b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/mtx-context-third-presvoz.tex
new file mode 100644
index 0000000000..2e9fc84a53
--- /dev/null
+++ b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/mtx-context-third-presvoz.tex
@@ -0,0 +1,798 @@
+%D \module
+%D [ file=mtx-context-third-presvoz,
+%D version=2022.02.02,
+%D title=PresVoz,
+%D subtitle=Presentations with Voice,
+%D author=Pablo Rodríguez,
+%D date=\currentdate,
+%D copyright={Michal Vlásak \&\ Pablo Rodríguez}]
+%C
+%C This module is part of the \CONTEXT\ macro||package and is
+%C copyrighted by its authors.
+
+\starttext
+\startlmtxmode
+\def\Presentation{\getdocumentfilename{1}}
+
+\startluacode
+if file.extname(document.files[1]) == "" then
+ document.main_file = file.addsuffix(document.files[1],"pdf")
+else
+ document.main_file = document.files[1]
+end
+
+if file.pathpart(document.main_file) == "" then
+ document.main_filename = file.nameonly(document.main_file)
+else
+ document.main_filename = file.pathpart(document.main_file):gsub(io.fileseparator, "/") .. "/" .. file.nameonly(document.main_file)
+end
+
+document.original_times = document.main_filename .. "-times.txt"
+
+document.uncompressed_audio = document.main_filename .. "-audio.wav"
+
+document.audio_mp3 = document.main_filename .. "-audio.mp3"
+
+document.audio_opus = document.main_filename .. "-audio.opus" -- opus might work later
+
+document.compressed_audio = document.audio_mp3
+
+--twolame is not an option: gives wrong sizes
+
+if io.exists(document.uncompressed_audio) and not(io.exists(document.audio_mp3)) and os.which('lame') then
+ os.execute('lame -m m -b 32 "' .. document.uncompressed_audio .. '" "' .. document.audio_mp3 .. '"')
+elseif io.exists(document.uncompressed_audio) and not(io.exists(document.compressed_audio)) then
+ if os.which('opusenc') then os.execute('opusenc --downmix-mono --bitrate 16 "' .. document.uncompressed_audio .. '" "' .. document.audio_opus .. '"') end
+end
+
+presvoz_name = document.main_filename .. "-presvoz.pdf"
+
+if not(io.exists(document.original_times)) or not(io.exists(document.compressed_audio)) then
+ context.enablemode({"missing-files"})
+end
+\stopluacode
+
+\startmode[missing-files]
+\setupinteractionscreen[option=max]
+\setupbodyfont[pagella]
+\startTEXpage[offset=2em, align=center]
+ \bf\color[darkred]{{\bi PresVoz} requires\\
+ {\tt\cldcontext{document.original_times}} and {\tt\cldcontext{document.uncompressed_audio}}\\
+ to do its magic with {\tt\cldcontext{document.main_file}}.}
+\stopTEXpage
+\stopmode
+
+\startnotmode[missing-files]
+\startluacode
+document.timeline_filename = document.main_filename .. "-times.js"
+
+document.slides_swf = document.main_filename .. ".swf"
+
+document.presentation_script = document.main_filename .. "-presentation.sc"
+
+document.presentation_swf = document.main_filename .. "-presentation.swf"
+
+document.presentation_filename = file.nameonly(document.main_file) .. "-presentation.swf"
+
+document.first_slide_swf = document.main_filename .. "-first.swf"
+
+document.loader_script = document.main_filename .. "-loader.sc"
+
+document.loader_swf = document.main_filename .. "-loader.swf"
+
+function document.transfer_metadata(name)
+ local main_doc = lpdf.epdf.load(name)
+ lpdf.addtocatalog("Lang", lpdf.unicode(main_doc.Catalog.Lang), lpdf.string(main_doc.Catalog.Lang))
+ if main_doc.Catalog.Lang == "en" then
+ document.separate_subtitle = ": "
+ else
+ document.separate_subtitle = ". "
+ end
+ if main_doc.Info.Subject ~= nil and main_doc.Info.Subject ~= "" then
+ context.setupinteraction{ title = main_doc.Info.Title .. document.separate_subtitle .. main_doc.Info.Subject }
+ else
+ context.setupinteraction{ title = main_doc.Info.Title }
+ end
+ if main_doc.Catalog.Lang == "es" then
+ document.presvoz_banner = "Hecho con «PresVoz»  🤞🐞"
+ elseif main_doc.Catalog.Lang == "pt" then
+ document.presvoz_banner = "Feito con «PresVoz»  🤞🐞"
+ elseif main_doc.Catalog.Lang == "it" then
+ document.presvoz_banner = "Fatto con «PresVoz»  🤞🐞"
+ elseif main_doc.Catalog.Lang == "fr" then
+ document.presvoz_banner = "Fait avec « PresVoz »  🤞🐞"
+ elseif main_doc.Catalog.Lang == "de" then
+ document.presvoz_banner = "Erezeugt mit »PresVoz«  🤞🐞"
+ elseif main_doc.Catalog.Lang == "nl" then
+ document.presvoz_banner = "Gedaan med „PresVoz”  🤞🐞"
+ elseif main_doc.Catalog.Lang == "nl" then
+ document.presvoz_banner = "Gedaan med „PresVoz”  🤞🐞"
+ else
+ document.presvoz_banner = "Done with “PresVoz”  🤞🐞"
+ end
+ context.setupinteraction{ subtitle = document.presvoz_banner .. " – https://www.presvoz.tk" }
+ if main_doc.Info.Author ~= nil and main_doc.Info.Author ~= "" then
+ context.setupinteraction{ author = main_doc.Info.Author }
+ end
+ if main_doc.Info.ModDate ~=nil and main_doc.Info.ModDate ~= "" then
+ original_Doc_date = main_doc.Info.ModDate:sub(3,6) .. "-" ..
+ main_doc.Info.ModDate:sub(7,8) .. "-" ..
+ main_doc.Info.ModDate:sub(9,10) .. "T" ..
+ main_doc.Info.ModDate:sub(11,12) .. ":" ..
+ main_doc.Info.ModDate:sub(13,14) .. ":" ..
+ main_doc.Info.ModDate:sub(15,22):gsub("'", ":")
+ directives.enable('backend.date=' .. original_Doc_date .. "'")
+ end
+ lpdf.epdf.unload(name)
+end
+
+document.transfer_metadata(document.main_file)
+\stopluacode
+
+\startbuffer[flash-presentation]
+ \startluacode
+ local raw_times = io.open(document.original_times)
+ local swf_times = io.open(document.presentation_script, "w")
+
+ swf_times:write([[# Presentation script, generated by PresVoz
+ #
+ # Copyright (C) 2003 Leonard Lin
+ # Copyright (C) 2007-2008 Sergio Costas
+ # Copyright (C) 2009-2021 Pablo Rodríguez
+ #
+ # This program is free software; you can redistribute it and/or
+ # modify it under the terms of the GNU General Public License
+ # as published by the Free Software Foundation; either version 3
+ # of the License, or (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ # General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, see <http://www.gnu.org/licenses>.
+ #
+ # Additional permission under GNU GPL version 3 section 7
+ #
+ # As a special exception, if you create a document which uses this
+ # script, and compile this script or a modified version of it in the
+ # document, this script does not by itself cause the resulting document
+ # to be covered by the GNU General Public License. This exception does
+ # not however invalidate any other reasons why the document might be
+ # covered by the GNU General Public License.
+
+ .flash filename="]] .. document.presentation_swf .. [[" version=8 fps=12
+
+ .swf slides "]] .. document.slides_swf .. [["
+ .sound audio "]] .. document.audio_mp3 .. [["
+
+ .action:
+ var times=new Array();
+ var maxtimes;
+ var position;
+ var mode;
+ var sound_position;
+ var sound_length;
+ var show_slide;
+
+ var contextual = new ContextMenu();
+ function ssurl(){
+ getURL("https://www.presvoz.tk", "_blank");
+ }
+
+ switch (System.capabilities.language) {
+ case "en" :
+ ss_message = "Done with PresVoz  🤞🐞";
+ break;
+ case "es" :
+ ss_message = "Hecho con PresVoz  🤞🐞";
+ break;
+ case "gl" :
+ ss_message = "Feito con PresVoz  🤞🐞";
+ break;
+ case "pt" :
+ ss_message = "Feito con PresVoz  🤞🐞";
+ break;
+ case "it" :
+ ss_message = "Fatto con PresVoz  🤞🐞";
+ break;
+ case "fr" :
+ ss_message = "Fait avec PresVoz  🤞🐞";
+ break;
+ case "de" :
+ ss_message = "Erezeugt mit PresVoz  🤞🐞";
+ break;
+ case "nl" :
+ ss_message = "Gedaan med PresVoz  🤞🐞";
+ break;
+ case "el" :
+ ss_message = "Kατασκευασμένος με PresVoz  🤞🐞";
+ break;
+ default:
+ ss_message = "Made with PresVoz  🤞🐞";
+ break;
+ }
+
+ contextual.hideBuiltInItems();
+ ss_url = new ContextMenuItem(ss_message, ssurl);
+ contextual.customItems.push(ss_url);
+ _root.menu = contextual;
+
+ snd = new Sound(this);
+ snd.attachSound("audio");
+ sound_length=snd.duration;
+ position = 0;
+
+ show_slide = false;
+ times[0] = 0;]] .. "\n")
+
+ line_number = 0
+ while true do
+ line = raw_times:read()
+ if line == nil then break end
+ if line:match("%D") == nil then
+ line_number = line_number + 1
+ print ("times["..line_number.."] = " .. line .. ";")
+ swf_times:write(" times["..line_number.."] = " .. line .. ";")
+ swf_times:write("\n")
+ end
+ end
+
+ swf_times:write("\n" .. [[
+ maxtimes = times.length - 1;
+
+ function pause_or_play() {
+ if (mode==0) {
+ snd.start(snd.position/1000.0,0);
+ mode=1;
+ } else if (mode==1) {
+ snd.stop();
+ mode=0;
+ }
+ }
+
+ function previous_slide() {
+ if (mode<2) {
+ if (mode==0) { mode=1; }
+ snd.stop();
+ if (position>0) {
+ sound_position=times[position-1];
+ } else {
+ sound_position=0;
+ }
+ snd.start(sound_position/1000.0,0);
+ }
+ }
+
+ function next_slide() {
+ if (mode<2) {
+ if (mode==0) { mode=1; }
+ snd.stop();
+ sound_position = times[position+1];
+ if (sound_position>sound_length) {
+ sound_position=sound_length-500;
+ }
+ snd.start(sound_position/1000.0,0);
+ }
+ }
+
+ function first_slide() {
+ snd.stop();
+ snd.start(0,0);
+ slides.gotoAndStop(1);
+ position=0;
+ mode=1;
+ show_slide=true;
+ }
+
+ function last_slide() {
+ snd.stop();
+ sound_position = times[maxtimes-1];
+ slides.gotoAndStop(maxtimes);
+ show_slide=false;
+ snd.start(sound_position/1000.0,0);
+ }
+
+ function toogle_fullscreen() {
+ if(Stage.displayState == "normal"){
+ Stage.displayState="fullScreen";
+ } else {
+ Stage.displayState="normal";
+ }
+ }
+
+ Mouse.onMouseDown = function() {
+ if ((getTimer() - lastClick) < 400) {
+ pause_or_play();
+ } else {
+ lastClick = getTimer();
+ }
+ };
+
+
+ key_listen=new Object();
+
+ key_listen.onKeyDown = function() {
+ switch (Key.getCode()) {
+ case 32:
+ pause_or_play();
+ break;
+ case 37:
+ previous_slide();
+ break;
+ case 38:
+ first_slide();
+ break;
+ case 39:
+ next_slide();
+ break;
+ case 40:
+ last_slide();
+ break;
+ case 70:
+ toogle_fullscreen();
+ break;
+ }
+ };
+
+ function check_time() {
+ if (mode==1) {
+ if ( sound_position + 50 > sound_length) {
+ snd.stop();
+ mode=2;
+ if(Stage.displayState == "fullScreen"){
+ Stage.displayState="normal";
+ }
+ } else {
+ if ((snd.position>=times[position])&&(snd.position<times[position+1])) {
+ if (show_slide) {
+ slides.gotoAndStop(position+1);
+ show_slide=false;
+ }
+ } else {
+ if (position>maxtimes) {
+ snd.stop();
+ mode=2;
+ } else {
+ if (snd.position<times[position]) {
+ position-=1;
+ } else {
+ position+=1;
+ }
+ show_slide=true;
+ }
+ }
+ }
+ }
+ }
+
+ setInterval(check_time, 10);
+
+ mode=1;
+ snd.start(0,0);
+ Stage["displayState"] = "fullScreen";
+ Mouse.addListener(Mouse);
+ Key.addListener(key_listen);
+
+ .end
+
+ .frame 1
+ .put slides
+ .stop slides
+
+ .end
+ ]])
+
+ raw_times:close()
+ swf_times:close()
+
+ os.execute('pdf2swf -f -T 8 -s filloverlap -s linksopennewwindow "' .. document.main_file .. '" -o "' .. document.slides_swf .. '"')
+ os.execute('swfc "' .. document.presentation_script .. '"')
+ if io.exists(document.presentation_swf) then os.remove(document.presentation_script) os.remove(document.slides_swf) end
+ \stopluacode
+\stopbuffer
+
+\startbuffer[flash-loader]
+ \startluacode
+ local raw_times = io.open(document.original_times)
+ local loader_times = io.open(document.loader_script, "w")
+
+ fig = figures.getinfo(document.main_file)
+ function dimension_bp(dimension)
+ return math.floor(dimension*number.dimenfactors.bp)
+ end
+
+ loader_times:write([[# Preloader script, generated by PresVoz
+ #
+ # Copyright (C) 2009-2021 Pablo Rodríguez
+ #
+ # This program is free software; you can redistribute it and/or
+ # modify it under the terms of the GNU General Public License
+ # as published by the Free Software Foundation; either version 3
+ # of the License, or (at your option) any later version.
+ #
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ # General Public License for more details.
+ #
+ # You should have received a copy of the GNU General Public License
+ # along with this program; if not, see <http://www.gnu.org/licenses>.
+ #
+ # Additional permission under GNU GPL version 3 section 7
+ #
+ # As a special exception, if you create a document which uses this
+ # script, and compile this script or a modified version of this script
+ # into the document, this script does not by itself cause the resulting
+ # document to be covered by the GNU General Public License.
+ # This exception does not however invalidate any other reasons why
+ # the document might be covered by the GNU General Public License.
+
+ .flash filename="]] .. document.loader_swf .. [[" version=8 fps=12"
+ .font roman "]] .. resolvers.findfile("iRaccoonShowBold.otf") .. [[" glyphs=" %()KB0123456789/:,.CPDNuk[]resntiocanbld!"
+ .edittext newloader font=roman color=#ffff00 size=30% width=350 height=30 border=none align="center" noselect variable=load_text
+ .box placeholder width=]] .. dimension_bp(fig.used.width) .. [[ height=]] .. dimension_bp(fig.used.height) .. "\n" .. [[
+ .box fsarea fill=#ffffff00 color=#ffffff00 width=]] .. dimension_bp(fig.used.width) .. [[ height=]] .. dimension_bp(fig.used.height) .. "\n" .. [[
+ .outline fscreen_outline: M 62.78125 18.703125 L 43.367188 23.734375 L 38.390625 43.09375 L 42.109375 39.375 L 48.671875 45.9375 L 65.625 29.039062 L 59.0625 22.421875 L 62.78125 18.703125 z M 199.71875 18.703125 L 203.4375 22.421875 L 196.875 29.039062 L 213.773438 45.9375 L 220.390625 39.375 L 224.109375 43.09375 L 219.132812 23.734375 L 199.71875 18.703125 z M 83.125 45.9375 C 73.429688 45.9375 65.625 53.742188 65.625 63.4375 L 65.625 133.4375 C 65.625 143.132812 73.429688 150.9375 83.125 150.9375 L 179.375 150.9375 C 189.070312 150.9375 196.875 143.132812 196.875 133.4375 L 196.875 63.4375 C 196.875 53.742188 189.070312 45.9375 179.375 45.9375 L 83.125 45.9375 z M 48.726562 150.9375 L 42.109375 157.5 L 38.390625 153.78125 L 43.367188 173.140625 L 62.78125 178.171875 L 59.0625 174.453125 L 65.625 167.835938 L 48.726562 150.9375 z M 213.773438 150.9375 L 196.875 167.835938 L 203.4375 174.453125 L 199.71875 178.171875 L 219.132812 173.140625 L 224.109375 153.78125 L 220.390625 157.5 L 213.773438 150.9375 z .end
+ .outline fulls_outline: M 17.5 0 L 245 0 C 254.695312 0 262.5 7.804688 262.5 17.5 L 262.5 179.375 C 262.5 189.070312 254.695312 196.875 245 196.875 L 17.5 196.875 C 7.804688 196.875 0 189.070312 0 179.375 L 0 17.5 C 0 7.804688 7.804688 0 17.5 0 z .end
+ .filled fscreen outline=fscreen_outline fill=#969696ff color=#969696ff
+ .filled fulls outline=fulls_outline fill=#64646496 color=#64646496
+
+ .button fscr_button
+ .show fscreen as=idle
+ .show fscreen as=area
+ .show fscreen as=hover
+ .show fscreen as=pressed
+ .end
+
+ .button fs_area
+ .show fsarea as=idle
+ .show fsarea as=area
+ .show fsarea as=hover
+ .show fsarea as=pressed
+ .on_release:
+ fullscreen_button._visible = 0;
+ fs_area._visible = 0;
+ Stage["displayState"] = "fullScreen";
+ _root.load_text = "[Click to start]";
+ _root.dlprogress_mvclip._visible = true;
+ the_presentation = "./]] .. document.presentation_filename .. [[";
+ this.loadMovie(the_presentation, this.placeholder);
+ .end
+ .end
+
+ .sprite fullscreen_button
+ .put fscreen
+ .put fulls
+ .end
+
+ .swf first_slide "]] .. document.first_slide_swf .. [["
+ .frame 1
+ .put first_slide
+ .stop first_slide
+ .put fullscreen_button
+ .stop fullscreen_button
+ .put fs_area
+ .stop fs_area
+
+ .action:
+ slide_height=Stage.height;
+ slide_width=Stage.width;
+
+ var contextual = new ContextMenu();
+ function ssurl(){ getURL("https://www.presvoz.tk", "_blank"); }
+
+ switch (System.capabilities.language) {
+ case "en" :
+ ss_message = "Done with PresVoz  🤞🐞";
+ break;
+ case "es" :
+ ss_message = "Hecho con PresVoz  🤞🐞";
+ break;
+ case "gl" :
+ ss_message = "Feito con PresVoz  🤞🐞";
+ break;
+ case "pt" :
+ ss_message = "Feito con PresVoz  🤞🐞";
+ break;
+ case "it" :
+ ss_message = "Fatto con PresVoz  🤞🐞";
+ break;
+ case "fr" :
+ ss_message = "Fait avec PresVoz  🤞🐞";
+ break;
+ case "de" :
+ ss_message = "Erezeugt mit PresVoz  🤞🐞";
+ break;
+ case "nl" :
+ ss_message = "Gedaan med PresVoz  🤞🐞";
+ break;
+ case "el" :
+ ss_message = "Kατασκευασμένος με PresVoz  🤞🐞";
+ break;
+ default:
+ ss_message = "Made with PresVoz  🤞🐞";
+ break;
+ }
+
+ contextual.hideBuiltInItems();
+ ss_url = new ContextMenuItem(ss_message, ssurl);
+ contextual.customItems.push(ss_url);
+ _root.menu = contextual;
+
+ counter_percent=(slide_width/800)*100;
+ newloader._xscale=counter_percent;
+ newloader._yscale=counter_percent;
+ newloader._x = (slide_width-(newloader._width))/2;
+ newloader._y = (slide_height-newloader._height)/2;
+
+ button_percent = (slide_width/600)*100;
+ fullscreen_button._xscale = button_percent;
+ fullscreen_button._yscale = button_percent;
+ fullscreen_button._x = (slide_width-(fullscreen_button._width))/2;
+ fullscreen_button._y = (slide_height-fullscreen_button._height)/2;
+
+ _root.createEmptyMovieClip("dlprogress_mvclip", 0);
+ dlprogress_mvclip.createEmptyMovieClip("bar", 1);
+ dlprogress_mvclip.createEmptyMovieClip("stroke", 2);
+
+ with (dlprogress_mvclip.stroke) {
+ lineStyle(0, 0xFF0000, 30);
+ moveTo(0, 0);
+ lineTo(300, 0);
+ lineTo(300, 40);
+ lineTo(0, 40);
+ lineTo(0, 0);
+ }
+ with (dlprogress_mvclip.bar) {
+ beginFill(0xFF0000, 30);
+ moveTo(0, 0);
+ lineTo(300, 0);
+ lineTo(300, 40);
+ lineTo(0, 40);
+ lineTo(0, 0);
+ endFill();
+ _xscale = 0;
+ }
+ dlprogress_mvclip._x = (slide_width-dlprogress_mvclip._width)/2;
+ dlprogress_mvclip._y = (slide_height-dlprogress_mvclip._height)/2;
+
+ dlprogress_mvclip._visible = false;
+ fs_listen=new Object();
+
+ fs_listen.onKeyDown = function() {
+ if (Key.isDown(13)) {
+ if(Stage.displayState == "normal"){
+ Stage.displayState="fullScreen";
+ } else {
+ Stage.displayState="normal";
+ }
+ }
+ };
+
+ Key.addListener(fs_listen);
+
+
+ .end
+
+ .sprite images
+ .put placeholder alpha=0%
+ .action:
+ the_presentation = "./]] .. document.presentation_filename .. [[";
+ first_loading = new Object();
+ first_loading.onMouseDown = function () {
+ load_swf = new MovieClipLoader();
+ load_swf.loadClip(the_presentation, placeholder);
+ listen_loading = new Object();
+ listen_loading.onLoadStart = function(target) {
+ _root.dlprogress_mvclip.bar._xscale = 0;
+ _starttime = gettimer();
+ };
+ listen_loading.onLoadError = function(){
+ _root.load_text = "Presentation cannot be loaded!";
+ };
+ listen_loading.onLoadProgress = function(target, bytesLoaded, bytesTotal) {
+ downldtime = (gettimer() - _starttime) / 1000;
+ _root.load_text = (String (Math.round ((bytesLoaded * 100) / bytesTotal)) + "% (" + Math.round((bytesLoaded / 1024) / downldtime) + " KB/s)");
+ _root.dlprogress_mvclip.bar._xscale = Math.round(bytesLoaded/bytesTotal*100);
+ keeping_awake = setInterval(function(){}, 1000);
+ };
+ listen_loading.onLoadComplete = function(target) {
+ clearInterval(keeping_awake);
+ _root.load_text = "";
+ _root.dlprogress_mvclip._visible = 0;
+ _root.dlprogress_mvclip.bar._visible = 0;
+ _root.first_slide._visible = 0;
+ };
+ load_swf.addListener(listen_loading);
+ };
+ Mouse.addListener(first_loading);
+ .end
+ .end
+
+ .put newloader
+ .stop newloader
+ .end]])
+
+ raw_times:close()
+ loader_times:close()
+
+ os.execute('pdf2swf -f -p 1 -T 8 -s filloverlap -s linksopennewwindow "' .. document.main_file .. '" -o "' .. document.first_slide_swf .. '"')
+ os.execute('swfc "' .. document.loader_script .. '"')
+ if io.exists(document.loader_swf) then os.remove(document.loader_script) os.remove(document.first_slide_swf) end
+ \stopluacode
+\stopbuffer
+
+\def\TimeLine#1%
+ {\cldcontext{ document.timeline_filename }}
+
+\def\SoundFile#1%
+ {\cldcontext{ document.compressed_audio }}
+
+\startbuffer[generate-timeline]
+ \startluacode
+ local raw_times = io.open(document.original_times)
+ local js_times = io.open(document.timeline_filename, "w")
+
+ js_times:write("\\startJSpreamble times used now")
+ js_times:write("\n")
+ js_times:write("var times = [];")
+ js_times:write("\n")
+ js_times:write("var maxtimes = times[times.length - 1];")
+ js_times:write("\n")
+ js_times:write("times[0] = 0;")
+ js_times:write("\n")
+ line_number = 0
+ while true do
+ line = raw_times:read()
+ if line == nil then break end
+ if line:match("%D") == nil then
+ line_number = line_number + 1
+ print ("times["..line_number.."] = " .. line .. ";")
+ js_times:write("times["..line_number.."] = " .. line .. ";")
+ js_times:write("\n")
+ end
+ end
+
+ js_times:write("\\stopJSpreamble")
+
+ raw_times:close()
+ js_times:close()
+ \stopluacode
+\stopbuffer
+
+\startmode[*first]
+\getbuffer[generate-timeline]
+\doiftext
+ {\ctxlua{if os.which('pdf2swf') and os.which('swfc') then context("a") end}}
+ {\getbuffer[flash-presentation]
+ \getbuffer[flash-loader]}
+\stopmode
+
+\getfiguredimensions[\Presentation]
+
+\setupexternalfigures[interaction=all]
+
+\setupinteraction
+ [state=start,
+ color=,
+ contrastcolor=,
+ style=,
+ focus=standard]
+
+\useJSscripts[presvoz.mkxl]
+\startnotmode[*first]
+ \useJSscripts[\TimeLine{\Presentation}]
+\stopnotmode
+
+\definefontfamily
+ [mainface]
+ [rm]
+ [Latin Modern Sans]
+
+\definefontfamily
+ [mainface]
+ [ss]
+ [Flechitas]
+
+\setupbodyfont
+ [mainface, 25pt]
+
+\setupmakeup
+ [page]
+ [pagestate=start,
+ style=\bfd,
+ color=white,
+ footerstate=start,
+ align=center]
+
+\definecolor[transparent-gray]
+ [r=.45, g=.45, b=.45]
+
+\defineviewerlayer[fullscreen][state=start]
+\defineviewerlayer[unfullscreen][state=stop]
+\defineviewerlayer[play][state=start]
+\defineviewerlayer[pause][state=stop]
+
+\definecolor[transparent][r=1, a=1, t=0]
+
+\startbuffer[fullscreen-button]
+ \startoverlay
+ {\viewerlayer[fullscreen]{C}}
+ {\viewerlayer[unfullscreen]{I}}
+ {\goto{\color[transparent]{C}}[JS(SwitchFS{})]}
+ \stopoverlay
+\stopbuffer
+
+\startbuffer[play-pause-button]
+ \startoverlay
+ {\viewerlayer[play]{R}}
+ {\viewerlayer[pause]{H}}
+ {\goto{\color[transparent]{C}}[JS(PlayPauseSound{})]}
+ \stopoverlay
+\stopbuffer
+
+\def\SlideNavigationButtons{%
+ \goto{F}[JS(GoToFirstSlide{})]\,%
+ \goto{B}[JS(GoToPreviousSlide{})]\,%
+ \inlinebuffer[play-pause-button]\,%
+ \goto{S}[JS(StopSound{})]\,%
+ \goto{N}[JS(GoToNextSlide{})]\,%
+ \goto{L}[JS(GoToLastSlide{})]\quad
+ \null\inlinebuffer[fullscreen-button]%
+ }
+
+\definelayer[player-buttons]
+ [x=.5\dimexpr\figurewidth\relax,
+ y=.9525\dimexpr\figureheight\relax,
+ location=middle,
+ state=repeat]
+
+\definelayer[placesound]
+
+\startbuffer[placesound]
+ \definerenderingwindow[soundplace]
+ [width=0pt, height=0pt, frame=on]
+
+\doiftextelse{\ctxlua{if document.compressed_audio == document.audio_opus then context("opus") end}}
+ {\userendering[mainsound][audio/opus][\SoundFile{\Presentation}][embed=yes, list=no]}
+ {\userendering[mainsound][audio/mp3][\SoundFile{\Presentation}][embed=yes, list=no]}
+
+ \placerenderingwindow[soundplace][mainsound]
+\stopbuffer
+
+\setupbackgrounds
+ [page]
+ [background={foreground, placesound, player-buttons}]
+
+
+\setlayer[player-buttons]
+ {\switchtobodyfont[sans, \cldcontext{tex.dimen.paperwidth/1000000}pt]\color[transparent-gray]{\SlideNavigationButtons}}
+
+\resetpagenumber
+
+\dorecurse{\noffigurepages}{\startTEXpage[pagestate=start]
+\ifnum\recurselevel=1 \setlayer[placesound]{\getbuffer[placesound]}\fi
+\externalfigure[\Presentation][page=\recurselevel]
+\stopTEXpage}
+\stopnotmode
+
+\startluacode
+luatex.wrapup(
+ function()
+ os.remove(presvoz_name)
+ os.rename(tex.jobname .. ".pdf", presvoz_name)
+ end
+)
+\stopluacode
+\stoptext
+\stoplmtxmode
+
+\startmkivmode
+\setupinteractionscreen[option=max]
+\startTEXpage[offset=2em, align=center]
+ \ssbf\color[darkgreen]{\LMTX\ required,\\I’m afraid.}
+\stopTEXpage
+\stopmkivmode
+\stoptext
diff --git a/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/presvoz.mkxl b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/presvoz.mkxl
new file mode 100644
index 0000000000..8d8ecd3cde
--- /dev/null
+++ b/macros/context/contrib/context-handlecsv/context-presvoz-master-5196bdec981cf48b83896ec7b7009fda20d9106f/tex/context/third/presvoz/presvoz.mkxl
@@ -0,0 +1,183 @@
+\startJSpreamble PresVoz used now
+var ocgs = this.getOCGs(0);
+this.pageNum = 0;
+
+var label = "mainsound" ;
+var rendition = this.media.getRendition(label) ;
+var screen = this.media.getAnnot({nPage: 0, cAnnotTitle: label}) ;
+var main_sound_player;
+
+function ToogleFSButton() {
+ if (app.fs.isFullScreen) {
+ ocgs[0].state = false;
+ ocgs[3].state = true;
+ } else {
+ ocgs[0].state = true;
+ ocgs[3].state = false;
+ }
+}
+
+function TooglePlayPauseButton() {
+ if (main_sound_player.isPlaying) {
+ ocgs[1].state = true;
+ ocgs[2].state = false;
+ } else {
+ ocgs[1].state = false;
+ ocgs[2].state = true;
+ }
+}
+
+function timer_resume() {
+ check_time = app.setInterval("advance_slide()", 10);
+}
+
+function timer_pause() {
+ app.clearInterval(check_time);
+}
+
+function jump() {
+ if (!main_sound_player.isOpen) { main_sound_player.open(); }
+
+ if ( typeof main_sound_player != "undefined" || ( typeof main_sound_player != "undefined" && main_sound_player.isOpen )) {
+ if (this.pageNum < times.length) {
+ if (!main_sound_player.isPlaying) {
+ timer_resume();
+ }
+
+ var jump_time = times[this.pageNum] / 1000;
+
+ main_sound_player.pause();
+ main_sound_player.seek({time: jump_time});
+ main_sound_player.play();
+ }
+ }
+}
+
+function advance_slide() {
+ if (!main_sound_player.isOpen) { main_sound_player.open(); }
+ if ( typeof main_sound_player.where() != "undefined") {
+ var current_offset = 1000 * main_sound_player.where().time;
+
+ if (current_offset >= times[this.pageNum + 1]) {
+ this.pageNum += 1;
+ } else if (current_offset <= times[this.pageNum - 1]) {
+ this.pageNum -= 1;
+ }
+ }
+}
+
+function start_player() {
+ main_sound_player = app.media.createPlayer({
+ rendition: rendition,
+ annot: screen,
+ settings: {
+ autoPlay: false,
+ },
+ events: {
+ onDone: function() {
+ timer_pause();
+ app.fs.isFullScreen = false;
+ ToogleFSButton();
+ this.pageNum = this.numPages - 1;
+ },
+ afterDone: function() {
+ main_sound_player.pause();
+ TooglePlayPauseButton();
+ main_sound_player.seek({time: maxtimes});
+ this.pageNum = this.numPages - 1;
+ },
+ onEscape: function() {
+ app.fs.isFullScreen = false;
+ ToogleFSButton();
+ },
+ afterEscape: function() {
+ main_sound_player.pause();
+ TooglePlayPauseButton();
+ },
+ afterPause: function() {
+ timer_pause();
+ TooglePlayPauseButton();
+ },
+ onPlay: function() {
+ app.fs.isFullScreen = true;
+ ToogleFSButton();
+ },
+ afterPlay: function() {
+ timer_resume();
+ TooglePlayPauseButton();
+ },
+ afterReady: function() {
+ main_sound_player.play();
+ },
+ },
+ });
+ main_sound_player.open();
+}
+
+function GoToFirstSlide(label) {
+ this.pageNum = 0;
+ if ( typeof main_sound_player != "undefined" || ( typeof main_sound_player != "undefined" && main_sound_player.isOpen )) {
+ if ( main_sound_player.isPlaying ) { jump(); }
+ }
+}
+
+function PlayPauseSound() {
+ if ( typeof main_sound_player == "undefined" ) {
+ start_player();
+ } else if ( !main_sound_player.isPlaying ) {
+ if (!main_sound_player.isOpen) { main_sound_player.open(); }
+ if ( typeof main_sound_player.where() != "undefined" && main_sound_player.where().time == 0 )
+ { this.pageNum = 0; }
+ timer_resume();
+ main_sound_player.play();
+ } else if ( main_sound_player.isPlaying ) {
+ timer_pause();
+ main_sound_player.pause();
+ }
+}
+
+function StopSound() {
+ if ( typeof main_sound_player != "undefined" || ( typeof main_sound_player != "undefined" && main_sound_player.isOpen )) {
+ main_sound_player.pause();
+ main_sound_player.seek({time: 0});
+ }
+ this.pageNum = 0;
+}
+
+function GoToLastSlide(label) {
+ this.pageNum = this.numPages - 1;
+ if ( typeof main_sound_player != "undefined" || ( typeof main_sound_player != "undefined" && main_sound_player.isOpen )) {
+ if ( main_sound_player.isPlaying ) { jump(); }
+ }
+}
+
+function GoToNextSlide(label) {
+ ++this.pageNum;
+ if ( typeof main_sound_player != "undefined" || ( typeof main_sound_player != "undefined" && main_sound_player.isOpen )) {
+ if ( main_sound_player.isPlaying ) { jump(); }
+ }
+}
+
+function GoToPreviousSlide(label) {
+ --this.pageNum;
+ if ( typeof main_sound_player != "undefined" || ( typeof main_sound_player != "undefined" && main_sound_player.isOpen )) {
+ if ( main_sound_player.isPlaying ) { jump(); }
+ }
+}
+
+function SwitchFS() {
+ if (app.fs.isFullScreen == false) {
+ app.fs.isFullScreen = true;
+ if (app.fs.isFullScreen) {
+ ocgs[0].state = false;
+ ocgs[3].state = true;
+ }
+ } else {
+ app.fs.isFullScreen = false;
+ if (!app.fs.isFullScreen) {
+ ocgs[0].state = true;
+ ocgs[3].state = false;
+ }
+ }
+}
+\stopJSpreamble
diff --git a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/doc/context/third/handlecsv/handlecsv.epub b/macros/context/contrib/context-handlecsv/handlecsv-context-suite/doc/context/third/handlecsv/handlecsv.epub
deleted file mode 100644
index 9c84f899b5..0000000000
--- a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/doc/context/third/handlecsv/handlecsv.epub
+++ /dev/null
Binary files differ
diff --git a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/doc/context/third/handlecsv/handlecsv.pdf b/macros/context/contrib/context-handlecsv/handlecsv-context-suite/doc/context/third/handlecsv/handlecsv.pdf
deleted file mode 100644
index df145b2179..0000000000
--- a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/doc/context/third/handlecsv/handlecsv.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv-extra.lua b/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv-extra.lua
deleted file mode 100644
index 1efdcbb06d..0000000000
--- a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv-extra.lua
+++ /dev/null
@@ -1,151 +0,0 @@
--- %D \module
--- %D [ file=t-handlecsv-extra.lua,
--- %D version=2019.05.27,
--- %D title=HandleCSV extra,
--- %D subtitle=CSV file analysis - extended functions and macros,
--- %D author=Jaroslav Hajtmar,
--- %D date=2019-05-27,
--- %D copyright=Jaroslav Hajtmar,
--- %D license=GNU General Public License]
---
--- %C Copyright (C) 2019 Jaroslav Hajtmar
--- %C
--- %C This program is free software: you can redistribute it and/or modify
--- %C it under the terms of the GNU General Public License as published by
--- %C the Free Software Foundation, either version 3 of the License, or
--- %C (at your option) any later version.
--- %C
--- %C This program is distributed in the hope that it will be useful,
--- %C but WITHOUT ANY WARRANTY; without even the implied warranty of
--- %C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- %C GNU General Public License for more details.
--- %C
--- %C You should have received a copy of the GNU General Public License
--- %C along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-thirddata = thirddata or { }
-
-thirddata = thirddata or { }
-
-thirddata.handlecsv = thirddata.handlecsv or { -- next global variables
-
-}
-
-
--- Initialize global variables etc.
-
-
--- Utility and documentation function and macros
-
-
-
-function thirddata.handlecsv.addleadingcharacters(character, tonumberortext, width)
--- Add leading characters to number to align with the width
- local strcharacter=tostring(character)
- local strnumberortext=tostring(tonumberortext)
- strnumberortext = string.rep(strcharacter, width-#strnumberortext)..strnumberortext
- return strnumberortext -- It returns a strange result unless the leading character is just one.
-end
-
-function thirddata.handlecsv.addleadingzeros(tonumberortext, width)
--- Add leading zeros to number to align with the width
- return thirddata.handlecsv.addleadingcharacters(0, tonumberortext, width)
-end
-
-function thirddata.handlecsv.addzeros(tonumber)
--- Add leading zeroes depending on the number of rows
- local width=string.len(tostring(thirddata.handlecsv.numrows()))
- return thirddata.handlecsv.addleadingzeros(tonumber, width)
-end
-
-
-
--- function thirddata.handlecsv.cr_lines(s)
--- return s:gsub('\r\n?', '\n'):gmatch('(.-)\n')
--- end
-
-
-function thirddata.handlecsv.file2Array(filename)
--- read CSV file into line array
-local linesarray={}
- for line in io.lines (filename) do
- linesarray[#linesarray+1]=line
- end
-return linesarray
-end
-
-
-
-function thirddata.handlecsv.writefileinreverseorder(inpfilename,outfilename)
--- write CSV file <inpfilename> into reverse order CSV file <outfilename>
- local tLines = thirddata.handlecsv.file2Array(inpfilename)
- local outfile = io.open(outfilename, "w")
- local ifrom=#tLines
- local ito=1
- if thirddata.handlecsv.gCSVHeader then -- when CSV file is with header, then header line is first line
- outfile:write(tLines[1])
- outfile:write("\r\n")
- ito=2
- end
- for i = ifrom, ito, -1 do -- write rest of lines in reverse order
- outfile:write(tLines[i])
- outfile:write("\r\n")
- end
-outfile:flush()
-outfile:close()
-end
-
-
-
-function thirddata.handlecsv.deletefile(filename)
--- remove file from disk
- os.remove(filename)
-end
-
-
-function thirddata.handlecsv.varreverseorder(csvfilename)
--- CSV file <csvfilename> is stored in variable array gTableRows['csvfilename'][row][column]
--- this function rearrange gTableRows into reverse order
-local templine={}
-for i = 1, math.floor(thirddata.handlecsv.gNumRows[csvfilename]/2) do
-templine=thirddata.handlecsv.gTableRows[csvfilename][i]
-thirddata.handlecsv.gTableRows[csvfilename][i]=thirddata.handlecsv.gTableRows[csvfilename][thirddata.handlecsv.gNumRows[csvfilename]-i+1]
-thirddata.handlecsv.gTableRows[csvfilename][thirddata.handlecsv.gNumRows[csvfilename]-i+1]=templine
-end
-end
-
-
-
-
-
--- ConTeXt source:
-local string2print=[[%
-
-\def\addleading#1#2#3{\ctxlua{context(thirddata.handlecsv.addleadingcharacters('#1','#2','#3'))}}
-\def\addzeros#1#2{\ctxlua{context(thirddata.handlecsv.addleadingzeros('#1','#2'))}}
-\def\zeroed#1{\ctxlua{context(thirddata.handlecsv.addzeros('#1'))}}
-% \def\zeroedlineno{\ctxlua{context(string.rep( "0",(tostring(thirddata.handlecsv.numrows())):len() - (tostring(thirddata.handlecsv.linepointer())):len()) .. thirddata.handlecsv.linepointer())}}% from Pablo
-\def\zeroedlineno{\zeroed{\lineno}}% from Pablo (and simplified by him)
-\def\writefileinreverseorderfromto#1#2{\ctxlua{thirddata.handlecsv.writefileinreverseorder('#1','#2')}}%
-\def\writecurrfileinreverseorderto#1{\ctxlua{thirddata.handlecsv.writefileinreverseorder(thirddata.handlecsv.gCurrentlyProcessedCSVFile,'#1')}}%
-\def\deletefile#1{\ctxlua{thirddata.handlecsv.deletefile('#1')}}%
-\def\reverseorderof#1{\ctxlua{thirddata.handlecsv.varreverseorder('#1')}}
-\def\reverseorder{\ctxlua{thirddata.handlecsv.varreverseorder(thirddata.handlecsv.gCurrentlyProcessedCSVFile)}}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Complete listing macros and commands that can be used (to keep track of all defined macros):
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \addleading{}{}{}, \addzeros{}{}, \zeroed{}, \zeroedlineno (from Pablo)
-% \writefileinreverseorderfromto{<inpfilename>}{<outfilename>} % create file <outfilename> in reverse order of file <inpfilename>
-% \writecurrfileinreverseorderto{<outfilename>} % create file <outfilename> in reverse order
-% \deletefile{<filename>} % close and delete file <filename>
-% \reverseorderof{<csvfilename>} % reverse order of opened CSV file <csvfilename>
-% \reverseorder % reverse order of currently processed CSV file
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-]]
-
--- write definitions into ConTeXt:
-thirddata.handlecsv.string2context(string2print)
-
diff --git a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv-tools.lua b/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv-tools.lua
deleted file mode 100644
index 87806a9a03..0000000000
--- a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv-tools.lua
+++ /dev/null
@@ -1,178 +0,0 @@
--- %D \module
--- %D [ file=t-handlecsv-tools.lua,
--- %D version=2015.07.08,
--- %D title=HandleCSV tools,
--- %D subtitle=CSV file analysis,
--- %D author=Jaroslav Hajtmar,
--- %D date=\currentdate,
--- %D copyright=Jaroslav Hajtmar,
--- %D license=GNU General Public License]
---
--- %C Copyright (C) 2015 Jaroslav Hajtmar
--- %C
--- %C This program is free software: you can redistribute it and/or modify
--- %C it under the terms of the GNU General Public License as published by
--- %C the Free Software Foundation, either version 3 of the License, or
--- %C (at your option) any later version.
--- %C
--- %C This program is distributed in the hope that it will be useful,
--- %C but WITHOUT ANY WARRANTY; without even the implied warranty of
--- %C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- %C GNU General Public License for more details.
--- %C
--- %C You should have received a copy of the GNU General Public License
--- %C along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
--- use a feature that is part of the /texmf-dist/tex/context/base/util-prs.lua
-
-thirddata = thirddata or { }
-
-thirddata = thirddata or { }
-
-thirddata.handlecsv = thirddata.handlecsv or { -- next global variables
-
-}
-
-
--- Initialize global variables etc.
-
-
--- Utility and documentation function and macros
-
-function thirddata.handlecsv.csvreport(anyfilename) -- Listing report informations about opening a CSV file
- local actualopenfile=thirddata.handlecsv.gCurrentlyProcessedCSVFile
- thirddata.handlecsv.opencsvfile(anyfilename)
- local coldelim = thirddata.handlecsv.gUserCSVSeparator or ""
- local quot = thirddata.handlecsv.gUserCSVQuoter or ""
- local currcoldelim = thirddata.handlecsv.gCSVSeparator or ""
- local currquot = thirddata.handlecsv.gCSVQuoter or ""
- infomakra=[[\crlf ]]
- for i = 1, thirddata.handlecsv.gNumCols do -- for all fields in header
- local makroname=[[{\bf\backslash ]]..thirddata.handlecsv.tmn(thirddata.handlecsv.gColumnNames[i])..[[}]]
- headercolnames = [[{\bf\backslash c]]..thirddata.handlecsv.ar2colnum(i)..[[}=]]..makroname..[[, ]]
- infomakra=infomakra..headercolnames -- list generating
- end -- for i=1, #gCSV
- -- Kvůli nastavení na zač.
- infomakra=infomakra..'\\par' -- infomakra=infomakra..'\par' -- closing of opened group
-local string2print=[[\title{Current CSV file report}
-Input CSV file: {\bf ]]..'\\csvfilename'..[[} \crlf
-Existing header of CSV file (ie first no data line) : {\tt ]]..tostring(thirddata.handlecsv.gCSVHeader)..[[}\crlf
-Settings default CSV separator (see Lua variable {\tt gUserCSVSeparator}) : ]]..coldelim..[[\crlf
-Settings default CSV field "quoter" (see Lua variable {\tt gUserCSVQuoter}) : ]]..quot..[[\crlf
-Settings current CSV separator : ]]..currcoldelim..[[\crlf
-Settings current CSV field "quoter" : ]]..currquot..[[\crlf
-Current settings of delimiters and quoters: {\tt ]]..currquot..[[field1]]..currquot..currcoldelim..currquot..[[field2]]..currquot..currcoldelim..currquot..[[field3]]..currquot..currcoldelim..[[ } ... etc.\crlf
-Using hooks (default is off) : {\tt ]]..tostring(thirddata.handlecsv.gUseHooks)..[[}\crlf
-Number of columns in a table: {\bf]]..'\\numcols'..[[}\crlf
-Number of rows in the table: {\bf ]]..'\\numrows'..[[}\crlf
-Macros supplying columns data in each row of table: ]]..infomakra..[[
-\crlf
-Additional predefined macros: \crlf
-{\bf\backslash csvfilename} -- name of open CSV file ({\bf]]..'\\csvfilename'..[[})\crlf
-{\bf\backslash numcols} -- number of table columns ({\bf]]..'\\numcols'..[[})\crlf
-{\bf\backslash numrows} -- number of table lines ({\bf]]..'\\numrows'..[[})\crlf
-{\bf\backslash numline} -- number of the currently loaded row (for use in print reports) \crlf
-{\bf\backslash lineno} -- serial number of the actual loaded line of CSV table \crlf
-{\bf\backslash csvreport} -- prints the report on file open \crlf
-{\bf\backslash printline} -- lists the current CSV row table in a condensed form \crlf
-{\bf\backslash printall} -- CSV output table in a condensed form \crlf
-{\bf\backslash setfiletoscan}\{{\it filename}\} -- setting of name of CSV file\crlf
-{\bf\backslash opencsvfile}{\{\it filename}\} -- open CSV table\crlf
-{\bf\backslash setheader} -- set a header flag\crlf
-{\bf\backslash resetheader} -- unset a header flag\crlf
-{\bf\backslash nextrow} -- next row of CSV table (with test of EOF)\crlf
-{\bf\backslash setsep}{\{\it delimiter}\} -- set delimiter of columns\crlf
-{\bf\backslash resetsep} -- unset to default values\crlf
-{\bf\backslash setld}\{{\it delimiter}\} -- set left quoter\crlf
-{\bf\backslash resetld} -- unset left quoter to default values\crlf
-{\bf\backslash setrd}\{{\it delimiter}\} -- set right quoter\crlf
-{\bf\backslash resetrd} -- unset right quoter to default values\crlf
-{\bf\backslash blinehook} -- begin line hook macro (process before first column value of each row)\crlf
-{\bf\backslash elinehook} -- end line hook macro (process after last column value of each row)\crlf
-{\bf\backslash bfilehook} -- begin file hook macro (process before whole file processing)\crlf
-{\bf\backslash efilehook} -- end file hook macro (process after whole file processing)\crlf
-\vfill\break ]]
-thirddata.handlecsv.string2context(string2print)
-thirddata.handlecsv.opencsvfile(actualopenfile)
-end -- thirddata.handlecsv.csvreport()
-
-function thirddata.handlecsv.xprintline() -- lists the current CSV row table (needed to define macro \printline)
- for i=1,thirddata.handlecsv.gNumCols do
- context([[\csvcell]]..'['..i..','..thirddata.handlecsv.gCurrentLinePointer..']'..thirddata.handlecsv.gCSVSeparator..[[ ]])
- end
-end
-
-
-function thirddata.handlecsv.xprintall() -- lists all the csv table (necessary to define macros \printall)
--- http://www.pragma-ade.nl/general/manuals/hybrid.pdf
- thirddata.handlecsv.opencsvfile()
- local basespec = {
- framecolor = "blue",
- split="yes",
- align= "middle",
- style = "sans",
- offset="2pt",
- }
- context.bTABLE(basespec)
- for i=1, thirddata.handlecsv.gNumRows do
- context.bTR()
- for j=1,thirddata.handlecsv.gNumCols do
- context.bTD()
- context([[\csvcell]]..'['..j..','..i..']') -- Writing real values ...
- -- context(thirddata.handlecsv.gTableRows[j][i]..' ') -- Writing real values ...
- context.eTD()
- end
- context.eTR()
- end -- of for
-context.eTABLE()
-end
-
-
-
--- ConTeXt source:
-local string2print=[[%
-
-% CSV file report. Syntax: \csvreport or \csvreport{filename}.
-\def\csvreport{\dosingleempty\docsvreport}%
-\def\docsvreport[#1]{\dosinglegroupempty\dodocsvreport}%
-\def\dodocsvreport#1{\iffirstargument\ctxlua{thirddata.handlecsv.csvreport("#1")}\else\ctxlua{thirddata.handlecsv.csvreport()}\fi}%
-
-%\def\xprintline{\ctxlua{context(thirddata.handlecsv.printline())}}
-
-
-% Původní verze:
-% \def\xprintall{\ctxlua{context(thirddata.handlecsv.xprintall())}}
-
-\def\printline{\dorecurse{\numcols}{\csvcell[\recurselevel,\linepointer], }\crlf}
-
-
-\def\printall{%
-\setuppapersize[A3,landscape][A3,landscape]
-\catcode`\#=12 %CSV file contains # characters (i.e. TeX problematic character)
-\switchtobodyfont[10pt]
-\setupTABLE[background=color,backgroundcolor=yellow]
-\setupTABLE[row][first][background=color,backgroundcolor=lightgray]
-\bTABLE[offset=2pt, split=yes]
- \dorecurse{\numexpr(\numrows+1)}
- {\bTR
- \dorecurse{\numcols}
- {\bTD \csvcell[\currentTABLEcolumn,\currentTABLErow-1] \eTD}
- \eTR}
-\eTABLE
-}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Complete listing macros and commands that can be used (to keep track of all defined macros):
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \csvreport, \csvreport{<filename>}
-% \printline
-% \printall
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-]]
-
--- write definitions into ConTeXt:
-thirddata.handlecsv.string2context(string2print)
-
diff --git a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv.lua b/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv.lua
deleted file mode 100644
index 16ba045aa2..0000000000
--- a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv.lua
+++ /dev/null
@@ -1,1403 +0,0 @@
--- %D \module
--- %D [ file=t-handlecsv.lua,
--- %D version=2019.03.30,
--- %D title=HandleCSV module,
--- %D subtitle=CSV file handling,
--- %D author=Jaroslav Hajtmar,
--- %D date=\currentdate,
--- %D copyright=Jaroslav Hajtmar,
--- %D email=hajtmar@gyza.cz,
--- %D license=GNU General Public License]
---
--- %C Copyright (C) 2019 Jaroslav Hajtmar
--- %C
--- %C This program is free software: you can redistribute it and/or modify
--- %C it under the terms of the GNU General Public License as published by
--- %C the Free Software Foundation, either version 3 of the License, or
--- %C (at your option) any later version.
--- %C
--- %C This program is distributed in the hope that it will be useful,
--- %C but WITHOUT ANY WARRANTY; without even the implied warranty of
--- %C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--- %C GNU General Public License for more details.
--- %C
--- %C You should have received a copy of the GNU General Public License
--- %C along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
--- use a feature that is part of the /texmf-dist/tex/context/base/util-prs.lua
-
-thirddata = thirddata or { }
-
-thirddata.handlecsv = { -- Global variables
--- gCSVSeparator
- gUserCSVSeparator=';', -- the most widely used field separator in CSV tables
--- gCSVQuoter
- gUserCSVQuoter='"', --
--- gCSVHeader
- gUserCSVHeader=false, -- CSV file is by default considered as a CSV file without the header (in header are treated as column names of macros
- gUserUseHooks=false, -- In default setting is not use "hooks" when process CSV file
- gUserColumnNumbering='XLS', -- Something other than the XLS or undefined variable value (eg commenting that line) to set the Roman numbering ...
- gCurrentlyProcessedCSVFile=nil,
- gMarkingEmptyLines=false,
- gUserMarkingEmptyLines=false, -- if true, then module mark empty rows in CSV file else module accept empty lines as regular lines
- gTableEmptyRows={}, -- array of indexes of empty lines of CSV table -> gTableEmptyRows['csvfilename'][1]= 3 etc
- gTableNotEmptyRows={}, -- array of indexes of nonempty lines of CSV table -> gTableNotEmptyRows['csvfilename'][1]= 3 etc
- gCSVHandleBuffer={}, -- temporary buffer
--- NEW variables
- gOpenFiles={}, -- array of all opened files
- gNumLine={}, -- global variable - gNumLine['csvfilename.csv']=0
- gNumRows={}, -- global variable - save number of rows of csv table: gNumRows['csvfilename']=0
- gNumEmptyRows={}, -- global variable - save number of empty rows of csv table: gNumEmptyRows['csvfilename']=0
- gNumNotEmptyRows={}, -- global variable - save number of empty rows of csv table: gNumNotEmptyRows['csvfilename']=0
- gNumCols={}, -- global variable - save number of columns of csv table: gNumCols['csvfilename']=0
- gCurrentLinePointer={}, -- ie. CSV line number ie. number of the currently processed row: gCurrentLinePointer['csvfilename']=0
- gColumnNames={}, -- array with column names (readings from header of CSV file): gColumnNames['csvfilename']
- gColNames={}, -- associative array with column names for indexing use f.e. gColNames['csvfilename']['Firstname']=1, etc...
- gTableRows={}, -- array of contents of cells of CSV table -> gTableRows['csvfilename'][row][column]
- gTableRowsIndex={}, -- array of flags of lines of CSV table -> gTableEmptyRowsIndex['csvfilename'][i]= true or false
- gSavedLinePointerNo=1, -- global variable to keep the line number
-}
-
-local setmacro = interfaces.setmacro or ""
-
--- Initialize global variables etc.
-
--- Default value is saved in glob. variable gUseHooks (default is FALSE)
-if thirddata.handlecsv.gUseHooks == nil then thirddata.handlecsv.gUseHooks = thirddata.handlecsv.gUserUseHooks end
--- Default value is saved in glob. variable gUserCSVHeader (default FALSE)
-if thirddata.handlecsv.gCSVHeader == nil then thirddata.handlecsv.gCSVHeader = thirddata.handlecsv.gUserCSVHeader end
--- Default value is saved in glob. variable gCSVSeparator (default COMMA)
-if thirddata.handlecsv.gCSVSeparator == nil then thirddata.handlecsv.gCSVSeparator = thirddata.handlecsv.gUserCSVSeparator end
--- Default value is saved in glob. variable gCSVSeparator (default ")
-if thirddata.handlecsv.gCSVQuoter == nil then thirddata.handlecsv.gCSVQuoter = thirddata.handlecsv.gUserCSVQuoter end
--- Default value is saved in glob. variable gMarkingEmptyLines (default is FALSE)
-if thirddata.handlecsv.gMarkingEmptyLines==nil then thirddata.handlecsv.gMarkingEmptyLines = thirddata.handlecsv.gUserMarkingEmptyLines end
-
-
--- Tools block: Contain auxiliary functions and tools
-
-
-function thirddata.handlecsv.texmacroisdefined(macroname) -- check whether macroname macro is defined in ConTeXt
--- function is used to test whether the user has defined the macro \macroname. If not, it needs to define any default value
- return token.get_cmdname(token.create(macroname)) ~= "undefined_cs"
-end
-
-function thirddata.handlecsv.ParseCSVLine(line,sep)
--- tool function ParseCSVLine is defined for compatibility. Parsing string (or line).
- local mycsvsplitter = utilities.parsers.rfc4180splitter{
- separator = sep,
- quote = '"',
- strict=true, -- add 15.2.2016
- }
- local list = mycsvsplitter(line) inspect(list)
- return list[1]
-end
-
-
-function thirddata.handlecsv.tmn(s) -- TeX Macro Name. Name of TeX macro should not contain forbidden characters
- if string.len(s) == 0 then s='nil' end -- When the parameter 's' does not contain any character that is not the separator character, it is necessary to create macro name
- maxmacrolength=50 -- if the first string in line longer "than is healthy, so about 50 characters is sufficient
- -- ATTENTION! In the case that 1st CSV table row header that is a different column for content, which coincides with the first 'maxmacrolength' characters, the names of macros in different columns are the same (ie, the macro will give the correct result for the column)
- diachar= {"á","ä","č","ď","é","ě","í","ň","ó","ř","š","ť","ú","ů","ý","ž","Á","Ä","Č","Ď","É","Ě","Í","Ň","Ó","Ř","Š","Ť","Ú","Ů","Ý","Ž"}
- asciichar={"a","a","c","d","e","e","i","n","o","r","s","t","u","u","y","z","A","A","C","D","E","E","I","N","O","R","S","T","U","U","Y","Z"}
- for i=1, 32 do
- s=string.gsub(s, diachar[i], asciichar[i]) -- change diakritics chars
- end
- --s=string.gsub(s, "%d", "n") -- replace the numbers in name
- -- For 0-9 to replace the letter O or Roman numerals
- s=string.gsub(s, "0", "O") -- replace the numbers in name
- s=string.gsub(s, "1", "I") -- replace the numbers in name
- s=string.gsub(s, "2", "II") --
- s=string.gsub(s, "3", "III") --
- s=string.gsub(s, "4", "IV") --
- s=string.gsub(s, "5", "V") --
- s=string.gsub(s, "6", "VI") --
- s=string.gsub(s, "7", "VII") --
- s=string.gsub(s, "8", "VIII") --
- s=string.gsub(s, "9", "IX") --
- s=string.gsub(s, "%A", "x") -- Finally still removes all nealfabetic characters that were left there
- if string.len(s) > maxmacrolength+1 then s=string.sub(s, 1, maxmacrolength) end -- to limit the maximum length of a macro
-return s
-end
-
-
-function thirddata.handlecsv.xls2ar(colname) -- convert Excel column name (like A, B, ... AA, AB, ...) into serial number of column (A->1, B->2, ...)
- -- No for more than 702 columns (ie last column parametr for this function is ZZ)
- -- for example Excel 2003 can handle only up to the column IV!
- local colnumber=0
- local colname=colname:upper()
- for i=1, string.len(colname) do
- local onechar = string.sub(colname,i,i)
- colnumber=26*colnumber + (string.byte(onechar) - string.byte('A') + 1)
- end
- return colnumber
-end
-
-
-
-function thirddata.handlecsv.ar2xls(arnum) -- convert number to Excel name column
- -- For more than 703 columns (ie column A to ZZ) should be a function to modify
- -- Excel 2003 can handle only up to the column IV!
- local part=math.floor(arnum/26)
- local remainder = math.mod(arnum,26)
- part = part - (math.mod(arnum,26)==0 and 1 or 0)
- remainder = remainder + (math.mod(arnum,26)==0 and 26 or 0)
- local ctl =''
- if arnum < 703 then
- if part > 0 then
- ctl=string.char(64+part)
- end
- ctl = ctl .. string.char(64+remainder)
- else
- ctl = 'overZZ'
- end
- return ctl
-end
-
-
-function thirddata.handlecsv.ar2colnum(arnum) -- According to the settings glob. variable returns the column designation of TeX macros
- -- generated TeX macros referring to values in columns are numbered a`la EXCEL ie cA, cB, ..., cAA, etc
- -- or a`la roman number ie. cI, cII, cIII, cIV, ..., cXVIII, etc
- -- if it is "romannumbers" setting, then columns wil numbered by Romna else ala Excel
- if string.lower(thirddata.handlecsv.gUserColumnNumbering) == 'xls' then
- return thirddata.handlecsv.ar2xls(arnum) -- a la EXCEL
- else
- return string.upper(converters.romannumerals(arnum)) -- a la big ROMAN - convert Arabic numbers to big Roman. Used for "numbering" column in the TeX macros
- end
-end
-
-function thirddata.handlecsv.substitutecontentofcellof(csvfile,column,row,whattoreplace,substitution)
--- Substitute text in cell content of specified CSV file with other text
- local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- local column=thirddata.handlecsv.gColNames[csvfile][column]
- local whattoreplace=tostring(whattoreplace)
- local substitution=tostring(substitution)
- return thirddata.handlecsv.getcellcontentof(csvfile,column,row):gsub(whattoreplace,substitution)
-end
-
-function thirddata.handlecsv.substitutecontentofcell(column,row,whattoreplace,substitution)
--- Substitute text in cell content of current CSV file with other text
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- local column=thirddata.handlecsv.gColNames[csvfile][column]
- return thirddata.handlecsv.substitutecontentofcellof(csvfile,column,row,whattoreplace,substitution)
-end
-
-function thirddata.handlecsv.substitutecontentofcellofcurrentrow(column,whattoreplace,substitution)
--- Substitute text in cell content of current row of current CSV file with other text
- local row=thirddata.handlecsv.linepointer()
- return thirddata.handlecsv.substitutecontentofcell(column,row,whattoreplace,substitution)
-end
-
-function thirddata.handlecsv.processinputvalue(inputparameter,replacingnumber)
--- when inputparameter is not correct, then return replacingnumber
-local returnparameter=inputparameter
- if type(inputparameter)~= 'number' then
- returnparameter=replacingnumber
- end --
-return returnparameter
-end
-
-
--- Main functions and macros:
-
-function thirddata.handlecsv.hookson()
- thirddata.handlecsv.gUseHooks=true
-end
-
-function thirddata.handlecsv.hooksoff()
- thirddata.handlecsv.gUseHooks=false
-end
-
-function thirddata.handlecsv.setfiletoscan(filetoscan)
- local inpcsvfile=thirddata.handlecsv.handlecsvfile(filetoscan)
- thirddata.handlecsv.gCurrentlyProcessedCSVFile=inpcsvfile
-end
-
-
-function thirddata.handlecsv.setheader()
- thirddata.handlecsv.gCSVHeader=true
- context([[\global\issetheadertrue%]])
- context([[\global\notsetheaderfalse%]])
-end
-
-
-function thirddata.handlecsv.unsetheader()
- thirddata.handlecsv.gCSVHeader=false
- context([[\global\issetheaderfalse%]])
- context([[\global\notsetheadertrue%]])
-end
-
-function thirddata.handlecsv.setsep(sep)
- thirddata.handlecsv.gCSVSeparator=sep
-end
-
-function thirddata.handlecsv.unsetsep()
- thirddata.handlecsv.gCSVSeparator=thirddata.handlecsv.gUserCSVSeparator
-end
-
-function thirddata.handlecsv.indexofnotemptyline(sernumline)
-local csvfilename=thirddata.handlecsv.getcurrentcsvfilename()
- return thirddata.handlecsv.gTableNotEmptyRows[csvfilename][sernumline]
-end
-
-function thirddata.handlecsv.indexofemptyline(sernumline)
-local csvfilename=thirddata.handlecsv.getcurrentcsvfilename()
- return thirddata.handlecsv.gTableEmptyRows[csvfilename][sernumline]
-end
-
-function thirddata.handlecsv.notmarkemptylines()
-local csvfilename=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.gMarkingEmptyLines=false
- for row=1,thirddata.handlecsv.gNumRows[csvfilename] do
- thirddata.handlecsv.gTableNotEmptyRows[csvfilename][row]=row
- end
- thirddata.handlecsv.gTableEmptyRows[csvfilename]={}
- thirddata.handlecsv.gNumEmptyRows[csvfilename]=0
- thirddata.handlecsv.gNumNotEmptyRows[csvfilename]=thirddata.handlecsv.gNumRows[csvfilename]
- context([[\global\emptylinefalse%]])
- context([[\global\notemptylinetrue%]])
- context([[\global\emptylinesmarkingfalse%]])
- context([[\global\emptylinesnotmarkingtrue%]])
-end
-
-function thirddata.handlecsv.markemptylines()
-local csvfilename=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.gTableEmptyRows[csvfilename]={}
- thirddata.handlecsv.gTableNotEmptyRows[csvfilename]={}
- thirddata.handlecsv.gMarkingEmptyLines=true
- local counteremptylines=0
- local counternotemptylines=0
- for row=1,thirddata.handlecsv.gNumRows[csvfilename] do
- if thirddata.handlecsv.testemptyrow(row) then
- counteremptylines=counteremptylines+1
- thirddata.handlecsv.gTableEmptyRows[csvfilename][counteremptylines]=row
- else
- counternotemptylines=counternotemptylines+1
- thirddata.handlecsv.gTableNotEmptyRows[csvfilename][counternotemptylines]=row
- end
- end -- for
- thirddata.handlecsv.gNumEmptyRows[csvfilename]=counteremptylines
- thirddata.handlecsv.gNumNotEmptyRows[csvfilename]=counternotemptylines
- context([[\global\emptylinesmarkingtrue%]])
- context([[\global\emptylinesnotmarkingfalse%]])
-end
-
-
-function thirddata.handlecsv.resetmarkemptylines()
--- do following lines only when file contain completely empty rows and is requiring testing empty lines
-local csvfilename=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.gMarkingEmptyLines = thirddata.handlecsv.gUserMarkingEmptyLines
- if thirddata.handlecsv.gMarkingEmptyLines then
- thirddata.handlecsv.markemptylines()
- else thirddata.handlecsv.notmarkemptylines()
- end -- if thirddata.handlecsv.gMarkingEmptyLines
-end
-
-
-function thirddata.handlecsv.testemptyrow(lineindex)
-local csvfilename=thirddata.handlecsv.getcurrentcsvfilename()
-local linecontent=""
-local isemptyline=false
- for column=1,thirddata.handlecsv.gNumCols[csvfilename] do
- linecontent=linecontent..thirddata.handlecsv.gTableRows[csvfilename][lineindex][column]
- end
- if linecontent=="" or linecontent==nil then
- isemptyline=true
--- thirddata.handlecsv.gNumEmptyRows[csvfilename]=thirddata.handlecsv.gNumEmptyRows[csvfilename]+1
- end
- thirddata.handlecsv.gTableRowsIndex[csvfilename][lineindex]=isemptyline
- return isemptyline
-end
-
-
-function thirddata.handlecsv.emptylineevaluation(lineindex)
- if thirddata.handlecsv.gTableRowsIndex[thirddata.handlecsv.getcurrentcsvfilename()][lineindex] then
- context([[\global\emptylinetrue%]])
- context([[\global\notemptylinefalse%]])
- else
- context([[\global\emptylinefalse%]])
- context([[\global\notemptylinetrue%]])
- end
- return thirddata.handlecsv.gTableRowsIndex[thirddata.handlecsv.getcurrentcsvfilename()][lineindex]
-end
-
-
-function thirddata.handlecsv.removeemptylines()
--- This function remove empty rows only from field of variables thirddata.handlecsv.gTableRows!
--- The field is only re-indexed and function does not affect onto the physical input CSV file!
--- When the physical CSV file is reopened by using \open macro, the global field variable
--- thirddata.handlecsv.gTableRows[csvfile] is reset into original state!
- thirddata.handlecsv.markemptylines()
- local csvfilename=thirddata.handlecsv.getcurrentcsvfilename()
-
- for i=1,thirddata.handlecsv.gNumNotEmptyRows[csvfilename] do
- local indexofnotemptyrow=thirddata.handlecsv.gTableNotEmptyRows[csvfilename][i]
- -- i<--indexofnotemptyrow
- thirddata.handlecsv.gTableRows[csvfilename][i]=thirddata.handlecsv.gTableRows[csvfilename][indexofnotemptyrow]
- end
-
- for i=thirddata.handlecsv.gNumNotEmptyRows[csvfilename]+1,thirddata.handlecsv.gNumRows[csvfilename] do
- thirddata.handlecsv.gTableRows[csvfilename][i]=nil
- end
-
- thirddata.handlecsv.gNumRows[csvfilename]=thirddata.handlecsv.gNumNotEmptyRows[csvfilename]
- thirddata.handlecsv.markemptylines()
- thirddata.handlecsv.gTableEmptyRows[csvfilename]={}
- thirddata.handlecsv.gTableNotEmptyRows[csvfilename]={}
-end
-
-
-function thirddata.handlecsv.hooksevaluation()
- for i=1,#thirddata.handlecsv.gColumnNames[thirddata.handlecsv.getcurrentcsvfilename()] do
- if not thirddata.handlecsv.texmacroisdefined('bch'..thirddata.handlecsv.gColumnNames[thirddata.handlecsv.getcurrentcsvfilename()][i]) then
- context.setgvalue('bch'..thirddata.handlecsv.gColumnNames[thirddata.handlecsv.getcurrentcsvfilename()][i],'\\relax')
- end
- if not thirddata.handlecsv.texmacroisdefined('ech'..thirddata.handlecsv.gColumnNames[thirddata.handlecsv.getcurrentcsvfilename()][i]) then
- context.setgvalue('ech'..thirddata.handlecsv.gColumnNames[thirddata.handlecsv.getcurrentcsvfilename()][i],'\\relax')
- end
- end
-end
-
-
-function thirddata.handlecsv.setgetcurrentcsvfile(filename)
--- In the absence of the file name to use the global variable
- thirddata.handlecsv.gCurrentlyProcessedCSVFile = (filename ~= nil) and filename or thirddata.handlecsv.gCurrentlyProcessedCSVFile
- thirddata.handlecsv.gCurrentlyProcessedCSVFile = (thirddata.handlecsv.gCurrentlyProcessedCSVFile == nil) and filename or thirddata.handlecsv.gCurrentlyProcessedCSVFile
- local filename = filename ~= nil and filename or thirddata.handlecsv.gCurrentlyProcessedCSVFile
--- thirddata.handlecsv.gCurrentlyProcessedCSVFile = tostring(filename)
- return tostring(filename)
-end
-
-function thirddata.handlecsv.handlecsvfile(filename)
--- not used yet
-local filename = tostring(filename)
- filename = string.gsub(filename, '"', '')
- filename = string.gsub(filename, "'", "")
-if not (thirddata.handlecsv.isopenfile(filename)) then
- filename = (filename ~= nil) and filename or thirddata.handlecsv.gCurrentlyProcessedCSVFile
- filename = (thirddata.handlecsv.gCurrentlyProcessedCSVFile == nil) and filename or thirddata.handlecsv.gCurrentlyProcessedCSVFile
- filename = filename ~= nil and filename or thirddata.handlecsv.gCurrentlyProcessedCSVFile
- filename = filename ~= '' and filename or thirddata.handlecsv.gCurrentlyProcessedCSVFile
-end
- return filename
-end
-
-function thirddata.handlecsv.getcurrentcsvfilename()
--- return current (actual) CSV file
- return tostring(thirddata.handlecsv.gCurrentlyProcessedCSVFile)
-end
-
-
-function thirddata.handlecsv.isopenfile(csvfilename)
--- testing of opening CSV files
- local retval=(thirddata.handlecsv.gOpenFiles[csvfilename] ~= nil)
- return retval
-end
-
-function thirddata.handlecsv.closecsvfile(csvfilename)
--- manual closing of CSV files
- thirddata.handlecsv.gOpenFiles[csvfilename] = nil
-end
-
-
-function thirddata.handlecsv.getnumberofopencsvfiles()
--- get the number of open files
-local count = 0
-for k, v in pairs(thirddata.handlecsv.gOpenFiles) do
- count = count + 1
-end
- return count
-end
-
-
-
-function thirddata.handlecsv.setpointersofopeningcsvfile(inpcsvfile)
- thirddata.handlecsv.gCurrentLinePointer[inpcsvfile]=1
- thirddata.handlecsv.gNumLine[inpcsvfile]=1 -- set numline counter of file inpcsvfile
- thirddata.handlecsv.resetlinepointerof(inpcsvfile) -- set pointer to begin table (first row)
- thirddata.handlecsv.setnumlineof(inpcsvfile,1)
- context([[\global\EOFfalse%]])
- context([[\global\notEOFtrue%]])
- thirddata.handlecsv.resetmarkemptylines()
-end
-
-function thirddata.handlecsv.opencsvfile(filetoscan)
--- Open CSV tabule, inicialize variables
- -- open the table and load it into the global variable thirddata.handlecsv.gTableRows[filetoscan]
- -- if the option thirddata.handlecsv.gCSVHeader==true is enabled, then into glob variable thirddata.handlecsv.gColumnNames[filetoscan]
- -- sets the column names from the title, if not then sets XLS notation, ie. cA, cB, cC, ...
- -- into global variables thirddata.handlecsv.gNumRows[filetoscan] and thirddata.handlecsv.gNumCols[filetoscan] it saves the number of rows and columns of the table
- -- if the file header and the header line does not count the number of rows in the table
- -- Additionally, they can defined ConTeXt macros \csvfilename, \numrows a \numcols
-
- local inpcsvfile=thirddata.handlecsv.setgetcurrentcsvfile(filetoscan) -- set filetoscan as current processed csv file
-
- if thirddata.handlecsv.isopenfile(inpcsvfile) then -- if file is open, then set needed pointers at first line of file only
- thirddata.handlecsv.setpointersofopeningcsvfile(inpcsvfile)
- else -- if CSV file is not open, then open it and set all needed variables
-
- local inpcsvfile=thirddata.handlecsv.setgetcurrentcsvfile(inpcsvfile)
- thirddata.handlecsv.gOpenFiles[inpcsvfile]=inpcsvfile -- memory opening file
- thirddata.handlecsv.gColNames[inpcsvfile]={}
- thirddata.handlecsv.gColumnNames[inpcsvfile]={}
- thirddata.handlecsv.gTableRowsIndex[inpcsvfile]={}
- thirddata.handlecsv.gTableRows[inpcsvfile]={}
- thirddata.handlecsv.gTableEmptyRows[inpcsvfile]={}
- thirddata.handlecsv.gTableNotEmptyRows[inpcsvfile]={}
-
-
- local currentlyprocessedcsvfile = io.loaddata(inpcsvfile)
- local mycsvsplitter = utilities.parsers.rfc4180splitter{
- separator = thirddata.handlecsv.gCSVSeparator,
- quote = thirddata.handlecsv.gCSVQuoter,
- strict = true,
- }
- if thirddata.handlecsv.gCSVHeader then
- thirddata.handlecsv.gTableRows[inpcsvfile], thirddata.handlecsv.gColumnNames[inpcsvfile] = mycsvsplitter(currentlyprocessedcsvfile,true)
- inspect(thirddata.handlecsv.gTableRows[inpcsvfile])
- inspect(thirddata.handlecsv.gColumnNames[inpcsvfile])
- else -- if thirddata.handlecsv.gCSVHeader
- thirddata.handlecsv.gTableRows[inpcsvfile], thirddata.handlecsv.gColumnNames[inpcsvfile] = mycsvsplitter(currentlyprocessedcsvfile)
- inspect(thirddata.handlecsv.gTableRows[inpcsvfile])
- thirddata.handlecsv.gColumnNames[inpcsvfile]={}
- -- ad now set column names for withoutheader situation:
- for i=1,#thirddata.handlecsv.gTableRows[inpcsvfile][1] do
- -- OK, but not used: thirddata.handlecsv.gColumnNames[inpcsvfile][i]=thirddata.handlecsv.tmn(thirddata.handlecsv.gTableRows[inpcsvfile][1][i])
- thirddata.handlecsv.gColumnNames[inpcsvfile][i]=tostring(thirddata.handlecsv.ar2xls(i)) -- set XLS notation (fill array with XLS names of columns like 'cA', 'cB', etc.)
- end -- for
- end -- if thirddata.handlecsv.gCSVHeader
- for i=1,#thirddata.handlecsv.gTableRows[inpcsvfile][1] do
- thirddata.handlecsv.gColNames[inpcsvfile][tostring(thirddata.handlecsv.tmn(thirddata.handlecsv.gColumnNames[inpcsvfile][i]))] = i -- for indexing use (register names of macros ie 'Firstname' etc...)
- thirddata.handlecsv.gColNames[inpcsvfile][tostring(thirddata.handlecsv.gColumnNames[inpcsvfile][i])] = i -- for indexing use (register names of macros ie 'Firstname' etc...)
- thirddata.handlecsv.gColNames[inpcsvfile][tostring(thirddata.handlecsv.ar2xls(i))] = i -- for indexcolname macro (register names of macros ie 'A', 'B', etc...)
- thirddata.handlecsv.gColNames[inpcsvfile][tostring('c'..thirddata.handlecsv.ar2xls(i))] = i -- for indexcolname macro (register names of macros ie 'cA', 'cB', etc...)
- thirddata.handlecsv.gColNames[inpcsvfile][tostring(i)] = i -- for indexcolname macro (register names of macros ie 'cA', 'cB', etc...)
- thirddata.handlecsv.gColNames[inpcsvfile][i] = i -- for indexcolname macro (register names of macros ie 'cA', 'cB', etc...)
- end -- for
- local j=#thirddata.handlecsv.gTableRows[inpcsvfile][1]
- for i=1,#thirddata.handlecsv.gTableRows[inpcsvfile][1] do
- j=j+1
- thirddata.handlecsv.gColumnNames[inpcsvfile][j]=tostring('c'..thirddata.handlecsv.ar2xls(i)) -- set XLS notation (fill array with XLS names of columns like 'cA', 'cB', etc.)
- end -- for
- if thirddata.handlecsv.gCSVHeader then
- for i=1,#thirddata.handlecsv.gTableRows[inpcsvfile][1] do
- j=j+1
- thirddata.handlecsv.gColumnNames[inpcsvfile][j]=tostring(thirddata.handlecsv.ar2xls(i)) -- set XLS notation (fill array with XLS names of columns like 'cA', 'cB', etc.)
- end -- for
- for i=1,#thirddata.handlecsv.gTableRows[inpcsvfile][1] do
- j=j+1
- thirddata.handlecsv.gColumnNames[inpcsvfile][j]=tostring(thirddata.handlecsv.tmn(thirddata.handlecsv.gColumnNames[inpcsvfile][i])) -- maybe TeX incorect names of columns
- end -- for
- end -- if thirddata.handlecsv.gCSVHeader then
-
- thirddata.handlecsv.gNumRows[inpcsvfile]=#thirddata.handlecsv.gTableRows[inpcsvfile] -- Getting number of rows
- thirddata.handlecsv.gNumCols[inpcsvfile]=#thirddata.handlecsv.gTableRows[inpcsvfile][1] -- Getting number of columns
- thirddata.handlecsv.gNumEmptyRows[inpcsvfile]=0
- thirddata.handlecsv.gNumNotEmptyRows[inpcsvfile]=#thirddata.handlecsv.gTableRows[inpcsvfile]
- thirddata.handlecsv.setpointersofopeningcsvfile(inpcsvfile) -- set pointers
-
- if thirddata.handlecsv.gUseHooks then thirddata.handlecsv.hooksevaluation() end
-
- end -- if thirddata.handlecsv.isopenfile(inpcsvfile) then
-return
-end -- of thirddata.handlecsv.opencsvfile(file)
-
-
-function thirddata.handlecsv.readlineof(inpcsvfile,numberofline) --
--- Main function. Read data from specific line of specific file, parse them etc.
- local inpcsvfile=thirddata.handlecsv.handlecsvfile(inpcsvfile)
- local numberofline=numberofline
- local returnpar=false
- if type(numberofline)~= 'number' then
- if numberofline==nil then
- numberofline=thirddata.handlecsv.gCurrentLinePointer[inpcsvfile]
- returnpar=true
- else numberofline = 0
- end -- if numberofline==nil
- end -- if type(numberofline)
- if (numberofline > 0 and numberofline <=thirddata.handlecsv.gNumRows[inpcsvfile]) then
- thirddata.handlecsv.addtonumlineof(inpcsvfile,1)
- thirddata.handlecsv.gCurrentLinePointer[inpcsvfile]=numberofline
- returnpar=true
- thirddata.handlecsv.assigncontentsof(inpcsvfile,thirddata.handlecsv.gTableRows[inpcsvfile][numberofline])
- context([[\global\EOFfalse\global\notEOFtrue%]])
- else
- thirddata.handlecsv.assigncontentsof(inpcsvfile,'nil_line')
- if numberofline > thirddata.handlecsv.gNumRows[inpcsvfile] then
- context([[\global\EOFtrue\global\notEOFfalse%]])
- end
- end -- if (numberofline > 0
---řešit thirddata.handlecsv.emptylineevaluation(numberofline)
- return returnpar -- return true if numberofline is regular line, else return false
-end -- function thirddata.handlecsv.readlineof(inpcsvfile,numberofline) --
-
-
-function thirddata.handlecsv.readline(numberofline) --
--- Main function. Read data from specific line of specific file, parse them etc.
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- if type(numberofline) == 'number' then
- thirddata.handlecsv.readlineof(csvfile,numberofline) --
- else
- thirddata.handlecsv.readlineof(csvfile,thirddata.handlecsv.gCurrentLinePointer[csvfile]) --
- end
-end
-
-
-function thirddata.handlecsv.createxlscommandof(xlsname,csvfile)
-local inpcsvfile=thirddata.handlecsv.handlecsvfile(csvfile)
-local cxlsname=tostring('col'..xlsname)
-local docxlsname=tostring('docol'..xlsname)
-local xlsname=tostring(''..xlsname)
-
--- context([[\def\definice]]..xlsname..[[#1{\ctxlua{context(thirddata.handlecsv.getcellcontentof(']]..inpcsvfile..[[',']]..xlsname..[[','#1'))}}]])
-
- interfaces.definecommand (docxlsname, {
- arguments = { { "option", "string" } },
- macro = function (opt_1)
- if #opt_1>0 then
- context(thirddata.handlecsv.getcellcontentof(inpcsvfile,xlsname,tonumber(opt_1)))
- else
- context(thirddata.handlecsv.getcellcontentof(inpcsvfile,xlsname,thirddata.handlecsv.gCurrentLinePointer[inpcsvfile]))
- end
- end
- })
- interfaces.definecommand(cxlsname, {
- macro = function ()
- context.dosingleempty()
- context[docxlsname]()
- end
- })
--- interfaces.definecommand ("column"..xlsname, {
--- arguments = { { "option"} },
--- macro = function (opt_1)
--- if opt_1~="" then
--- context(thirddata.handlecsv.getcellcontentof(inpcsvfile,xlsname,tonumber(opt_1)))
--- else
--- context(thirddata.handlecsv.getcellcontentof(inpcsvfile,xlsname,thirddata.handlecsv.gCurrentLinePointer[inpcsvfile]))
--- end
--- end
--- })
-end
-
-
-function thirddata.handlecsv.createxlscommand(xlsname)
-local inpcsvfile=thirddata.handlecsv.getcurrentcsvfilename()
-thirddata.handlecsv.createxlscommandof(xlsname,inpcsvfile)
-end
-
-
-function thirddata.handlecsv.assigncontentsof(inpcsvfile,line) -- put data into columns macros
--- after read of line this function put content of columns into specific TeX macros...
---if tex.modes['XXL'] then context("XXL mode") else context("not XXL mode") end
- local inpcsvfile=thirddata.handlecsv.handlecsvfile(inpcsvfile)
- local cutoffinpcsvfile=thirddata.handlecsv.ParseCSVLine(inpcsvfile,".")[1] -- cut filename extension
- for i=1,thirddata.handlecsv.gNumCols[inpcsvfile] do
- content='nil' -- 1.10.2015
- if line ~= 'nil_line' then content = line[i] end
- local puremacroname=thirddata.handlecsv.gColumnNames[inpcsvfile][i]
--- local macroname=cutoffinpcsvfile..thirddata.handlecsv.gColumnNames[inpcsvfile][i]
- local macroname=thirddata.handlecsv.gColumnNames[inpcsvfile][i]
--- context("macroname: "..macroname.."\\crlf")
- local purexlsname=thirddata.handlecsv.ar2colnum(i)
--- context("purexlsname: "..purexlsname.."\\crlf")
- local xlsname='c'..purexlsname
--- context("xlsname: "..xlsname.."\\crlf")
- local xlsfilename=thirddata.handlecsv.tmn(cutoffinpcsvfile)..'c'..purexlsname
--- context("xlsfilename: "..xlsfilename.."\\crlf")
- local hookxlsname='h'..xlsname
- local macroname=thirddata.handlecsv.tmn(macroname)
- local puremacroname=thirddata.handlecsv.tmn(puremacroname)
--- context("macroname: "..macroname.."\\crlf")
- local hookmacroname='h'..macroname
--- if content == ' ' then tex.print('space') end
--- if content == '' then tex.print('empty') content=[[\empty]] end
- context.setgvalue(xlsname, content) -- defining automatic TeX macros \cA, \cB, atd. resp. \cI, \cII, ... containing the contents of the line. Macros with names of the headers are updated automatically
- context.setgvalue(xlsfilename, content) -- defining automatic TeX macros \filenamecA, \filenamecB, atd. resp. \cI, \cII, ... containing the contents of the line. Macros with names of the headers are updated automatically
- -- was context.setgvalue(macroname,'\\'..xlsname) -- ie for example \let\Name\cA
--- context.setgvalue(macroname,content) -- defining automatic TeX macros \Name, \Date, etc. (names gets from header), containing the contents of the line. Macros with names of the headers are updated automatically
- context.setgvalue(puremacroname,content) -- defining automatic TeX macros \Name, \Date, etc. (names gets from header), containing the contents of the line. Macros with names of the headers are updated automatically
- -- experimental version in next two lines:
- -- this define variants of macros \colA, \colA[8], ... and \colFirstname, \colFirstname[11] etc.
- thirddata.handlecsv.createxlscommandof(''..purexlsname,inpcsvfile) -- create macros \colA, \colB, etc. and their variants \colA[row], ...
---if tex.modes['XXX'] then
---context("XXX-"..macroname.."-XXX")
---end
- context.setgvalue('col'..macroname,'\\col'..purexlsname) -- and create fullname macros \colFirstname, \colFirstname[5], etc...
--- context.setgvalue(''..macroname,'\\col'..purexlsname) -- and create fullname macros \colFirstname, \colFirstname[5], etc...
--- context.setgvalue(''..macroname,'\\col'..purexlsname) -- and create fullname macros \colFirstname, \colFirstname[5], etc...
- --
- interfaces.definecommand ("column"..purexlsname, {
- arguments = { { "string"} },
- macro = function (opt_1)
- if opt_1~="" then
- context(thirddata.handlecsv.getcellcontentof(inpcsvfile,xlsname,tonumber(opt_1)))
- else
- context(thirddata.handlecsv.getcellcontentof(inpcsvfile,xlsname,thirddata.handlecsv.gCurrentLinePointer[inpcsvfile]))
- end
- end
- })
- --
- -- and now create hooks macros:
- if thirddata.handlecsv.gUseHooks then
- context.setgvalue(hookxlsname,'\\bch\\bch'..xlsname..'\\'..xlsname..'\\ech'..xlsname..'\\ech') -- defining automatic TeX macros \hcA, \hcB, atd. resp. \hcI, \hcII, ... containing 'hooked' contents of the line. Macros with names of the headers are updated automatically)
- context.setgvalue(hookmacroname,'\\bch\\bch'..macroname..'\\'..xlsname..'\\ech'..macroname..'\\ech ') -- defining automatic TeX macros \hName, \hDate, etc. (names gets from header), containing 'hooked' contents of the line. Macros with names of the headers are updated automatically)
- end
- end -- for i=1,
-end -- function thirddata.handlecsv.assigncontentsof(inpcsvfile,line) -- put data into columns macros
-
-
-function thirddata.handlecsv.assigncontents(line) -- put data into columns macros
-thirddata.handlecsv.assigncontentsof(thirddata.handlecsv.getcurrentcsvfilename(),line)
-end
-
-
-function thirddata.handlecsv.getcellcontentof(csvfile,column,row)
--- Read data from specific cell of specific the csv table
- -- local returnparametr='nil' -- 1.10.2015
- local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- local returnparametr='' -- 9.1.2016
- local column=column
- local row=row
- if type(column)=='string' then
- local testcolumn=thirddata.handlecsv.gColNames[csvfile][column]
- if testcolumn==nil then
- column=thirddata.handlecsv.xls2ar(column)
- else
- column=testcolumn
- end
- else
- testcolumn=tonumber(column)
- if testcolumn==nil then
- column=0
- else
- column=testcolumn
- end
- end
- if column<=0 then column=1 end
- if column>thirddata.handlecsv.gNumCols[csvfile] then column=thirddata.handlecsv.gNumCols[csvfile] end
- if type(row)=='string' then
- local testrow=tonumber(row)
- if testrow==nil then
- row=0
- else
- row=testrow
- end
- end
- if type(column)=='number' and type(row)=='number' then
- if row>0 and row <=thirddata.handlecsv.gNumRows[csvfile] and column>=0 and column<=thirddata.handlecsv.gNumCols[csvfile] then
- returnparametr=thirddata.handlecsv.gTableRows[csvfile][row][column]
- elseif row==0 then
- returnparametr=thirddata.handlecsv.gColumnNames[csvfile][column]
- end
- end
- return returnparametr
-end
-
-
-function thirddata.handlecsv.getcellcontent(column,row)
--- Read data from specific cell of current open csv table
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- local returnparametr=thirddata.handlecsv.getcellcontentof(csvfile,column,row)
- return returnparametr
-end
-
-
-function thirddata.handlecsv.nextlineof(csvfile)
--- Move line pointer to next line.
- local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- if thirddata.handlecsv.gCurrentLinePointer[csvfile] > thirddata.handlecsv.gNumRows[csvfile] then
- thirddata.handlecsv.gCurrentLinePointer[csvfile]=thirddata.handlecsv.gNumRows[csvfile]
- context([[\global\EOFtrue%]])
- context([[\global\notEOFfalse%]])
- else
- thirddata.handlecsv.gCurrentLinePointer[csvfile]=thirddata.handlecsv.gCurrentLinePointer[csvfile]+1
- context([[\global\EOFfalse%]])
- context([[\global\notEOFtrue%]])
- end
-end
-
-
-function thirddata.handlecsv.nextline()
--- Move line pointer to next line.
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.nextlineof(csvfile)
-end
-
-
-function thirddata.handlecsv.previouslineof(csvfile)
--- Move line pointer to previous line.
- local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- if thirddata.handlecsv.gCurrentLinePointer[csvfile] < 2 then
- thirddata.handlecsv.gCurrentLinePointer[csvfile] = 1
- else
- thirddata.handlecsv.gCurrentLinePointer[csvfile]=thirddata.handlecsv.gCurrentLinePointer[csvfile] - 1
- end
- context([[\global\EOFfalse%]])
- context([[\global\notEOFtrue%]])
-end
-
-
-function thirddata.handlecsv.previousline()
--- Move line pointer to previous line.
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.previouslineof(csvfile)
-end
-
-
-function thirddata.handlecsv.setlinepointerof(csvfile,numberofline)
- local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- local numberofline = thirddata.handlecsv.processinputvalue(numberofline,thirddata.handlecsv.gCurrentLinePointer[csvfile])
- if numberofline < 1 then numberofline = 1 end
- if numberofline > thirddata.handlecsv.gNumRows[csvfile] then
- numberofline=thirddata.handlecsv.gNumRows[csvfile]
- end
- thirddata.handlecsv.gCurrentLinePointer[csvfile]=numberofline
- thirddata.handlecsv.readlineof(csvfile,numberofline)
-end
-
-
-function thirddata.handlecsv.setlinepointer(numberofline)
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.setlinepointerof(csvfile,numberofline)
-end
-
-
-function thirddata.handlecsv.savelinepointer()
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.gSavedLinePointerNo = thirddata.handlecsv.gCurrentLinePointer[csvfile]
-end
-
-
-function thirddata.handlecsv.setsavedlinepointer()
- thirddata.handlecsv.setlinepointer(thirddata.handlecsv.gSavedLinePointerNo)
-end
-
-
-function thirddata.handlecsv.resetlinepointerof(csvfile)
--- Take pointer to first row of table
- local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- thirddata.handlecsv.setlinepointerof(csvfile,1)
-end
-
-
-function thirddata.handlecsv.resetlinepointer()
--- Take pointer to first row of table
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.setlinepointerof(csvfile,1)
-end
-
-
-function thirddata.handlecsv.linepointerof(csvfile)
- local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- return thirddata.handlecsv.gCurrentLinePointer[csvfile]
-end
-
-
-function thirddata.handlecsv.linepointer()
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- -- return thirddata.handlecsv.gCurrentLinePointer[csvfile] -- cause problem with decimal point for higher versions of Lua
- -- return math.tointeger(thirddata.handlecsv.gCurrentLinePointer[csvfile]) -- cause incompatibility for lower version of Lua
- return math.floor(tonumber(thirddata.handlecsv.gCurrentLinePointer[csvfile])) -- compatible with lower and higher versions of Lua
-end
-
-
-function thirddata.handlecsv.getcurrentlinepointer() -- for compatibility
- return thirddata.handlecsv.linepointer()
-end
-
-
-function thirddata.handlecsv.getlinepointer() -- for compatibility
- return thirddata.handlecsv.linepointer()
-end
-
-
-function thirddata.handlecsv.setnumlineof(csvfile,numline)
- local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
-thirddata.handlecsv.gNumLine[csvfile]=numline
-end
-
-
-function thirddata.handlecsv.setnumline(numline)
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
-thirddata.handlecsv.setnumlineof(csvfile,numline)
-end
-
-
-function thirddata.handlecsv.resetnumlineof(csvfile)
-local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- thirddata.handlecsv.setnumlineof(csvfile,0)
-end
-
-function thirddata.handlecsv.resetnumline()
-local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.resetnumlineof(csvfile)
-end
-
-function thirddata.handlecsv.addtonumlineof(inpcsvfile,numline)
- local inpcsvfile=thirddata.handlecsv.handlecsvfile(inpcsvfile)
- thirddata.handlecsv.gNumLine[inpcsvfile]=thirddata.handlecsv.gNumLine[inpcsvfile]+numline
-end
-
-
-function thirddata.handlecsv.addtonumline(numline)
- local inpcsvfile=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.addtonumlineof(inpcsvfile,numline)
-end
-
-function thirddata.handlecsv.numlineof(csvfile)
-local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- return thirddata.handlecsv.gNumLine[csvfile]
-end
-
-function thirddata.handlecsv.numline()
-local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- return thirddata.handlecsv.gNumLine[csvfile]
-end
-
-
-function thirddata.handlecsv.nextnumlineof(csvfile)
--- Move numline pointer to next number.
-local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- thirddata.handlecsv.gNumLine[csvfile]=thirddata.handlecsv.gNumLine[csvfile]+1
-end
-
-
-function thirddata.handlecsv.nextnumline()
--- Move numline pointer to next number.
-local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- thirddata.handlecsv.gNumLine[csvfile]=thirddata.handlecsv.gNumLine[csvfile]+1
-end
-
-
-function thirddata.handlecsv.numrowsof(csvfile)
-local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
--- context(thirddata.handlecsv.gNumRows[csvfile])
- return thirddata.handlecsv.gNumRows[csvfile]
-end
-
-function thirddata.handlecsv.numrows()
-local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
--- context(thirddata.handlecsv.gNumRows[csvfile])
- return thirddata.handlecsv.gNumRows[csvfile]
-end
-
-
-function thirddata.handlecsv.numemptyrows()
- return thirddata.handlecsv.gNumEmptyRows[thirddata.handlecsv.getcurrentcsvfilename()]
-end
-
-
-function thirddata.handlecsv.numnotemptyrows()
-return thirddata.handlecsv.gNumRows[thirddata.handlecsv.getcurrentcsvfilename()]-thirddata.handlecsv.gNumEmptyRows[thirddata.handlecsv.getcurrentcsvfilename()]
-end
-
-
-function thirddata.handlecsv.numcolsof(csvfile)
-local csvfile=thirddata.handlecsv.handlecsvfile(csvfile)
- context(thirddata.handlecsv.gNumCols[csvfile])
-end
-
-function thirddata.handlecsv.numcols()
-local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- context(thirddata.handlecsv.gNumCols[csvfile])
--- thirddata.handlecsv.numcolsof(csvfile)
-end
-
-
-function thirddata.handlecsv.resethooks()
--- initialize ConTeXt hooks
- context([[%
- \letvalue{blinehook}=\relax%
- \letvalue{elinehook}=\relax%
- \letvalue{bfilehook}=\relax%
- \letvalue{efilehook}=\relax%
- \letvalue{bch}=\relax%
- \letvalue{ech}=\relax%
- ]])
-end
-
-
-function thirddata.handlecsv.string2context(str2ctx)
--- for safety writen
- local s=str2ctx
- s=string.gsub(s, "%%(.-)\n", "\n") -- remove TeX comments from string. From % character to the end of line
- -- s=string.gsub(s, '\n', "")
- context(s)
- -- texsprint(s) -- for debugging ...
-end
-
-
-function thirddata.handlecsv.doloopfromto(from, to, action)
- context[[\opencsvfile]]
- context[[\edef\tempnumline{\numline}]] -- 23.6.2017
- context[[\resetnumline]] -- uncommented 23.6.2017
- if thirddata.handlecsv.gUseHooks then context[[\bfilehook]] end
- context[[\removeunwantedspaces]]
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- local gnumrows=thirddata.handlecsv.gNumRows[csvfile]+0
- local from=from+0
- local to=to+0
- local step=1
- local docycle=true
- if (from>gnumrows and to>gnumrows) then docycle=false end
- if docycle then
- if from>to then
- step=-1
- if from>gnumrows then from=gnumrows end
- if to<0 then to=0 end
- else -- if from<=to
- if to>gnumrows then to=gnumrows end
- if from<0 then from=1 end
- end
- for i=from, to, step do
- if thirddata.handlecsv.gUseHooks then context[[\blinehook]] end
- context([[\readline{]]..i..[[}]]) --
- context(action)
- if thirddata.handlecsv.gUseHooks then context[[\elinehook]] end
- end
- end -- docycle
--- context[[\removeunwantedspaces]]
-if thirddata.handlecsv.gUseHooks then context[[\efilehook]] end
-context[[\setnumline{\tempnumline}]] -- 23.6.2017
-end -- function thirddata.handlecsv.doloopfromto
-
-
-function thirddata.handlecsv.doloopfornext(numberofrows, action)
- if thirddata.handlecsv.gUseHooks then context[[\bfilehook]] end
- context[[\removeunwantedspaces]]
- local csvfile=thirddata.handlecsv.getcurrentcsvfilename()
- local gnumrows=thirddata.handlecsv.gNumRows[csvfile]+0
- local from=thirddata.handlecsv.gCurrentLinePointer[csvfile]+0
- local to=thirddata.handlecsv.gCurrentLinePointer[csvfile]+numberofrows
- local step=1
- local docycle=true
- if from>to then
- step=-1
- if from>gnumrows then from=gnumrows end
- if to<0 then to=0 end
- else -- if from<=to
- if to>gnumrows then to=gnumrows end
- if from<0 then from=1 end
- end
- for i=from, to-step, step do
- if thirddata.handlecsv.gUseHooks then context[[\blinehook]] end
- context([[\readline{]]..i..[[}]]) -- context(thirddata.handlecsv.readline(i))
- context(action)
- if thirddata.handlecsv.gUseHooks then context[[\elinehook]] end
- end
- thirddata.handlecsv.addtonumline(-1)
-context[[\removeunwantedspaces]]
-if thirddata.handlecsv.gUseHooks then context[[\efilehook]] end
-context[[\nextrow]]
-end -- function thirddata.handlecsv.doloopfornext
-
-
-
--- ConTeXt source:
-local string2print=[[%
-% library newifs for testing during processing CSV table
-\newif\ifissetheader%
-\newif\ifnotsetheader%
-\newif\ifEOF%
-\newif\ifnotEOF%
-\newif\ifemptyline%
-\newif\ifnotemptyline%
-\newif\ifemptylinesmarking% setting by macros \markemptylines and \notmarkemptylines
-\newif\ifemptylinesnotmarking% setting by \markemptylines and \notmarkemptylines
-
-
-% Macros defining above in source text:
-\let\lineaction\empty% set user define macro into default value
-\def\resethooks{\ctxlua{context(thirddata.handlecsv.resethooks())}}
-\resethooks % -- DO IT NOW !!!
-\def\hookson{\ctxlua{thirddata.handlecsv.hookson()}}
-\let\usehooks\hookson % -- synonym only
-\def\hooksoff{\ctxlua{thirddata.handlecsv.hooksoff()}}
-\def\setheader{\ctxlua{thirddata.handlecsv.setheader()}}
-\def\unsetheader{\ctxlua{thirddata.handlecsv.unsetheader()}}
-\let\resetheader\unsetheader % -- for compatibility
-\def\setsep#1{\ctxlua{thirddata.handlecsv.setsep('#1')}}
-\def\unsetsep{\ctxlua{thirddata.handlecsv.unsetsep()}}
-\let\resetsep\unsetsep % -- for compatibility
-\def\setfiletoscan#1{\ctxlua{thirddata.handlecsv.setfiletoscan('#1');thirddata.handlecsv.opencsvfile()}}
-\def\setcurrentcsvfile[#1]{\ctxlua{thirddata.handlecsv.setgetcurrentcsvfile('#1')}}
-
-
-\def\numrows{\ctxlua{context(thirddata.handlecsv.numrows())}}
-\def\numrowsof[#1]{\ctxlua{context(thirddata.handlecsv.numrowsof('#1'))}}
-\def\numcols{\ctxlua{context(thirddata.handlecsv.gNumCols[thirddata.handlecsv.gCurrentlyProcessedCSVFile])}}
-\def\numcolsof[#1]{\ctxlua{context(thirddata.handlecsv.gNumCols['#1'])}}
-\def\currentcsvfile{\ctxlua{context(thirddata.handlecsv.getcurrentcsvfilename())}}
-\let\csvfilename\currentcsvfile % for compatibility using
-
-
-\def\numemptyrows{\ctxlua{context(thirddata.handlecsv.numemptyrows())}}
-\def\numnotemptyrows{\ctxlua{context(thirddata.handlecsv.numnotemptyrows())}}
-
-
-% usefull tool macros :
-
-% Pass the contents of the macro into parameter
-\def\thenumexpr#1{\the\numexpr(#1+0)}
-% Add content (#2) into content of macro #1
-\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
-% Expanded version of previous macro
-\long\def\eaddto#1#2{\edef#1{#1#2}}
-
-
-
-% Get content of specific cell of CSV table. Calling: \csvcell[column number,row number] OR \csvcell['ColumnName',row number]
-\def\getcsvcell[#1,#2]{\ctxlua{context(thirddata.handlecsv.getcellcontent(#1,#2))}}%
-%%%%%\def\getcsvcell[#1,#2]{\if!#2!\ctxlua{context(thirddata.handlecsv.getcellcontent(#1,thirddata.handlecsv.gCurrentLinePointer[thirddata.handlecsv.getcurrentcsvfilename()]))}\else\ctxlua{context(thirddata.handlecsv.getcellcontent(#1,#2))}\fi}%
-
-% Get content of specific cell of CSV table. Calling: \csvcell[column number,row number] OR \csvcell['ColumnName',row number]
-\def\getcsvcellof[#1][#2,#3]{\ctxlua{context(thirddata.handlecsv.getcellcontentof("#1",#2,#3))}}%
-
-
-% Get content of specific cell of CSV table. Calling: \csvcell[column number,row number or row number getting from macro] OR \csvcell['ColumnName',row number or row number getting from macro]
-\def\csvcell[#1,#2]{\getcsvcell[#1,\the\numexpr(#2+0)]}%
-%\def\csvcell\getcsvcell
-
-
-% Get content of specific cell of current line of CSV table. Calling: \currentcell{column number} OR \currentcell{'ColumnName'}
-\def\currentcsvcell#1{\getcsvcell[#1,\thenumexpr{\linepointer}]}%
-\let\currcell\currentcsvcell
-
-% Get content of specific cell of next line of CSV table. Calling: \nextcell{column number} OR \nextcell{'ColumnName'}
-\def\nextcsvcell#1{\ifnum\linepointer<\numrows{\getcsvcell[#1,\thenumexpr{\linepointer+1}]}\fi}%
-\let\nextcell\nextcsvcell
-
-% Get content of specific cell of previous line of CSV table. Calling: \previouscell{column number} OR \previouscell{'ColumnName'}
-\def\previouscsvcell#1{\ifnum\linepointer>1{\getcsvcell[#1,\thenumexpr{\linepointer-1}]}\fi}%
-\let\prevcell\previouscsvcell
-
-
-% Get column name of n-th column of CSV table. When is set header, then get headername else get XLSname
-\def\colnameof[#1][#2]{\ctxlua{context(thirddata.handlecsv.gColumnNames['#1'][#2])}}%
-\def\colname[#1]{\ctxlua{context(thirddata.handlecsv.gColumnNames[thirddata.handlecsv.getcurrentcsvfilename()][#1])}}%
-
-% Get index (ie serrial number) of strings columns names (own name or XLS name)
-\def\indexcolnameof[#1][#2]{\ctxlua{context(thirddata.handlecsv.gColNames['#1'][#2])}}%
-\def\indexcolname[#1]{\ctxlua{context(thirddata.handlecsv.gColNames[thirddata.handlecsv.getcurrentcsvfilename()][#1])}}%
-
-% Get (alternative) XLS column name (of n-th column)
-\def\xlscolname[#1]{\ctxlua{context(thirddata.handlecsv.ar2colnum(#1))}}%
-
-% Get (alternative) XLS column name (of n-th column)
-\def\cxlscolname[#1]{\ctxlua{context('c'..thirddata.handlecsv.ar2colnum(#1))}}%
-
-% Get column TeX name of n-th column of CSV table. When is set header, then get headername else get XLSname
-\def\texcolname[#1]{\ctxlua{context(thirddata.handlecsv.tmn(thirddata.handlecsv.gColumnNames[thirddata.handlecsv.getcurrentcsvfilename()][#1]))}}%
-
-
-% Get content of n-th column of current row
-\def\columncontent[#1]{%
-\getcsvcell[#1,\ctxlua{context(thirddata.handlecsv.linepointer())}] %
-%\getcsvcell[#1,\linepointer]%
-%\getcsvcell[#1,\ctxlua{context(thirddata.handlecsv.linepointer())}]%
-%\ctxlua{context(tostring(thirddata.handlecsv.getcellcontent(#1,8)))}
-}%
-
-% Substitution of text #2 in cell content by text #3. Substitution is done in the current column of column #1 (number, XLS name or cX name)
-\def\replacecontentin#1#2#3{\ctxlua{context(thirddata.handlecsv.substitutecontentofcellofcurrentrow('#1','#2','#3'))}}%
-
-% Get number from XLS column name (ie n-th column)
-\def\numberxlscolname[#1]{\ctxlua{context(thirddata.handlecsv.xls2ar(#1))}}%
-%%%\def\columncontent[#1]{\ctxlua{context(thirddata.handlecsv.getcellcontent(#1,thirddata.handlecsv.linepointer()))}}
-%%%\def\columncontent[#1]{\ctxlua{context(thirddata.handlecsv.getcellcontent(thirddata.handlecsv.gColNames[#1],thirddata.handlecsv.linepointer()))}}
-\def\columncontentof[#1][#2]{\ctxlua{context(thirddata.handlecsv.getcellcontentof('#1',thirddata.handlecsv.gColNames['#1'][#2],thirddata.handlecsv.linepointerof('#1')))}}
-\def\columncontent[#1]{\ctxlua{context(thirddata.handlecsv.getcellcontent(thirddata.handlecsv.gColNames[thirddata.handlecsv.getcurrentcsvfilename()][#1],thirddata.handlecsv.linepointerof(thirddata.handlecsv.getcurrentcsvfilename())))}}
-\def\resetlinepointer{\ctxlua{context(thirddata.handlecsv.resetlinepointer())}}
-\def\resetlinepointerof[#1]{\ctxlua{context(thirddata.handlecsv.resetlinepointerof('#1'))}}
-\let\resetlineno\resetlinepointer
-\let\resetsernumline\resetlinepointer
-\def\setnumline#1{\ctxlua{thirddata.handlecsv.setnumline(#1)}}
-\def\resetnumline{\ctxlua{context(thirddata.handlecsv.resetnumline())}}
-\resetnumline % DO IT NOW
-\def\linepointer{\ctxlua{context(thirddata.handlecsv.linepointer())}}
-\def\linepointerof[#1]{\ctxlua{context(thirddata.handlecsv.linepointerof('#1'))}}
-\let\lineno\linepointer
-\let\sernumline\linepointer
-\def\numline{\ctxlua{context(thirddata.handlecsv.numline())}}
-\def\addtonumline#1{\ctxlua{thirddata.handlecsv.addtonumline(#1)}}
-%\def\setlinepointer#1{\ctxlua{thirddata.handlecsv.setlinepointer(#1);thirddata.handlecsv.readline(#1)}}
-\def\setlinepointerof[#1]#2{\ctxlua{thirddata.handlecsv.setlinepointerof('#1',#2)}}
-\def\setlinepointer#1{\ctxlua{thirddata.handlecsv.setlinepointer(#1)}}
-\def\savelinepointer{\ctxlua{thirddata.handlecsv.savelinepointer()}}
-\let\savelineno\savelinepointer % synonym
-\def\setsavedlinepointer{\ctxlua{thirddata.handlecsv.setsavedlinepointer()}}
-\let\setsavedlineno\setsavedlinepointer % synonym
-\def\indexofnotemptyline#1{\ctxlua{context(thirddata.handlecsv.indexofnotemptyline(#1))}}
-\def\indexofemptyline#1{\ctxlua{context(thirddata.handlecsv.indexofemptyline(#1))}}
-\def\notmarkemptylines{\ctxlua{thirddata.handlecsv.notmarkemptylines()}}
-\def\markemptylines{\ctxlua{thirddata.handlecsv.markemptylines()}}
-\def\resetmarkemptylines{\ctxlua{thirddata.handlecsv.resetmarkemptylines()}}%
-\def\removeemptylines{\ctxlua{thirddata.handlecsv.removeemptylines()}}%
-\def\nextlineof[#1]{\ctxlua{thirddata.handlecsv.nextlineof('#1')}} % -- macro for skip to next line. \nextlineof no read data from current line unlike \nextrow macro.
-\def\nextline{\ctxlua{thirddata.handlecsv.nextline()}} % -- macro for skip to next line. \nextline no read data from current line unlike \nextrow macro.
-\def\prevlineof[#1]{\ctxlua{thirddata.handlecsv.previouslineof('#1')}} % -- macro for skip to previous line. \prevlineof no read data from current line unlike \prevrowof macro.
-\def\prevline{\ctxlua{thirddata.handlecsv.previousline()}} % -- macro for skip to previous line. \prevline no read data from current line unlike \prevrow macro.
-\def\nextnumline{\ctxlua{thirddata.handlecsv.nextnumline()}} % -- macro for add numline counter.
-%\def\nextrow{\readline\nextline} % -- For compatibility
-\def\nextrow{\nextline\readline} % -- For compatibility (changed 2015-09-22)
-\def\nextrowof[#1]{\nextlineof[#1]\readlineof[#1]{\ctxlua{context(thirddata.handlecsv.linepointerof('#1'))}}} % -- For compatibility (changed 2015-09-22)
-%\def\nextrowof[#1]{\nextlineof[#1]\readlineof[#1]{\ctxlua{context(thirddata.handlecsv.gCurrentLinePointer['#1'])}}} % -- For compatibility (changed 2015-09-22)
-\def\prevrow{\prevline\readline}
-\def\prevrowof[#1]{\prevlineof[#1]\readlineof[#1]{\ctxlua{context(thirddata.handlecsv.linepointerof('#1'))}}}
-\def\exitlooptest{\ifEOF\exitloop\else\nextrow\fi}
-
-
-
-
-% MAIN CONTEXT MACRO DEFINITIONS
-
-% Open CSV file. Syntax: \opencsvfile or \opencsvfile{filename}.
-\def\opencsvfile{%
- \dosingleempty\doopencsvfile%
-}%
-
-\def\doopencsvfile[#1]{%
- \dosinglegroupempty\dodoopencsvfile%
-}%
-
-\def\dodoopencsvfile#1{%
- \iffirstargument%
- \ctxlua{thirddata.handlecsv.opencsvfile("#1")}%
- \doifnot{\env{MainLinePointer}}{}{\setlinepointer{\env{MainLinePointer}}}% added by Pablo
- \else%
- \ctxlua{thirddata.handlecsv.opencsvfile()}%
- \fi%
-}%
-
-
-% manual closing of CSV file
-\def\closecsvfile#1{\ctxlua{thirddata.handlecsv.closecsvfile("#1")}}
-
-% Read data from n-th line of CSV table. Calling without parameter read current line (pointered by global variable)
-\def\readline{\dosingleempty\doreadline}%
-
-\def\doreadline[#1]{\dosinglegroupempty\dodoreadline}%
-
-% They must remain in such a compact form, otherwise it returns unwanted gaps !!!!
-\def\dodoreadline#1{\iffirstargument\ctxlua{thirddata.handlecsv.readline(#1)}\else\ctxlua{thirddata.handlecsv.readline(thirddata.handlecsv.gCurrentLinePointer[thirddata.handlecsv.gCurrentlyProcessedCSVFile])}\fi}%
-
-
-\def\readlineof[#1]#2{\ctxlua{thirddata.handlecsv.readlineof('#1',#2)}}
-
-%\def\readline{\ctxlua{thirddata.handlecsv.readline(thirddata.handlecsv.gCurrentLinePointer[thirddata.handlecsv.gCurrentlyProcessedCSVFile])}}%
-
-
-\def\readandprocessparameters#1#2#3#4{%
- \edef\firstparam{#1}%
- \edef\secondparam{#2}%
- \edef\thirdparam{#3}%
- \def\fourthparam{#4}%
- \edef\paroperator{#2}%
- % operator '==' is for strings comparing converted to 'eq' operator; a blank space before the percent sign is strictly required!!!
- \ctxlua{if '#2'=="==" and not(type(tonumber('#1'))=='number' and type(tonumber('#3'))=='number') then context('\\def\\paroperator{eq}') end}%
- % operator '~=' is for strings comparing converted to 'neq' operator; a blank space before the percent sign is strictly required !!!
- \ctxlua{if '#2'=="~=" and not(type(tonumber('#1'))=='number' and type(tonumber('#3'))=='number') then context('\\def\\paroperator{neq}') end}%
-}%
-
-% MACROS FOR CYCLES PROCESSING. DO ACTIONS IN CYCLES
-
-
-% In this function to remove unwanted gaps
-% 1. \doloopfromto{from}{to}{action}
-% do action "action" from line "from" to line "to" of open CSV file
-\def\doloopfromto#1#2#3{\ctxlua{thirddata.handlecsv.doloopfromto([==[\thenumexpr{#1}]==],[==[\thenumexpr{#2}]==],[==[\detokenize{#3}]==])}}%
-%\def\doloopfromto#1#2#3{\ctxlua{thirddata.handlecsv.doloopfromto([==[\thenumexpr{#1}]==],[==[\thenumexpr{#2}]==],[==[\expanded{#3}]==])}}%
-
-\def\Doloopfromto#1#2#3{% deprecated - old version - no longer recommended
- {\opencsvfile}%
- {\resetnumline}%
- \bfilehook%
- \removeunwantedspaces%
- \ifnum#1<#2\dostepwiserecurse{#1}{#2}{1}{\blinehook{\readline{\recurselevel}}#3\elinehook}%
- \else\dostepwiserecurse{#1}{#2}{-1}{\blinehook{\readline{\recurselevel}}#3\elinehook}%
- \fi%
- \removeunwantedspaces%
- \efilehook%
-}%
-
-% 2. \doloopforall % implicit do \lineaction for all lines of open CSV table
-% \doloopforall{\action} % do \action macro for all lines of open CSV table
-\def\doloopforall{\dosinglegroupempty\doloopforAll}%
-
-\def\doloopforAll#1{%
- \doifsomethingelse{#1}{%1 args.
- \doloopfromto{1}{\numrows}{#1}%
- }{%
- \doloopfromto{1}{\numrows}{\lineaction}%
- }%
-}%
-
-% 3. \doloopaction % implicit use \lineaction macro
-% \doloopaction{\action} % use \action macro for all lines of open CSV file
-% \doloopaction{\action}{4} % use \action macro for first 4 lines
-% \doloopaction{\action}{2}{5} % use \action macro for lines from 2 to 5
-\def\doloopaction{\dotriplegroupempty\doloopAction}
-
-\def\doloopAction#1#2#3{%
-\opencsvfile%
-% \resetnumline % commented 22.6.2017
-\doifsomethingelse{#3}{%3 args.
- \doloopfromto{#2}{#3}{#1}% if 3 arguments then do #1 macro from #2 line to #3 line
- }{%
- \doifsomethingelse{#2}{%2 args.
- \doloopfromto{1}{#2}{#1}% if 2 arguments then do #1 macro for first #2 lines
- }%
- {\doifsomethingelse{#1}{% 1 arg.
- \doloopfromto{1}{\numrows}{#1}%
- }{% if without arguments then do \lineaction macro for all lines
- \doloopfromto{1}{\numrows}{\lineaction}%
- }%
- }%
- }%
-}%
-
-
-% 4. \doloopif{value1}{[compare_operator]}{value2}{macro_for_doing} % [compareoperators] <, >, ==(eq), ~=(neq), >=, <=, in, ~in, until, while
-% actions for rows of open CSV file which are responded of condition
-\def\doloopif#1#2#3#4{%
- \edef\tempnumline{\numline}% 23.6.2017
- \readandprocessparameters{#1}{#2}{#3}{#4}%
- \removeunwantedspaces% 25.3.2019
- % \resetnumline % 22.6.2017
- \bfilehook%
- % and now process actual operator
- \processaction[\paroperator][%
- <=>{% {number1}{<}{number2} ... Less
- \doloopfromto{1}{\numrows}{\ctxlua{if #1<#3 then context('\\blinehook\\fourthparam\\elinehook') else thirddata.handlecsv.addtonumline(-1) end}}%
- },% end < ... Less
- >=>{% {number1}{>}{number2} ... Greater
- \doloopfromto{1}{\numrows}{\ctxlua{if #1>#3 then context('\\blinehook\\fourthparam\\elinehook') else thirddata.handlecsv.addtonumline(-1) end}}%
- },% end > ... Greater
- ===>{% {number1}{==}{number2} ... Equal
- \doloopfromto{1}{\numrows}{\ctxlua{if #1==#3 then context('\\blinehook\\fourthparam\\elinehook') else thirddata.handlecsv.addtonumline(-1) end}}%
- },% end == ... Equal
- ~==>{% {number1}{~=}{number2} ... Not Equal
- \doloopfromto{1}{\numrows}{\ctxlua{if #1~=#3 then context('\\blinehook\\fourthparam\\elinehook') else thirddata.handlecsv.addtonumline(-1) end}}%
- },% end ~= ... Not Equal
- >==>{% {number1}{>=}{number2} ... GreaterOrEqual
- \doloopfromto{1}{\numrows}{\ctxlua{if #1>=#3 then context('\\blinehook\\fourthparam\\elinehook') else thirddata.handlecsv.addtonumline(-1) end}}%
- },% end >= ... GreaterOrEqual
- <==>{% {number1}{<=}{number2} ... LessOrEqual
- \doloopfromto{1}{\numrows}{\ctxlua{if #1<=#3 then context('\\blinehook\\fourthparam\\elinehook') else thirddata.handlecsv.addtonumline(-1) end}}%
- },% end <= ... LessOrEqual
- eq=>{% command {string1}{==}{string2} is converted to command command {string1}{eq}{string2} ... string1 is equal string2
- \doloopfromto{1}{\numrows}{\doifelse{#1}{#3}{\blinehook\fourthparam\elinehook}{\addtonumline{-1}}}% 23.06.2017
- %%%%%\doloopfromto{1}{\numrows}{\ctxlua{if '#1'=='#3' then context('\\blinehook\\fourthparam\\elinehook') else thirddata.handlecsv.addtonumline(-1) end}}%
- },% end eq
- neq=>{% command {string1}{~=}{string2} is converted to command command {string1}{neq}{string2} ... string1 is not equal string2
- \doloopfromto{1}{\numrows}{\doifelse{#1}{#3}{\ctxlua{thirddata.handlecsv.addtonumline(-1)}}{\blinehook\fourthparam\elinehook}}% 23.06.2017
- %%%%%\doloopfromto{1}{\numrows}{\ctxlua{if '#1'~='#3' then context('\\blinehook\\fourthparam\\elinehook') else thirddata.handlecsv.addtonumline(-1) end}}%
- },% end neq
- in=>{% {substring}{in}{string} ... substring is contained inside string
- \doloopfromto{1}{\numrows}{\doifinstringelse{#1}{#3}{\blinehook\fourthparam\elinehook}{\addtonumline{-1}}}% \doifincsnameelse
- },% end in
- ~in=>{% {substring}{~in}{string} ... substring is not contained inside string
- \doloopfromto{1}{\numrows}{\doifinstringelse{#1}{#3}{\addtonumline{-1}}{\blinehook\fourthparam\elinehook}}% \doifincsnameelse
- },% end notin
- repeatuntil=>{% {substring}{until}{string} ... % Repeats the action until the condition is met. If it is not never met, will list all record
- \doloop{\ctxlua{if '#1'=='#3' then context('\\exitloop') else context('\\ifEOF\\exitloop\\else\\blinehook\\fourthparam\\elinehook\\nextrow\\fi') end}}%
- },% end until % the comma , is very important here!!!
- whiledo=>{% {substring}{untilneq}{string} ... % Repeat action when the condition is met. When the condition is not met for the first line, the action will NOT BE performed!
- \doloop{\ctxlua{if '#1'~='#3' then context('\\exitloop') else context('\\removeunwantedspaces\\blinehook\\fourthparam\\elinehook\\ifEOF\\exitloop\\else\\nextrow\\fi') end}}%
- },% end untilneq % the comma , is very important here!!!
- ]% end of \processaction%
- \efilehook%
- \setnumline{\tempnumline}%
- \removeunwantedspaces% 30.3.2019
-} % end of \doloopif
-
-
-% specific variations of previous macro \doloopif
-\letvalue{doloopifnum}=\doloopif %\doloopifnum{value1}{[compare_operator]}{value2}{macro_for_doing}% [compareoperators] ==, ~=, >, <, >=, <= % FOR COMPATIBILITY ONLY
-\def\doloopuntil#1#2#3{\doloopif{#1}{repeatuntil}{#2}{#3}}% \doloopuntil{\Trida}{3.A}{\tableaction}% REPEAT-UNTIL loop: Repeats the action until the condition is met.
-\letvalue{repeatuntil}=\doloopuntil%
-\def\doloopwhile#1#2#3{\doloopif{#1}{whiledo}{#2}{#3}}% \doloopwhile{\Trida}{3.A}{\tableaction}% Repeat action when the condition is met.
-\letvalue{whiledo}=\doloopwhile%
-
-% 5. \filelineaction % implicit do \lineaction for all lines of current open CSV table
-% \filelineaction{filename.csv} % do \lineaction macro for all lines of specific CSV table (filename.csv)
-\def\filelineaction{\dotriplegroupempty\dofilelineaction}%
-
-\def\dofilelineaction#1#2#3{%
- \doifelsenothing{#1}%
- {\opencsvfile\doloopaction%0 parameter - open actual CSV file and do action
- }%
- {\doifelsenothing{#2}%
- {\opencsvfile{#1}\doloopaction%1 parameter - parameter = filename
- }%
- {\doifelsenothing{#3}%
- {\opencsvfile{#1}\doloopaction{\lineaction}{#2}%2 parameters, 1st parameter = filename, 2nd parameter = num of lines
- }%
- {\opencsvfile{#1}\doloopaction{\lineaction}{#2}{#3}%3 parameters, 1st parameter = filename, 2nd parameter = from line, 3rd parameter = to line
- }}}%
-}%
-
-% 6. \doloopfornext{<numberofrows>}{<action>}
-% do action <action> for next <number> of rows from current line of open CSV file
-\def\doloopfornext#1#2{\ctxlua{thirddata.handlecsv.doloopfornext([==[\thenumexpr{#1}]==],[==[\detokenize{#2}]==])}}%
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Complete listing macros and commands that can be used (to keep track of all defined macros):
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% \ifissetheader, \ifnotsetheader
-% \ifEOF, \ifnotEOF
-% \ifemptyline, \ifnotemptyline
-% \ifemptylinesmarking, \ifemptylinesnotmarking (they can be set by macros \markemptylines, \notmarkemptylines and \resetmarkemptylines)
-% \hookson, \hooksoff
-% \resethooks
-% user defined hooks macros: \bfilehook, \efilehook, \blinehook, \elinehook,
-% \setheader, \unsetheader, (\resetheader - compatibility synonym)
-% \setsep{<columnseparator>}, \unsetsep, (\resetsep - compatibility synonym)
-% \setfiletoscan{<filetoprocess>}
-% \numrows, \numemptyrows, \numnotemptyrows
-% \numcols
-% \csvfilename
-% \thenumexp{<expression>}
-% \addto\anymacro{<addingnonexpandedcontent>}, \eaddto\anymacro{<addingexpandedcontent>}
-% \getcsvcell[<columnnumber or columnname>,<rownumber>], \csvcell[<columnnumber or columnname>,<rownumber>]
-% \currentcell{<columnnumber or columnname}, \nextcell{<columnnumber or columnname}, \previouscell{<columnnumber or columnname}
-% and their synonyms \currcell{}, \nextcell{}, \prevcell{}
-% \colname[numberofcolumn], \xlscolname[<numberofcolumn>], \cxlscolname[<numberofcolumn>], \texcolname[<numberofcolumn>]
-% \indexcolname[<'columnname' or 'xlsname'>]
-% \columncontent[<numberofcolumn> or <'columnname'> or <'xlsname'>]
-% \numberxlscolname[<'xlsname'>]
-% \linepointer, (\lineno, \sernumline are synonyms), \resetlinepointer, \resetlinepointerof[<csvfile>], (\resetlineno, \resetsernumline are synonyms), \setlinepointer{<numberofline>}
-% \savelineno=\savelinepointer, \setsavedlineno=\setsavedlinepointer
-% \numline, \setnumline{<numberofline>}, \resetnumline
-% \addtonumline{<number>}
-% \indexofnotemptyline{}, \indexofemptyline{}
-% \markemptylines, \notmarkemptylines, \resetmarkemptylines, \removeemptylines
-% \nextlineof[csvfile], \prevlineof[csvfile], \nextline, \prevline
-% \nextnumline
-% \nextrowof[csvfile], \prevrowof[csvfile], \nextrow, \prevrow
-% \exitlooptest
-% \opencsvfile, \opencsvfile{<filename>}, \closecsvfile{<filename>}
-% \readline, \readline{<numberofline>}
-% \readandprocessparameters#1#2#3#4 -- for internal use only
-% \replacecontentin{<colname/colnumber>}{<substitutefrom>}{<substituteto>}
-%
-% Module predefined cycles for processing of lines CSV table:
-% \doloopfromto{<fromnumblerline>}{<tonumblerline}{<\actionmacro>}
-% \doloopforall, \doloopforall{<\actionmacro>}
-% \doloopaction, \doloopaction{<\actionmacro>}, \doloopaction{<\actionmacro>}{<tonumblerline>}, \doloopaction{<\actionmacro>}{<fromnumblerline>}{<tonumblerline>}
-% \doloopif{<value1>}{<compare_operator>}{value2}{<\actionmacro>}, (\doloopifnum{<value1>}{<compare_operator>}{value2}{<\actionmacro>} is synonym)
-% \doloopuntil{<value1>}{<value2>}{<\actionmacro>} = \repeatuntil{<value1>}{<value2>}{<\actionmacro>}
-% \doloopwhile{<value1>}{<value2>}{<\actionmacro>} = \doloopwhiledo{<value1>}{<value2>}{<\actionmacro>}
-% \filelineaction, \filelineaction{<filename>}
-% \doloopfornext{<+/-numberofrows>}{<\actionmacro>} % use \setlinepointer, \resetlinepointer (and then set it up \setnumline) to set line pointer. Opening of CSV file automatically reset line pointer.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-]]
-
--- write definitions into ConTeXt:
-thirddata.handlecsv.string2context(string2print)
-
diff --git a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv.tex b/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv.tex
deleted file mode 100644
index b7f2a97db3..0000000000
--- a/macros/context/contrib/context-handlecsv/handlecsv-context-suite/tex/context/third/handlecsv/t-handlecsv.tex
+++ /dev/null
@@ -1,29 +0,0 @@
-%D \module
-%D [ file=t-handlecsv.tex,
-%D version=2018.04.07,
-%D title=HandleCSV module,
-%D subtitle=CSV file handling,
-%D author=Jaroslav Hajtmar,
-%D date=\currentdate,
-%D copyright=Jaroslav Hajtmar,
-%D email=hajtmar@gyza.cz,
-%D license=GNU General Public License]
-%
-%C Copyright (C) 2018 Jaroslav Hajtmar
-%C
-%C This program is free software: you can redistribute it and/or modify
-%C it under the terms of the GNU General Public License as published by
-%C the Free Software Foundation, either version 3 of the License, or
-%C (at your option) any later version.
-%C
-%C This program is distributed in the hope that it will be useful,
-%C but WITHOUT ANY WARRANTY; without even the implied warranty of
-%C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-%C GNU General Public License for more details.
-%C
-%C You should have received a copy of the GNU General Public License
-%C along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-\usemodule[handlecsv.lua]
-\usemodule[handlecsv-extra.lua]
-\usemodule[handlecsv-tools.lua]
diff --git a/macros/latex/contrib/highlightx/README.md b/macros/latex/contrib/highlightx/README.md
new file mode 100644
index 0000000000..6b7890a62e
--- /dev/null
+++ b/macros/latex/contrib/highlightx/README.md
@@ -0,0 +1,8 @@
+highlightx is a package to highlight paragraphs or formulas.
+-------------------------------------------------------------------------
+highlightx est un package pour surligner des paragraphes ou des formules.
+-------------------------------------------------------------------------
+Author : Cédric Pierquet
+email : cpierquet@outlook.fr
+Licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt
+Source : https://tex.stackexchange.com/questions/5959/cool-text-highlighting-in-latex \ No newline at end of file
diff --git a/macros/latex/contrib/highlightx/doc/highlightx-doc.pdf b/macros/latex/contrib/highlightx/doc/highlightx-doc.pdf
new file mode 100644
index 0000000000..41e5bd8427
--- /dev/null
+++ b/macros/latex/contrib/highlightx/doc/highlightx-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/highlightx/doc/highlightx-doc.tex b/macros/latex/contrib/highlightx/doc/highlightx-doc.tex
new file mode 100644
index 0000000000..bcf972b0c8
--- /dev/null
+++ b/macros/latex/contrib/highlightx/doc/highlightx-doc.tex
@@ -0,0 +1,843 @@
+% !TeX TXS-program:compile = txs:///lualatex
+
+\documentclass[french,11pt,a4paper]{article}
+%\usepackage[utf8]{inputenc}
+%\usepackage[T1]{fontenc}
+\usepackage{amsmath,amssymb}
+\usepackage{fontspec}
+\setmonofont[Scale=MatchLowercase]{Inconsolatazi4}
+\usepackage{highlightx}
+\usepackage{enumitem}
+\usepackage{codehigh}
+\usepackage{multicol}
+\usepackage{tabularray}
+\usepackage{lipsum}
+\usepackage{fancyvrb}
+\usepackage{fancyhdr}
+\usepackage{fontawesome5}
+\fancyhf{}
+\renewcommand{\headrulewidth}{0pt}
+%\rhead{\sffamily\small\affloetalab[Legende]}
+\lfoot{\sffamily\small [highlightx]}
+\cfoot{\sffamily\small - \thepage{} -}
+\rfoot{\hyperlink{matoc}{\small\faArrowAltCircleUp[regular]}}
+\usepackage{hologo}
+\providecommand\tikzlogo{Ti\textit{k}Z}
+\providecommand\TeXLive{\TeX{}Live\xspace}
+\providecommand\PSTricks{\textsf{PSTricks}\xspace}
+\let\pstricks\PSTricks
+\let\TikZ\tikzlogo
+
+\usepackage{hyperref}
+\urlstyle{same}
+\hypersetup{pdfborder=0 0 0}
+\usepackage[margin=1.5cm]{geometry}
+\setlength{\parindent}{0pt}
+\def\TPversion{0.1.0}
+\def\TPdate{31 août 2023}
+\usepackage{tcolorbox}
+\tcbuselibrary{skins,hooks}
+\sethlcolor{lightgray!25}
+\NewDocumentCommand\MontreCode{ m }{%
+ \hl{\vphantom{\texttt{pf}}\texttt{#1}}%
+}
+\usepackage{babel}
+
+\begin{document}
+
+\pagestyle{fancy}
+
+\thispagestyle{empty}
+
+\begin{center}
+ \begin{minipage}{0.88\linewidth}
+ \begin{tcolorbox}[colframe=yellow,colback=yellow!15]
+ \begin{center}
+ \begin{tabular}{c}
+ {\Huge \texttt{highlightx}}\\
+ \\
+ {\LARGE Commandes pour surligner formules ou paragraphes,} \\
+ \\
+ {\LARGE avec un effet main levée, à l'aide des packages} \\
+ \\
+ {\LARGE \MontreCode{soul} ou \MontreCode{tikz}.} \\
+ \\
+ {\LARGE $\rhd$ Commandes [fr] ou [en] $\lhd$} \\
+ \\
+ {\small \texttt{Version \TPversion{} -- \TPdate}}
+ \end{tabular}
+ \end{center}
+ \end{tcolorbox}
+\end{minipage}
+\end{center}
+
+\begin{center}
+ \begin{tabular}{c}
+ \texttt{Cédric Pierquet}\\
+ {\ttfamily c pierquet -- at -- outlook . fr}\\
+ \texttt{\url{https://github.com/cpierquet/highlightx}}
+\end{tabular}
+\end{center}
+
+\hrule
+
+\vfill
+
+\begin{tcolorbox}[colframe=lightgray,colback=lightgray!5]
+Surligner une formule en ligne, avec un effet \textit{main levée}, comme $\SurlignerFormule{f(x)=\displaystyle\frac{1}{1+x}}$.
+
+\vspace*{5mm}
+
+Surligner une formule en ligne, sans effet, comme $\SurlignerFormule*[Bord=red,Fond=teal!25]{f(x)=\displaystyle\int_0^4 x^2 + 1\,\text{d}x}$.
+\end{tcolorbox}
+
+\vspace*{5mm}
+
+\begin{tcolorbox}[colframe=lightgray,colback=lightgray!5]
+Et en mode hors ligne :
+
+\[ \SurlignerFormule[Fond=green!25,Bord=red]{A=\begin{pmatrix}1&2\\3&4\end{pmatrix}}<thick>. \]
+\end{tcolorbox}
+
+\vspace*{5mm}
+
+\begin{tcolorbox}[colframe=lightgray,colback=lightgray!5]
+Et on peut même mettre en forme un paragraphe (dans une \MontreCode{tcbox}), généré aléatoirement grâce au site \url{https://ipsum.one/} par exemple : \og \genhighlightpar{Enfin, comme le dernier coup de dix heures retentissait encore, il étendit la main et prit celle de Mme Rênal, qui la retira aussitôt. Julien, sans trop savoir ce qu’il faisait, la saisit de nouveau. Quoique bien ému lui-même, il fut frappé de la froideur glaciale de la main qu’il prenait ; il la serrait avec une force convulsive ; on fit un dernier effort pour la lui ôter, mais enfin cette main lui resta.} \fg
+\end{tcolorbox}
+
+\vspace*{5mm}
+
+Et dans un paragraphe classique, on peut mettre des effets, comme par exemple avec le texte suivant, généré aléatoirement grâce au site \url{https://ipsum.one/} par exemple : \og \SurlignerTexte[orange!25,draw=teal]{Une scie à eau se compose d’un hangar au bord d’un ruisseau. Le toit est soutenu par une charpente qui porte sur quatre gros piliers en bois. À huit ou dix pieds d’élévation, au milieu du hangar, on voit une scie qui monte et descend, tandis qu’un mécanisme fort simple pousse contre cette scie une pièce de bois. C’est une roue mise en mouvement par le ruisseau qui fait aller ce double mécanisme ; celui de la scie qui monte et descend, et celui qui pousse doucement la pièce de bois vers la scie, qui la débite en planches.} \fg
+
+\vfill~
+
+\pagebreak
+
+\phantomsection
+
+\hypertarget{matoc}{}
+
+\tableofcontents
+
+\vspace*{5mm}
+
+\hrule
+
+\vspace*{5mm}
+
+\section{Le package highlightx}
+
+\subsection{Solutions existantes}
+
+Le package \MontreCode{soul} permet de surligner du texte, de manière efficace, mais avec des formules mathématiques le surlignage n'est pas forcément optimal.
+
+Il est également possible d'utiliser \MontreCode{fcolorbox} pour des formules mathématiques.
+
+\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+On peut surligner \hl{avec la commande \texttt{hl} du package \texttt{soul}}.\\
+Avec une formule, du style \hl{$\int_0^4 x^2\,\text{d}x$}, on constate un léger décalage.\\\\
+Aucun souci avec \texttt{hl} pour un paragraphe : \og \hl{Une scie à eau se compose d’un
+hangar au bord d’un ruisseau. Le toit est soutenu par une charpente qui porte sur quatre
+gros piliers en bois. À huit ou dix pieds d’élévation, au milieu du hangar, on voit une
+scie qui monte et descend, tandis qu’un mécanisme fort simple pousse contre cette scie
+une pièce de bois.} \fg.\\\\
+Et maintenant avec \texttt{fcolorbox} : \colorbox{lightgray!25}{$\int_0^4 x^2\,\text{d}x$}.
+\end{demohigh}
+
+\pagebreak
+
+\subsection{Possibilités et limitations}
+
+L'idée du package \MontreCode{highlightx} est de proposer des commandes, simples et basiques, pour \textit{surligner} :
+
+\begin{itemize}
+ \item du texte simple ou multi-lignes (paragraphes) ;
+ \item des formules en mode math en ligne ou hors-ligne (grâce à \TikZ) ;
+ \item avec un effet de bordure à \textit{main levée} (sauf pour un paragraphe dans une \MontreCode{tcbox}).
+\end{itemize}
+
+{\small\faBomb}~Pour le moment le surlignement avec effet en mode paragraphe n'est pas compatible avec des environnements (comme \MontreCode{tcolorbox}), donc dans ce cas il n'y aura pas d'effet possible.
+
+\medskip
+
+{\small\faAngellist}~Le code permettant de surligner un paragraphe avec effet vient d'une solution proposée par l'internaute \MontreCode{gusbrs}, dans un fil de discussion du site \MontreCode{tex.stackexchange} :
+
+\smallskip
+
+\hfill\url{https://tex.stackexchange.com/questions/5959/cool-text-highlighting-in-latex}\hfill~
+
+\subsection{Chargement}
+
+Le package se charge dans le préambule, via \MontreCode{\textbackslash usepackage\{highlightx\}}.
+
+Les seuls packages chargés sont :
+
+\begin{itemize}
+ \item \MontreCode{soul}, \MontreCode{atbegshi}, \MontreCode{etoolbox} ;
+ \item \MontreCode{tikz} avec les librairies \MontreCode{tikzmark,calc,decorations.pathmorphing} ;
+ \item \MontreCode{xstring} et \MontreCode{simplekv}.
+\end{itemize}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+\usepackage{highlightx}
+\end{codehigh}
+
+{\small\faAngleDoubleRight}~\MontreCode{highlightx} est compatible avec les compilations usuelles en \textsf{latex}, \textsf{pdflatex}, \textsf{lualatex} ou \textsf{xelatex}.
+
+\medskip
+
+{\small\faBomb}~Des erreurs peuvent apparaître lors de la compilation, dans ce cas une nouvelle compilation sera nécessaire afin de placer correctement les effets de surlignage !
+
+\subsection{Commandes disponibles}
+
+Les commandes proposées par le package \MontreCode{highlightx} sont :
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%Commande pour surligner une formule (mode math)
+\SurlignerFormule
+
+%Commande pour surligner du texte
+\SurlignerTexte
+
+%Commande pour surligner du texte de manière basique, sans effet
+\genhighlightpar
+\end{codehigh}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+Par exemple $\SurlignerFormule{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+Ou bien :
+\[ \SurlignerFormule{A=\begin{pmatrix}1&2\\3&4\end{pmatrix}}. \]
+
+Et : \og \SurlignerTexte{Une scie à eau se compose d’un
+hangar au bord d’un ruisseau. Le toit est soutenu par une charpente qui porte sur quatre
+gros piliers en bois. À huit ou dix pieds d’élévation, au milieu du hangar, on voit une
+scie qui monte et descend, tandis qu’un mécanisme fort simple pousse contre cette scie
+une pièce de bois.} \fg.
+\end{codehigh}
+
+Par exemple $\SurlignerFormule{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+Ou bien :
+\[ \SurlignerFormule{A=\begin{pmatrix}1&2\\3&4\end{pmatrix}}. \]
+
+Et : \og \SurlignerTexte{Une scie à eau se compose d’un
+hangar au bord d’un ruisseau. Le toit est soutenu par une charpente qui porte sur quatre
+gros piliers en bois. À huit ou dix pieds d’élévation, au milieu du hangar, on voit une
+scie qui monte et descend, tandis qu’un mécanisme fort simple pousse contre cette scie
+une pièce de bois.} \fg.
+
+\pagebreak
+
+\section{Les commandes}
+
+\subsection{Surligner une formule}
+
+La commande dédiée à la mise en évidence d'une formule mathématique est \MontreCode{\textbackslash SurlignerFormule} :
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%Commande pour surligner une formule (mode math)
+\SurlignerFormule(*)[Clés]{Formule}<options tikz>
+\end{codehigh}
+
+Concernant cette commande :
+
+\begin{itemize}
+ \item la version étoilée désactive l'effet \textit{main levée} ;
+ \item les clés disponibles sont :
+ \begin{itemize}
+ \item \MontreCode{Fond} pour la couleur de fond (\MontreCode{yellow!35} par défaut) ;
+ \item \MontreCode{Bord} pour une éventuelle bordure, \MontreCode{none} ou \MontreCode{couleur} (\MontreCode{none} par défaut) ;
+ \item \MontreCode{Texte} pour une couleur de texte (\MontreCode{black} par défaut) ;
+ \item \MontreCode{Offset} pour \textit{élargir} le surlignage, sous la forme \MontreCode{Offset} ou \MontreCode{OffsetH/OffsetV} (\MontreCode{1pt/2pt} par défaut) ;
+ \end{itemize}
+ \item la formule est insérée dans un groupe \MontreCode{\textbackslash ensuremath} ;
+ \item les \textit{options tikz} sont optionnelles.
+\end{itemize}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+$\SurlignerFormule{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+$\SurlignerFormule*{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+$\SurlignerFormule[Fond=teal!35]{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+$\SurlignerFormule[Fond=teal!35,Bord=red]{f(x)=\displaystyle\frac{1}{1+x}}<thick>$.\\
+$\SurlignerFormule[Offset=5mm/2mm]{f(x)=\displaystyle\frac{1}{1+x}}$\\
+$\SurlignerFormule*[Texte=red]{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+\end{codehigh}
+
+$\SurlignerFormule{f(x)=\displaystyle\frac{1}{1+x}}$
+\qquad
+$\SurlignerFormule*{f(x)=\displaystyle\frac{1}{1+x}}$
+\qquad
+$\SurlignerFormule[Fond=teal!35]{f(x)=\displaystyle\frac{1}{1+x}}$
+\qquad
+$\SurlignerFormule[Fond=teal!35,Bord=red]{f(x)=\displaystyle\frac{1}{1+x}}<thick>$
+\qquad
+$\SurlignerFormule[Offset=5mm/2mm]{f(x)=\displaystyle\frac{1}{1+x}}$
+\qquad
+$\SurlignerFormule*[Texte=red]{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+
+\bigskip
+
+Le style \textit{main levée} est fixé par défaut, mais peut être modifié en adaptant le style \TikZ{} suivant :
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%Style main levée
+\tikzstyle{encadreformule}=[%
+ decorate,decoration={random steps,amplitude=0.5pt,segment length=1em}]
+\end{codehigh}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+\tikzstyle{encadreformule}=[%
+ decorate,decoration={random steps,amplitude=4mm,segment length=10mm}]
+
+$\SurlignerFormule{f(x)=\displaystyle\frac{1}{1+x}}$
+\end{codehigh}
+
+\tikzstyle{encadreformule}=[decorate,decoration={random steps,amplitude=4mm,segment length=10mm}]
+
+$\SurlignerFormule{f(x)=\displaystyle\frac{1}{1+x}}$
+
+\tikzstyle{encadreformule}=[decorate,decoration={random steps,amplitude=0.5pt,segment length=1em}]
+
+\subsection{Surligner du texte, y compris multilignes}
+
+La commande dédiée à la mise en évidence d'une formule mathématique est \MontreCode{\textbackslash SurlignerTexte} :
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%Commande pour surligner du texte
+\SurlignerTexte[options tikz]{texte}
+\end{codehigh}
+
+Concernant cette commande, pour laquelle le fonctionnement (interne) est très différent du mode \textit{math} :
+
+\begin{itemize}
+ \item les options tikz permettent de spécifier la couleur de fond et l'éventuelle couleur de bordure, grâce à \MontreCode{[couleurfond,draw=couleurbord]}.
+\end{itemize}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%Paragraphes venant du site https://ipsum.one/
+
+Un premier paragraphe : \og \SurlignerTexte{Quand Julien aperçut les ruines pittoresques
+de l’ancienne église de Vergy, il remarqua que depuis l’avant-veille il n’avait pas pensé
+une seule fois à Mme de Rênal. L’autre jour en partant, cette femme m’a rappelé la distance
+infinie qui nous sépare, elle m’a traité comme le fils d’un ouvrier. Sans doute elle a voulu
+me marquer son repentir de m’avoir laissé sa main la veille... Elle est pourtant bien jolie,
+cette main ! quel charme ! quelle noblesse dans les regards de cette femme !} \fg.
+
+Un deuxième paragraphe : \og \SurlignerTexte[teal!35,draw=red]{Ce ne fut que dans la nuit
+du samedi au dimanche, après trois jours de pourparlers, que l’orgueil de l’abbé Maslon plia
+devant la peur du maire qui se changeait en courage. Il fallut écrire une lettre mielleuse à
+l’abbé Chélan, pour le prier d’assister à la cérémonie de la relique de Bray-le-Haut, si
+toutefois son grand âge et ses infirmités le lui permettaient. M. Chélan demanda et obtint
+une lettre d’invitation pour Julien qui devait l’accompagner en qualité de sous-diacre.} \fg.
+\end{codehigh}
+
+Un premier paragraphe : \og \SurlignerTexte{Quand Julien aperçut les ruines pittoresques
+de l’ancienne église de Vergy, il remarqua que depuis l’avant-veille il n’avait pas pensé
+une seule fois à Mme de Rênal. L’autre jour en partant, cette femme m’a rappelé la distance
+infinie qui nous sépare, elle m’a traité comme le fils d’un ouvrier. Sans doute elle a voulu
+me marquer son repentir de m’avoir laissé sa main la veille... Elle est pourtant bien jolie,
+cette main ! quel charme ! quelle noblesse dans les regards de cette femme !} \fg.
+
+\medskip
+
+Un deuxième paragraphe : \og \SurlignerTexte[teal!35,draw=red]{Ce ne fut que dans la nuit
+du samedi au dimanche, après trois jours de pourparlers, que l’orgueil de l’abbé Maslon plia
+devant la peur du maire qui se changeait en courage. Il fallut écrire une lettre mielleuse à
+l’abbé Chélan, pour le prier d’assister à la cérémonie de la relique de Bray-le-Haut, si
+toutefois son grand âge et ses infirmités le lui permettaient. M. Chélan demanda et obtint
+une lettre d’invitation pour Julien qui devait l’accompagner en qualité de sous-diacre.} \fg.
+
+\subsection{Surlignement \og classique \fg, au cas où\ldots}
+
+Au cas où le surlignement multilignes précédent ne fonctionne pas (dans un environnement spécifique par exemple\ldots), il est possible d'utiliser une commande \textit{générique}, qui utilise uniquement le package \MontreCode{soul} (donc pas d'effet !), qui est \MontreCode{\textbackslash genhighlightpar}.
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%Commande générique pour surligner du texte
+\genhighlightpar[couleur]{texte}
+\end{codehigh}
+
+Concernant cette commande, le premier argument (optionnel) est la couleur de fond, et le second argument (obligatoire) est le texte à mettre en évidence.
+
+\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+Un paragraphe : \og \genhighlightpar[orange!35]{Pour arriver à la considération publique
+à Verrières, l’essentiel est de ne pas adopter, tout en bâtissant beaucoup de murs, quelque
+plan apporté d’Italie par ces maçons, qui au printemps traversent les gorges du Jura pour
+gagner Paris. Une telle innovation vaudrait à l’imprudent bâtisseur une éternelle réputation
+de mauvaise tête, et il serait à jamais perdu auprès des gens sages et modérés qui distribuent
+la considération en Franche-Comté.} \fg.
+\end{demohigh}
+
+\pagebreak
+
+\section{English commands}
+
+\subsection{Introduction}
+
+There's also english versions of the commands :
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%Hightlight formula (math mode)
+\HighlightFormula
+
+%Highlight text
+\HighlightText
+
+%Basic highlight text, without effect
+\genhighlightpar
+\end{codehigh}
+
+\subsection{Highlight formula}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%Hightlight formula (math mode)
+\HighlightFormula(*)[keys]{formula}<tikz options>
+\end{codehigh}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+$\HighlightFormula{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+$\HighlightFormula*{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+$\HighlightFormula[bg=teal!35]{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+$\HighlightFormula[bg=teal!35,border=red]{f(x)=\displaystyle\frac{1}{1+x}}<thick>$.\\
+$\HighlightFormula[offset=5mm/2mm]{f(x)=\displaystyle\frac{1}{1+x}}$\\
+$\HighlightFormula*[text=red]{f(x)=\displaystyle\frac{1}{1+x}}$.\\
+\end{codehigh}
+
+$\HighlightFormula{f(x)=\displaystyle\frac{1}{1+x}}$
+\qquad
+$\HighlightFormula*{f(x)=\displaystyle\frac{1}{1+x}}$
+\qquad
+$\HighlightFormula[bg=teal!35]{f(x)=\displaystyle\frac{1}{1+x}}$
+\qquad
+$\HighlightFormula[bg=teal!35,border=red]{f(x)=\displaystyle\frac{1}{1+x}}<thick>$
+\qquad
+$\HighlightFormula[offset=5mm/2mm]{f(x)=\displaystyle\frac{1}{1+x}}$
+\qquad
+$\HighlightFormula*[text=red]{f(x)=\displaystyle\frac{1}{1+x}}$.
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%handwriting style
+\tikzstyle{borderformula}=[%
+ decorate,decoration={random steps,amplitude=0.5pt,segment length=1em}]
+\end{codehigh}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+\tikzstyle{borderformula}=[%
+ decorate,decoration={random steps,amplitude=4mm,segment length=10mm}]
+
+$\HighlightFormula{f(x)=\displaystyle\frac{1}{1+x}}$
+\end{codehigh}
+
+\tikzstyle{borderformula}=[decorate,decoration={random steps,amplitude=4mm,segment length=10mm}]
+
+$\HighlightFormula{f(x)=\displaystyle\frac{1}{1+x}}$
+
+\tikzstyle{borderformula}=[decorate,decoration={random steps,amplitude=0.5pt,segment length=1em}]
+
+\subsection{Highlight text}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%Highlight text, with effect
+\HighlightText[tikz options]{text}
+\end{codehigh}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%Paragraphs from https://ipsum.one/
+
+A first one : \HighlightText{In order to modify it, he has only to press his hand lightly
+on a small wheel, measuring hardly a foot in diameter, and placed within his reach. Immediately
+the valves open, the steam from the boilers rushes along the conducting tubes into the two
+cylinders of the small engine, the pistons move rapidly, and the rudder instantly obeys.
+If this plan succeeds, a man will be able to direct the gigantic body of the 'Great Eastern'
+with one finge}.
+
+A second one : \HighlightText[teal!35,draw=red]{On Wednesday night the weather was very bad,
+my balance was strangely variable, and I was obliged to lean with my knees and elbows against
+the sideboard, to prevent myself from falling. Portmanteaus and bags came in and out of my cabin;
+an unusual hubbub reigned in the adjoining saloon, in which two or three hundred packages were
+making expeditions from one end to the other, knocking the tables and chairs with loud crashes;
+doors slammed, the boards creaked, the partitions made that groaning noise peculiar to pine wood;
+bottles and glasses jingled together in their racks, and a cataract of plates and dishes rolled
+about on the pantry floors}.
+\end{codehigh}
+
+A first one : \HighlightText{In order to modify it, he has only to press his hand lightly
+on a small wheel, measuring hardly a foot in diameter, and placed within his reach. Immediately
+the valves open, the steam from the boilers rushes along the conducting tubes into the two
+cylinders of the small engine, the pistons move rapidly, and the rudder instantly obeys.
+If this plan succeeds, a man will be able to direct the gigantic body of the 'Great Eastern'
+with one finge}.
+
+\medskip
+
+A second one : \HighlightText[teal!35,draw=red]{On Wednesday night the weather was very bad,
+my balance was strangely variable, and I was obliged to lean with my knees and elbows against
+the sideboard, to prevent myself from falling. Portmanteaus and bags came in and out of my cabin ;
+an unusual hubbub reigned in the adjoining saloon, in which two or three hundred packages were
+making expeditions from one end to the other, knocking the tables and chairs with loud crashes ;
+doors slammed, the boards creaked, the partitions made that groaning noise peculiar to pine wood ;
+bottles and glasses jingled together in their racks, and a cataract of plates and dishes rolled
+about on the pantry floors}.
+
+\subsection{Generic highlight, without effect}
+
+\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%generic command, without effect
+\genhighlightpar[color]{text}
+\end{codehigh}
+
+\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+A paragraph : \genhighlightpar[violet!35]{This steam-ship is indeed a masterpiece of naval
+construction ; more than a vessel, it is a floating city, part of the country, detached from
+English soil, which after having crossed the sea, unites itself to the American Continent.
+I pictured to myself this enormous bulk borne on the waves, her defiant struggle with the wind,
+her boldness before the powerless sea, her indifference to the billows, her stability in the
+midst of that element which tosses 'Warriors' and 'Solferinos' like ship's boats.}.
+\end{demohigh}
+
+
+%Le style global des boîtes est défini par :
+%
+%\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\tcbset{baseboite/.style={
+% enhanced,sharp corners=uphill,boxrule=\eptraitboite,%
+% before skip=0.5em,after skip=0.5em,%
+% colback=white,top=4mm,%
+% left={\margeboite-\margeinttitreboite-\eptraitboite},%
+% right={\margeboite-\margeinttitreboite-\eptraitboite}
+%}%
+%}
+%\end{codehigh}
+%
+%À noter que le \MontreCode{\textbackslash margeboite-\textbackslash margeinttitreboite-\textbackslash eptraitboite} vient :
+%
+%\begin{itemize}
+% \item des \MontreCode{\textbackslash margeinttitreboite} du paramètre \MontreCode{inner sep} du nœud Ti\textit{k}Z ;
+% \item des \MontreCode{\textbackslash eptraitboite} du paramètre \MontreCode{boxrule} de la boîte \textit{titre}.
+%\end{itemize}
+%
+%\subsection{Paramétrage simple de la boîte}
+%
+%Il est possible de rajouter ou modifier quelques éléments de chaque boîte (les clés suivantes sont cumulables) :
+%
+%\begin{itemize}
+% \item un \textsf{sous-titre} (couleur \textsf{rouge foncé}) peut être ajouté (en haut à droite de la boîte), via la clé \MontreCode{[SousTitre=...]} ;
+% \item le label peut être modifié :
+% \begin{itemize}
+% \item le compteur peut être désactivé, grâce à la clé \MontreCode{[Compteur=false]} ;
+% \item la clé \MontreCode{[Pluriel]} force le pluriel du label ;
+% \item un complément peut être rajouté entre le label et le compteur grâce à la clé \MontreCode{[ModifLabel=...]} ;
+% \item un complément peut être rajouté après le compteur grâce à la clé \MontreCode{[ComplementTitre=...]} ;
+% \end{itemize}
+% \item une petite image (type \textit{filigrane}) peut être rajoutée (de hauteur 24pt et pivotée de 45° dans le sens horaire par défaut), dans le coin \textit{bas-droite} de la boîte :
+% \begin{itemize}
+% \item en spécifiant l'image grâce à la clé \MontreCode{[Logo=...]} ;
+% \item en spécifiant hauteur/rotation/opacité grâce aux clés \MontreCode{[HauteurLogo=...]} , \MontreCode{[RotationLogo=...]} et \MontreCode{[OpaciteLogo=...]}.
+% \end{itemize}
+%\end{itemize}
+%
+%Des options spécifiques \MontreCode{tcolorbox} peuvent être passées en option à l'environnement, elles sont à mettre entre \MontreCode{<...>} avant le corps de l'environnement.
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\setcounter{CompteurBoiteDemo}{0}
+%\begin{BoiteDeDemo}[Compteur=false]
+%\lipsum[1][1-2]
+%\end{BoiteDeDemo}
+%\end{demohigh}
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\begin{BoiteDeDemo}[Pluriel]<width=0.5\linewidth>
+%\lipsum[1][1-2]
+%\end{BoiteDeDemo}
+%\end{demohigh}
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\begin{BoiteDeDemo}[SousTitre={Un petit sous-titre}]
+%\lipsum[1][1-2]
+%\end{BoiteDeDemo}
+%\end{demohigh}
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\begin{BoiteDeDemo}[ComplementTitre={ - Un complément de titre}]%noter l'espace ;-)
+%\lipsum[1][1-2]
+%\end{BoiteDeDemo}
+%\end{demohigh}
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\begin{BoiteDeDemo}[ModifLabel={ super important}]%noter l'espace ;-)
+%\lipsum[1][1-2]
+%\end{BoiteDeDemo}
+%\end{demohigh}
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\begin{BoiteDeDemo}[Logo={example-image}]
+%\lipsum[1][3-4]
+%\end{BoiteDeDemo}
+%\end{demohigh}
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\begin{BoiteDeDemo}[Logo={example-image},HauteurLogo=5mm,RotationLogo=10]
+%\lipsum[1][3-4]
+%\end{BoiteDeDemo}
+%\end{demohigh}
+%
+%\pagebreak
+%
+%Et en \textit{cumulant} des clés de personnalisation on peut obtenir :
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\begin{BoiteDeDemo}[%
+% ModifLabel={s super importants},ComplementTitre={ (vraiment super importants)},%
+% SousTitre={- Source -},Compteur=false,Logo={example-image-a},%
+% HauteurLogo=1cm,RotationLogo=15,OpaciteLogo=1
+% ]
+%\lipsum[2][1-4]
+%\end{BoiteDeDemo}
+%\end{demohigh}
+%
+%\subsection{Personnalisation \textit{intermédiaire}}
+%
+%Il est possible de paramétrer \textit{facilement} certaines options, via la commande \MontreCode{\textbackslash ParamBoites[...]} :
+%
+%\begin{itemize}
+% \item la police du label grâce à la clé \MontreCode{[PoliceTitre=...]} (\verb*|\bfseries\sffamily| par défaut) ;
+% \item la police du sous-titre grâce à la clé \MontreCode{[PoliceSousTitre=...]} (\verb*|\small\bfseries\sffamily| par défaut) ;
+% \item la couleur de base du sous-titre grâce à la clé \MontreCode{[CouleurSousTitre=...]} (\verb*|red| par défaut) ;
+% \item les marges gauche et droite grâce à la clé \MontreCode{[Marge=...]} (\verb*|4mm| par défaut) ;
+% \item l'épaisseur des bordures grâce à la clé \MontreCode{[EpaisseurBordure=...]} (\verb*|1.25pt| par défaut) ;
+% \item la marge spécifique pour la boîte \textit{titre} grâce à clé \MontreCode{[MargeTitre=...]} (\verb*|3pt| par défaut).
+%\end{itemize}
+%
+%\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\ParamBoites[%
+% Marge=2cm,MargeTitre=2mm,%
+% PoliceTitre=\large\bfseries\ttfamily,%
+% PoliceSousTitre=\scriptsize\bfseries\sffamily,%
+% CouleurSousTitre=orange]
+%\end{codehigh}
+%
+%\ParamBoites[Marge=2cm,MargeTitre=2mm,PoliceTitre=\large\bfseries\ttfamily,PoliceSousTitre=\scriptsize\bfseries\sffamily,CouleurSousTitre=orange]
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\begin{BoiteDeDemo}[SousTitre={- Un petit sous-titre -}]
+%\lipsum[1][1-2]
+%\end{BoiteDeDemo}
+%\end{demohigh}
+%
+%On peut revenir aux paramètres par défaut grâce à la commande \MontreCode{\textbackslash ParamBoites} (sans argument).
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\ParamBoites
+%\begin{BoiteDeDemo}[SousTitre={- Un petit sous-titre -}]
+%\lipsum[1][1-2]
+%\end{BoiteDeDemo}
+%\end{demohigh}
+%
+%\pagebreak
+%
+%\section{Utilisation avancée}
+%
+%\subsection{Styles spécifiques}
+%
+%Il est possible quand même de modifier \textit{en profondeur} les boîtes créées, en redéfinissant les commandes suivantes via \verb*|\RenewDocumentCommand| :
+%
+%\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\NewDocumentCommand\TitreBoite{ m m m m }{%
+% %1=couleur
+% %2=icone
+% %3=nom
+% %4=compteur
+% % \BoxModifLabel = texte entre label et compteur
+% % \BoxCpltTitle = Texte après le compteur
+% \node[inner sep=\margeinttitreboite,rounded corners=3pt,draw=#1,line width=\eptraitboite,%
+% rectangle,fill=#1!5!white,anchor=west,xshift=\margeboite,text=black,%
+% font=\policetitreboite]%
+% at (frame.north west)
+% {%
+% \,\IfStrEq{#2}{}{}{{\small#2}~}\vphantom{Ppé}%
+% \ifboolKV[Boites]{Pluriel}{\StrBehind{#3}{/}}{\StrBefore{#3}{/}}%
+% \IfStrEq{\BoxModifLabel}{}{}{\BoxModifLabel}\ifboolKV[Boites]{Compteur}{~#4}{}%
+% \IfStrEq{\BoxCpltTitle}{}{}{\BoxCpltTitle}\,%
+% } ;
+%}
+%\end{codehigh}
+%
+%\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\NewDocumentCommand\SousTitreBoite{ }{%\BoxSubTitle = Sous-titre
+% \node[fill=white,anchor=east,xshift=-\margeboite,text=red!75!black,%
+% font=\policesoustitreboite] at (frame.north east) %
+% {\vphantom{Ppé}\BoxSubTitle} ;
+%}
+%\end{codehigh}
+%
+%\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\NewDocumentCommand\LogoCoinDroit{ }{%
+% \begin{tcbclipinterior}%
+% \node[opacity=\BoxOpaciteLogo,rotate=-\BoxRotationLogo]%
+% at ($(interior.south east)+(-10pt,10pt)$) %
+% {\includegraphics[height=\BoxHauteurLogo]{\BoxLogo}};%
+% \end{tcbclipinterior}%
+%}
+%\end{codehigh}
+%
+%\pagebreak
+%
+%\subsection{Exemple de personnalisations avancées}
+%
+%Par exemple, on peut modifier globalement le comportement de la boîte :
+%
+%\begin{codehigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\tcbset{baseboite/.style={
+% enhanced,boxrule=0.75pt,%
+% center,width=0.75\linewidth,%
+% before skip=1em,after skip=1em,%
+% colback=white,top=4mm,left=1mm,right=1mm
+% }%
+%}
+%\RenewDocumentCommand\TitreBoite{ m m m m }{%
+% \node[inner sep=2pt,draw=#1,line width=0.75pt,rounded corners,%
+% rectangle,fill=white,anchor=center,xshift=-1cm,text=black,%
+% font=\policetitreboite]%
+% at (frame.north)
+% {%
+% ~#2 #3\ifboolKV[Boites]{Compteur}{~#4}{}\IfStrEq{\BoxCpltTitle}{}{}{\BoxCpltTitle}~
+% } ;
+%}
+%\RenewDocumentCommand\SousTitreBoite{ }{%
+% \node[fill=white,anchor=center,%
+% font=\policesoustitreboite] at (frame.south) {\vphantom{pP}\BoxSubTitle} ;
+%}
+%\ParamBoites[PoliceTitre=\bfseries,PoliceSousTitre=\small\sffamily]
+%\CreationBoite{BoxDef}{CompteurDefi}{\faAddressBook}{Définition}
+%\CreationBoite[lime]{BoxProp}{CompteurProp}{\faAmbulance}{Propriété}
+%\end{codehigh}
+%
+%\tcbset{baseboite/.style={
+%enhanced,boxrule=0.75pt,%
+%center,width=0.75\linewidth,%
+%before skip=1em,after skip=1em,%
+%colback=white,top=4mm,left=1mm,right=1mm
+%}%
+%}
+%
+%\RenewDocumentCommand\TitreBoite{ m m m m }{%
+%\node[inner sep=2pt,draw=#1,line width=0.75pt,rounded corners,%
+%rectangle,fill=white,anchor=center,text=black,%
+%font=\policetitreboite]%
+%at (frame.north)
+%{%
+%~#2 #3\ifboolKV[Boites]{Compteur}{~#4}{}\IfStrEq{\BoxCpltTitle}{}{}{\BoxCpltTitle}~
+%} ;
+%}
+%
+%\RenewDocumentCommand\SousTitreBoite{ }{%
+%\node[fill=white,anchor=center,%
+%font=\policesoustitreboite] at (frame.south) %
+%{\vphantom{pP}\BoxSubTitle} ;
+%}
+%
+%\ParamBoites[PoliceTitre=\bfseries,PoliceSousTitre=\small\sffamily]
+%
+%\CreationBoite{BoxDef}{CompteurDefi}{\faAddressBook}{Définition}
+%\CreationBoite[lime]{BoxProp}{CompteurProp}{\faAmbulance}{Propriété}
+%
+%\begin{demohigh}
+%On va montrer en situation :
+%
+%\begin{BoxDef}[ComplementTitre={ (importante)},SousTitre={- Fin -}]
+%\lipsum[1][1-2]
+%\end{BoxDef}
+%
+%\begin{BoxProp}[ComplementTitre={ (très importante)},Compteur=false]
+%\lipsum[1][3-4]
+%\end{BoxProp}
+%
+%Voili voilà !
+%\end{demohigh}
+%
+%\pagebreak
+%
+%\subsection{Galerie pour des boîtes à destination de cours}
+%
+%Pour les exemples suivants, les paramètres et styles ont été remis par défaut.
+%
+%Toute couleur (\MontreCode{xcolor} n'est pas chargé avec des options spécifiques) peut être utilisée pour créer une boîte.
+%
+%\tcbset{baseboite/.style={
+% enhanced,sharp corners=uphill,boxrule=1.25pt,%
+% before skip=0.5em,after skip=0.5em,%
+% colback=white,top=4mm,left={\margeboite-4.25pt},right={\margeboite-4.25pt}
+%}%
+%}
+%
+%\RenewDocumentCommand\TitreBoite{ m m m m }{%
+% %1=couleur
+% %2=icone
+% %3=nom
+% %4=compteur
+% % \BoxModifLabel = texte entre label et compteur
+% % \BoxCpltTitle = Texte après le compteur
+% \node[inner sep=3pt,rounded corners=3pt,draw=#1,line width=1.25pt,%
+% rectangle,fill=#1!5!white,anchor=west,xshift=\margeboite,text=black,%
+% font=\policetitreboite]%
+% at (frame.north west)
+% {%
+% \,\IfStrEq{#2}{}{}{{\small#2}~}\vphantom{Ppé}%
+% \ifboolKV[Boites]{Pluriel}{\StrBehind{#3}{/}}{\StrBefore{#3}{/}}%
+% \IfStrEq{\BoxModifLabel}{}{}{\BoxModifLabel}\ifboolKV[Boites]{Compteur}{~#4}{}%
+% \IfStrEq{\BoxCpltTitle}{}{}{\BoxCpltTitle}\,%
+% } ;
+%}
+%
+%\RenewDocumentCommand\SousTitreBoite{ }{%\BoxSubTitle = Sous-titre
+% \node[fill=white,anchor=east,xshift=-\margeboite,text=red!75!black,%
+% font=\policesoustitreboite] at (frame.north east) %
+% {\vphantom{Ppé}\BoxSubTitle} ;
+%}
+%
+%\RenewDocumentCommand\LogoCoinDroit{ }{%
+% \begin{tcbclipinterior}%
+% \node[opacity=\BoxOpaciteLogo,rotate=-\BoxRotationLogo]%
+% at ($(interior.south east)+(-10pt,10pt)$) %
+% {\includegraphics[height=\BoxHauteurLogo]{\BoxLogo}};%
+% \end{tcbclipinterior}%
+%}
+%
+%\begin{demohigh}[language=latex/latex2,style/main=cyan!10,style/code=cyan!10]
+%\ParamBoites %on remet à 0 les paramètres
+%\CreationBoite[teal]{EnvDefi}{CptDefi}{\faIcon[regular]{comment-dots}}{Définition/Définitions}
+%\CreationBoite[yellow]{EnvHumour}{CptHumour}{\faIcon[regular]{laugh-wink}}{Humour/Humours}
+%\CreationBoite[violet]{EnvProp}{CptProp}{\faCog}{Propriété/Propriétés}
+%\CreationBoite[red]{EnvThm}{CptThm}{\faBullhorn}{Théorème/Théorèmes}
+%\CreationBoite[blue]{EnvRmq}{CptRmq}{\faHandPointRight[regular]}{Remarque/Remarques}
+%
+%\begin{EnvDefi}
+%\lipsum[1][3-4]
+%\end{EnvDefi}
+%
+%\begin{EnvHumour}
+%\lipsum[2][3-4]
+%\end{EnvHumour}
+%
+%\begin{EnvProp}
+%\lipsum[2][3-4]
+%\end{EnvProp}
+%
+%\begin{EnvThm}
+%\lipsum[2][3-4]
+%\end{EnvThm}
+%
+%\begin{EnvRmq}[Pluriel,Logo={example-image-1x1},SousTitre={ - Fondamentales -}]
+%\lipsum[3][1-7]
+%\end{EnvRmq}
+%\end{demohigh}
+%
+%\pagebreak
+%
+%\section{Historique}
+%
+%\verb|v0.1.0|~:~~~~Version initiale
+%
+%\vspace*{15mm}
+%
+%\pagebreak
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/highlightx/tex/highlightx.sty b/macros/latex/contrib/highlightx/tex/highlightx.sty
new file mode 100644
index 0000000000..fb7a8babf2
--- /dev/null
+++ b/macros/latex/contrib/highlightx/tex/highlightx.sty
@@ -0,0 +1,328 @@
+% Author : C. Pierquet
+% licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
+% source : https://tex.stackexchange.com/questions/5959/cool-text-highlighting-in-latex
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{highlightx}[2023/08/31 0.1.0 Macros pour surligner du texte, meme en mode paragraphe]
+
+%====HISTORIQUE
+% v 0.1.0 Version initiale [fr] et [en]
+
+%====BASE
+\RequirePackage{soul}
+\RequirePackage{atbegshi}
+\RequirePackage{etoolbox}
+\RequirePackage{tikz}
+\RequirePackage{xstring}
+\RequirePackage{simplekv}
+\usetikzlibrary{tikzmark,calc,decorations.pathmorphing}
+\colorlet{hlcolback}{yellow!35}
+
+%====COMMANDES POUR FORMULES
+\tikzstyle{encadreformule}=[decorate,decoration={random steps,amplitude=0.5pt,segment length=1em}]
+\tikzstyle{borderformula}=[decorate,decoration={random steps,amplitude=0.5pt,segment length=1em}]
+
+\defKV[surlignformule]{%
+ Fond=\def\surlignformulefond{#1},%
+ Bord=\def\surlignformulebord{#1},%
+ Texte=\def\surlignformuletexte{#1},%
+ Offset=\def\surlignformuleoffset{#1}
+}
+\setKVdefault[surlignformule]{%
+ Fond=hlcolback,%
+ Bord=none,%
+ Texte=black,%
+ Offset=1pt/2pt
+}
+
+\NewDocumentCommand\SurlignerFormule{ s O{\surlignformulefond} m D<>{} }{%
+ \useKVdefault[surlignformule]%
+ \setKV[surlignformule]{#2}%
+ \IfSubStr{\surlignformuleoffset}{/}%
+ {%
+ \StrCut{\surlignformuleoffset}{/}{\surlignformuleoffsetH}{\surlignformuleoffsetV}%
+ }%
+ {%
+ \def\surlignformuleoffsetH{\surlignformuleoffset}\def\surlignformuleoffsetV{\surlignformuleoffset}%
+ }%
+ \tikzmarknode[inner sep=0pt,outer sep=0pt]{formule}{\ensuremath{#3}}%
+ \begin{tikzpicture}[remember picture,overlay]
+ \IfBooleanTF{#1}%
+ {%
+ \fill[\surlignformulefond,draw=\surlignformulebord,#4] ([xshift=-\surlignformuleoffsetH,yshift=-\surlignformuleoffsetV]formule.south west) rectangle ([xshift=\surlignformuleoffsetH,yshift=\surlignformuleoffsetV]formule.north east) node[text=\surlignformuletexte,midway] {\ensuremath{#3}} ;
+ }%
+ {%
+ \fill[\surlignformulefond,draw=\surlignformulebord,encadreformule,#4] ([xshift=-\surlignformuleoffsetH,yshift=-\surlignformuleoffsetV]formule.south west) rectangle ([xshift=\surlignformuleoffsetH,yshift=\surlignformuleoffsetV]formule.north east) node[text=\surlignformuletexte,midway] {\ensuremath{#3}} ;
+ }
+ \end{tikzpicture}%
+}
+
+\defKV[hlformula]{%
+ bg=\def\hlformulabg{#1},%
+ border=\def\hlformulaborder{#1},%
+ text=\def\surlignformulatext{#1},%
+ offset=\def\hlformulaoffset{#1}
+}
+\setKVdefault[hlformula]{%
+ bg=hlcolback,%
+ border=none,%
+ text=black,%
+ offset=1pt/2pt
+}
+
+\NewDocumentCommand\HighlightFormula{ s O{\surlignformulefond} m D<>{} }{%
+ \useKVdefault[hlformula]%
+ \setKV[hlformula]{#2}%
+ \IfSubStr{\hlformulaoffset}{/}%
+ {%
+ \StrCut{\hlformulaoffset}{/}{\hlformulaoffsetH}{\hlformulaoffsetV}%
+ }%
+ {%
+ \def\hlformulaoffsetH{\hlformulaoffset}\def\hlformulaoffsetV{\hlformulaoffset}%
+ }%
+ \tikzmarknode[inner sep=0pt,outer sep=0pt]{formula}{\ensuremath{#3}}%
+ \begin{tikzpicture}[remember picture,overlay]
+ \IfBooleanTF{#1}%
+ {%
+ \fill[\hlformulabg,draw=\hlformulaborder,#4] ([xshift=-\hlformulaoffsetH,yshift=-\hlformulaoffsetV]formula.south west) rectangle ([xshift=\hlformulaoffsetH,yshift=\hlformulaoffsetV]formula.north east) node[text=\surlignformulatext,midway] {\ensuremath{#3}} ;
+ }%
+ {%
+ \fill[\hlformulabg,draw=\hlformulaborder,borderformula,#4] ([xshift=-\hlformulaoffsetH,yshift=-\hlformulaoffsetV]formula.south west) rectangle ([xshift=\hlformulaoffsetH,yshift=\hlformulaoffsetV]formula.north east) node[text=\surlignformulatext,midway] {\ensuremath{#3}} ;
+ }
+ \end{tikzpicture}%
+}
+
+%====COMMANDES POUR PARAGRAPHES SIMPLES (tcbox par exemple)
+\NewDocumentCommand\genhighlightpar{ O{hlcolback} m }{%
+ {\sethlcolor{#1}\hl{#2}}%
+}
+
+%====COMPTEURS ET VARIABLES
+\newlength{\txtdec@depth}
+\setlength{\txtdec@depth}{.5ex}
+\newlength{\txtdec@height}
+\setlength{\txtdec@height}{\f@size pt} % sensible default
+\newcounter{txtdec@hyphmark}
+\newcounter{txtdec@decormark}
+\setcounter{txtdec@decormark}{1}
+\newcounter{txtdec@hyphdraw}
+\setcounter{txtdec@hyphdraw}{1}
+\newcounter{txtdec@decordraw}
+\setcounter{txtdec@decordraw}{1}
+\newcounter{txtdec@thenextpage}
+\newtoggle{txtdec@unfinisheddecor}
+\newtoggle{txtdec@stayonpage}
+\newtoggle{txtdec@stayondecor}
+\newtoggle{txtdec@stayonline}
+
+%====COMMANDES AUXILIAIRES
+% from https://tex.stackexchange.com/a/33765/105447
+\newcommand{\gettikzxy}[3]{%
+ \tikz@scan@one@point\pgfutil@firstofone#1\relax
+ \edef#2{\the\pgf@x}%
+ \edef#3{\the\pgf@y}%
+}
+
+% the drawing macros
+\tikzset{%
+ defaultdecor/.style={%
+ fill=hlcolback,
+ decoration = {random steps, amplitude=0.5pt, segment length=1em},
+ outer sep = -15pt,
+ inner sep = 0pt,
+ decorate}%
+}
+
+\newcommand{\txtdec@draw@all}{%
+ \tikzset{thisdecor/.style/.expanded=\csuse{decor@tikz@style@\thetxtdec@decordraw}}%
+ \path[defaultdecor, thisdecor]
+ ($(\Xbegin,\Ybegin)+(0,-\txtdec@depth)$) rectangle
+ ($(\Xend,\Yend)+(0,\txtdec@height-\txtdec@depth)$) ;
+}
+
+\newcommand{\txtdec@draw@begin}{%
+ \tikzset{thisdecor/.style/.expanded=\csuse{decor@tikz@style@\thetxtdec@decordraw}}%
+ \path[defaultdecor, thisdecor]
+ ($(\Xbegin,\Ybegin)+(0,-\txtdec@depth)$) rectangle
+ ($(\Xlineend,\Ylineend)+(0,\txtdec@height-\txtdec@depth)$) ;
+}
+
+\newcommand{\txtdec@draw@middle}{%
+ \tikzset{thisdecor/.style/.expanded=\csuse{decor@tikz@style@\thetxtdec@decordraw}}%
+ \path[defaultdecor, thisdecor]
+ ($(\Xlinebegin,\Ylinebegin)+(0,-\txtdec@depth)$) rectangle
+ ($(\Xlineend,\Ylineend)+(0,\txtdec@height-\txtdec@depth)$) ;
+}
+
+\newcommand{\txtdec@draw@end}{%
+ \tikzset{thisdecor/.style/.expanded=\csuse{decor@tikz@style@\thetxtdec@decordraw}}%
+ \path[defaultdecor, thisdecor]
+ ($(\Xlinebegin,\Ylinebegin)+(0,-\txtdec@depth)$) rectangle
+ ($(\Xend,\Yend)+(0,\txtdec@height-\txtdec@depth)$) ;
+}
+
+% using soul to set tikzmarks
+\def\SOUL@tdleaders{%
+ \stepcounter{txtdec@hyphmark}%
+ \tikzmark{p\thepage.d\arabic{txtdec@decormark}.\arabic{txtdec@hyphmark}}%
+ \leaders\hrule\@depth\z@\@height\z@\relax
+}
+\def\SOUL@tdunderline#1{{%
+ \setbox\z@\hbox{#1}%
+ \dimen@=\wd\z@
+ \dimen@i=\SOUL@uloverlap
+ \advance\dimen@2\dimen@i
+ \rlap{%
+ \null
+ \kern-\dimen@i
+ \SOUL@ulcolor{\SOUL@tdleaders\hskip\dimen@}%
+ \hskip\dimen@
+ }%
+ \unhcopy\z@
+}}
+\def\SOUL@tdpreamble{%
+ \spaceskip\SOUL@spaceskip
+ \setcounter{txtdec@hyphmark}{0}%
+ \tikzmark{p\thepage.d\arabic{txtdec@decormark}.begin}%
+}
+\def\SOUL@tdeverysyllable{%
+ \SOUL@tdunderline{%
+ \the\SOUL@syllable
+ \SOUL@setkern\SOUL@charkern
+ }%
+ \stepcounter{txtdec@hyphmark}%
+ \tikzmark{p\thepage.d\arabic{txtdec@decormark}.\arabic{txtdec@hyphmark}}%
+}
+\def\SOUL@tdeveryhyphen{%
+ \discretionary{%
+ \unkern
+ \SOUL@tdunderline{%
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@sethyphenchar
+ }%
+ \stepcounter{txtdec@hyphmark}%
+ \tikzmark{p\thepage.d\arabic{txtdec@decormark}.\arabic{txtdec@hyphmark}}%
+ }{}{}%
+}
+\def\SOUL@tdeveryexhyphen#1{%
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@tdunderline{#1}%
+ \stepcounter{txtdec@hyphmark}%
+ \tikzmark{p\thepage.d\arabic{txtdec@decormark}.\arabic{txtdec@hyphmark}}%
+ \discretionary{}{}{%
+ \SOUL@setkern\SOUL@charkern
+ }%
+}
+\def\SOUL@tdpostamble{%
+ % create an extra mark, vertically displaced, to create an exit condition for the last line
+ \stepcounter{txtdec@hyphmark}%
+ \raisebox{-5pt}{\tikzmark{p\thepage.d\arabic{txtdec@decormark}.\arabic{txtdec@hyphmark}}}%
+ \tikzmark{p\thepage.d\arabic{txtdec@decormark}.end}%
+ \stepcounter{txtdec@decormark}%
+}
+\def\SOUL@tdsetup{%
+ \SOUL@setup
+ \let\SOUL@preamble\SOUL@tdpreamble
+ \let\SOUL@everysyllable\SOUL@tdeverysyllable
+ \let\SOUL@everyhyphen\SOUL@tdeveryhyphen
+ \let\SOUL@everyexhyphen\SOUL@tdeveryexhyphen
+ \let\SOUL@postamble\SOUL@tdpostamble
+}
+
+%====COMMANDES PRINCIPALES
+\DeclareRobustCommand*\SurlignerTexte[1][]{%
+ \csxdef{decor@tikz@style@\thetxtdec@decormark}{#1}%
+ \csxdef{decor@fsize@\thetxtdec@decormark}{\f@size pt}%
+ \SOUL@tdsetup\SOUL@%
+}
+
+\DeclareRobustCommand*\HighlightText[1][]{%
+ \csxdef{decor@tikz@style@\thetxtdec@decormark}{#1}%
+ \csxdef{decor@fsize@\thetxtdec@decormark}{\f@size pt}%
+ \SOUL@tdsetup\SOUL@%
+}
+
+\AtBeginShipout{%
+ \AtBeginShipoutUpperLeft{%
+ % getting the number of the next page
+ \setcounter{txtdec@thenextpage}{\thepage}%
+ \stepcounter{txtdec@thenextpage}%
+ % if the current decoration occurs on this page, stay on it
+ \iftikzmark{p\thepage.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw}}{%
+ \toggletrue{txtdec@stayonpage}}{}%
+ \whileboolexpr{togl {txtdec@stayonpage}}{%
+ \begin{tikzpicture}[remember picture, overlay]
+ \setlength{\txtdec@height}{\csuse{decor@fsize@\thetxtdec@decordraw}}%
+ \iftikzmark{p\thepage.d\arabic{txtdec@decordraw}.begin}{%
+ % if current decor begins in current page, get coordinates
+ \gettikzxy{(pic cs:p\thepage.d\arabic{txtdec@decordraw}.begin)}{\Xbegin}{\Ybegin}}{%
+ % if current decor begins in previous page, set to top left of the page
+ \gettikzxy{(current page.north west)}{\Xbegin}{\Ybegin}}%
+ \iftikzmark{p\thepage.d\arabic{txtdec@decordraw}.end}{%
+ % if current decor ends in current page, get coordinates
+ \gettikzxy{(pic cs:p\thepage.d\arabic{txtdec@decordraw}.end)}{\Xend}{\Yend}}{%
+ % if current decor ends in future page, set to bottom right of the page
+ \gettikzxy{(current page.south east)}{\Xend}{\Yend}}%
+ \ifdim\Ybegin=\Yend % the simplest case, a single line
+ \txtdec@draw@all
+ \stepcounter{txtdec@decordraw}%
+ \else % current textdecor has a line break
+ \toggletrue{txtdec@stayondecor}%
+ \whileboolexpr{togl {txtdec@stayondecor}}{%
+ \gettikzxy{(pic cs:p\thepage.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw})}{\Xlinebegin}{\Ylinebegin}%
+ \edef\Xcurrent{\Xlinebegin}%
+ \edef\Ycurrent{\Ylinebegin}%
+ \edef\Xnext{\Xcurrent}%
+ \edef\Ynext{\Ycurrent}%
+ \toggletrue{txtdec@stayonline}%
+ \whileboolexpr{togl {txtdec@stayonline}}{%
+ \ifdim\Ycurrent=\Ynext
+ \stepcounter{txtdec@hyphdraw}%
+ % if the following tikzmark exists, we are at a page break
+ \iftikzmark{p\arabic{txtdec@thenextpage}.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw}}{%
+ \edef\Xcurrent{\Xnext}%
+ \edef\Ycurrent{\Ynext}%
+ \gettikzxy{(current page.south east)}{\Xnext}{\Ynext}
+ \togglefalse{txtdec@stayondecor}%
+ }{% else, we remain on the same page
+ \iftikzmark{p\thepage.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw}}{%
+ \edef\Xcurrent{\Xnext}%
+ \edef\Ycurrent{\Ynext}%
+ \gettikzxy{(pic cs:p\thepage.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw})}{\Xnext}{\Ynext}}{}%
+ }%
+ \else
+ \edef\Xlineend{\Xcurrent}%
+ \edef\Ylineend{\Ycurrent}%
+ % if we are on the first line of the current decoration
+ \ifdim\Ylinebegin=\Ybegin
+ \txtdec@draw@begin
+ \else
+ % if we are on the last line of the current decoration
+ \ifdim\Ycurrent=\Yend
+ \txtdec@draw@end
+ \stepcounter{txtdec@decordraw}%
+ \setcounter{txtdec@hyphdraw}{1}%
+ \togglefalse{txtdec@stayondecor}%
+ % if we are in a middle line of the decoration
+ \else
+ \txtdec@draw@middle
+ \fi
+ \fi
+ \togglefalse{txtdec@stayonline}%
+ \fi
+ }%
+ }%
+ \fi
+ \end{tikzpicture}%
+ % if the beginning of the next decor does not exist in this page, leave this page
+ \iftikzmark{p\thepage.d\arabic{txtdec@decordraw}.begin}{}{%
+ \togglefalse{txtdec@stayonpage}}%
+ % if the continuation of the current decor exists in the next page, leave this page
+ \iftikzmark{p\arabic{txtdec@thenextpage}.d\arabic{txtdec@decordraw}.\arabic{txtdec@hyphdraw}}{%
+ \togglefalse{txtdec@stayonpage}}{}%
+ }%
+ }%
+}
+
+
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/huawei/huawei.dtx b/macros/latex/contrib/huawei/huawei.dtx
index 7297aae941..f2b24f8581 100644
--- a/macros/latex/contrib/huawei/huawei.dtx
+++ b/macros/latex/contrib/huawei/huawei.dtx
@@ -50,7 +50,7 @@
%<class>\NeedsTeXFormat{LaTeX2e}
%<class>\ProvidesClass{huawei}
%<*class>
-[2023-08-09 0.18.0 Template for Huawei Documents]
+[2023-08-31 0.18.1 Template for Huawei Documents]
%</class>
%<*driver>
\documentclass{ltxdoc}
@@ -447,7 +447,7 @@ $pdflatex = 'pdflatex %O --shell-escape %S';
% Then, we configure |enumitem|:
% \begin{macrocode}
-\RequirePackage{enumitem}
+\RequirePackage[inline]{enumitem}
\setlist{nosep}
% \end{macrocode}
@@ -707,7 +707,7 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
\begin{textblock}{14}[0.5,0.5](8,8)%
\tikz \node[minimum width=14\TPHorizModule] {%
\fontsize{64}{64}\selectfont\sffamily\scshape%
- \color{gray!20}\rotatebox{30}{it is a draft}
+ \color{gray!20}\rotatebox{30}{it is a draft}%
};%
\end{textblock}%
\else\fi%
@@ -725,7 +725,7 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
\begin{textblock}{8}[1,0](15.8,0.2)%
\raggedleft\huawei@header{%
\ifdefined\huawei@nosecurity\else%
- \thesecurity
+ \thesecurity%
\fi%
}%
\end{textblock}%
@@ -737,14 +737,14 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
\ifdefined\huawei@anonymous\else%
\theauthor%
\ifdefined\huawei@nosecurity\else%
- \ifx\theid\empty\else, \theid\fi
+ \ifx\theid\empty\else, \theid\fi%
\fi%
\ifdefined\huawei@nobrand\else%
\newline
\fi%
\fi%
\ifdefined\huawei@nobrand\else%
- \thecompany{}
+ \thecompany{}%
\fi%
}%
\fi%
@@ -781,35 +781,38 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
% Then, we redefine |\maketitle|:
% \begin{macrocode}
\makeatletter\renewcommand\maketitle{%
- \vspace*{18pt}
- {\bfseries{\Huge\thetitle\par}}
+ \vspace*{18pt}%
+ {\bfseries{\Huge\raggedright\thetitle\par}}%
\ifx\thesubtitle\empty\else%
- {\color{gray!50!black}\large\thesubtitle\par}
- \fi
+ {\color{gray!50!black}\large\raggedright\thesubtitle\par}%
+ \fi%
\ifdefined\huawei@nobrand\else%
\ifdefined\huawei@anonymous\else%
\ifx\thecompany\empty\else%
- \thecompany\newline
- \fi
- \fi
- \fi
- \ifx\theauthor\empty\else%
- {\scshape\ifdefined\huawei@anonymous
- Anonymous Authors
- \else%
- \theauthor
- \fi}%
+ \thecompany\par%
+ \fi%
+ \fi%
\fi%
- \ifdefined\huawei@anonymous\else%
- \ifx\theauthor\empty\else
- \ifdefined\huawei@nobrand\else%
- \ifx\theid\empty\else
- $\;$/ {\theid}
- \fi
- \fi
- \fi
- \fi
- \vspace{2em}
+ \parbox{.6\textwidth}{\raggedright%
+ \ifx\theauthor\empty\else%
+ {\scshape\ifdefined\huawei@anonymous%
+ Anonymous Authors%
+ \else%
+ \theauthor%
+ \fi}%
+ \fi%
+ \ifdefined\huawei@anonymous\else%
+ \ifx\theauthor\empty\else%
+ \ifdefined\huawei@nobrand\else%
+ \ifx\theid\empty\else%
+ $\;$/ {\theid}%
+ \fi%
+ \fi%
+ \fi%
+ \fi%
+ \par%
+ }%
+ \vspace{2em}%
}\makeatother
% \end{macrocode}
% \end{macro}
@@ -869,7 +872,7 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
cannot be held liable for the use of and reliance of
the opinions, estimates, forecasts and findings in
these documents.
- \par
+ \par%
\endgroup%
}\makeatother
% \end{macrocode}
@@ -878,25 +881,25 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
% \begin{macro}{\PrintFirstPage}
% Then, we define |\PrintFirstPage|:
% \begin{macrocode}
-\makeatletter\newcommand\PrintFirstPage[1]{
- \ifdefined\huawei@landscape\else
+\makeatletter\newcommand\PrintFirstPage[1]{%
+ \ifdefined\huawei@landscape\else%
\PackageError{huawei}{It's allowed to use
PrintFirstPage only in landscape mode}{Read huawei.pdf
for more information}
- \fi
- \huawei@bar
+ \fi%
+ \huawei@bar%
\def\param{#1}%
- \ifx\param\empty\else
- \includegraphics[height=2in]{#1}
- \newline
- \fi
- \vspace*{0.5in}
- \maketitle
- \ifdefined\huawei@nocover\else
- \begin{textblock}{14}[1,1](14,14)
- \raggedleft\includegraphics[height=3.6in]{huawei-cover-picture.pdf}
- \end{textblock}
- \fi
+ \ifx\param\empty\else%
+ \includegraphics[height=2in]{#1}%
+ \newline%
+ \fi%
+ \vspace*{0.5in}%
+ \maketitle%
+ \ifdefined\huawei@nocover\else%
+ \begin{textblock}{14}[1,1](14,14)%
+ \raggedleft\includegraphics[height=3.6in]{huawei-cover-picture.pdf}%
+ \end{textblock}%
+ \fi%
}\makeatother
% \end{macrocode}
% \end{macro}
@@ -904,32 +907,32 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
% \begin{macro}{\PrintLastPage}
% Then, we define |\PrintLastPage|:
% \begin{macrocode}
-\makeatletter\newcommand\PrintLastPage{
- \ifdefined\huawei@landscape\else
+\makeatletter\newcommand\PrintLastPage{%
+ \ifdefined\huawei@landscape\else%
\PackageError{huawei}{It's allowed to use
PrintLastPage only in landscape mode}{Read huawei.pdf
for more information}
- \fi
- \newpage
- \vspace*{1in}
- \begin{center}
- \begin{minipage}{0.6\columnwidth}\raggedright
- \normalsize
- \setlength{\parskip}{6pt}
- {\Huge\color{red}\textbf{Thank you!}}
-
- \vspace{0.5in}
-
+ \fi%
+ \newpage%
+ \vspace*{1in}%
+ \begin{center}%
+ \begin{minipage}{0.6\columnwidth}\raggedright%
+ \normalsize%
+ \setlength{\parskip}{6pt}%
+ {\Huge\color{red}\textbf{Thank you!}}%
+ \par%
+ \vspace{0.5in}%
+ \par%
Bring digital to every person, home and organization
- \newline
+ \newline%
for a fully connected, intelligent world.
-
+ \par%
\textbf{%
Copyright \copyright{} \the\year{} \thecompany{}
\newline
All Rights Reserved.%
}
-
+ \par%
The information in this document may contain predictive
statements including, without limitation, statements regarding
the future financial and operating results, future product
@@ -942,7 +945,7 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
The author%
\else%
\thecompany{}%
- \fi
+ \fi%
may change the information at any time without notice.
\end{minipage}
\end{center}%
@@ -976,7 +979,7 @@ xscale=#1, inner sep=0pt, outer sep=0pt]
% Then, we set the background color of the document, if required by the |dark| class option:
% \begin{macrocode}
-\makeatletter\ifdefined\huawei@dark
+\makeatletter\ifdefined\huawei@dark%
\RequirePackage{pagecolor}%
\pagecolor{black}%
\color{white}%
diff --git a/macros/latex/contrib/huawei/huawei.pdf b/macros/latex/contrib/huawei/huawei.pdf
index f002dcbce5..e744f240b8 100644
--- a/macros/latex/contrib/huawei/huawei.pdf
+++ b/macros/latex/contrib/huawei/huawei.pdf
Binary files differ
diff --git a/macros/latex/contrib/jwjournal/README.md b/macros/latex/contrib/jwjournal/README.md
index 996d0376a0..20f9f77307 100644
--- a/macros/latex/contrib/jwjournal/README.md
+++ b/macros/latex/contrib/jwjournal/README.md
@@ -13,7 +13,16 @@ Codewise, it is as simple as below:
Today I visited the botanical garden!
- [Food] And had ice-cream for lunch!
+ [Food] And had *ice cream* for lunch!
+
+ >>> This botanical garden has a history of nearly two hundred years, take a look at this photo:
+ || <0.40> {example-image}
+
+ (( <0.45> {example-image-a}
+ <- <5>
+ )) <0.50> {example-image-b}
+ <- <5>
+ (( <0.45> {example-image-c}
```
> It is also possible to write the date as `2023/01/01`.
@@ -35,28 +44,34 @@ By the way, the conversion from plain date string like `2023-01-01` to natural l
The structure of the document is very simple:
```latex
-\documentclass[11pt, paperstyle=light yellow, color entry]{jwjournal}
+\documentclass[11pt, paperstyle = light yellow, color entry]{jwjournal}
+\UseLanguage{⟨language⟩}
\begin{document}
+
+
% Your journal
+
+
\end{document}
```
-The options are:
-- `month-day-year` or `day-month-year` for other date format
-- `paperstyle = ...` adjusts the paper color, options include: lightyellow、yellow、parchment、green、lightgray、gray、nord、dark...
-- `color entry` adds more color to the title of each entry
-- `scroll` turns on the scroll mode and can generate a single-page pdf similar to a long screenshot
+The available class options include:
+- `month-day-year` or `day-month-year` for using other date format;
+- `paperstyle = ...` adjusts the paper color, choices include: `light yellow`, `yellow`, `parchment`, `green`, `light gray`, `gray`, `nord`, `dark`...
+- `color entry` adds more color to the title of each entry;
+- `scroll` turns the scroll mode on, which generates a single-page pdf similar to a long screenshot.
-And there are only three major syntaxes for the main text:
+Here are the major syntaxes for your main text:
1) Title
- - Any line begins with date like `2023-01-01` would be regard as the *Title* line.
+ - Any line begins with date like `2023-01-01` or `2023/01/01` would be regard as the *Title* line.
- You may write the weather and/or location after the date.
- Example:
```
- 2023-01-01 Sunny --- Apartment
+ 2023-01-01 Sunny | Apartment
```
-2) Note
+ > With the options `month-day-year` or `day-month-year`, you can also write date in the format `mm-dd-yyyy` or `dd-mm-yyyy`, respectively. You may refer to the English and French demo documents for examples.
+1) Note
- Any line begins with something like `[Note]` would be regard as the *Note* line.
- Example:
```
@@ -64,10 +79,17 @@ And there are only three major syntaxes for the main text:
```
The space(s) between `[Note]` and the text following it would be ignored.
> You may also use `【` and `】`, which is especially useful when writing Chinese.
-3) Displayed images can be included via one of the following ways:
- - `|| <⟨width⟩> {⟨image file name⟩}` or `|| {⟨image file name⟩} <⟨width⟩>`: show image in the middle.
- - `(( <⟨width⟩> {⟨image file name⟩}` or `(( {⟨image file name⟩} <⟨width⟩>`: show image on the left.
- - `)) <⟨width⟩> {⟨image file name⟩}` or `)) {⟨image file name⟩} <⟨width⟩>`: show image on the right.
+1) Emphasis
+ - You may emphasize text as with Markdown:
+ - `*⟨text⟩*` is emphasizing;
+ - `**⟨text⟩**` is bolding;
+ - `***⟨text⟩***` is bolding and emphasizing.
+ - You may put text in a colored block via `>>>`, its usage is like the `>` in Markdown for blockquote.
+1) Image
+ - Displayed images can be included via one of the following ways:
+ - `|| <⟨width⟩> {⟨image file name⟩}` or `|| {⟨image file name⟩} <⟨width⟩>`: show image in the middle.
+ - `(( <⟨width⟩> {⟨image file name⟩}` or `(( {⟨image file name⟩} <⟨width⟩>`: show image on the left.
+ - `)) <⟨width⟩> {⟨image file name⟩}` or `)) {⟨image file name⟩} <⟨width⟩>`: show image on the right.
> The `<⟨width⟩>` is optional. Here `⟨width⟩` is a number like `0.75`, the unit is `\linewidth`. When `<⟨width⟩>` is not given, the width would be full `\linewidth`.
With a few more for icing on the cake:
@@ -111,6 +133,8 @@ With a few more for icing on the cake:
> You may also refer to the demo documents to see their behaviors in action.
+> And don't forget that you are still using LaTeX! Thus if the provided syntax does not satisfy you, there are always LaTeX commands as a fallback.
+
Indentations are not important, but paragraphs need to be separated by a blank line. For the sake of readability, it is recommended to organize your text as one of the following ways:
- with indentation:
```
diff --git a/macros/latex/contrib/jwjournal/jwjournal-demo-cn.pdf b/macros/latex/contrib/jwjournal/jwjournal-demo-cn.pdf
index 40281336ad..7980506f1e 100644
--- a/macros/latex/contrib/jwjournal/jwjournal-demo-cn.pdf
+++ b/macros/latex/contrib/jwjournal/jwjournal-demo-cn.pdf
Binary files differ
diff --git a/macros/latex/contrib/jwjournal/jwjournal-demo-cn.tex b/macros/latex/contrib/jwjournal/jwjournal-demo-cn.tex
index 5ed5d23589..9cd0937d84 100644
--- a/macros/latex/contrib/jwjournal/jwjournal-demo-cn.tex
+++ b/macros/latex/contrib/jwjournal/jwjournal-demo-cn.tex
@@ -12,21 +12,23 @@
在文中出现的日期和标注不会被识别: 2022-12-25、[标注]、【标注】,放心使用!
- [体育] 一些关于体育赛事的事情
+ [文本] 你可以使用*斜体*、**粗体**或者***两者结合***。
- 【学习】 % 【...】与 [...] 效果相同
- 一些关于学习的事情
+ 【说明】 % 【...】与 [...] 效果相同
+ 在一些特殊情况需要把星号用 \texttt{\{\}} 隔开:**像**{}***这***{}*样*。
- 图片这可以这样引入:
+ >>> 像这样可以把文本放在色彩框内。
- || <.4> {example-image-a} % 或者 || {example-image-a} <.4>
+ 图片可以这样引入:
+
+ || <.4> {example-image} % 或者 || {example-image} <.4>
>> (图片的注释)
>> (更多注释)
也可以靠左或者靠右显示:
(( <.4> {example-image-a} % 或者 (( {example-image-a} <.4>
-> <.3> % 加入一点竖直间距,例如这里是 0.3\baselineskip
- )) <.4> {example-image-a} % 或者 )) {example-image-a} <.4>
+ )) <.4> {example-image-b} % 或者 )) {example-image-b} <.4>
diff --git a/macros/latex/contrib/jwjournal/jwjournal-demo-en.pdf b/macros/latex/contrib/jwjournal/jwjournal-demo-en.pdf
index 04b98e6366..eeffdf0183 100644
--- a/macros/latex/contrib/jwjournal/jwjournal-demo-en.pdf
+++ b/macros/latex/contrib/jwjournal/jwjournal-demo-en.pdf
Binary files differ
diff --git a/macros/latex/contrib/jwjournal/jwjournal-demo-en.tex b/macros/latex/contrib/jwjournal/jwjournal-demo-en.tex
index 5a5d8740c9..0fb357e3ee 100644
--- a/macros/latex/contrib/jwjournal/jwjournal-demo-en.tex
+++ b/macros/latex/contrib/jwjournal/jwjournal-demo-en.tex
@@ -10,20 +10,22 @@
Dates and annotations appearing in the text will not be recognized: 12/25/2022, [Note], so feel free to write these.
- [Sports] something about sporting events.
+ [Text] You can write text in *italics*, **bold** or ***both***.
- [Learning] something about learning.
+ [Remark] In some special cases, it would be necessary to separate the asterisks with~\texttt{\{\}}: **like**{}***this***{}*one*.
+
+ >>> You can put text inside a colored block like this.
Images can be included via:
- || <.4> {example-image-a} % or || {example-image-a} <.4>
+ || <.4> {example-image} % or || {example-image} <.4>
>> (Remark on the image)
>> (More remark...)
You may also show the image on the left or on the right:
(( <.4> {example-image-a} % or (( {example-image-a} <.4>
-> <.3> % add some vertical spacing, here is 0.3\baselineskip
- )) <.4> {example-image-a} % or )) {example-image-a} <.4>
+ )) <.4> {example-image-b} % or )) {example-image-b} <.4>
diff --git a/macros/latex/contrib/jwjournal/jwjournal-demo-fr.pdf b/macros/latex/contrib/jwjournal/jwjournal-demo-fr.pdf
index 7303b8b07e..98da8d1897 100644
--- a/macros/latex/contrib/jwjournal/jwjournal-demo-fr.pdf
+++ b/macros/latex/contrib/jwjournal/jwjournal-demo-fr.pdf
Binary files differ
diff --git a/macros/latex/contrib/jwjournal/jwjournal-demo-fr.tex b/macros/latex/contrib/jwjournal/jwjournal-demo-fr.tex
index 865402e254..f83a5d4ae1 100644
--- a/macros/latex/contrib/jwjournal/jwjournal-demo-fr.tex
+++ b/macros/latex/contrib/jwjournal/jwjournal-demo-fr.tex
@@ -12,20 +12,22 @@
Les dates et annotations apparaissant dans le texte ne seront pas détectées : 25/12/2022, [Note], alors n'hésitez pas à les écrire !
- [Sports] quelque chose sur les événements sportifs.
+ [Texte] Vous pouvez écrire votre texte en *italique*, **gras** ou ***les deux***.
- [Apprendre] quelque chose sur l'apprentissage.
+ [Remarque] Dans certains cas particuliers, il serait nécessaire de séparer les astérisques par~\texttt{\{\}} : **comme**{}***cet***{}*exemple*.
+
+ >>> Vous pouvez mettre votre texte dans un bloc coloré comme celui-ci.
Les images peuvent être incluses via :
- || <.4> {example-image-a} % ou || {example-image-a} <.4>
+ || <.4> {example-image} % ou || {example-image} <.4>
>> (Remarque sur l'image)
>> (Plus de remarque...)
Vous pouvez également afficher l'image à gauche ou à droite :
(( <.4> {example-image-a} % ou (( {example-image-a} <.4>
-> <.3> % ajouter un certain espace vertical, ici c'est 0.3\baselineskip
- )) <.4> {example-image-a} % ou )) {example-image-a} <.4>
+ )) <.4> {example-image-b} % ou )) {example-image-b} <.4>
diff --git a/macros/latex/contrib/jwjournal/jwjournal.cls b/macros/latex/contrib/jwjournal/jwjournal.cls
index bf03993158..c178db4e59 100644
--- a/macros/latex/contrib/jwjournal/jwjournal.cls
+++ b/macros/latex/contrib/jwjournal/jwjournal.cls
@@ -12,7 +12,7 @@
\NeedsTeXFormat{LaTeX2e}[2022-06-01]
\ProvidesExplClass
{jwjournal}
- {2023/08/30} {}
+ {2023/08/31} {}
{JW's journal class}
\keys_define:nn { jwjournal }
@@ -57,6 +57,14 @@
\colorlet { jwjournal-entry } { . }
+\NewDocumentCommand \JWJournalSeperator { O{jwjournal-entry!60!main-text} }
+ {
+ \enspace
+ \tikz [x=.75ex,y=.75ex,line~width=.2ex,line~join=round,baseline=-.3ex]
+ \draw [#1] (0,.5) -- (.5,1) -- (1,.5) -- (.5,0) -- (0,.5) -- cycle;
+ \enspace
+ }
+
\NewDocumentCommand \JWJournalEntry { m m }
{
\skip_vertical:n { .5 \baselineskip }
@@ -70,7 +78,7 @@
{
\colorlet { jwjournal-entry-background } { paper }
}
- \begin{tcolorbox}[enhanced~jigsaw, breakable,
+ \begin{tcolorbox}[enhanced~jigsaw,
enlarge~left~by=-3.5mm, width=\textwidth+3.5mm,
colback=jwjournal-entry-background,
boxrule=0pt, top=2pt, bottom=2pt, left=2.5mm, right=
@@ -84,15 +92,11 @@
\color {jwjournal-entry!30!main-text}
}
\ProjLibDate {#1}
- \enspace
- \tikz [x=.75ex,y=.75ex,line~width=.2ex,line~join=round,baseline=-.3ex] \draw [jwjournal-entry!60!main-text] (0,.5) -- (.5,1) -- (1,.5) -- (.5,0) -- (0,.5) -- cycle;
- \enspace
+ \JWJournalSeperator{}
\projlib_datetime_display_week_uppercase:n { #1 }
\tl_if_blank:eF { #2 }
{
- \enspace
- \tikz [x=.75ex,y=.75ex,line~width=.2ex,line~join=round,baseline=-.3ex] \draw [jwjournal-entry!60!main-text] (0,.5) -- (.5,1) -- (1,.5) -- (.5,0) -- (0,.5) -- cycle;
- \enspace
+ \JWJournalSeperator{}
#2
}
\end{tcolorbox}
@@ -100,11 +104,10 @@
}
\RequirePackage { enumitem }
-\setlist [ description ] { font = \normalfont\sffamily, leftmargin = 3em, topsep = 0pt }
+\setlist [ description ] { font = \normalfont\sffamily, leftmargin = 3em, topsep = 0pt, labelsep = 1em }
\RenewDocumentCommand \descriptionlabel { m }
{
- \skip_horizontal:n { \labelsep }
- \makebox[\maxof{\width}{2.5em}]{
+ \makebox[\maxof{\width}{2em}][l]{
\tcbox[enhanced~jigsaw, breakable, oversize,
on~line, arc = .12em, outer~arc = .1em,
colframe = jwjournal-entry, colupper=main-text, opacityback = 0,
@@ -119,6 +122,26 @@
\end{description}
}
+\NewDocumentCommand \JWJournalNote { m }
+ {
+ \bool_if:NTF \l__jwjournal_color_entry_bool
+ {
+ \colorlet { jwjournal-note-background } { jwjournal-entry!3!paper }
+ }
+ {
+ \colorlet { jwjournal-note-background } { paper }
+ }
+ \begin{tcolorbox}[enhanced~jigsaw, breakable,
+ colback=jwjournal-note-background,
+ boxrule=0pt, top=2pt, bottom=2pt, left=1em-1mm, right=
+ \bool_if:NTF \l__jwjournal_color_entry_bool
+ { 2mm }
+ { -1mm },
+ borderline~west={1mm}{0mm}{jwjournal-entry!90!main-text!60!paper}, frame~hidden]
+ #1
+ \end{tcolorbox}
+ }
+
\NewDocumentCommand \JWJournalSkip { D<>{.5} }
{
% \vspace{#1\baselineskip}
@@ -316,10 +339,36 @@
{ \c{c_jwjournal_new_line_with_skip_tl} }
\l_jwjournal_tmp_tl
- % \regex_replace_all:nnN
- % { >> (.*) }
- % { \c{JWJournalCompactCenterText}\{\1\} }
- % \l_jwjournal_tmp_tl
+ \regex_replace_all:nnN
+ { \*\*\* (.*?) \*\*\* }
+ { \c{textbf}\{ \c{emph}\{ \1 \} \} }
+ \l_jwjournal_tmp_tl
+ \regex_replace_all:nnN
+ { \*\* (.*?) \*\* }
+ { \c{textbf}\{ \1 \} }
+ \l_jwjournal_tmp_tl
+ \regex_replace_all:nnN
+ { \* (.*?) \* }
+ { \c{emph}\{ \1 \} }
+ \l_jwjournal_tmp_tl
+
+ \regex_replace_once:nnN
+ { >>> \ *? (.*) }
+ { \c{JWJournalNote}\{\1\} }
+ \l_jwjournal_tmp_tl
+ \regex_replace_all:nnN
+ { \ *? >>> \ *? }
+ { }
+ \l_jwjournal_tmp_tl
+ % \exp_args:Nno \regex_split:nnN { >>> } { \l_jwjournal_tmp_tl } \l_tmpa_seq
+ % \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
+ % \tl_set_eq:NN \l_jwjournal_tmp_tl \l_tmpa_tl
+ % \seq_map_inline:Nn \l_tmpa_seq
+ % {
+ % \tl_put_right:Nn \l_jwjournal_tmp_tl
+ % { \JWJournalNote { ####1 } }
+ % }
+
\exp_args:Nno \regex_split:nnN { >> } { \l_jwjournal_tmp_tl } \l_tmpa_seq
\seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
\tl_set_eq:NN \l_jwjournal_tmp_tl \l_tmpa_tl
diff --git a/macros/latex/contrib/siunitx/CHANGELOG.md b/macros/latex/contrib/siunitx/CHANGELOG.md
index 92d2a410b3..5f4eb8bb13 100644
--- a/macros/latex/contrib/siunitx/CHANGELOG.md
+++ b/macros/latex/contrib/siunitx/CHANGELOG.md
@@ -7,6 +7,22 @@ Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to
## [Unreleased]
+## [v3.3.5] - 2023-08-30
+
+### Fixed
+- Correct spacing for uncertainties for integers in
+ tables (see issue
+ [\#690](https://github.com/josephwright/siunitx/issues/690))
+- Prevent expansion of `\text` in literal units (see issue
+ [\#691](https://github.com/josephwright/siunitx/issues/691))
+- Parse empty and zero exponents independently (see issue
+ [\#692](https://github.com/josephwright/siunitx/issues/692))
+- Printing of 'boundary' phrases (see issue
+ [\#693](https://github.com/josephwright/siunitx/issues/693))
+- Handling of font commands inside `\ensuremath` in text
+ mode (see issue
+ [\#694](https://github.com/josephwright/siunitx/issues/694))
+
## [v3.3.4] - 2023-08-24
### Fixed
@@ -1996,7 +2012,8 @@ Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to
### Added
- First public testing release (as `si`)
-[Unreleased]: https://github.com/josephwright/siunitx/compare/v3.3.4...HEAD
+[Unreleased]: https://github.com/josephwright/siunitx/compare/v3.3.5...HEAD
+[v3.3.5]: https://github.com/josephwright/siunitx/compare/v3.3.4...v3.3.5
[v3.3.4]: https://github.com/josephwright/siunitx/compare/v3.3.3...v3.3.4
[v3.3.3]: https://github.com/josephwright/siunitx/compare/v3.3.2...v3.3.3
[v3.3.2]: https://github.com/josephwright/siunitx/compare/v3.3.1...v3.3.2
diff --git a/macros/latex/contrib/siunitx/siunitx-angle.dtx b/macros/latex/contrib/siunitx/siunitx-angle.dtx
index da61a09fec..5489fbfec3 100644
--- a/macros/latex/contrib/siunitx/siunitx-angle.dtx
+++ b/macros/latex/contrib/siunitx/siunitx-angle.dtx
@@ -62,7 +62,11 @@
%
% \section{Formatting angles}
%
-% \begin{function}{\siunitx_angle:n, \siunitx_angle:nnn}
+% \begin{function}
+% {
+% \siunitx_angle:n, \siunitx_angle:x,
+% \siunitx_angle:nnn, \siunitx_angle:xxx
+% }
% \begin{syntax}
% \cs{siunitx_angle:n} \Arg{angle}
% \cs{siunitx_angle:nnn} \Arg{degrees} \Arg{minutes} \Arg{seconds}
@@ -236,9 +240,9 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\siunitx_angle:n, \@@_angle:n}
-% \begin{macro}{\siunitx_angle:nnn}
-% \begin{macro}{\@@_arc_convert:n}
+% \begin{macro}{\siunitx_angle:n, \siunitx_angle:x, \@@_angle:n}
+% \begin{macro}{\siunitx_angle:nnn, \siunitx_angle:xxx}
+% \begin{macro}{\@@_arc_convert:n, \@@_arc_convert:x}
% The first step here is to force format conversion if required. Going to
% a decimal is easy, going to arc format is a bit more painful: avoid
% repeating calculations mainly for code readability.
@@ -258,10 +262,11 @@
}
}
}
+\cs_generate_variant:Nn \siunitx_angle:n { x }
\cs_new_protected:Npn \@@_angle:n #1
{
\bool_if:NTF \l_@@_force_arc_bool
- { \exp_args:Ne \@@_arc_convert:n { \fp_eval:n {#1} } }
+ { \@@_arc_convert:x { \fp_eval:n {#1} } }
{
\siunitx_number_parse:nN {#1} \l_@@_degrees_tl
\siunitx_number_process:NN \l_@@_degrees_tl \l_@@_degrees_tl
@@ -279,7 +284,7 @@
{
\bool_if:NTF \l_@@_force_decimal_bool
{
- \exp_args:Ne \siunitx_angle:n
+ \siunitx_angle:x
{ \fp_eval:n { #1 + (#2) / 60 + (#3) / 3600 } }
}
{ \@@_arc_sign:nnn {#1} {#2} {#3} }
@@ -297,25 +302,24 @@
\l_@@_seconds_tl
}
}
+\cs_generate_variant:Nn \siunitx_angle:nnn { xxx }
\cs_new_protected:Npn \@@_arc_convert:n #1
{
- \use:x
+ \siunitx_angle:xxx
+ { \fp_eval:n { trunc(#1,0) } }
+ { \fp_eval:n { trunc((#1 - trunc(#1,0)) * 60,0) } }
{
- \siunitx_angle:nnn
- { \fp_eval:n { trunc(#1,0) } }
- { \fp_eval:n { trunc((#1 - trunc(#1,0)) * 60,0) } }
+ \fp_eval:n
{
- \fp_eval:n
- {
- (
- (#1 - trunc(#1,0)) * 60
- - trunc((#1 - trunc(#1,0)) * 60,0)
- )
- * 60
- }
+ (
+ (#1 - trunc(#1,0)) * 60
+ - trunc((#1 - trunc(#1,0)) * 60,0)
+ )
+ * 60
}
}
}
+\cs_generate_variant:Nn \@@_arc_convert:n { x }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -399,11 +403,11 @@
{
\tl_if_empty:cF { l_@@_ ##1 _tl }
{
- \exp_args:Ncc \siunitx_number_process:NN
+ \siunitx_number_process:cc
{ l_@@_ ##1 _tl } { l_@@_ ##1 _tl }
\tl_set:cx { l_@@_ ##1 _tl }
{
- \exp_args:Nc \siunitx_number_output:NN
+ \siunitx_number_output:cN
{ l_@@_ ##1 _tl } \q_nil
}
}
diff --git a/macros/latex/contrib/siunitx/siunitx-code.pdf b/macros/latex/contrib/siunitx/siunitx-code.pdf
index 5ee4a1467b..493c8aeced 100644
--- a/macros/latex/contrib/siunitx/siunitx-code.pdf
+++ b/macros/latex/contrib/siunitx/siunitx-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/siunitx/siunitx-complex.dtx b/macros/latex/contrib/siunitx/siunitx-complex.dtx
index 21a8fa3be9..af0b882c94 100644
--- a/macros/latex/contrib/siunitx/siunitx-complex.dtx
+++ b/macros/latex/contrib/siunitx/siunitx-complex.dtx
@@ -66,7 +66,7 @@
% assumptions concerning \LaTeXe{} commands in the submodule beyond those in the
% core number and unit submodules.
%
-% \begin{function}{\siunitx_complex_number:n}
+% \begin{function}{\siunitx_complex_number:n, \siunitx_complex_number:x}
% \begin{syntax}
% \cs{siunitx_complex_number:n} \Arg{number}
% \end{syntax}
@@ -93,7 +93,12 @@
% \cs{siunitx_complex_number:n}.
% \end{function}
%
-% \begin{function}{\siunitx_complex_quantity:nn, \siunitx_complex_quantity:nnn}
+% \begin{function}
+% {
+% \siunitx_complex_quantity:nn ,
+% \siunitx_complex_quantity:xn ,
+% \siunitx_complex_quantity:nnn
+% }
% \begin{syntax}
% \cs{siunitx_complex_quantity:nn} \Arg{number} \Arg{units}
% \cs{siunitx_complex_quantity:nnn} \Arg{magnitude} \Arg{angle} \Arg{units}
@@ -686,9 +691,9 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\siunitx_complex_number:n}
+% \begin{macro}{\siunitx_complex_number:n, \siunitx_complex_number:x}
% \begin{macro}{\siunitx_complex_number:nn, \@@_number:nn}
-% \begin{macro}{\siunitx_complex_quantity:nn}
+% \begin{macro}{\siunitx_complex_quantity:nn, \siunitx_complex_quantity:xn}
% \begin{macro}{\siunitx_complex_quantity:nnn, \@@_quantity:nnn}
% The work here is pretty trivial: only conversion between forms makes
% things a bit more intricate.
@@ -717,6 +722,7 @@
}
}
}
+\cs_generate_variant:Nn \siunitx_complex_number:n { x }
\cs_new_protected:Npn \siunitx_complex_number:nn #1#2
{
\bool_lazy_or:nnTF
@@ -734,7 +740,7 @@
{ \l_@@_force_cartesian_bool }
{ \l_siunitx_number_parse_bool }
{
- \exp_args:Ne \siunitx_complex_number:n
+ \siunitx_complex_number:x
{ \@@_convert_cartesian:nn {#1} {#2} }
}
{
@@ -764,6 +770,7 @@
{ \siunitx_quantity:nn {#1} {#2} }
}
}
+\cs_generate_variant:Nn \siunitx_complex_quantity:nn { x }
\cs_new_protected:Npn \siunitx_complex_quantity:nnn #1#2#3
{
\bool_lazy_or:nnTF
@@ -781,7 +788,7 @@
{ \l_@@_force_cartesian_bool }
{ \l_siunitx_number_parse_bool }
{
- \exp_args:Ne \siunitx_complex_quantity:nn
+ \siunitx_complex_quantity:xn
{ \@@_convert_cartesian:nn {#1} {#2} }
{#3}
}
@@ -1053,7 +1060,7 @@
\siunitx_print_number:V \l_@@_tmp_tl
\bool_if:NT \l_@@_polar_degree_bool
{
- \exp_args:NV \siunitx_unit_format:nN \l_@@_symbol_degree_tl \l_@@_tmp_tl
+ \siunitx_unit_format:VN \l_@@_symbol_degree_tl \l_@@_tmp_tl
\nobreak
\siunitx_print_unit:V \l_@@_tmp_tl
}
@@ -1087,14 +1094,18 @@
% \subsection{Conversion}
%
% \begin{macro}[EXP]
-% {\@@_convert_cartesian:nn, \@@_convert_cartesian_aux:nn}
+% {
+% \@@_convert_cartesian:nn ,
+% \@@_convert_cartesian_aux:nn ,
+% \@@_convert_cartesian_aux:ee
+% }
% \begin{macro}[EXP]{\@@_convert_cartesian_aux:w}
% Conversion to Cartesian form is easy as we have two inputs and need to
% do no parsing here at all.
% \begin{macrocode}
\cs_new:Npn \@@_convert_cartesian:nn #1#2
{
- \exp_args:Nee \@@_convert_cartesian_aux:nn
+ \@@_convert_cartesian_aux:ee
{
\fp_to_tl:n
{ (#1) * cos \bool_if:NT \l_@@_polar_degree_bool { d } (#2) }
@@ -1108,6 +1119,7 @@
{
\@@_convert_cartesian_aux:w #1 e e \q_mark #2 e e \q_stop
}
+\cs_generate_variant:Nn \@@_convert_cartesian_aux:nn { ee }
\cs_new:Npn \@@_convert_cartesian_aux:w
#1 e #2 e #3 \q_mark #4 e #5 e #6 \q_stop
{
@@ -1132,8 +1144,10 @@
% \begin{macro}[EXP]{\@@_convert_polar_auxiv:nnw}
% \begin{macro}[EXP]{\@@_convert_polar_auxv:nnw}
% \begin{macro}[EXP]{\@@_convert_polar_auxvi:nnn}
-% \begin{macro}[EXP]{\@@_convert_polar_auxvii:nnn}
-% \begin{macro}[EXP]{\@@_convert_polar_auxviii:nn}
+% \begin{macro}[EXP]
+% {\@@_convert_polar_auxvii:nnn, \@@_convert_polar_auxvii:eee}
+% \begin{macro}[EXP]
+% {\@@_convert_polar_auxviii:nn, \@@_convert_polar_auxviii:ee}
% A simplified parser for complex numbers which works by expansion,
% then converts to polar form.
% \begin{macrocode}
@@ -1181,21 +1195,23 @@
}
\cs_new:Npn \@@_convert_polar_auxvi:nnn #1#2#3
{
- \exp_args:Neee \@@_convert_polar_auxvii:nnn
+ \@@_convert_polar_auxvii:eee
{ \tl_if_blank:nTF {#1} { 0 } {#1} }
{ \tl_if_blank:nTF {#2} { 0 } {#2} }
{ \tl_if_blank:nF {#3} { e#3 } }
}
\cs_new:Npn \@@_convert_polar_auxvii:nnn #1#2#3
{
- \exp_args:Nee \@@_format_polar_auxviii:nn
+ \@@_format_polar_auxviii:ee
{ \fp_eval:n { sqrt ( (#1#3)^2 + (#2#3)^2 ) } }
{
\fp_eval:n
{ atan \bool_if:NT \l_@@_polar_degree_bool { d } (#2 , #1) }
}
}
+\cs_generate_variant:Nn \@@_convert_polar_auxvii:nnn { eee }
\cs_new:Npn \@@_format_polar_auxviii:nn #1#2 { {#1} {#2} }
+\cs_generate_variant:Nn \@@_format_polar_auxviii:nn { ee }
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/macros/latex/contrib/siunitx/siunitx-compound.dtx b/macros/latex/contrib/siunitx/siunitx-compound.dtx
index 0ce984f4a0..691ebf86c5 100644
--- a/macros/latex/contrib/siunitx/siunitx-compound.dtx
+++ b/macros/latex/contrib/siunitx/siunitx-compound.dtx
@@ -535,7 +535,7 @@
% \begin{macro}{\siunitx_compound_number:n}
% \begin{macro}{\@@_format:n}
% \begin{macro}{\@@_format:nn}
-% \begin{macro}{\@@_format:nnn}
+% \begin{macro}{\@@_format:nnn, \@@_format:xxn}
% Printing a generic set starts with the question of whether we want to
% extract exponents. If we do, then there is the work to do with extraction.
% Either way, the printing is handed off to a common function. We do a quick
@@ -554,7 +554,7 @@
\seq_clear:N \l_@@_tmp_seq
\bool_if:NTF \l_siunitx_number_parse_bool
{
- \exp_args:Nxx \@@_format:nnn
+ \@@_format:xxn
{ \tl_head:n {#1} }
{ \tl_tail:n {#1} }
{#2}
@@ -575,6 +575,7 @@
}
{ \@@_format_aux:nnn {#1} {#2} {#3} }
}
+\cs_generate_variant:Nn \@@_format:nnn { xx }
\cs_new_protected:Npn \@@_format_aux:nnn #1#2#3
{
\siunitx_number_parse:nN {#1} \l_@@_tmp_tl
@@ -699,7 +700,7 @@
% \@@_format_combine-exponent_aux:n ,
% \@@_format_extract-exponent_aux:n
% }
-% \begin{macro}{\@@_extract_exp:nN}
+% \begin{macro}{\@@_extract_exp:nN, \@@_extract_exp:VN}
% \begin{macro}{\@@_extract_exp:nnnnnnnN}
% Actually formatting the units is much the same as is done in
% the quantities module, except that we have to cover the multiplication
@@ -738,7 +739,7 @@
{
\bool_set_true:N \l_@@_exp_combine_bool
\siunitx_number_process:NN \l_@@_tmp_tl \l_@@_first_tl
- \exp_args:NV \@@_extract_exp:nN
+ \@@_extract_exp:VN
\l_@@_first_tl \l_@@_tmp_fp
#1 \l_@@_tmp_fp \l_@@_unit_tl
}
@@ -775,6 +776,7 @@
}
\cs_new_protected:Npn \@@_extract_exp:nN #1#2
{ \@@_extract_exp:nnnnnnnN #1 #2 }
+\cs_generate_variant:Nn \@@_extract_exp:nN { V }
\cs_new_protected:Npn \@@_extract_exp:nnnnnnnN #1#2#3#4#5#6#7#8
{ \fp_set:Nn #8 {#6#7} }
% \end{macrocode}
@@ -820,7 +822,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_quantity_auxi:nn #1#2
{
- \@@_print_boundary:V \l_@@_boundary_close_tl
+ \@@_print_boundary:V \l_@@_boundary_open_tl
\seq_clear:N \l_@@_tmp_seq
\tl_map_inline:nn {#1}
{
@@ -872,8 +874,8 @@
% \end{macro}
%
% \begin{macro}{\@@_print:N}
-% \begin{macro}{\@@_print:nnN, \@@_print:xxN}
-% \begin{macro}{\@@_print:nnnN}
+% \begin{macro}{\@@_print:nnN, \@@_print:nVN, \@@_print:xnN, \@@_print:xxN}
+% \begin{macro}{\@@_print:nnnN, \@@_print:xnnN}
% \begin{macro}{\@@_print_aux:n}
% \begin{macro}{\@@_print_aux:nn}
% \begin{macro}{\@@_print_quantity:n, \@@_print_quantity:x}
@@ -900,14 +902,14 @@
}
#1
}
- { \@@_print:xxN { } { \exp_not:V \l_@@_exp_tl } #1 }
+ { \@@_print:nVN { } \l_@@_exp_tl #1 }
}
\cs_new_protected:Npn \@@_print:nnN #1#2#3
{
- \exp_args:Nx \@@_print:nnnN
+ \@@_print:xnnN
{ \seq_count:N \l_@@_tmp_seq } {#1} {#2} #3
}
-\cs_generate_variant:Nn \@@_print:nnN { xx }
+\cs_generate_variant:Nn \@@_print:nnN { nV , x , xx }
% \end{macrocode}
% A rather long auxiliary as we want a way to have the brackets/exponent
% available. The actual flow is simple enough: see how many entries there are
@@ -938,7 +940,7 @@
\seq_item:Nn \l_@@_tmp_seq { 2 }
\exp_not:n {#3}
}
- \@@_print_boundary:V \l_@@_boundary_open_tl
+ \@@_print_boundary:V \l_@@_boundary_close_tl
}
}
{
@@ -953,6 +955,7 @@
\@@_print_boundary:V \l_@@_boundary_close_tl
}
}
+\cs_generate_variant:Nn \@@_print:nnnN { x }
\cs_new_protected:Npn \@@_print_aux:n #1 { }
\cs_new_protected:Npn \@@_print_aux:nn #1#2
{
diff --git a/macros/latex/contrib/siunitx/siunitx-number.dtx b/macros/latex/contrib/siunitx/siunitx-number.dtx
index 5bba843ce6..2218e61022 100644
--- a/macros/latex/contrib/siunitx/siunitx-number.dtx
+++ b/macros/latex/contrib/siunitx/siunitx-number.dtx
@@ -94,8 +94,8 @@
% \end{quote}
% where the two sign parts must be single tokens if present,
% and all other components
-% must be given in braces. The number will have at least one digit for both the
-% \meta{integer} and \meta{exponent} parts: these are required. The
+% must be given in braces. The number will have at least one digit for either the
+% \meta{integer} and \meta{exponent} parts.. The
% \meta{uncertainty} part should either be blank or contain an
% \meta{identifier} (as a brace group), followed by one or more data entries.
% Valid uncertainty \meta{identifiers} currently are
@@ -115,7 +115,7 @@
% \cs{empty}.
% \end{function}
%
-% \begin{function}{\siunitx_number_process:NN}
+% \begin{function}{\siunitx_number_process:NN, \siunitx_number_process:cc}
% \begin{syntax}
% \cs{siunitx_number_process:N} \meta{tl~var1} \meta{tl~var2}
% \end{syntax}
@@ -131,10 +131,12 @@
% with the result stored in \meta{tl~var2}.
% \end{function}
%
-% \begin{function}[rEXP]
+% \begin{function}[EXP]
% {
-% \siunitx_number_output:N, \siunitx_number_output:n,
-% \siunitx_number_output:NN, \siunitx_number_output:nN
+% \siunitx_number_output:N, \siunitx_number_output:c
+% \siunitx_number_output:n,
+% \siunitx_number_output:NN, \siunitx_number_output:cN
+% \siunitx_number_output:nN
% }
% \begin{syntax}
% \cs{siunitx_number_output:N} \meta{number}
@@ -179,7 +181,8 @@
% \begin{function}[EXP]
% {
% \siunitx_number_adjust_exponent:Nn ,
-% \siunitx_number_adjust_exponent:nn
+% \siunitx_number_adjust_exponent:nn ,
+% \siunitx_number_adjust_exponent:Vn
% }
% \begin{syntax}
% \cs{siunitx_number_adjust_exponent:Nn} \meta{number} \Arg{fp~expr}
@@ -711,7 +714,7 @@
% Variants not provided by \pkg{expl3}.
% \begin{macrocode}
\cs_generate_variant:Nn \keys_set:nn { nx }
-\cs_generate_variant:Nn \tl_if_blank:nTF { f }
+\cs_generate_variant:Nn \tl_if_blank:nTF { e }
\cs_generate_variant:Nn \tl_if_in:NnTF { NV }
\cs_generate_variant:Nn \tl_if_in:nnTF { nV }
\cs_generate_variant:Nn \tl_remove_all:Nn { NV }
@@ -799,8 +802,6 @@
% \end{quote}
% where all components must be given in braces. \emph{All} of the components
% must be present in a stored number (\foreign{i.e.}~at the end of parsing).
-% The number must have at least one digit for both the \meta{integer} and
-% \meta{exponent} parts.
%
% A non-empty \meta{uncertainty} must contain one leading brace group
% containing an identifier, then zero or more brace groups which contain
@@ -1078,7 +1079,7 @@
\tl_put_right:NV \l_@@_uncert_tl \l_@@_flex_tl
\tl_if_empty:NF \l_@@_uncert_tl
{
- \tl_if_blank:fTF { \exp_after:wN \use_iv:nnnn \l_@@_parsed_tl }
+ \tl_if_blank:eTF { \exp_after:wN \use_iv:nnnn \l_@@_parsed_tl }
{ \@@_parse_combine_uncert: }
{ \tl_clear:N \l_@@_parsed_tl }
}
@@ -1098,11 +1099,21 @@
% \begin{macro}{\@@_parse_combine_uncert:}
% \begin{macro}[EXP]{\@@_parse_combine_uncert:nnnn}
% \begin{macro}[EXP]{\@@_parse_combine_uncert:nn}
-% \begin{macro}[EXP]{\@@_parse_combine_uncert_loop:nnnnnnn}
-% \begin{macro}[EXP]{\@@_parse_combine_uncert:nnnnnn}
-% \begin{macro}[EXP]{\@@_parse_combine_uncert:nnnnnnn}
+% \begin{macro}[EXP]
+% {
+% \@@_parse_combine_uncert_loop:nnnnnnn ,
+% \@@_parse_combine_uncert_loop:nnnnnnn
+% }
+% \begin{macro}[EXP]
+% {\@@_parse_combine_uncert:nnnnnn, \@@_parse_combine_uncert:ennnnn}
+% \begin{macro}[EXP]
+% {\@@_parse_combine_uncert:nnnnnnn, \@@_parse_combine_uncert:ennnnnn}
% \begin{macro}[EXP]{\@@_parse_combine_uncert:nnnnn}
-% \begin{macro}[EXP]{\@@_parse_combine_uncert_aux:nnnn}
+% \begin{macro}[EXP]
+% {
+% \@@_parse_combine_uncert_aux:nnnn ,
+% \@@_parse_combine_uncert_aux:eenn
+% }
% \begin{macro}[EXP]{\@@_parse_combine_uncert:N}
% \begin{macro}[EXP]{\@@_parse_combine_uncert:w}
% \begin{macro}[EXP]{\@@_parse_combine_uncert_end:nnn}
@@ -1148,10 +1159,11 @@
{
\quark_if_recursion_tail_stop_do:nn {#4}
{ \@@_parse_combine_uncert_end:nnn {#1} {#2} {#3} }
- \exp_args:Nf \@@_parse_combine_uncert:nnnnnn
+ \@@_parse_combine_uncert:ennnnn
{ \int_eval:n { \tl_count:n {#1} - \tl_count:n {#6} } }
{#1} {#2} {#3} {#5} {#6}
}
+\cs_generate_variant:Nn \@@_parse_combine_uncert_loop:nnnnnnn { nee }
% \end{macrocode}
% The difference in places between the two decimal parts is now found: this
% is done just once to avoid having to parse token lists twice. The value
@@ -1160,10 +1172,11 @@
% \begin{macrocode}
\cs_new:Npn \@@_parse_combine_uncert:nnnnnn #1
{
- \exp_args:Nf \@@_parse_combine_uncert:nnnnnnn
+ \@@_parse_combine_uncert:ennnnnn
{ \prg_replicate:nn { \int_abs:n {#1} } { 0 } }
{#1}
}
+\cs_generate_variant:Nn \@@_parse_combine_uncert:nnnnnn { e }
\cs_new:Npn \@@_parse_combine_uncert:nnnnnnn #1#2#3#4#5#6#7
{
\int_compare:nNnTF {#2} > 0
@@ -1176,6 +1189,7 @@
{ #3 #1 } {#4} {#5} {#6} {#7}
}
}
+\cs_generate_variant:Nn \@@_parse_combine_uncert:nnnnnnn { e }
% \end{macrocode}
% We now ensure that the decimal part is never entirely blank \emph{if} there
% are decimal-part uncertainty digits. There is also a need to handle the
@@ -1184,7 +1198,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_parse_combine_uncert:nnnnn #1#2#3#4#5
{
- \exp_args:Nee \@@_parse_combine_uncert_aux:nnnn
+ \@@_parse_combine_uncert_aux:eenn
{
\bool_lazy_and:nnTF
{ \tl_if_blank_p:n {#1} }
@@ -1201,8 +1215,8 @@
}
\cs_new:Npn \@@_parse_combine_uncert_aux:nnnn #1#2#3#4
{
- \exp_args:Neee \@@_parse_combine_uncert_loop:nnnnnnn
- { \exp_not:n {#1} }
+ \@@_parse_combine_uncert_loop:neennnn
+ {#1}
{
\exp_not:n {#3}
\tl_if_blank:nF {#2} { S }
@@ -1212,6 +1226,7 @@
\tl_if_blank:nF {#2} { { \exp_not:n {#2} } }
}
}
+\cs_generate_variant:Nn \@@_parse_combine_uncert_aux:nnnn { ee }
% \end{macrocode}
% A short routine to remove any leading zeros in the uncertainty part,
% which are not needed for the compact representation used by the module.
@@ -1309,7 +1324,7 @@
{
\tl_if_empty:NTF \l_siunitx_number_input_exponent_tl
{
- \tl_set:Nn \l_@@_exponent_tl { { } 0 }
+ \tl_set:Nn \l_@@_exponent_tl { { } { } }
\tl_if_empty:NF \l_@@_parsed_tl
{ \@@_parse_loop: }
}
@@ -1343,7 +1358,7 @@
\cs_new_protected:Npn \@@_parse_exponent_auxii:nn #1#2
{
\quark_if_nil:nTF {#2}
- { \tl_set:Nn \l_@@_exponent_tl { { } 0 } }
+ { \tl_set:Nn \l_@@_exponent_tl { { } { } } }
{
\tl_set:Nn \l_@@_arg_tl {#1}
\tl_if_blank:nTF {#2}
@@ -1669,7 +1684,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_parse_loop_after_decimal:NN #1#2
{
- \tl_if_blank:fTF { \exp_after:wN \use_none:n #1 }
+ \tl_if_blank:eTF { \exp_after:wN \use_none:n #1 }
{
\quark_if_recursion_tail_stop_do:Nn #2
{ \@@_parse_loop_break:w \q_recursion_stop }
@@ -1759,7 +1774,11 @@
% \begin{macro}{\@@_parse_uncert_marker:w}
% \begin{macro}{\@@_parse_uncert_marker:nnnnN}
% \begin{macro}{\@@_parse_uncert_marker:nnnnnN}
-% \begin{macro}{\@@_parse_uncert_marker:nnnnnnN}
+% \begin{macro}
+% {
+% \@@_parse_uncert_marker:nnnnnnN ,
+% \@@_parse_uncert_marker:xnnnnnN
+% }
% \begin{macro}{\@@_parse_uncert_after:N}
% Parsing a combined uncertainty has a very restricted range of allowed
% tokens. A closing uncertainty token in the first place is an error,
@@ -1935,7 +1954,7 @@
}
\cs_new_protected:Npn \@@_parse_uncert_marker:nnnnnN #1#2#3#4#5#6
{
- \exp_args:Ne \@@_parse_uncert_marker:nnnnnnN
+ \@@_parse_uncert_marker:xnnnnnN
{ \int_eval:n { \tl_count:n {#4} } }
{#1} {#2} {#3} {#4} {#5} #6
}
@@ -1971,6 +1990,7 @@
}
#5#6#7
}
+\cs_generate_variant:Nn \@@_parse_uncert_marker:nnnnnnN { x }
% \end{macrocode}
% At the end of collection, we can either start another one or be done:
% either way we move the data around.
@@ -2177,7 +2197,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\siunitx_number_process:NN}
+% \begin{macro}{\siunitx_number_process:NN, \siunitx_number_process:cc}
% \begin{macro}{\@@_process:nnnnnnnNN}
% A top-level interface for the processing tools. Rounding happens in all
% cases, but exponents are only processed if the value is not $0$.
@@ -2194,6 +2214,7 @@
\@@_digits:NN #2 #2
}
}
+\cs_generate_variant:Nn \siunitx_number_process:NN { cc }
\cs_new_protected:Npn \@@_process:nnnnnnnNN #1#2#3#4#5#6#7#8#9
{
\bool_lazy_and:nnTF
@@ -2215,35 +2236,34 @@
% \begin{macro}{\@@_exponent:NN}
% \begin{macro}[EXP]
% {
+% \@@_exponent:nnnnnnn ,
+% \@@_exponent_aux:nnnnnnn ,
% \@@_exponent_engineering:nnnnnnn ,
% \@@_exponent_fixed:nnnnnnn ,
-% \@@_exponent_input:nnnnnnn ,
% \@@_exponent_scientific:nnnnnnn
% }
% \begin{macro}[EXP]
% {
-% \@@_exponent_fixed:nnnnnnnn ,
-% \@@_exponent_scientific:nnnnnnnn
+% \@@_exponent_fixed:nnnnnnnn ,
+% \@@_exponent_fixed:ennnnnnn ,
+% \@@_exponent_scientific:nnnnnnnn ,
+% \@@_exponent_scientific:ennnnnnn
% }
% \begin{macro}[EXP]{\@@_exponent_scientific:nnnw}
-% \begin{macro}[EXP]{\@@_exponent_shift:nnn,\@@_exponent_shift:nnf}
+% \begin{macro}[EXP]{\@@_exponent_shift:nnn, \@@_exponent_shift:nne}
% \begin{macro}[EXP]{\@@_exponent_shift_down:nnnw}
% \begin{macro}[EXP]{\@@_exponent_shift_down:nnn}
% \begin{macro}[EXP]{\@@_exponent_shift_down:nw}
% \begin{macro}[EXP]{\@@_exponent_shift_up:nnn}
% \begin{macro}[EXP]{\@@_exponent_shift_up:nnw}
% \begin{macro}[EXP]
-% {
-% \@@_exponent_shift_up_aux:nnn ,
-% \@@_exponent_shift_up_aux:fnn ,
-% \@@_exponent_shift_up_aux:ffn
-% }
+% {\@@_exponent_shift_up_aux:nnn, \@@_exponent_shift_up_aux:een}
% \begin{macro}[EXP]{\@@_exponent_shift_uncert:nw}
% \begin{macro}[EXP]
-% {\@@_exponent_shift_uncert_S:nnnn, \@@_exponent_shift_uncert_S:fnnn}
+% {\@@_exponent_shift_uncert_S:nnnn, \@@_exponent_shift_uncert_S:ennn}
% \begin{macro}[EXP]{\@@_exponent_uncert:n}
% \begin{macro}[EXP]{\@@_exponent_finalise:n}
-% \begin{macro}[EXP]{\@@_exponent_engineering_aux:nnnnnnn}
+% \begin{macro}[EXP]{\@@_exponentcd te_engineering_aux:nnnnnnn}
% \begin{macro}[EXP]
% {
% \@@_exponent_engineering_0:nnnn ,
@@ -2254,7 +2274,7 @@
% \begin{macro}[EXP]{\@@_exponent_engineering_uncert:nn}
% \begin{macro}[EXP]{\@@_exponent_engineering_uncert_S:nnn}
% \begin{macro}[EXP]{\@@_exponent_threshold:nnnnnnn}
-% \begin{macro}[EXP]{\@@_exponent_threshold:nn}
+% \begin{macro}[EXP]{\@@_exponent_threshold:nn, \@@_exponent_threshold:en}
% \begin{macro}[EXP]{\@@_exponent_threshold:nnnnnnnn}
% Manipulating an exponent is done using a single expansion function
% \emph{unless} dealing with engineering-style output. The latter is easier
@@ -2265,21 +2285,31 @@
\cs_new_protected:Npn \@@_exponent:NN #1#2
{
\tl_set:Nx #2
- {
- \cs:w
- @@_exponent_ \l_@@_exponent_mode_tl :nnnnnnn
- \exp_after:wN
- \cs_end: #1
- }
+ { \exp_after:wN \@@_exponent:nnnnnnn #1 }
\str_if_eq:VnT \l_@@_exponent_mode_tl { engineering }
{
\tl_set:Nx #2
{ \exp_after:wN \@@_exponent_engineering_aux:nnnnnnn #2 }
}
}
+\cs_new:Npn \@@_exponent:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \str_if_eq:VnTF \l_@@_exponent_mode_tl { input }
+ { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
+ {
+ \tl_if_blank:nTF {#7}
+ { \@@_exponent_aux:nnnnnnn {#1} {#2} {#3} {#4} {#5} {#6} { 0 } }
+ { \@@_exponent_aux:nnnnnnn {#1} {#2} {#3} {#4} {#5} {#6} {#7} }
+ }
+ }
+\cs_new:Npn \@@_exponent_aux:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \use:c { @@_exponent_ \l_@@_exponent_mode_tl :nnnnnnn }
+ {#1} {#2} {#3} {#4} {#5} {#6} {#7}
+ }
\cs_new:Npn \@@_exponent_fixed:nnnnnnn #1#2#3#4#5#6#7
{
- \exp_args:Nf \@@_exponent_fixed:nnnnnnnn
+ \@@_exponent_fixed:ennnnnnn
{ \int_eval:n { \l_@@_exponent_fixed_int - (#6#7) } }
{#1} {#2} {#3} {#4} {#5} {#6} {#7}
}
@@ -2291,8 +2321,7 @@
{ \int_compare:nNnT \l_@@_exponent_fixed_int < 0 { - } }
{ \int_abs:n \l_@@_exponent_fixed_int }
}
-\cs_new:Npn \@@_exponent_input:nnnnnnn #1#2#3#4#5#6#7
- { \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
+\cs_generate_variant:Nn \@@_exponent_fixed:nnnnnnnn { e }
% \end{macrocode}
% To convert to scientific notation, the key question is to find the number
% of significant places. That is easy enough if the number has a non-zero
@@ -2301,7 +2330,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_exponent_scientific:nnnnnnn #1#2#3#4#5#6#7
{
- \exp_args:Nf \@@_exponent_scientific:nnnnnnnn
+ \@@_exponent_scientific:ennnnnnn
{ \int_eval:n { \tl_count:n {#3} } }
{#1} {#2} {#3} {#4} {#5} {#6} {#7}
}
@@ -2323,6 +2352,7 @@
\@@_exponent_finalise:n { #1 + #7#8 - 1 }
}
}
+\cs_generate_variant:Nn \@@_exponent_scientific:nnnnnnnn { e }
\cs_new_eq:NN \@@_exponent_engineering:nnnnnnn
\@@_exponent_scientific:nnnnnnn
\cs_new:Npn \@@_exponent_scientific:nnnw #1#2#3#4#5 \q_stop
@@ -2351,7 +2381,7 @@
{ {#2} {#3} }
}
}
-\cs_generate_variant:Nn \@@_exponent_shift:nnn { nnf }
+\cs_generate_variant:Nn \@@_exponent_shift:nnn { nne }
% \end{macrocode}
% For shifting the exponent down, there is first a loop to reserve the
% integer part before doing the work: that of course has to be undone
@@ -2385,7 +2415,7 @@
{
\tl_if_blank:nTF {#3}
{
- \@@_exponent_shift_up_aux:ffn
+ \@@_exponent_shift_up_aux:een
{ \int_eval:n { #1 + 1 } }
{ \str_if_eq:nnF {#2} { 0 } {#2} 0 }
{ }
@@ -2395,7 +2425,7 @@
}
\cs_new:Npn \@@_exponent_shift_up:nnw #1#2#3#4 \q_stop
{
- \@@_exponent_shift_up_aux:ffn
+ \@@_exponent_shift_up_aux:een
{ \int_eval:n { #1 + 1 } }
{ \str_if_eq:nnF {#2} { 0 } {#2} #3 }
{#4}
@@ -2417,7 +2447,7 @@
{ \@@_exponent_shift_up:nnn {#1} {#2} {#3} }
}
}
-\cs_generate_variant:Nn \@@_exponent_shift_up_aux:nnn { f , ff }
+\cs_generate_variant:Nn \@@_exponent_shift_up_aux:nnn { ee }
% \end{macrocode}
% If the shift has put digits into the integer part, we have to adjust the
% uncertainty accordingly. First, we grab the data, then adjust by the
@@ -2438,7 +2468,7 @@
\@@_exponent_uncert:n { { S } { 0 } }
}
{
- \use:c { @@_exponent_shift_uncert_ \use_i:nn #3 :fnnn }
+ \@@_exponent_shift_uncert_S:ennn
{ \prg_replicate:nn {#1} { 0 } }
{#2}
#3
@@ -2450,7 +2480,7 @@
#2
\@@_exponent_uncert:n { { S } { #4#1 } }
}
-\cs_generate_variant:Nn \@@_exponent_shift_uncert_S:nnnn { f }
+\cs_generate_variant:Nn \@@_exponent_shift_uncert_S:nnnn { e }
\cs_new:Npn \@@_exponent_uncert:n #1 { { \exp_not:n {#1} } }
% \end{macrocode}
% Tidy up the exponent to put the sign in the right place.
@@ -2503,7 +2533,7 @@
}
{
{ \exp_not:n {#1} \exp_not:o { \tl_head:w #2 \q_stop } }
- { \exp_not:f { \tl_tail:n {#2} } }
+ { \tl_tail:n {#2} }
{ \exp_not:n {#3} }
}
\@@_exponent_finalise:n { #4 - 1 }
@@ -2527,7 +2557,7 @@
}
{
{ \exp_not:n {#1#3} \exp_not:o { \tl_head:w #4 \q_stop } }
- { \exp_not:f { \tl_tail:n {#4} } }
+ { \tl_tail:n {#4} }
{ \exp_not:n {#2} }
}
}
@@ -2552,16 +2582,17 @@
% \begin{macrocode}
\cs_new:Npn \@@_exponent_threshold:nnnnnnn #1#2#3#4#5#6#7
{
- \exp_args:Ne \@@_exponent_threshold:nn
+ \@@_exponent_threshold:en
{
\@@_exponent_scientific:nnnnnnn
{#1} {#2} {#3} {#4} {#5} {#6} {#7}
}
{ {#1} {#2} {#3} {#4} {#5} {#6} {#7} }
}
-\cs_new:Npn \@@_exponent_threshold:nn #1#2
+\cs_new:Npn \@@_exponent_threshold:nn #1#2
{ \@@_exponent_threshold:nnnnnnnn #1 {#2} }
-\cs_new:Npn \@@_exponent_threshold:nnnnnnnn #1#2#3#4#5#6#7#8
+\cs_generate_variant:Nn \@@_exponent_threshold:nn { e }
+\cs_new:Npn \@@_exponent_threshold:nnnnnnnn #1#2#3#4#5#6#7#8
{
\bool_lazy_and:nnTF
{ \int_compare_p:nNn {#6#7} > \l_@@_lower_threshold_int }
@@ -2569,7 +2600,6 @@
{ \exp_not:n {#8} }
{ \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
}
-
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2751,25 +2781,39 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_round:nnn, \@@_round:fnn}
+% \begin{macro}[EXP]{\@@_round:nnn, \@@_round:enn}
% \begin{macro}[EXP]{\@@_round:nnnn, \@@_round:Vnnn}
% \begin{macro}[EXP]
% {
% \@@_round_auxi:nnnnN ,
% \@@_round_auxii:nnnnN ,
% \@@_round_auxiii:nnnnN ,
-% \@@_round_auxiv:nnnnN
+% \@@_round_auxiii:ennnN ,
+% \@@_round_auxiv:nnnnN ,
+% \@@_round_auxiv:ennnN
% }
% \begin{macro}[EXP]{\@@_round_auxv:nnnN, \@@_round_auxvi:nnnN}
% \begin{macro}[EXP]{\@@_round_auxvii:nnnTF}
% \begin{macro}[EXP]{\@@_round_auxviii:nnN, \@@_round_auxix:nnN}
% \begin{macro}[EXP]{\@@_round_final_integer:nnw, \@@_round_final_decimal:nnw}
-% \begin{macro}[EXP]{\@@_round_final_signicant:n}
-% \begin{macro}[EXP]{\@@_round_final_signicant:N}
-% \begin{macro}[EXP]{\@@_round_final_signicant:w}
-% \begin{macro}[EXP]{\@@_round_final_output:nn, \@@_round_final_output:ff}
-% \begin{macro}[EXP]{\@@_round_final:nn, \@@_round_final:fn}
-% \begin{macro}[EXP]{\@@_round_final_shift:nn, \@@_round_final_shift:ff}
+% \begin{macro}[EXP]
+% {\@@_round_final_significant:n, \@@_round_final_significant:e}
+% \begin{macro}[EXP]{\@@_round_final_significant:N}
+% \begin{macro}[EXP]{\@@_round_final_significant:w}
+% \begin{macro}[EXP]
+% {
+% \@@_round_final_output:nn ,
+% \@@_round_final_output:ne ,
+% \@@_round_final_output:en ,
+% \@@_round_final_output:ee
+% }
+% \begin{macro}[EXP]{\@@_round_final:nn, \@@_round_final:en}
+% \begin{macro}[EXP]
+% {
+% \@@_round_final_shift:nn ,
+% \@@_round_final_shift:en ,
+% \@@_round_final_shift:ee
+% }
% \begin{macro}[EXP]{\@@_round_final_shift:Nw}
% \begin{macro}[EXP]
% {
@@ -2779,7 +2823,7 @@
% \@@_round_scientific:nn
% }
% \begin{macro}[EXP]{\@@_round_engineering:NNNNn}
-% \begin{macro}[EXP]{\@@_round_engineering:nnN}
+% \begin{macro}[EXP]{\@@_round_engineering:nnN, \@@_round_engineering:VnN}
% \begin{macro}[EXP]{\@@_round_truncate:n, \@@_round_truncate_direct:n}
% \begin{macro}[EXP]{\@@_round_truncate:nnN}
% Actually doing the rounding needs us to work from the least significant
@@ -2793,7 +2837,7 @@
\@@_round:Vnnn \l_@@_round_dir_tl
{#1} {#2} {#3}
}
-\cs_generate_variant:Nn \@@_round:nnn { f }
+\cs_generate_variant:Nn \@@_round:nnn { e }
\cs_new:Npn \@@_round:nnnn #1#2#3#4
{
\@@_round_auxi:nnnnN {#1} {#2} {#3} { }
@@ -2845,11 +2889,12 @@
}
\int_compare:nNnTF {#1} > 0
{
- \exp_args:Nf \@@_round_auxiii:nnnnN
+ \@@_round_auxiii:ennnN
{ \int_eval:n { #1 - 1 } } {#2} {#3} { #5#4 }
}
{ \@@_round_auxv:nnnN {#2} {#4} {#3} #5 }
}
+\cs_generate_variant:Nn \@@_round_auxiii:nnnnN { e }
\cs_new:Npn \@@_round_auxiv:nnnnN #1#2#3#4#5
{
\quark_if_recursion_tail_stop_do:Nn #5
@@ -2863,11 +2908,12 @@
}
\int_compare:nNnTF {#1} > 0
{
- \exp_args:Nf \@@_round_auxiv:nnnnN
+ \@@_round_auxiv:ennnN
{ \int_eval:n { #1 - 1 } } {#2} { #3 0 } { #5#4 }
}
{ \@@_round_auxvi:nnnN {#2} {#4} {#3} #5 }
}
+\cs_generate_variant:Nn \@@_round_auxiv:nnnnN { e }
% \end{macrocode}
% We now have the discarded digits, the matching filler and the
% next digit. So we can make the decision on rounding: that
@@ -2934,7 +2980,7 @@
{
\str_if_eq:nnTF {#1} { 0 }
{
- \@@_round_final_output:ff
+ \@@_round_final_output:ne
{ 1 }
{ \@@_round_truncate:n {#2} }
}
@@ -2961,7 +3007,7 @@
}
}
{
- \@@_round_final:fn
+ \@@_round_final:en
{ \int_eval:n { #3 + 1 } }
{ \@@_round_final_decimal:nnw {#1} {#2} }
}
@@ -2973,15 +3019,12 @@
{
\tl_if_blank:nTF {#1}
{
- \@@_round_final_shift:ff
- {
- \exp_last_unbraced:Nf 1
- { \@@_round_truncate_direct:n {#2} } 0
- }
+ \@@_round_final_shift:en
+ { 1 \@@_round_truncate_direct:n {#2} 0 }
{ }
}
{
- \@@_round_final_shift:ff
+ \@@_round_final_shift:ee
{ 1 #2 }
{ \@@_round_truncate:n {#1} }
}
@@ -2989,7 +3032,7 @@
\int_compare:nNnTF {#3} = 9
{ \@@_round_auxix:nnN {#1} { 0 #2 } }
{
- \@@_round_final:fn
+ \@@_round_final:en
{ \int_eval:n { #3 + 1 } }
{ \@@_round_final_integer:nnw {#1} {#2} }
}
@@ -3000,15 +3043,15 @@
\cs_new:Npn \@@_round_final_decimal:nnw
#1#2#3 \q_recursion_tail \q_recursion_stop
{
- \@@_round_final_output:ff
+ \@@_round_final_output:ee
{ \tl_reverse:n {#1} }
{ \tl_reverse:n {#3} #2 }
}
\cs_new:Npn \@@_round_final_integer:nnw
#1#2#3 \q_recursion_tail \q_recursion_stop
{
- \@@_round_final_output:ff
- { \exp_args:Ne \@@_round_final_significant:n { \tl_reverse:n {#3} #2 } }
+ \@@_round_final_output:en
+ { \@@_round_final_significant:e { \tl_reverse:n {#3} #2 } }
{#1}
}
\cs_new:Npn \@@_round_final_significant:n #1
@@ -3016,6 +3059,7 @@
\@@_round_final_significant:N #1
\q_recursion_tail \q_recursion_stop
}
+\cs_generate_variant:Nn \@@_round_final_significant:n { e }
\cs_new:Npn \@@_round_final_significant:N #1
{
\quark_if_recursion_tail_stop_do:Nn #1 { 0 }
@@ -3030,10 +3074,10 @@
#1 \q_recursion_tail \q_recursion_stop
{#1}
\cs_new:Npn \@@_round_final_output:nn #1#2 { {#1} {#2} }
-\cs_generate_variant:Nn \@@_round_final_output:nn { ff }
+\cs_generate_variant:Nn \@@_round_final_output:nn { ne , e , ee }
\cs_new:Npn \@@_round_final:nn #1#2
{ #2 #1 }
-\cs_generate_variant:Nn \@@_round_final:nn { f }
+\cs_generate_variant:Nn \@@_round_final:nn { e }
% \end{macrocode}
% Here we deal with the case where rounding applies along with an
% exponent set based on number of places. We can only get here if an
@@ -3055,7 +3099,7 @@
}
{ {#1} {#2} }
}
-\cs_generate_variant:Nn \@@_round_final_shift:nn { ff }
+\cs_generate_variant:Nn \@@_round_final_shift:nn { en , ee }
\cs_new:Npn \@@_round_engineering:nn #1#2
{
\int_compare:nNnTF { \tl_count:n {#1} } = 4
@@ -3072,7 +3116,7 @@
\cs_new:Npn \@@_round_engineering:NNNNn #1#2#3#4#5
{
{#1}
- \exp_args:NV \@@_round_engineering:nnN
+ \@@_round_engineering:VnN
\l_@@_round_precision_int { }
#2#3#4#5 \q_recursion_tail \q_recursion_stop
}
@@ -3083,6 +3127,7 @@
{ \use_i_delimit_by_q_recursion_stop:nw { {#2} } }
{ \@@_round_engineering:nnN { #1 - 1 } { #2#3 } }
}
+\cs_generate_variant:Nn \@@_round_engineering:nnN { V }
\cs_new:Npn \@@_round_fixed:nn #1#2 { {#1} {#2} }
\cs_new:Npn \@@_round_input:nn #1#2 { {#1} {#2} }
\cs_new:Npn \@@_round_scientific:nn #1#2
@@ -3092,7 +3137,7 @@
{ \str_if_eq_p:Vn \l_@@_round_mode_tl { figures } }
{ { 1 } { } }
{
- \@@_exponent_shift:nnf
+ \@@_exponent_shift:nne
{ 1 } {#1} { \@@_round_truncate_direct:n {#2} }
}
\@@_round_final_shift:Nw 1
@@ -3195,7 +3240,8 @@
%
% \begin{macro}[EXP]{\@@_round_figures:nnnnnnn, \@@_round_figures_aux:nnnnnnn}
% \begin{macro}[EXP]{\@@_round_figures_count:nnN}
-% \begin{macro}[EXP]{\@@_round_figures_count:nnnN}
+% \begin{macro}[EXP]
+% {\@@_round_figures_count:nnnN, \@@_round_figures_count:ennN}
% Rounding to figures only makes sense if the number is not $0$, so we start
% by filtering out that case. We then check that
% there is no uncertainty, and that the number of figures requested is
@@ -3245,7 +3291,7 @@
{
\int_compare:nNnTF {#1} > \l_@@_round_precision_int
{
- \@@_round:fnn
+ \@@_round:enn
{ \int_eval:n { #1 - \l_@@_round_precision_int } }
{#2} {#3}
}
@@ -3254,9 +3300,10 @@
{ \l_@@_round_precision_int - (#1) } {#2} {#3}
}
}
- \exp_args:Nf \@@_round_figures_count:nnnN
+ \@@_round_figures_count:ennN
{ \int_eval:n { #1 + 1 } } {#2} {#3}
}
+\cs_generate_variant:Nn \@@_round_figures_count:nnnN { e }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3264,7 +3311,7 @@
%
% \begin{macro}[EXP]{\@@_round_places:nnnnnnn}
% \begin{macro}[EXP]{\@@_round_places_decimal:nn, \@@_round_places_integer:nn}
-% \begin{macro}[EXP]{\@@_round_places_finalise:n}
+% \begin{macro}[EXP]{\@@_round_places_finalise:n, \@@_round_places_finalise:e}
% \begin{macro}[EXP]{\@@_round_places_finalise:nnnnnnn}
% \begin{macro}[EXP]{\@@_round_places_finalise:nnnnn}
% The first step when rounding to a fixed number of places is to establish
@@ -3277,7 +3324,7 @@
{
\tl_if_blank:nTF {#5}
{
- \exp_args:Ne \@@_round_places_finalise:n
+ \@@_round_places_finalise:e
{
\exp_not:n { {#1} {#2} }
\int_compare:nNnTF \l_@@_round_precision_int > 0
@@ -3299,7 +3346,7 @@
{#1} {#2}
}
{
- \@@_round:fnn
+ \@@_round:enn
{
\int_eval:n
{ 0 \tl_count:n {#2} - \l_@@_round_precision_int }
@@ -3309,7 +3356,7 @@
}
\cs_new:Npn \@@_round_places_integer:nn #1#2
{
- \@@_round:fnn
+ \@@_round:enn
{
\int_eval:n
{ 0 \tl_count:n {#2} - \l_@@_round_precision_int }
@@ -3347,6 +3394,7 @@
}
{ \exp_not:n { {#1} {#2} {#3} {#4} {#5} {#6} {#7} } }
}
+\cs_generate_variant:Nn \@@_round_places_finalise:n { e }
\cs_new:Npn \@@_round_places_finalise:nnnnn #1#2#3#4#5
{
{
@@ -3364,17 +3412,28 @@
% \end{macro}
%
% \begin{macro}[EXP]{\@@_round_uncertainty:nnnnnnn}
-% \begin{macro}[EXP]{\@@_round_uncertainty:nnn}
-% \begin{macro}[EXP]{\@@_round_uncertainty:nnnn}
+% \begin{macro}[EXP]{\@@_round_uncertainty:nnn, \@@_round_uncertainty:nno}
+% \begin{macro}[EXP]
+% {\@@_round_uncertainty:nnnn, \@@_round_uncertainty:ennn}
% \begin{macro}[EXP]{\@@_round_uncertainty:nnnnnn}
% \begin{macro}[EXP]
% {
% \@@_round_uncertainty_auxi:nnnnn ,
% \@@_round_uncertainty_auxii:nnnnn
% }
-% \begin{macro}[EXP]{\@@_round_uncertainty_auxiii:nnnnnnn}
+% \begin{macro}[EXP]
+% {
+% \@@_round_uncertainty_auxiii:nnnnnnn ,
+% \@@_round_uncertainty_auxiii:eennnnn
+% }
% \begin{macro}[EXP]{\@@_round_uncertainty_zeros:nnnn}
-% \begin{macro}[EXP]{\@@_round_uncertainty_auxiv:nnnnnnN}
+% \begin{macro}[EXP]
+% {
+% \@@_round_uncertainty_auxiv:nnnnnnN ,
+% \@@_round_uncertainty_auxiv:nennnnN ,
+% \@@_round_uncertainty_auxiv:ennnnnN ,
+% \@@_round_uncertainty_auxiv:eennnnN
+% }
% \begin{macro}[EXP]{\@@_round_uncertainty_auxv:nnnN}
% \begin{macro}[EXP]{\@@_round_uncertainty_auxvi:nn}
% \begin{macro}[EXP]{\@@_round_uncertainty_auxvii:nnNnnn}
@@ -3406,7 +3465,7 @@
\str_if_eq:eeTF { \tl_head:n {#5} } { S }
{
\exp_not:n { {#1} {#2} }
- \exp_args:Nnno \@@_round_uncertainty:nnn
+ \@@_round_uncertainty:nno
{#3} {#4} { \use_ii:nn #5 }
{#6} {#7}
}
@@ -3420,13 +3479,14 @@
% \begin{macrocode}
\cs_new:Npn \@@_round_uncertainty:nnn #1#2#3
{
- \exp_args:Nf \@@_round_uncertainty:nnnn
+ \@@_round_uncertainty:ennn
{
\int_eval:n
{ \tl_count:n {#3} - \l_@@_round_precision_int }
}
{#1} {#2} {#3}
}
+\cs_generate_variant:Nn \@@_round_uncertainty:nnn { nno }
\cs_new:Npn \@@_round_uncertainty:nnnn #1#2#3#4
{
\use:e
@@ -3437,6 +3497,7 @@
{#2} {#3} {#1} {#4}
}
}
+\cs_generate_variant:Nn \@@_round_uncertainty:nnnn { e }
% \end{macrocode}
% The number of digits to remove from the main part and the detail of
% zero filling depends on whether we rounded up the uncertainty. So there
@@ -3455,7 +3516,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_round_uncertainty_auxi:nnnnn #1#2#3#4#5
{
- \exp_args:Nf \@@_round_uncertainty_auxiv:nnnnnnN
+ \@@_round_uncertainty_auxiv:ennnnnN
{ \@@_round_uncertainty_zeros:nnnn {#1} {#3} {#4} {#5} }
{#4}
{#2} {#3} {#1} { }
@@ -3467,7 +3528,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_round_uncertainty_auxii:nnnnn #1#2#3#4#5
{
- \exp_args:Nff \@@_round_uncertainty_auxiii:nnnnnnn
+ \@@_round_uncertainty_auxiii:eennnnn
{ \tl_count:n {#5} }
{ \tl_count:n {#3} }
{#1} {#2} {#3} {#4} {#5}
@@ -3479,26 +3540,21 @@
\bool_lazy_and:nnTF
{ \int_compare_p:nNn \l_@@_round_precision_int = 2 }
{ \int_compare_p:nNn {#1} = {#2} }
- {
- \exp_args:Nnf \@@_round_uncertainty_auxiv:nnnnnnN
- { 0 }
- }
- {
- \exp_args:Nnf \@@_round_uncertainty_auxiv:nnnnnnN
- { }
- }
+ { \@@_round_uncertainty_auxiv:nennnnN { 0 } }
+ { \@@_round_uncertainty_auxiv:nennnnN { } }
{ \int_eval:n { #6 + 1 } }
{#4} {#5} { 1 } { }
\@@_round_uncertainty_auxvii:nnNnnn
}
{
- \exp_args:Nff \@@_round_uncertainty_auxiv:nnnnnnN
+ \@@_round_uncertainty_auxiv:eennnnN
{ \@@_round_uncertainty_zeros:nnnn {#3} {#5} {#6} {#7} }
{ \int_eval:n { #6 + 1 } }
{#4} {#5} { 1 } {#3}
\@@_round_uncertainty_auxvii:nnNnnn
}
}
+\cs_generate_variant:Nn \@@_round_uncertainty_auxiii:nnnnnnn { ee }
\cs_new:Npn \@@_round_uncertainty_zeros:nnnn #1#2#3#4
{
\prg_replicate:nn
@@ -3530,6 +3586,7 @@
{#3} #7
\@@_round_end:nnn { { S } { #5#6 #1 } }
}
+\cs_generate_variant:Nn \@@_round_uncertainty_auxiv:nnnnnnN { ne , e , ee }
\cs_new:Npn \@@_round_uncertainty_auxv:nnnN #1#2#3#4
{
\int_compare:nNnT { \tl_count:n {#1} } > { \tl_count:n {#3} }
@@ -3668,27 +3725,30 @@
%
% \subsection{Number modification}
%
-% \begin{macro}[rEXP]{\siunitx_number_adjust_exponent:nn}
-% \begin{macro}[rEXP]{\siunitx_number_adjust_exponent:Nn}
-% \begin{macro}[rEXP]{\@@_adjust_exp:nnnnnnnn}
-% \begin{macro}[rEXP]{\@@_adjust_exp:nn}
-% \begin{macro}[rEXP]{\@@_adjust_exp:nNw}
+% \begin{macro}[EXP]
+% {\siunitx_number_adjust_exponent:nn, \siunitx_number_adjust_exponent:Vn}
+% \begin{macro}[EXP]{\siunitx_number_adjust_exponent:Nn}
+% \begin{macro}[EXP]{\@@_adjust_exp:nnnnnnnn}
+% \begin{macro}[EXP]{\@@_adjust_exp:nn, \@@_adjust_exp:en}
+% \begin{macro}[EXP]{\@@_adjust_exp:nNw}
% A simply case of breaking down and rebuilding the number.
% \begin{macrocode}
\cs_new:Npn \siunitx_number_adjust_exponent:nn #1#2
{ \@@_adjust_exp:nnnnnnnn #1 {#2} }
+\cs_generate_variant:Nn \siunitx_number_adjust_exponent:nn { V }
\cs_new:Npn \siunitx_number_adjust_exponent:Nn #1#2
{
\tl_if_empty:NF #1
- { \exp_args:NV \siunitx_number_adjust_exponent:nn #1 {#2} }
+ { \siunitx_number_adjust_exponent:Vn #1 {#2} }
}
\cs_new:Npn \@@_adjust_exp:nnnnnnnn #1#2#3#4#5#6#7#8
{
\exp_not:n { {#1} {#2} {#3} {#4} {#5} }
- \exp_args:Ne \@@_adjust_exp:nn { \fp_eval:n { #6#7 + #8 } } {#6}
+ \@@_adjust_exp:en { \fp_eval:n { #6#7 + #8 } } {#6}
}
\cs_new:Npn \@@_adjust_exp:nn #1#2
{ \@@_adjust_exp:nNw {#2} #1 \q_stop }
+\cs_generate_variant:Nn \@@_adjust_exp:nn { e }
\cs_new:Npn \@@_adjust_exp:nNw #1#2#3 \q_stop
{
\token_if_eq_meaning:NNTF #2 -
@@ -3851,87 +3911,88 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}[rEXP]{\siunitx_number_output:N}
-% \begin{macro}[rEXP]{\siunitx_number_output:n}
-% \begin{macro}[rEXP]{\siunitx_number_output:NN}
-% \begin{macro}[rEXP]{\siunitx_number_output:nN}
-% \begin{macro}[rEXP]{\@@_output:Nn}
-% \begin{macro}[rEXP]{\@@_output:nn}
-% \begin{macro}[rEXP]{\@@_output:nnnnnnn}
-% \begin{macro}[rEXP]{\@@_output_bracket:nn}
-% \begin{macro}[rEXP]{\@@_output_bracket:w}
-% \begin{macro}[rEXP]{\@@_output_comparator:nn}
-% \begin{macro}[rEXP]{\@@_output_sign:nnn}
-% \begin{macro}[rEXP]{\@@_output_sign:nN}
-% \begin{macro}[rEXP]
+% \begin{macro}[EXP]{\siunitx_number_output:N, \siunitx_number_output:c}
+% \begin{macro}[EXP]{\siunitx_number_output:n}
+% \begin{macro}[EXP]{\siunitx_number_output:NN, \siunitx_number_output:cN}
+% \begin{macro}[EXP]{\siunitx_number_output:nN}
+% \begin{macro}[EXP]{\@@_output:Nn}
+% \begin{macro}[EXP]{\@@_output:nn}
+% \begin{macro}[EXP]{\@@_output:nnnnnnn}
+% \begin{macro}[EXP]{\@@_output_bracket:nn}
+% \begin{macro}[EXP]{\@@_output_bracket:w}
+% \begin{macro}[EXP]{\@@_output_comparator:nn}
+% \begin{macro}[EXP]{\@@_output_sign:nnn}
+% \begin{macro}[EXP]{\@@_output_sign:nN}
+% \begin{macro}[EXP]
% {\@@_output_sign_color:w, \@@_output_sign_brackets:w}
-% \begin{macro}[rEXP]{\@@_output_integer:nnn}
-% \begin{macro}[rEXP]{\@@_output_decimal:nn, \@@_output_decimal:fn}
-% \begin{macro}[rEXP]{\@@_output_digits:nn}
-% \begin{macro}[rEXP]{\@@_output_digit_separator:N}
-% \begin{macro}[rEXP]{\@@_output_integer_3_3:n}
-% \begin{macro}[rEXP]
+% \begin{macro}[EXP]{\@@_output_integer:nnn}
+% \begin{macro}[EXP]{\@@_output_decimal:nn, \@@_output_decimal:en}
+% \begin{macro}[EXP]{\@@_output_digits:nn}
+% \begin{macro}[EXP]{\@@_output_digit_separator:N}
+% \begin{macro}[EXP]{\@@_output_integer_3_3:n}
+% \begin{macro}[EXP]
% {
% \@@_output_integer_aux_0:n,
% \@@_output_integer_aux_1:n,
% \@@_output_integer_aux_2:n
% }
-% \begin{macro}[rEXP]{\@@_output_integer_first:nnNN}
-% \begin{macro}[rEXP]{\@@_output_integer_loop:NNNN}
-% \begin{macro}[rEXP]{\@@_output_integer_first:n}
-% \begin{macro}[rEXP]{\@@_output_integer_aux:n}
-% \begin{macro}[rEXP]{\@@_output_integer_loop:NnnN}
-% \begin{macro}[rEXP]{\@@_output_decimal_3_3:n}
-% \begin{macro}[rEXP]{\@@_output_decimal_loop:NNNN}
-% \begin{macro}[rEXP]{\@@_output_decimal_3_2:n}
-% \begin{macro}[rEXP]{\@@_output_decimal:NNNw}
-% \begin{macro}[rEXP]{\@@_output_decimal_loop:NN}
-% \begin{macro}[rEXP]{\@@_output_decimal_first:n}
-% \begin{macro}[rEXP]{\@@_output_decimal_loop:NnnN}
-% \begin{macro}[rEXP]{\@@_output_uncertainty:nnn}
-% \begin{macro}[rEXP]{\@@_output_uncertainty_unaligned:n}
-% \begin{macro}[rEXP]{\@@_output_uncert:nnnn}
-% \begin{macro}[rEXP]{\@@_output_uncert:nnnnn}
-% \begin{macro}[rEXP]{\@@_output_uncert_loop:nnN}
-% \begin{macro}[rEXP]{\@@_output_uncert_loop:nnNw}
-% \begin{macro}[rEXP]
+% \begin{macro}[EXP]{\@@_output_integer_first:nnNN}
+% \begin{macro}[EXP]{\@@_output_integer_loop:NNNN}
+% \begin{macro}[EXP]{\@@_output_integer_first:n}
+% \begin{macro}[EXP]{\@@_output_integer_aux:n, \@@_output_integer_aux:e}
+% \begin{macro}[EXP]{\@@_output_integer_loop:NnnN}
+% \begin{macro}[EXP]{\@@_output_decimal_3_3:n}
+% \begin{macro}[EXP]{\@@_output_decimal_loop:NNNN}
+% \begin{macro}[EXP]{\@@_output_decimal_3_2:n}
+% \begin{macro}[EXP]{\@@_output_decimal:NNNw}
+% \begin{macro}[EXP]{\@@_output_decimal_loop:NN}
+% \begin{macro}[EXP]{\@@_output_decimal_first:n}
+% \begin{macro}[EXP]{\@@_output_decimal_loop:NnnN}
+% \begin{macro}[EXP]{\@@_output_uncertainty:nnn}
+% \begin{macro}[EXP]{\@@_output_uncertainty_unaligned:n}
+% \begin{macro}[EXP]{\@@_output_uncert:nnnn}
+% \begin{macro}[EXP]{\@@_output_uncert:nnnnn, \@@_output_uncert:Vnnnn}
+% \begin{macro}[EXP]{\@@_output_uncert_loop:nnN}
+% \begin{macro}[EXP]{\@@_output_uncert_loop:nnNw}
+% \begin{macro}[EXP]
% {
% \@@_output_uncert_desc_bracket:n ,
% \@@_output_uncert_desc_bracket-separator:n ,
% \@@_output_uncert_desc_separator:n ,
% \@@_output_uncert_desc_subscript:n
% }
-% \begin{macro}[rEXP]{\@@_output_uncert_A_loop:nnn, \@@_output_uncert_S_loop:nnn}
-% \begin{macro}[rEXP]{\@@_output_uncert_S_loop:w}
-% \begin{macro}[rEXP]{\@@_output_uncert_A:nnnn, \@@_output_uncert_A_multi:nnnn}
-% \begin{macro}[rEXP]{\@@_output_uncert_A:nnnnn}
-% \begin{macro}[rEXP]
+% \begin{macro}[EXP]{\@@_output_uncert_A_loop:nnn, \@@_output_uncert_S_loop:nnn}
+% \begin{macro}[EXP]{\@@_output_uncert_S_loop:w}
+% \begin{macro}[EXP]{\@@_output_uncert_A:nnnn, \@@_output_uncert_A_multi:nnnn}
+% \begin{macro}[EXP]{\@@_output_uncert_A:nnnnn}
+% \begin{macro}[EXP]
% {
% \@@_output_uncert_S:nnnn ,
% \@@_output_uncert_S_sep:nnnn ,
% \@@_output_uncert_S_multi:nnnn
% }
-% \begin{macro}[rEXP]
+% \begin{macro}[EXP]
% {
% \@@_output_uncert_S_compact:nn ,
% \@@_output_uncert_S_compact-marker:nn ,
% \@@_output_uncert_S_full:nn
% }
-% \begin{macro}[rEXP]
+% \begin{macro}[EXP]
% {\@@_output_uncert_augment:nnnn}
-% \begin{macro}[rEXP]
-% {\@@_output_uncert_augment:nnn}
-% \begin{macro}[rEXP]
-% {\@@_output_uncert_augment:nnnw, \@@_output_uncert_augment:fnnw}
-% \begin{macro}[rEXP]{\@@_output_uncert_augment:nnw}
-% \begin{macro}[rEXP]
+% \begin{macro}[EXP]
+% {\@@_output_uncert_augment:nnn, \@@_output_uncert_augment:enn}
+% \begin{macro}[EXP]
+% {\@@_output_uncert_augment:nnnw, \@@_output_uncert_augment:ennw}
+% \begin{macro}[EXP]{\@@_output_uncert_augment:nnw}
+% \begin{macro}[EXP]
% {
% \@@_output_exponent:nnnnn ,
% \@@_output_exponent_auxi:nnnnn ,
-% \@@_output_exponent_auxii:nnnnn
+% \@@_output_exponent_auxii:nnnnn ,
+% \@@_output_exponent_auxiii:nnnnn
% }
-% \begin{macro}[rEXP]{\@@_output_exponent_auxiii:nn}
-% \begin{macro}[rEXP]{\@@_output_end:}
+% \begin{macro}[EXP]{\@@_output_exponent_auxiv:nn}
+% \begin{macro}[EXP]{\@@_output_end:}
% The approach to formatting a single number is to split into
% the constituent parts. All of the parts are assembled including
% inserting tabular alignment markers (which may be empty) for each
@@ -3939,10 +4000,12 @@
% \begin{macrocode}
\cs_new:Npn \siunitx_number_output:N #1
{ \@@_output:Nn #1 { } }
+\cs_generate_variant:Nn \siunitx_number_output:N { c }
\cs_new:Npn \siunitx_number_output:n #1
{ \@@_output:nn #1 { } }
\cs_new:Npn \siunitx_number_output:NN #1#2
{ \@@_output:Nn #1 {#2} }
+\cs_generate_variant:Nn \siunitx_number_output:NN { c }
\cs_new:Npn \siunitx_number_output:nN #1#2
{ \@@_output:nn #1 {#2} }
\cs_new:Npn \@@_output:Nn #1#2
@@ -3982,7 +4045,11 @@
{
\bool_lazy_or_p:nn
{ \l_@@_zero_exponent_bool }
- { ! \str_if_eq_p:nn {#2} { 0 } }
+ {
+ ! \bool_lazy_or_p:nn
+ { \tl_if_blank_p:n {#2} }
+ { \str_if_eq_p:nn {#2} { 0 } }
+ }
}
}
\@@_output_bracket:w
@@ -4118,7 +4185,7 @@
{ \@@_output_digits:nn { decimal } {#1} }
}
}
-\cs_generate_variant:Nn \@@_output_decimal:nn { f }
+\cs_generate_variant:Nn \@@_output_decimal:nn { e }
\cs_new:Npn \@@_output_digits:nn #1#2
{
\bool_if:cTF { l_@@_group_ #1 _ bool }
@@ -4192,13 +4259,14 @@
% \begin{macrocode}
\cs_new:Npn \@@_output_integer_first:n #1
{
- \exp_args:Ne \@@_output_integer_aux:n { \tl_reverse:n {#1} }
+ \@@_output_integer_aux:e { \tl_reverse:n {#1} }
}
\cs_new:Npn \@@_output_integer_aux:n #1
{
\@@_output_integer_loop:NnnN \l_@@_group_first_int { 0 } { }
#1 \q_recursion_tail \q_recursion_stop
}
+\cs_generate_variant:Nn \@@_output_integer_aux:n { e }
\cs_new:Npn \@@_output_integer_loop:NnnN #1#2#3#4
{
\quark_if_recursion_tail_stop_do:Nn #4 {#3}
@@ -4325,7 +4393,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_output_uncert:nnnn #1#2#3#4
{
- \exp_args:NV \@@_output_uncert:nnnnn \l_@@_uncert_desc_clist
+ \@@_output_uncert:Vnnnn \l_@@_uncert_desc_clist
{#1} {#2} {#3} {#4}
}
\cs_new:Npn \@@_output_uncert:nnnnn #1#2#3#4#5
@@ -4333,6 +4401,7 @@
\@@_output_uncert_loop:nnN {#2} {#3}
#4 \q_recursion_tail #1 , \q_recursion_stop {#5}
}
+\cs_generate_variant:Nn \@@_output_uncert:nnnnn { V }
\cs_new:Npn \@@_output_uncert_loop:nnN #1#2#3
{
\quark_if_recursion_tail_stop:N #3
@@ -4473,7 +4542,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_output_uncert_augment:nnnn #1#2#3#4
{
- \exp_args:Nf \@@_output_uncert_augment:nnn
+ \@@_output_uncert_augment:enn
{ \int_eval:n { \tl_count:n {#1} - \tl_count:n {#2} } }
{#3} {#4}
}
@@ -4481,7 +4550,7 @@
{
\int_compare:nNnTF {#1} > 0
{
- \@@_output_uncert_augment:fnnw
+ \@@_output_uncert_augment:ennw
{ \int_eval:n { #1 - 1 } }
{#3}
{ }
@@ -4489,7 +4558,7 @@
}
{
0
- \@@_output_decimal:fn
+ \@@_output_decimal:en
{
\prg_replicate:nn { \int_abs:n {#1} } { 0 }
#2
@@ -4497,6 +4566,7 @@
{#3}
}
}
+\cs_generate_variant:Nn \@@_output_uncert_augment:nnn { e }
\cs_new:Npn \@@_output_uncert_augment:nnnw #1#2#3#4
{
\quark_if_nil:NF #4
@@ -4504,14 +4574,14 @@
\int_compare:nNnTF {#1} = 0
{ \@@_output_uncert_augment:nnw {#3#4} {#2} }
{
- \@@_output_uncert_augment:fnnw
+ \@@_output_uncert_augment:ennw
{ \int_eval:n { #1 - 1 } }
{#2}
{#3#4}
}
}
}
-\cs_generate_variant:Nn \@@_output_uncert_augment:nnnw { f }
+\cs_generate_variant:Nn \@@_output_uncert_augment:nnnw { e }
\cs_new:Npn \@@_output_uncert_augment:nnw #1#2#3 \q_nil
{
\@@_output_digits:nn { integer } {#1}
@@ -4529,18 +4599,28 @@
\cs_new:Npn \@@_output_exponent:nnnnn #1#2#3#4#5
{
\exp_not:n {#5}
+ \str_if_empty:nTF {#2}
+ {
+ \bool_if:NTF \l_@@_zero_exponent_bool
+ { \@@_output_exponent_auxi:nnnnn {#1} { 0 } {#3} {#4} {#5} }
+ { \exp_not:n {#5} }
+ }
+ { \@@_output_exponent_auxi:nnnnn {#1} {#2} {#3} {#4} {#5} }
+ }
+\cs_new:Npn \@@_output_exponent_auxi:nnnnn #1#2#3#4#5
+ {
\bool_lazy_or:nnTF
{ \l_@@_zero_exponent_bool }
{ ! \str_if_eq_p:nn {#2} { 0 } }
{
\tl_if_empty:NTF \l_@@_output_exp_marker_tl
- { \@@_output_exponent_auxi:nnnnn }
{ \@@_output_exponent_auxii:nnnnn }
+ { \@@_output_exponent_auxiii:nnnnn }
{#1} {#2} {#3} {#4} {#5}
}
{ \exp_not:n {#5} }
}
-\cs_new:Npn \@@_output_exponent_auxi:nnnnn #1#2#3#4#5
+\cs_new:Npn \@@_output_exponent_auxii:nnnnn #1#2#3#4#5
{
\bool_lazy_or:nnT
{
@@ -4562,15 +4642,15 @@
\exp_not:n {#5}
\exp_not:V \l_@@_exponent_base_tl
^
- { \@@_output_exponent_auxiii:nnn { } {#1} {#2} }
+ { \@@_output_exponent_auxiv:nnn { } {#1} {#2} }
}
-\cs_new:Npn \@@_output_exponent_auxii:nnnnn #1#2#3#4#5
+\cs_new:Npn \@@_output_exponent_auxiii:nnnnn #1#2#3#4#5
{
\exp_not:n {#5}
\exp_not:V \l_@@_output_exp_marker_tl
- \@@_output_exponent_auxiii:nnn { \mathord } {#1} {#2}
+ \@@_output_exponent_auxiv:nnn { \mathord } {#1} {#2}
}
-\cs_new:Npn \@@_output_exponent_auxiii:nnn #1#2#3
+\cs_new:Npn \@@_output_exponent_auxiv:nnn #1#2#3
{
\tl_if_blank:nTF {#2}
{
diff --git a/macros/latex/contrib/siunitx/siunitx-print.dtx b/macros/latex/contrib/siunitx/siunitx-print.dtx
index 6786aba79e..f802bd7353 100644
--- a/macros/latex/contrib/siunitx/siunitx-print.dtx
+++ b/macros/latex/contrib/siunitx/siunitx-print.dtx
@@ -106,7 +106,7 @@
% {
% \siunitx_print_number:n, \siunitx_print_number:V,
% \siunitx_print_number:x,
-% \siunitx_print_unit:n, \siunitx_print_unit:V,
+% \siunitx_print_unit:n, \siunitx_print_unit:V, \siunitx_print_unit:o,
% \siunitx_print_unit:x
% }
% \begin{syntax}
@@ -347,12 +347,10 @@
\AtBeginDocument { \RequirePackage { color } }
% \end{macrocode}
%
-% \begin{macro}{\tl_replace_all:NVn}
% Required variants.
% \begin{macrocode}
\cs_generate_variant:Nn \tl_replace_all:Nnn { NV }
% \end{macrocode}
-% \end{macro}
%
% \begin{variable}{\l_@@_tmp_tl}
% Scratch space.
@@ -461,7 +459,7 @@
% {
% \siunitx_print_number:n, \siunitx_print_number:V,
% \siunitx_print_number:x,
-% \siunitx_print_unit:n, \siunitx_print_unit:V,
+% \siunitx_print_unit:n, \siunitx_print_unit:V, \siunitx_print_unit:o,
% \siunitx_print_unit:x
% }
% \begin{macro}{\@@_aux:nn}
@@ -476,14 +474,14 @@
\cs_generate_variant:Nn \siunitx_print_number:n { V , x }
\cs_new_protected:Npn \siunitx_print_unit:n #1
{ \@@_aux:nn { unit } {#1} }
-\cs_generate_variant:Nn \siunitx_print_unit:n { V , x }
+\cs_generate_variant:Nn \siunitx_print_unit:n { V , o , x }
\cs_new_protected:Npn \@@_aux:nn #1#2
{
\tl_if_empty:oF {#2}
{
\tl_if_empty:cTF { l_@@_ #1 _color_tl }
{ \use:n }
- { \exp_args:Nv \textcolor { l_@@_ #1 _color_tl } }
+ { \ExpandArgs { v } \textcolor { l_@@_ #1 _color_tl } }
{
\use:c
{
@@ -576,11 +574,12 @@
% \begin{macro}{\@@_math_replace:Nn}
% \begin{macro}
% {
-% \@@_math_auxiii:n,
-% \@@_math_auxiv:n,
+% \@@_math_auxiii:n ,
+% \@@_math_auxiii:V ,
+% \@@_math_auxiv:n ,
% \@@_math_auxv:n
% }
-% \begin{macro}{\@@_math_auxvi:Nn}
+% \begin{macro}{\@@_math_auxvi:Nn, \@@_math_auxvi:NV}
% \begin{macro}{\@@_math_auxvii:N}
% \begin{macro}{\@@_math_auxviii:w}
% \begin{macro}{\@@_math_auxix:Nn}
@@ -677,7 +676,7 @@
\exp_after:wN \@@_math_replace:Nn
\l_@@_math_html_tl
\q_recursion_tail { } \q_recursion_stop
- \exp_args:NV \@@_math_auxiii:n \l_@@_tmp_tl
+ \@@_math_auxiii:V \l_@@_tmp_tl
\group_end:
}
% \end{macrocode}
@@ -718,6 +717,7 @@
{ \@@_math_auxiv:n }
{#1}
}
+\cs_generate_variant:Nn \@@_math_auxiii:n { V }
% \end{macrocode}
% Now we deal with the font selection in math mode. There are two possible
% cases. First, we are retaining the current math font, and the active one is
@@ -747,6 +747,7 @@
}
\cs_new_protected:Npn \@@_math_auxvi:Nn #1#2
{ \@@_math_ensure:n { #1 {#2} } }
+\cs_generate_variant:Nn \@@_math_auxvi:Nn { NV }
\cs_new_protected:Npn \@@_math_auxvii:N #1
{
\quark_if_recursion_tail_stop_do:Nn #1 { \@@_math_auxv:n }
@@ -775,8 +776,7 @@
\tl_replace_all:Nnn \exp_not:N \l_@@_tmp_tl
{ ^ }
{ \exp_not:N \@@_math_super:n }
- \exp_not:N \exp_args:NNV \@@_math_auxvi:Nn
- #1 \exp_not:N \l_@@_tmp_tl
+ \@@_math_auxvi:NV #1 \exp_not:N \l_@@_tmp_tl
\group_end:
}
\cs_new_protected:Npx \@@_math_sub:n #1
@@ -831,6 +831,7 @@
%
% \begin{macro}{\siunitx_print_text:n}
% \begin{macro}{\@@_text_replace:n, \@@_text_replace_aux:n}
+% \begin{macro}{\@@_text_replace_font:N}
% \begin{macro}[EXP]{\@@_text_replace_first:N}
% \begin{macro}{\@@_text_replace:N}
% \begin{macro}{\@@_text_replace:NNn}
@@ -865,7 +866,8 @@
}
{ \selectfont }
\tl_use:N \l_@@_text_font_tl
- \exp_args:NnV \tl_if_head_eq_meaning:nNTF {#1} \l_siunitx_unit_fraction_tl
+ \exp_last_unbraced:Nno \tl_if_head_eq_meaning:nNTF
+ {#1} \l_siunitx_unit_fraction_tl
{ \@@_text_fraction:Nnn #1 }
{ \@@_text_replace:n {#1} }
}
@@ -874,6 +876,11 @@
% To get math mode material to print in text mode, various search-and-replace
% steps are needed. We use \tn{protected@edef} to deal with commands, partly
% for speed and partly as it deals with anything nested inside \cs{mathord}.
+% On the other hand, the unit font command has to be handled at exactly one
+% level, so that it does not affect anything inside for example
+% \cs{ensuremath}. That means preventing any change inside the
+% \tn{protected@edef}, hence the \cs{cs_set_eq:NN} to \cs{scan_stop:}
+% (for \LaTeXe{} robust commands).
% \begin{macrocode}
\cs_new_protected:Npn \@@_text_replace:n #1
{
@@ -884,8 +891,12 @@
\tl_set:Nn \l_@@_tmp_tl {#1}
\tl_if_empty:NF \l_@@_tmp_tl
{
+ \@@_text_replace_font:N \l_@@_tmp_tl
\tl_if_empty:NF \l_siunitx_unit_font_tl
- { \exp_after:wN \cs_set_eq:NN \l_siunitx_unit_font_tl \use:n }
+ {
+ \exp_after:wN
+ \cs_set_eq:NN \l_siunitx_unit_font_tl \scan_stop:
+ }
\cs_set:Npn \mathord ##1
{ \@@_text_replace_first:N ##1 }
\group_begin:
@@ -911,6 +922,14 @@
\group_end:
}
\cs_new_protected:Npn \@@_text_replace_aux:n #1 {#1}
+\cs_new_protected:Npn \@@_text_replace_font:N #1
+ {
+ \tl_if_empty:NF \l_siunitx_unit_font_tl
+ {
+ \tl_replace_all:NVn #1
+ \l_siunitx_unit_font_tl { \use:n }
+ }
+ }
\cs_new:Npn \@@_text_replace_first:N #1
{
\str_case:nnF {#1}
@@ -939,6 +958,7 @@
\exp_not:N \q_recursion_tail
{ ? }
\exp_not:N \q_recursion_stop
+ \@@_text_replace_font:N #1
}
\cs_new_protected:Npn \@@_text_replace:NNn #1#2#3
{
@@ -963,7 +983,8 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_print_replace_frac:n #1
{
- \exp_args:NnV \tl_if_head_eq_meaning:nNTF {#1} \l_siunitx_unit_fraction_tl
+ \exp_last_unbraced:Nno \tl_if_head_eq_meaning:nNTF
+ {#1} \l_siunitx_unit_fraction_tl
{ \@@_text_fraction:Nnn #1 }
{ \mbox { \@@_text_replace:n {#1} } }
}
@@ -1085,6 +1106,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \subsection{Standard settings for module options}
%
diff --git a/macros/latex/contrib/siunitx/siunitx-quantity.dtx b/macros/latex/contrib/siunitx/siunitx-quantity.dtx
index 2b2e783eed..a89ee78682 100644
--- a/macros/latex/contrib/siunitx/siunitx-quantity.dtx
+++ b/macros/latex/contrib/siunitx/siunitx-quantity.dtx
@@ -222,7 +222,7 @@
% \begin{macro}{\@@_parsed_aux:w}
% \begin{macro}{\@@_parsed_aux:nnnw}
% \begin{macro}{\@@_parsed_aux:nnnnw}
-% \begin{macro}{\@@_parsed_aux:nnnn}
+% \begin{macro}{\@@_parsed_aux:nnnn, \@@_parsed_aux:onnn}
% \begin{macro}{\@@_parsed_aux:nnn}
% For quantities, there is bit to do to combine things. The first question is
% whether we are parsing at all: if not, things are quite short. Notice that
@@ -268,7 +268,7 @@
\cs_new_protected:cpn { @@_parsed_combine-exponent:n } #1
{
\siunitx_number_process:NN \l_@@_number_tl \l_@@_number_tl
- \exp_args:NV \@@_extract_exp:nNN
+ \@@_extract_exp:VNN
\l_@@_number_tl \l_@@_tmp_fp \l_@@_number_tl
\siunitx_unit_format_combine_exponent:nnN {#1}
\l_@@_tmp_fp \l_@@_unit_tl
@@ -303,7 +303,7 @@
{ \@@_parsed_aux:nnnnw {#1} {#2} {#3} {#4} ? }
\cs_new_protected:Npn \@@_parsed_aux:nnnnw
#1#2#3#4 #5 \q_nil #6 \q_stop
- { \exp_args:No \@@_parsed_aux:nnnn { \use_none:n #5#6 } {#1} {#2} {#3#4} }
+ { \@@_parsed_aux:onnn { \use_none:n #5#6 } {#1} {#2} {#3#4} }
\cs_new_protected:Npn \@@_parsed_aux:nnnn #1#2#3#4
{
\tl_if_blank:nTF {#4}
@@ -332,6 +332,7 @@
}
}
}
+\cs_generate_variant:Nn \@@_parsed_aux:nnnn { o }
% \end{macrocode}
% For the case of a separated uncertainty with repeated units, we print the
% two parts independently. The third argument here is the exponent if there
@@ -353,13 +354,14 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_extract_exp:nNN}
+% \begin{macro}{\@@_extract_exp:nNN, \@@_extract_exp:VNN}
% \begin{macro}{\@@_extract_exp:nnnnnnnNN}
% To extract the exponent part for a combined prefix, we decompose the value
% and remove it.
% \begin{macrocode}
\cs_new_protected:Npn \@@_extract_exp:nNN #1#2#3
{ \@@_extract_exp:nnnnnnnNN #1 #2 #3 }
+\cs_generate_variant:Nn \@@_extract_exp:nNN { V }
\cs_new_protected:Npn \@@_extract_exp:nnnnnnnNN #1#2#3#4#5#6#7#8#9
{
\fp_set:Nn #8 {#6#7}
@@ -397,9 +399,7 @@
{ \nobreak }
\siunitx_print_unit:n {#2}
}
- {
- \exp_args:No \siunitx_print_unit:n { \use_none:n #2 }
- }
+ { \siunitx_print_unit:o { \use_none:n #2 } }
}
}
\cs_generate_variant:Nn \siunitx_quantity_print:nn { nV , VV , xV }
diff --git a/macros/latex/contrib/siunitx/siunitx-symbol.dtx b/macros/latex/contrib/siunitx/siunitx-symbol.dtx
index 8a7bad09b8..037e39ffc7 100644
--- a/macros/latex/contrib/siunitx/siunitx-symbol.dtx
+++ b/macros/latex/contrib/siunitx/siunitx-symbol.dtx
@@ -286,7 +286,7 @@
{
\@ifpackageloaded { hyperref }
{
- \exp_args:Nx \pdfstringdefDisableCommands
+ \ExpandArgs { x } \pdfstringdefDisableCommands
{
\cs_set_eq:NN \siunitx_print_text:n \exp_not:N \use:n
\siunitx_declare_unit:Nn \exp_not:N \ohm
diff --git a/macros/latex/contrib/siunitx/siunitx-table.dtx b/macros/latex/contrib/siunitx/siunitx-table.dtx
index 3fe8d34a5d..1eaf959a6b 100644
--- a/macros/latex/contrib/siunitx/siunitx-table.dtx
+++ b/macros/latex/contrib/siunitx/siunitx-table.dtx
@@ -235,6 +235,11 @@
%<@@=siunitx_table>
% \end{macrocode}
%
+% Required core variants.
+% \begin{macrocode}
+\cs_generate_variant:Nn \keys_set:nn { nx }
+% \end{macrocode}
+%
% \begin{variable}{\l_@@_tmp_box, \l_@@_tmp_dim, \l_@@_tmp_tl}
% Scratch space.
% \begin{macrocode}
@@ -445,7 +450,7 @@
{
\exp_args:NNV \group_end:
\@@_collect_end:n \l_@@_collect_tl
- \exp_args:NV \@@_split:nNNN
+ \@@_split:VNNN
\l_@@_collect_tl
\l_@@_before_tl
\l_@@_number_tl
@@ -487,7 +492,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_split:nNNN}
+% \begin{macro}{\@@_split:nNNN, \@@_split:VNNN}
% \begin{macro}{\@@_split_loop:NNN}
% \begin{macro}{\@@_split_group:NNNn}
% \begin{macro}{\@@_split_token:NNNN}
@@ -504,6 +509,7 @@
\@@_split_tidy:N #2
\@@_split_tidy:N #4
}
+\cs_generate_variant:Nn \@@_split:nNNN { V }
\cs_new_protected:Npn \@@_split_loop:NNN #1#2#3
{
\peek_remove_spaces:n
@@ -853,7 +859,7 @@
\l_@@_before_model_tl
\l_@@_model_tl
\l_@@_after_model_tl
- \exp_args:NV \@@_generate_model:n \l_@@_model_tl
+ \@@_generate_model:V \l_@@_model_tl
\tl_set:Nn \l_@@_align_mode_tl { format }
} ,
table-model-setup .tl_set:N =
@@ -877,10 +883,10 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_generate_model:n}
+% \begin{macro}{\@@_generate_model:n, \@@_generate_model:V}
% \begin{macro}{\@@_generate_model:nnnnnnn}
% \begin{macro}[EXP]{\@@_generate_model_S:nnw}
-% \begin{macro}[EXP]{\@@_generate_model_S:nnn}
+% \begin{macro}[EXP]{\@@_generate_model_S:nnn, \@@_generate_model_S:een}
% Creating a model for a table at this stage means parsing the format and
% converting that to an appropriate model. Things are quite straight-forward
% other than the uncertainty part. At this stage there is no point in
@@ -902,6 +908,7 @@
\l_@@_format_tl
}
}
+\cs_generate_variant:Nn \@@_generate_model:n { V }
\cs_new_protected:Npn \@@_generate_model:nnnnnnn #1#2#3#4#5#6#7
{
\tl_set:Nx \l_@@_model_tl
@@ -922,9 +929,9 @@
}
\exp_not:n { {#6} }
{
- \int_compare:nNnTF {#7} = 0
+ \int_compare:nNnTF { 0#7 } = 0
{ 0 }
- { \prg_replicate:nn {#7} { 8 } }
+ { \prg_replicate:nn { 0#7 } { 8 } }
}
}
}
@@ -932,7 +939,7 @@
{
{ S }
{
- \exp_args:Nff \@@_generate_model_S:nnn
+ \@@_generate_model_S:een
{ \tl_count:n {#1} } { \tl_count:n {#3} }
{#3}
}
@@ -951,6 +958,7 @@
}
{ 8 }
}
+\cs_generate_variant:Nn \@@_generate_model_S:nnn { ee }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1271,7 +1279,12 @@
#1 \q_nil #2 \q_nil #3 \q_nil #4 \q_nil #5
\q_nil #6 \q_nil #7 \q_nil #8 \q_stop
{
- \exp_not:n {#1#2#3#4#5#6}
+ \bool_lazy_and:nnTF
+ { \tl_if_blank_p:n {#1#2} }
+ { ! \tl_if_blank_p:n {#3} }
+ { { } }
+ { \exp_not:n {#1#2} }
+ \exp_not:n {#3#4#5#6}
\tl_if_blank:nT {#1#2#3#4#5#6} { { } }
\exp_not:n {#7#8}
}
@@ -1298,7 +1311,7 @@
\group_begin:
\bool_if:NT \l_@@_auto_round_bool
{
- \exp_args:Nx \keys_set:nn { siunitx }
+ \keys_set:nx { siunitx }
{
round-mode = places ,
round-pad = true ,
diff --git a/macros/latex/contrib/siunitx/siunitx-unit.dtx b/macros/latex/contrib/siunitx/siunitx-unit.dtx
index 34ccb1ec82..ee458b3f88 100644
--- a/macros/latex/contrib/siunitx/siunitx-unit.dtx
+++ b/macros/latex/contrib/siunitx/siunitx-unit.dtx
@@ -93,7 +93,7 @@
%
% \section{Formatting units}
%
-% \begin{function}{\siunitx_unit_format:nN}
+% \begin{function}{\siunitx_unit_format:nN, \siunitx_unit_format:VN}
% \begin{syntax}
% \cs{siunitx_unit_format:nN} \Arg{units} \meta{tl~var}
% \end{syntax}
@@ -1062,7 +1062,7 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\siunitx_unit_format:nN}
+% \begin{macro}{\siunitx_unit_format:nN, \siunitx_unit_format:VN}
% \begin{macro}{\siunitx_unit_format_extract_prefixes:nNN}
% \begin{macro}{\siunitx_unit_format_combine_exponent:nnN}
% \begin{macro}{\siunitx_unit_format_multiply:nnN}
@@ -1098,6 +1098,7 @@
\fp_set:Nn \l_@@_multiple_fp { \c_one_fp }
\@@_format:nNN {#1} #2 \l_@@_tmp_fp
}
+\cs_generate_variant:Nn \siunitx_unit_format:nN { V }
\cs_new_protected:Npn \siunitx_unit_format_extract_prefixes:nNN #1#2#3
{
\bool_set_true:N \l_@@_prefix_exp_bool
@@ -1249,6 +1250,7 @@
{ \token_to_str:N ^ } { ^ }
\tl_replace_all:Nnn \exp_not:N \l_@@_tmp_tl
{ \token_to_str:N _ } { \c_@@_math_subscript_tl }
+ \cs_set_eq:NN \exp_not:N \text \scan_stop:
\char_set_active_eq:NN ^
\exp_not:N \@@_format_literal_superscript:
\char_set_active_eq:NN _
diff --git a/macros/latex/contrib/siunitx/siunitx.dtx b/macros/latex/contrib/siunitx/siunitx.dtx
index 96f6999841..f2ec215fa5 100644
--- a/macros/latex/contrib/siunitx/siunitx.dtx
+++ b/macros/latex/contrib/siunitx/siunitx.dtx
@@ -121,7 +121,7 @@
%
% Identify the package and give the over all version information.
% \begin{macrocode}
-\ProvidesExplPackage {siunitx} {2023-08-24} {3.3.4}
+\ProvidesExplPackage {siunitx} {2023-08-30} {3.3.5}
{A comprehensive (SI) units package}
% \end{macrocode}
%
@@ -572,7 +572,7 @@
\cs_set_protected:Npn \@@_tmp:w \NC@do ##1##2 \NC@do #1
{ \NC@list { \NC@do ##1 \NC@do #1 ##2 } }
\exp_after:wN \@@_tmp:w \the \NC@list
- \exp_args:NNc \renewcommand * { NC@rewrite@ #1 } [ 1 ] [ ]
+ \ExpandArgs { Nc } \renewcommand * { NC@rewrite@ #1 } [ 1 ] [ ]
{
\@temptokena \expandafter
{
@@ -629,7 +629,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_bookmark_cmd:Nnn #1#2#3
{
- \exp_args:Nc \DeclareExpandableDocumentCommand
+ \ExpandArgs { c } \DeclareExpandableDocumentCommand
{ \cs_to_str:N #1 \c_space_tl ( pdfstring ~ context ) }
{#2} {#3}
}
@@ -788,12 +788,13 @@
{
0
\exp_not:N \@@_list_count:w \c_space_tl
- #1 \exp_not:n { ; \q_recursion_tail ; \q_recursion_stop }
+ #1
+ \exp_not:n { ; \s_stop \use_none_delimit_by_q_stop:w ; \q_stop }
}
}
\cs_new:Npx \@@_list_count:w #1 ;
{
- \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1}
+ \exp_not:N \use_none_delimit_by_s_stop:w #1 \exp_not:N \s_stop
\exp_not:N \tl_if_blank:nF {#1} { + 1 }
\exp_not:N \@@_list_count:w \c_space_tl
}
diff --git a/macros/latex/contrib/siunitx/siunitx.pdf b/macros/latex/contrib/siunitx/siunitx.pdf
index edd301f219..000d5790d6 100644
--- a/macros/latex/contrib/siunitx/siunitx.pdf
+++ b/macros/latex/contrib/siunitx/siunitx.pdf
Binary files differ
diff --git a/macros/latex/contrib/tagpdf/README.md b/macros/latex/contrib/tagpdf/README.md
index 555e13337e..961b6e2161 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.98k
-Packagedate: 2023/08/04
+Packageversion: 0.98l
+Packagedate: 2023/08/30
Author: Ulrike Fischer
## License
diff --git a/macros/latex/contrib/tagpdf/ex-AF-file.pdf b/macros/latex/contrib/tagpdf/ex-AF-file.pdf
index 0ff5805d5f..41e750a736 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
%
23 0 obj
-<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<</ModDate (D:20230804192949+02'00') /Size 151 /CheckSum (C612D20D328FD1A0CF5848A18384AC20) >> /Length 151 >>
+<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<</ModDate (D:20230830231109+02'00') /Size 151 /CheckSum (BADAD63AAC8953B42877D379D71F03C9) >> /Length 151 >>
stream
%% LaTeX2e file `example-input-file.tex'
%% generated by the `filecontents' environment
-%% from source `ex-AF-file' on 2023/08/04.
+%% from source `ex-AF-file' on 2023/08/30.
%%
Additional info!
@@ -15,7 +15,7 @@ endobj
<< /Type /Filespec /AFRelationship /Unspecified /F <FEFF006500780061006D0070006C0065002D0069006E007000750074002D00660069006C0065002E007400650078> /UF <FEFF006500780061006D0070006C0065002D0069006E007000750074002D00660069006C0065002E007400650078> /EF<</F 23 0 R/UF 23 0 R>> >>
endobj
26 0 obj
-<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20230804) >> /Length 19 >>
+<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20230830) >> /Length 19 >>
stream
Bär with teh shirt
endstream
@@ -24,7 +24,7 @@ endobj
<< /Type /Filespec /AFRelationship /Supplement /F <FEFF007400610067002D0041004600660069006C00650031002E007400780074> /UF <FEFF007400610067002D0041004600660069006C00650031002E007400780074> /EF<</F 26 0 R/UF 26 0 R>> >>
endobj
29 0 obj
-<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20230804) >> /Length 4 >>
+<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20230830) >> /Length 4 >>
stream
Duck
endstream
@@ -33,7 +33,7 @@ endobj
<< /Type /Filespec /AFRelationship /Supplement /F <FEFF007400610067002D0041004600660069006C00650032002E007400780074> /UF <FEFF007400610067002D0041004600660069006C00650032002E007400780074> /EF<</F 29 0 R/UF 29 0 R>> >>
endobj
32 0 obj
-<< /Type /Metadata /Subtype /XML /Length 11034 >>
+<< /Type /Metadata /Subtype /XML /Length 11382 >>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
@@ -103,6 +103,12 @@ stream
<pdfaProperty:category>internal</pdfaProperty:category>
<pdfaProperty:description>Part of ISO 14289 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 of ISO 14289 standard</pdfaProperty:description>
+ </rdf:li>
</rdf:Seq>
</pdfaSchema:property>
</rdf:li>
@@ -137,13 +143,13 @@ stream
<pdfaProperty:name>publicationName</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationname</pdfaProperty:description>
+ <pdfaProperty:description>Publication name</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>aggregationType</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationtype</pdfaProperty:description>
+ <pdfaProperty:description>Publication type</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>bookEdition</pdfaProperty:name>
@@ -185,7 +191,7 @@ stream
<pdfaProperty:name>isbn</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>ISBNforthepublicationinwhichthedocumentwaspublished</pdfaProperty:description>
+ <pdfaProperty:description>ISBN for the publication in which the document was published</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>doi</pdfaProperty:name>
@@ -215,7 +221,7 @@ stream
<pdfaProperty:name>subtitle</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Document'ssubtitle</pdfaProperty:description>
+ <pdfaProperty:description>Document's subtitle</pdfaProperty:description>
</rdf:li>
</rdf:Seq>
</pdfaSchema:property>
@@ -236,17 +242,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-08-04T19:30:18+02:00</rdf:li>
+ <rdf:li>2023-08-30T23:11:25+02: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>2023-08-04T19:30:18+02:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-08-04T19:30:18+02:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-08-04T19:30:18+02:00</xmp:MetadataDate>
+ <xmp:CreateDate>2023-08-30T23:11:25+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2023-08-30T23:11:25+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2023-08-30T23:11:25+02:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:38d5a844-2217-4081-87cc-b2129dc357a6</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:67330fdd-2c56-4383-81b3-0ec390a6bfd1</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:4d6334e8-8cfa-44b2-8ddf-e31f3ddae4d9</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -344,7 +350,7 @@ endobj
<< /Type /Namespace /NS (https://www.latex-project.org/ns/inline/2022) /RoleMapNS 19 0 R >>
endobj
20 0 obj
-<< /Type /Namespace /NS (data:,B8DAD688-8800-C46F-E7F5-429E1A290228) >>
+<< /Type /Namespace /NS (data:,CEF0968F-94E5-866F-7E1D-6C99EF80C88B) >>
endobj
7 0 obj
[ 8 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R ]
@@ -446,60 +452,60 @@ endobj
<< /Type /Catalog /Pages 37 0 R /MarkInfo 38 0 R/Lang (de-DE)/Metadata 32 0 R/StructTreeRoot 5 0 R >>
endobj
47 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230804193018+02'00')/ModDate (D:20230804193018+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230830231125+02'00')/ModDate (D:20230830231125+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 48
0000000002 65535 f
-0000013364 00000 n
+0000013712 00000 n
0000000003 00000 f
0000000004 00000 f
0000000009 00000 f
-0000015799 00000 n
-0000013447 00000 n
-0000015222 00000 n
-0000013658 00000 n
+0000016147 00000 n
+0000013795 00000 n
+0000015570 00000 n
+0000014006 00000 n
0000000011 00000 f
-0000013726 00000 n
+0000014074 00000 n
0000000013 00000 f
-0000013796 00000 n
+0000014144 00000 n
0000000021 00000 f
-0000014438 00000 n
-0000013877 00000 n
-0000014716 00000 n
-0000014545 00000 n
-0000015024 00000 n
-0000014823 00000 n
-0000015133 00000 n
+0000014786 00000 n
+0000014225 00000 n
+0000015064 00000 n
+0000014893 00000 n
+0000015372 00000 n
+0000015171 00000 n
+0000015481 00000 n
0000000000 00000 f
-0000015290 00000 n
+0000015638 00000 n
0000000020 00000 n
0000000382 00000 n
-0000015403 00000 n
+0000015751 00000 n
0000000673 00000 n
0000000828 00000 n
-0000015535 00000 n
+0000015883 00000 n
0000001062 00000 n
0000001202 00000 n
-0000015667 00000 n
+0000016015 00000 n
0000001436 00000 n
-0000013301 00000 n
-0000013166 00000 n
-0000012560 00000 n
-0000019537 00000 n
-0000019891 00000 n
-0000013411 00000 n
-0000013504 00000 n
-0000013621 00000 n
-0000015904 00000 n
-0000018353 00000 n
-0000016090 00000 n
-0000018574 00000 n
-0000019691 00000 n
-0000019953 00000 n
-0000020071 00000 n
+0000013649 00000 n
+0000013514 00000 n
+0000012908 00000 n
+0000019885 00000 n
+0000020239 00000 n
+0000013759 00000 n
+0000013852 00000 n
+0000013969 00000 n
+0000016252 00000 n
+0000018701 00000 n
+0000016438 00000 n
+0000018922 00000 n
+0000020039 00000 n
+0000020301 00000 n
+0000020419 00000 n
trailer
-<< /Size 48 /Root 46 0 R /Info 47 0 R /ID [ <EB7C0636F11F81FDD9D080CAE7D81B4A> <EB7C0636F11F81FDD9D080CAE7D81B4A> ] >>
+<< /Size 48 /Root 46 0 R /Info 47 0 R /ID [ <89DE760DC5086CB2FFEDEFAA6BD2DA9B> <89DE760DC5086CB2FFEDEFAA6BD2DA9B> ] >>
startxref
-20294
+20642
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf b/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf
index f43da375d1..2ff37d0b04 100644
--- a/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf
+++ b/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf
Binary files differ
diff --git a/macros/latex/contrib/tagpdf/ex-attribute.pdf b/macros/latex/contrib/tagpdf/ex-attribute.pdf
index 4eb4ff455d..31963fef52 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 11036 >>
+<< /Type /Metadata /Subtype /XML /Length 11384 >>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
@@ -77,6 +77,12 @@ stream
<pdfaProperty:category>internal</pdfaProperty:category>
<pdfaProperty:description>Part of ISO 14289 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 of ISO 14289 standard</pdfaProperty:description>
+ </rdf:li>
</rdf:Seq>
</pdfaSchema:property>
</rdf:li>
@@ -111,13 +117,13 @@ stream
<pdfaProperty:name>publicationName</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationname</pdfaProperty:description>
+ <pdfaProperty:description>Publication name</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>aggregationType</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationtype</pdfaProperty:description>
+ <pdfaProperty:description>Publication type</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>bookEdition</pdfaProperty:name>
@@ -159,7 +165,7 @@ stream
<pdfaProperty:name>isbn</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>ISBNforthepublicationinwhichthedocumentwaspublished</pdfaProperty:description>
+ <pdfaProperty:description>ISBN for the publication in which the document was published</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>doi</pdfaProperty:name>
@@ -189,7 +195,7 @@ stream
<pdfaProperty:name>subtitle</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Document'ssubtitle</pdfaProperty:description>
+ <pdfaProperty:description>Document's subtitle</pdfaProperty:description>
</rdf:li>
</rdf:Seq>
</pdfaSchema:property>
@@ -210,17 +216,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-08-04T19:31:19+02:00</rdf:li>
+ <rdf:li>2023-08-30T23:12:08+02: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>2023-08-04T19:31:19+02:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-08-04T19:31:19+02:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-08-04T19:31:19+02:00</xmp:MetadataDate>
+ <xmp:CreateDate>2023-08-30T23:12:08+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2023-08-30T23:12:08+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2023-08-30T23:12:08+02:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:7a9cf910-1c19-429a-8f24-339c62d8a57f</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:2e9261fa-4639-4b72-826b-dd496923bab9</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:d01ecca6-7bad-4daf-84dc-c57583be006a</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -443,51 +449,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.17.0)/Creator (LaTeX)/Title (Title)/CreationDate (D:20230804193119+02'00')/ModDate (D:20230804193119+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/Title (Title)/CreationDate (D:20230830231208+02'00')/ModDate (D:20230830231208+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 39
0000000002 65535 f
-0000012497 00000 n
+0000012845 00000 n
0000000003 00000 f
0000000004 00000 f
0000000008 00000 f
-0000014540 00000 n
-0000012580 00000 n
-0000012899 00000 n
+0000014888 00000 n
+0000012928 00000 n
+0000013247 00000 n
0000000000 00000 f
-0000013528 00000 n
-0000013613 00000 n
-0000013705 00000 n
-0000013789 00000 n
-0000013879 00000 n
+0000013876 00000 n
+0000013961 00000 n
+0000014053 00000 n
+0000014137 00000 n
+0000014227 00000 n
0000000020 00000 n
0000000071 00000 n
-0000014008 00000 n
-0000014148 00000 n
-0000014232 00000 n
-0000014322 00000 n
-0000014431 00000 n
+0000014356 00000 n
+0000014496 00000 n
+0000014580 00000 n
+0000014670 00000 n
+0000014779 00000 n
0000000132 00000 n
-0000012410 00000 n
-0000012268 00000 n
-0000011258 00000 n
-0000016880 00000 n
-0000017234 00000 n
-0000012544 00000 n
-0000012644 00000 n
-0000012862 00000 n
-0000013402 00000 n
-0000014658 00000 n
-0000015836 00000 n
-0000014735 00000 n
-0000014809 00000 n
-0000016072 00000 n
-0000017034 00000 n
-0000017296 00000 n
-0000017414 00000 n
+0000012758 00000 n
+0000012616 00000 n
+0000011606 00000 n
+0000017228 00000 n
+0000017582 00000 n
+0000012892 00000 n
+0000012992 00000 n
+0000013210 00000 n
+0000013750 00000 n
+0000015006 00000 n
+0000016184 00000 n
+0000015083 00000 n
+0000015157 00000 n
+0000016420 00000 n
+0000017382 00000 n
+0000017644 00000 n
+0000017762 00000 n
trailer
-<< /Size 39 /Root 37 0 R /Info 38 0 R /ID [ <6E7D71013228F6DA006A90DF510CF242> <6E7D71013228F6DA006A90DF510CF242> ] >>
+<< /Size 39 /Root 37 0 R /Info 38 0 R /ID [ <C0D9194F0F8325FEE262A9FEBD89B665> <C0D9194F0F8325FEE262A9FEBD89B665> ] >>
startxref
-17651
+17999
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-formula-problem.pdf b/macros/latex/contrib/tagpdf/ex-formula-problem.pdf
index 6d8c1bfefd..229ae70db3 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 11042 >>
+<< /Type /Metadata /Subtype /XML /Length 11390 >>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
@@ -100,6 +100,12 @@ stream
<pdfaProperty:category>internal</pdfaProperty:category>
<pdfaProperty:description>Part of ISO 14289 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 of ISO 14289 standard</pdfaProperty:description>
+ </rdf:li>
</rdf:Seq>
</pdfaSchema:property>
</rdf:li>
@@ -134,13 +140,13 @@ stream
<pdfaProperty:name>publicationName</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationname</pdfaProperty:description>
+ <pdfaProperty:description>Publication name</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>aggregationType</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationtype</pdfaProperty:description>
+ <pdfaProperty:description>Publication type</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>bookEdition</pdfaProperty:name>
@@ -182,7 +188,7 @@ stream
<pdfaProperty:name>isbn</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>ISBNforthepublicationinwhichthedocumentwaspublished</pdfaProperty:description>
+ <pdfaProperty:description>ISBN for the publication in which the document was published</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>doi</pdfaProperty:name>
@@ -212,7 +218,7 @@ stream
<pdfaProperty:name>subtitle</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Document'ssubtitle</pdfaProperty:description>
+ <pdfaProperty:description>Document's subtitle</pdfaProperty:description>
</rdf:li>
</rdf:Seq>
</pdfaSchema:property>
@@ -233,17 +239,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-08-04T19:31:50+02:00</rdf:li>
+ <rdf:li>2023-08-30T23:12:29+02: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>2023-08-04T19:31:50+02:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-08-04T19:31:50+02:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-08-04T19:31:50+02:00</xmp:MetadataDate>
+ <xmp:CreateDate>2023-08-30T23:12:29+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2023-08-30T23:12:29+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2023-08-30T23:12:29+02:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:8eb2ce1d-b2ec-440a-8bc2-73733eb3eeb0</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:16d13dfb-e7a3-4f18-860c-443e275fa999</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:edd036c8-c70f-4410-8f43-8f745826598f</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>2</prism:pageCount>
</rdf:Description>
@@ -419,46 +425,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.17.0)/Creator (LaTeX)/CreationDate (D:20230804193150+02'00')/ModDate (D:20230804193150+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230830231229+02'00')/ModDate (D:20230830231229+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 34
0000000002 65535 f
-0000012468 00000 n
+0000012816 00000 n
0000000003 00000 f
0000000004 00000 f
0000000008 00000 f
-0000013955 00000 n
-0000012551 00000 n
-0000012789 00000 n
+0000014303 00000 n
+0000012899 00000 n
+0000013137 00000 n
0000000000 00000 f
-0000013292 00000 n
-0000013399 00000 n
-0000013505 00000 n
+0000013640 00000 n
+0000013747 00000 n
+0000013853 00000 n
0000000637 00000 n
0000000502 00000 n
0000000020 00000 n
-0000018039 00000 n
-0000018393 00000 n
-0000013617 00000 n
-0000013723 00000 n
+0000018387 00000 n
+0000018741 00000 n
+0000013965 00000 n
+0000014071 00000 n
0000000724 00000 n
-0000012381 00000 n
-0000012246 00000 n
-0000011856 00000 n
-0000012515 00000 n
-0000012621 00000 n
-0000012752 00000 n
-0000014056 00000 n
-0000016812 00000 n
-0000014257 00000 n
-0000014333 00000 n
-0000017048 00000 n
-0000018193 00000 n
-0000018462 00000 n
-0000018580 00000 n
+0000012729 00000 n
+0000012594 00000 n
+0000012204 00000 n
+0000012863 00000 n
+0000012969 00000 n
+0000013100 00000 n
+0000014404 00000 n
+0000017160 00000 n
+0000014605 00000 n
+0000014681 00000 n
+0000017396 00000 n
+0000018541 00000 n
+0000018810 00000 n
+0000018928 00000 n
trailer
-<< /Size 34 /Root 32 0 R /Info 33 0 R /ID [ <313B6B151EAE693C9D4A2842B7659ACE> <313B6B151EAE693C9D4A2842B7659ACE> ] >>
+<< /Size 34 /Root 32 0 R /Info 33 0 R /ID [ <C438D9F37967D5A1217C11DDDBD5EC00> <C438D9F37967D5A1217C11DDDBD5EC00> ] >>
startxref
-18803
+19151
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-list.pdf b/macros/latex/contrib/tagpdf/ex-list.pdf
index 762ec0df25..d5885d53b7 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 11031 >>
+<< /Type /Metadata /Subtype /XML /Length 11379 >>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
@@ -71,6 +71,12 @@ stream
<pdfaProperty:category>internal</pdfaProperty:category>
<pdfaProperty:description>Part of ISO 14289 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 of ISO 14289 standard</pdfaProperty:description>
+ </rdf:li>
</rdf:Seq>
</pdfaSchema:property>
</rdf:li>
@@ -105,13 +111,13 @@ stream
<pdfaProperty:name>publicationName</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationname</pdfaProperty:description>
+ <pdfaProperty:description>Publication name</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>aggregationType</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationtype</pdfaProperty:description>
+ <pdfaProperty:description>Publication type</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>bookEdition</pdfaProperty:name>
@@ -153,7 +159,7 @@ stream
<pdfaProperty:name>isbn</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>ISBNforthepublicationinwhichthedocumentwaspublished</pdfaProperty:description>
+ <pdfaProperty:description>ISBN for the publication in which the document was published</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>doi</pdfaProperty:name>
@@ -183,7 +189,7 @@ stream
<pdfaProperty:name>subtitle</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Document'ssubtitle</pdfaProperty:description>
+ <pdfaProperty:description>Document's subtitle</pdfaProperty:description>
</rdf:li>
</rdf:Seq>
</pdfaSchema:property>
@@ -204,17 +210,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-08-04T19:32:24+02:00</rdf:li>
+ <rdf:li>2023-08-30T23:12:52+02: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>2023-08-04T19:32:24+02:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-08-04T19:32:24+02:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-08-04T19:32:24+02:00</xmp:MetadataDate>
+ <xmp:CreateDate>2023-08-30T23:12:52+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2023-08-30T23:12:52+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2023-08-30T23:12:52+02:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:4c749825-1de7-414c-879f-29e4d0bef66e</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:e5956d13-e998-4dd3-8296-ce8ffcafc35b</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:4f234d81-ca31-480c-8267-5daf94e5542c</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -647,85 +653,85 @@ endobj
<< /Type /Catalog /Pages 54 0 R /MarkInfo 55 0 R/Lang (en-US)/Metadata 48 0 R/StructTreeRoot 5 0 R >>
endobj
72 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230804193224+02'00')/ModDate (D:20230804193224+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230830231252+02'00')/ModDate (D:20230830231252+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 73
0000000002 65535 f
-0000013164 00000 n
+0000013512 00000 n
0000000003 00000 f
0000000004 00000 f
0000000008 00000 f
-0000018701 00000 n
-0000013247 00000 n
-0000014086 00000 n
+0000019049 00000 n
+0000013595 00000 n
+0000014434 00000 n
0000000000 00000 f
-0000014882 00000 n
-0000014983 00000 n
-0000015059 00000 n
-0000015135 00000 n
-0000015222 00000 n
-0000015329 00000 n
-0000015419 00000 n
-0000015529 00000 n
-0000015613 00000 n
-0000015701 00000 n
-0000015824 00000 n
-0000015914 00000 n
-0000016024 00000 n
-0000016108 00000 n
-0000016196 00000 n
-0000016319 00000 n
-0000016406 00000 n
-0000016517 00000 n
-0000016607 00000 n
-0000016717 00000 n
-0000016801 00000 n
-0000016889 00000 n
-0000017012 00000 n
-0000017102 00000 n
-0000017212 00000 n
-0000017296 00000 n
-0000017384 00000 n
-0000017507 00000 n
-0000017594 00000 n
-0000017709 00000 n
-0000017799 00000 n
-0000017909 00000 n
-0000017993 00000 n
-0000018081 00000 n
-0000018204 00000 n
-0000018294 00000 n
-0000018405 00000 n
-0000018489 00000 n
-0000018577 00000 n
+0000015230 00000 n
+0000015331 00000 n
+0000015407 00000 n
+0000015483 00000 n
+0000015570 00000 n
+0000015677 00000 n
+0000015767 00000 n
+0000015877 00000 n
+0000015961 00000 n
+0000016049 00000 n
+0000016172 00000 n
+0000016262 00000 n
+0000016372 00000 n
+0000016456 00000 n
+0000016544 00000 n
+0000016667 00000 n
+0000016754 00000 n
+0000016865 00000 n
+0000016955 00000 n
+0000017065 00000 n
+0000017149 00000 n
+0000017237 00000 n
+0000017360 00000 n
+0000017450 00000 n
+0000017560 00000 n
+0000017644 00000 n
+0000017732 00000 n
+0000017855 00000 n
+0000017942 00000 n
+0000018057 00000 n
+0000018147 00000 n
+0000018257 00000 n
+0000018341 00000 n
+0000018429 00000 n
+0000018552 00000 n
+0000018642 00000 n
+0000018753 00000 n
+0000018837 00000 n
+0000018925 00000 n
0000000020 00000 n
-0000013065 00000 n
-0000012923 00000 n
-0000011141 00000 n
-0000028828 00000 n
-0000021876 00000 n
-0000029182 00000 n
-0000013211 00000 n
-0000013367 00000 n
-0000014049 00000 n
-0000014678 00000 n
-0000018819 00000 n
-0000020778 00000 n
-0000018951 00000 n
-0000019025 00000 n
-0000021012 00000 n
-0000022027 00000 n
+0000013413 00000 n
+0000013271 00000 n
+0000011489 00000 n
+0000029176 00000 n
0000022224 00000 n
-0000027363 00000 n
-0000022560 00000 n
-0000022683 00000 n
-0000027599 00000 n
-0000028982 00000 n
-0000029244 00000 n
-0000029362 00000 n
+0000029530 00000 n
+0000013559 00000 n
+0000013715 00000 n
+0000014397 00000 n
+0000015026 00000 n
+0000019167 00000 n
+0000021126 00000 n
+0000019299 00000 n
+0000019373 00000 n
+0000021360 00000 n
+0000022375 00000 n
+0000022572 00000 n
+0000027711 00000 n
+0000022908 00000 n
+0000023031 00000 n
+0000027947 00000 n
+0000029330 00000 n
+0000029592 00000 n
+0000029710 00000 n
trailer
-<< /Size 73 /Root 71 0 R /Info 72 0 R /ID [ <A805B03F80D8DCD32E332F5BD885CFF4> <A805B03F80D8DCD32E332F5BD885CFF4> ] >>
+<< /Size 73 /Root 71 0 R /Info 72 0 R /ID [ <019D2B53AF4CC011A02E911AD5A1AC04> <019D2B53AF4CC011A02E911AD5A1AC04> ] >>
startxref
-29585
+29933
%%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 d837eb5607..f7777952e4 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
@@ -1,13 +1,7 @@
%PDF-1.7
%
-9 0 obj
-<< /MCID 0 >>
-endobj
-11 0 obj
-<< /MCID 0 >>
-endobj
-14 0 obj
-<< /Length 2891 >>
+12 0 obj
+<< /Length 2896 >>
stream
/opacity1 gs
/Artifact BMC
@@ -16,7 +10,7 @@ q
[] 0 d 0 J 0.398 w 0 0 m 343.711 0 l S
Q
EMC
-/P /l3pdf1 BDC
+/P <</MCID 0 >> BDC
BT
/F15 9.96264 Tf
1 0 0 1 121.813 658.164 Tm [<002A0060001C0062>-415<0032003B003200620069001C0062>-415<004200540062006D004B>-416<001C>-415<004D0042006200480058>-416<006F00420070>55<001C004B>28<006D0062>-414<0070>55<001C00600042006D0062>-414<002F0051004800510060>-416<006D0069>-415<002F00510048005100600058>-416<0036>82<006D0062002B0032>-414<0070>27<00320048>-415<0032004D0042004B0058>]TJ
@@ -33,14 +27,14 @@ EMC
endstream
endobj
-10 0 obj
-<< /Type /Page /Contents 14 0 R /Resources 13 0 R /MediaBox [ 0 0 612 792 ] /Tabs /S /Parent 16 0 R >>
+9 0 obj
+<< /Type /Page /Contents 12 0 R /Resources 11 0 R /MediaBox [ 0 0 612 792 ] /Tabs /S /Parent 14 0 R >>
endobj
-13 0 obj
-<< /Properties <</l3pdf1 9 0 R>>/ExtGState 1 0 R /Font << /F15 15 0 R >> /ProcSet [ /PDF /Text ] >>
+11 0 obj
+<< /ExtGState 1 0 R /Font << /F15 13 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
-17 0 obj
-<< /Type /Metadata /Subtype /XML /Length 11056 >>
+15 0 obj
+<< /Type /Metadata /Subtype /XML /Length 11404 >>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
@@ -110,6 +104,12 @@ stream
<pdfaProperty:category>internal</pdfaProperty:category>
<pdfaProperty:description>Part of ISO 14289 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 of ISO 14289 standard</pdfaProperty:description>
+ </rdf:li>
</rdf:Seq>
</pdfaSchema:property>
</rdf:li>
@@ -144,13 +144,13 @@ stream
<pdfaProperty:name>publicationName</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationname</pdfaProperty:description>
+ <pdfaProperty:description>Publication name</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>aggregationType</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationtype</pdfaProperty:description>
+ <pdfaProperty:description>Publication type</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>bookEdition</pdfaProperty:name>
@@ -192,7 +192,7 @@ stream
<pdfaProperty:name>isbn</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>ISBNforthepublicationinwhichthedocumentwaspublished</pdfaProperty:description>
+ <pdfaProperty:description>ISBN for the publication in which the document was published</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>doi</pdfaProperty:name>
@@ -222,7 +222,7 @@ stream
<pdfaProperty:name>subtitle</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Document'ssubtitle</pdfaProperty:description>
+ <pdfaProperty:description>Document's subtitle</pdfaProperty:description>
</rdf:li>
</rdf:Seq>
</pdfaSchema:property>
@@ -243,17 +243,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-08-04T19:32:51+02:00</rdf:li>
+ <rdf:li>2023-08-30T23:13:12+02: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>2023-08-04T19:32:51+02:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-08-04T19:32:51+02:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-08-04T19:32:51+02:00</xmp:MetadataDate>
+ <xmp:CreateDate>2023-08-30T23:13:12+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2023-08-30T23:13:12+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2023-08-30T23:13:12+02:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:c33d64b4-96ec-4e48-8f27-0b3edc831547</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:1ec3ab74-bc70-4881-8156-ed22cfb7642f</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:2887128f-21c5-4c52-8669-a58e88f41682</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>2</prism:pageCount>
</rdf:Description>
@@ -272,8 +272,8 @@ stream
<?xpacket end="w"?>
endstream
endobj
-19 0 obj
-<< /Length 1908 >>
+17 0 obj
+<< /Length 1913 >>
stream
/opacity1 gs
/Artifact BMC
@@ -282,7 +282,7 @@ q
[] 0 d 0 J 0.398 w 0 0 m 343.711 0 l S
Q
EMC
-/P /l3pdf2 BDC
+/P <</MCID 0 >> BDC
BT
/F15 9.96264 Tf
1 0 0 1 160.667 658.164 Tm [<0062002B003200480032006000420062005B006D0032>-423<001C006D003B006D0032>-424<006200420069>-423<001C004B00320069>-424<006D0060004D001C0058>-424<004C006D00480048001C>-424<0070>27<00510048006D00690054001C0069>-422<001C00480042005B006D00320069>-424<0069005100600069005100600058>-424<002A0060001C0062>-424<001C00480042005B006D001C004B002D>]TJ
@@ -297,25 +297,25 @@ EMC
endstream
endobj
-12 0 obj
-<< /Type /Page /Contents 19 0 R /Resources 18 0 R /MediaBox [ 0 0 612 792 ] /Tabs /S /Parent 16 0 R >>
+10 0 obj
+<< /Type /Page /Contents 17 0 R /Resources 16 0 R /MediaBox [ 0 0 612 792 ] /Tabs /S /Parent 14 0 R >>
endobj
-18 0 obj
-<< /Properties <</l3pdf2 11 0 R>>/ExtGState 1 0 R /Font << /F15 15 0 R >> /ProcSet [ /PDF /Text ] >>
+16 0 obj
+<< /ExtGState 1 0 R /Font << /F15 13 0 R >> /ProcSet [ /PDF /Text ] >>
endobj
1 0 obj
<< /opacity1 <</ca 1/CA 1>> >>
endobj
-20 0 obj
+18 0 obj
[ 28 [ 500 ] 35 [ 556 ] 42 [ 722 444 ] 45 [ 278 764 556 ] 49 [ 681 444 ] 54 [ 653 306 ] 59 [ 500 ] 63 [ 556 ] 65 [ 361 278 ] 68 [ 306 ] 72 [ 278 ] 75 [ 833 750 556 ] 81 [ 500 ] 83 [ 681 556 ] 88 [ 278 ] 90 [ 778 528 ] 96 [ 392 556 394 ] 105 [ 389 ] 109 [ 556 ] 111 [ 750 528 ] 114 [ 722 ] ]
endobj
-22 0 obj
+20 0 obj
<< /Length 15 >>
stream
endstream
endobj
-23 0 obj
+21 0 obj
<< /Subtype /CIDFontType0C /Length 4657 >>
stream

@@ -327,10 +327,10 @@ m
endstream
endobj
-21 0 obj
-<< /Type /FontDescriptor /FontName /DUCKUG+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 23 0 R /CIDSet 22 0 R >>
+19 0 obj
+<< /Type /FontDescriptor /FontName /DUCKUG+LMRoman10-Regular /Flags 4 /FontBBox [ -430 -290 1417 1127 ] /Ascent 1127 /CapHeight 683 /Descent -290 /ItalicAngle 0 /StemV 93 /XHeight 431 /FontFile3 21 0 R /CIDSet 20 0 R >>
endobj
-24 0 obj
+22 0 obj
<< /Length 1155 >>
stream
%!PS-Adobe-3.0 Resource-CMap
@@ -400,25 +400,25 @@ end
endstream
endobj
-15 0 obj
-<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /DUCKUG+LMRoman10-Regular /DescendantFonts [ 25 0 R ] /ToUnicode 24 0 R >>
+13 0 obj
+<< /Type /Font /Subtype /Type0 /Encoding /Identity-H /BaseFont /DUCKUG+LMRoman10-Regular /DescendantFonts [ 23 0 R ] /ToUnicode 22 0 R >>
endobj
-25 0 obj
-<< /Type /Font /Subtype /CIDFontType0 /BaseFont /DUCKUG+LMRoman10-Regular /FontDescriptor 21 0 R /W 20 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
+23 0 obj
+<< /Type /Font /Subtype /CIDFontType0 /BaseFont /DUCKUG+LMRoman10-Regular /FontDescriptor 19 0 R /W 18 0 R /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> >>
endobj
-16 0 obj
-<< /Type /Pages /Count 2 /Kids [ 10 0 R 12 0 R ] >>
+14 0 obj
+<< /Type /Pages /Count 2 /Kids [ 9 0 R 10 0 R ] >>
endobj
-26 0 obj
-<< /Type /Catalog /Pages 16 0 R /Lang (en-US)/Metadata 17 0 R >>
+24 0 obj
+<< /Type /Catalog /Pages 14 0 R /Lang (en-US)/Metadata 15 0 R >>
endobj
-27 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230804193251+02'00')/ModDate (D:20230804193251+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+25 0 obj
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230830231312+02'00')/ModDate (D:20230830231312+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
-0 28
+0 26
0000000002 65535 f
-0000016617 00000 n
+0000016854 00000 n
0000000003 00000 f
0000000004 00000 f
0000000005 00000 f
@@ -426,27 +426,25 @@ xref
0000000007 00000 f
0000000008 00000 f
0000000000 00000 f
+0000002976 00000 n
+0000016648 00000 n
+0000003094 00000 n
0000000020 00000 n
-0000003032 00000 n
-0000000050 00000 n
-0000016381 00000 n
-0000003151 00000 n
-0000000081 00000 n
-0000023238 00000 n
-0000023592 00000 n
-0000003267 00000 n
-0000016500 00000 n
-0000014413 00000 n
-0000016664 00000 n
-0000021787 00000 n
-0000016971 00000 n
-0000017046 00000 n
-0000022023 00000 n
-0000023392 00000 n
-0000023661 00000 n
-0000023742 00000 n
+0000023475 00000 n
+0000023829 00000 n
+0000003181 00000 n
+0000016767 00000 n
+0000014675 00000 n
+0000016901 00000 n
+0000022024 00000 n
+0000017208 00000 n
+0000017283 00000 n
+0000022260 00000 n
+0000023629 00000 n
+0000023897 00000 n
+0000023978 00000 n
trailer
-<< /Size 28 /Root 26 0 R /Info 27 0 R /ID [ <ABF09154E3A1591664AE2C579FE4AD47> <ABF09154E3A1591664AE2C579FE4AD47> ] >>
+<< /Size 26 /Root 24 0 R /Info 25 0 R /ID [ <470CC785A1D0B3B694D43EBE24661D19> <470CC785A1D0B3B694D43EBE24661D19> ] >>
startxref
-23965
+24201
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-softhyphen.pdf b/macros/latex/contrib/tagpdf/ex-softhyphen.pdf
index d155a50958..7287b6e5f2 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 11037 >>
+<< /Type /Metadata /Subtype /XML /Length 11385 >>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
@@ -71,6 +71,12 @@ stream
<pdfaProperty:category>internal</pdfaProperty:category>
<pdfaProperty:description>Part of ISO 14289 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 of ISO 14289 standard</pdfaProperty:description>
+ </rdf:li>
</rdf:Seq>
</pdfaSchema:property>
</rdf:li>
@@ -105,13 +111,13 @@ stream
<pdfaProperty:name>publicationName</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationname</pdfaProperty:description>
+ <pdfaProperty:description>Publication name</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>aggregationType</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationtype</pdfaProperty:description>
+ <pdfaProperty:description>Publication type</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>bookEdition</pdfaProperty:name>
@@ -153,7 +159,7 @@ stream
<pdfaProperty:name>isbn</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>ISBNforthepublicationinwhichthedocumentwaspublished</pdfaProperty:description>
+ <pdfaProperty:description>ISBN for the publication in which the document was published</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>doi</pdfaProperty:name>
@@ -183,7 +189,7 @@ stream
<pdfaProperty:name>subtitle</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Document'ssubtitle</pdfaProperty:description>
+ <pdfaProperty:description>Document's subtitle</pdfaProperty:description>
</rdf:li>
</rdf:Seq>
</pdfaSchema:property>
@@ -204,17 +210,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-08-04T19:33:20+02:00</rdf:li>
+ <rdf:li>2023-08-30T23:13:31+02: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>2023-08-04T19:33:20+02:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-08-04T19:33:20+02:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-08-04T19:33:20+02:00</xmp:MetadataDate>
+ <xmp:CreateDate>2023-08-30T23:13:31+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2023-08-30T23:13:31+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2023-08-30T23:13:31+02:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:aa82e685-4098-469d-861c-3c45dfc700c7</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:811373e4-d45d-4e95-8c0f-0a2541deaf41</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:e1838625-8288-439b-850f-8396de55e668</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -387,43 +393,43 @@ endobj
<< /Type /Catalog /Pages 19 0 R /MarkInfo 20 0 R/Lang (en-US)/Metadata 14 0 R/StructTreeRoot 5 0 R >>
endobj
30 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230804193320+02'00')/ModDate (D:20230804193320+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230830231331+02'00')/ModDate (D:20230830231331+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 31
0000000002 65535 f
-0000012015 00000 n
+0000012363 00000 n
0000000003 00000 f
0000000004 00000 f
0000000008 00000 f
-0000013317 00000 n
-0000012098 00000 n
-0000012316 00000 n
+0000013665 00000 n
+0000012446 00000 n
+0000012664 00000 n
0000000000 00000 f
-0000012832 00000 n
-0000012925 00000 n
-0000013011 00000 n
-0000013121 00000 n
-0000013207 00000 n
+0000013180 00000 n
+0000013273 00000 n
+0000013359 00000 n
+0000013469 00000 n
+0000013555 00000 n
0000000020 00000 n
-0000011928 00000 n
-0000011793 00000 n
-0000011147 00000 n
-0000017266 00000 n
-0000017630 00000 n
-0000012062 00000 n
-0000012148 00000 n
-0000012279 00000 n
-0000013418 00000 n
-0000016066 00000 n
-0000013572 00000 n
-0000013746 00000 n
-0000016306 00000 n
-0000017425 00000 n
-0000017692 00000 n
-0000017810 00000 n
+0000012276 00000 n
+0000012141 00000 n
+0000011495 00000 n
+0000017614 00000 n
+0000017978 00000 n
+0000012410 00000 n
+0000012496 00000 n
+0000012627 00000 n
+0000013766 00000 n
+0000016414 00000 n
+0000013920 00000 n
+0000014094 00000 n
+0000016654 00000 n
+0000017773 00000 n
+0000018040 00000 n
+0000018158 00000 n
trailer
-<< /Size 31 /Root 29 0 R /Info 30 0 R /ID [ <5F6BE19E852F212114F4F37F190A2AC0> <5F6BE19E852F212114F4F37F190A2AC0> ] >>
+<< /Size 31 /Root 29 0 R /Info 30 0 R /ID [ <6B288E973F57BDFEC84F230DEBCFA2E8> <6B288E973F57BDFEC84F230DEBCFA2E8> ] >>
startxref
-18033
+18381
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf b/macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf
index 992a190e2c..7ae6db6779 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 11046 >>
+<< /Type /Metadata /Subtype /XML /Length 11394 >>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
@@ -71,6 +71,12 @@ stream
<pdfaProperty:category>internal</pdfaProperty:category>
<pdfaProperty:description>Part of ISO 14289 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 of ISO 14289 standard</pdfaProperty:description>
+ </rdf:li>
</rdf:Seq>
</pdfaSchema:property>
</rdf:li>
@@ -105,13 +111,13 @@ stream
<pdfaProperty:name>publicationName</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationname</pdfaProperty:description>
+ <pdfaProperty:description>Publication name</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>aggregationType</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationtype</pdfaProperty:description>
+ <pdfaProperty:description>Publication type</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>bookEdition</pdfaProperty:name>
@@ -153,7 +159,7 @@ stream
<pdfaProperty:name>isbn</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>ISBNforthepublicationinwhichthedocumentwaspublished</pdfaProperty:description>
+ <pdfaProperty:description>ISBN for the publication in which the document was published</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>doi</pdfaProperty:name>
@@ -183,7 +189,7 @@ stream
<pdfaProperty:name>subtitle</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Document'ssubtitle</pdfaProperty:description>
+ <pdfaProperty:description>Document's subtitle</pdfaProperty:description>
</rdf:li>
</rdf:Seq>
</pdfaSchema:property>
@@ -204,17 +210,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-08-04T19:33:44+02:00</rdf:li>
+ <rdf:li>2023-08-30T23:13:48+02: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>2023-08-04T19:33:44+02:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-08-04T19:33:44+02:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-08-04T19:33:44+02:00</xmp:MetadataDate>
+ <xmp:CreateDate>2023-08-30T23:13:48+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2023-08-30T23:13:48+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2023-08-30T23:13:48+02:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:acdc2435-bf29-4e54-8d09-1c9b6dc32038</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:2c17e3a2-7acc-4dc6-863f-a09158871fe0</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:6a509f48-5cd8-4bd2-864d-46b6f7a3e3af</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -348,39 +354,39 @@ endobj
<< /Type /Catalog /Pages 15 0 R /MarkInfo 16 0 R/Lang (en-US)/Metadata 10 0 R/StructTreeRoot 5 0 R >>
endobj
26 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230804193344+02'00')/ModDate (D:20230804193344+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230830231348+02'00')/ModDate (D:20230830231348+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 27
0000000002 65535 f
-0000011662 00000 n
+0000012010 00000 n
0000000003 00000 f
0000000004 00000 f
0000000008 00000 f
-0000012461 00000 n
-0000011745 00000 n
-0000011884 00000 n
+0000012809 00000 n
+0000012093 00000 n
+0000012232 00000 n
0000000000 00000 f
-0000012387 00000 n
+0000012735 00000 n
0000000020 00000 n
-0000011575 00000 n
-0000011440 00000 n
-0000011156 00000 n
-0000014644 00000 n
-0000014998 00000 n
-0000011709 00000 n
-0000011776 00000 n
-0000011847 00000 n
-0000012562 00000 n
-0000013628 00000 n
-0000012617 00000 n
-0000012692 00000 n
-0000013864 00000 n
-0000014798 00000 n
-0000015060 00000 n
-0000015178 00000 n
+0000011923 00000 n
+0000011788 00000 n
+0000011504 00000 n
+0000014992 00000 n
+0000015346 00000 n
+0000012057 00000 n
+0000012124 00000 n
+0000012195 00000 n
+0000012910 00000 n
+0000013976 00000 n
+0000012965 00000 n
+0000013040 00000 n
+0000014212 00000 n
+0000015146 00000 n
+0000015408 00000 n
+0000015526 00000 n
trailer
-<< /Size 27 /Root 25 0 R /Info 26 0 R /ID [ <C823F3BCF51E8899AC6814D1CC3CAEA5> <C823F3BCF51E8899AC6814D1CC3CAEA5> ] >>
+<< /Size 27 /Root 25 0 R /Info 26 0 R /ID [ <A1D7171338063BC081A09387B55B4DC2> <A1D7171338063BC081A09387B55B4DC2> ] >>
startxref
-15401
+15749
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf b/macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf
index 39bba38435..55337b9dce 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 11045 >>
+<< /Type /Metadata /Subtype /XML /Length 11393 >>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
@@ -71,6 +71,12 @@ stream
<pdfaProperty:category>internal</pdfaProperty:category>
<pdfaProperty:description>Part of ISO 14289 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 of ISO 14289 standard</pdfaProperty:description>
+ </rdf:li>
</rdf:Seq>
</pdfaSchema:property>
</rdf:li>
@@ -105,13 +111,13 @@ stream
<pdfaProperty:name>publicationName</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationname</pdfaProperty:description>
+ <pdfaProperty:description>Publication name</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>aggregationType</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationtype</pdfaProperty:description>
+ <pdfaProperty:description>Publication type</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>bookEdition</pdfaProperty:name>
@@ -153,7 +159,7 @@ stream
<pdfaProperty:name>isbn</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>ISBNforthepublicationinwhichthedocumentwaspublished</pdfaProperty:description>
+ <pdfaProperty:description>ISBN for the publication in which the document was published</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>doi</pdfaProperty:name>
@@ -183,7 +189,7 @@ stream
<pdfaProperty:name>subtitle</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Document'ssubtitle</pdfaProperty:description>
+ <pdfaProperty:description>Document's subtitle</pdfaProperty:description>
</rdf:li>
</rdf:Seq>
</pdfaSchema:property>
@@ -204,17 +210,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-08-04T19:34:12+02:00</rdf:li>
+ <rdf:li>2023-08-30T23:14:06+02: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>2023-08-04T19:34:12+02:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-08-04T19:34:12+02:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-08-04T19:34:12+02:00</xmp:MetadataDate>
+ <xmp:CreateDate>2023-08-30T23:14:06+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2023-08-30T23:14:06+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2023-08-30T23:14:06+02:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:bf5e4a2b-cfa9-4fc5-878c-8f9d2ee95445</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:e330f38b-78ef-4952-8a63-59379e0045b5</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:f6360433-4c88-4e51-80e3-5dcd1d2dd103</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -520,56 +526,56 @@ endobj
<< /Type /Catalog /Pages 26 0 R /MarkInfo 27 0 R/Lang (en-US)/Metadata 20 0 R/StructTreeRoot 5 0 R >>
endobj
43 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230804193412+02'00')/ModDate (D:20230804193412+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230830231406+02'00')/ModDate (D:20230830231406+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 44
0000000002 65535 f
-0000012449 00000 n
+0000012797 00000 n
0000000003 00000 f
0000000004 00000 f
0000000008 00000 f
-0000014509 00000 n
-0000012532 00000 n
-0000012881 00000 n
+0000014857 00000 n
+0000012880 00000 n
+0000013229 00000 n
0000000000 00000 f
-0000013397 00000 n
-0000013482 00000 n
-0000013580 00000 n
-0000013688 00000 n
-0000013796 00000 n
-0000013885 00000 n
-0000013975 00000 n
-0000014085 00000 n
-0000014197 00000 n
-0000014287 00000 n
-0000014397 00000 n
+0000013745 00000 n
+0000013830 00000 n
+0000013928 00000 n
+0000014036 00000 n
+0000014144 00000 n
+0000014233 00000 n
+0000014323 00000 n
+0000014433 00000 n
+0000014545 00000 n
+0000014635 00000 n
+0000014745 00000 n
0000000020 00000 n
-0000012350 00000 n
-0000012215 00000 n
-0000011155 00000 n
-0000022592 00000 n
-0000019358 00000 n
+0000012698 00000 n
+0000012563 00000 n
+0000011503 00000 n
0000022940 00000 n
-0000012496 00000 n
-0000012610 00000 n
+0000019706 00000 n
+0000023288 00000 n
0000012844 00000 n
-0000014610 00000 n
-0000018089 00000 n
-0000014859 00000 n
-0000014934 00000 n
-0000018325 00000 n
-0000019512 00000 n
-0000019712 00000 n
-0000021480 00000 n
-0000019849 00000 n
-0000019925 00000 n
-0000021714 00000 n
-0000022743 00000 n
-0000023002 00000 n
-0000023120 00000 n
+0000012958 00000 n
+0000013192 00000 n
+0000014958 00000 n
+0000018437 00000 n
+0000015207 00000 n
+0000015282 00000 n
+0000018673 00000 n
+0000019860 00000 n
+0000020060 00000 n
+0000021828 00000 n
+0000020197 00000 n
+0000020273 00000 n
+0000022062 00000 n
+0000023091 00000 n
+0000023350 00000 n
+0000023468 00000 n
trailer
-<< /Size 44 /Root 42 0 R /Info 43 0 R /ID [ <FBC6F25645660BE150AC7E0A877D1A3C> <FBC6F25645660BE150AC7E0A877D1A3C> ] >>
+<< /Size 44 /Root 42 0 R /Info 43 0 R /ID [ <E81A69FEE9B9E50F0C56DE6BBF434A40> <E81A69FEE9B9E50F0C56DE6BBF434A40> ] >>
startxref
-23343
+23691
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf b/macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf
index 74d6ce2375..952a516e8f 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
%
27 0 obj
-<< /Type /Metadata /Subtype /XML /Length 11042 >>
+<< /Type /Metadata /Subtype /XML /Length 11390 >>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
@@ -71,6 +71,12 @@ stream
<pdfaProperty:category>internal</pdfaProperty:category>
<pdfaProperty:description>Part of ISO 14289 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 of ISO 14289 standard</pdfaProperty:description>
+ </rdf:li>
</rdf:Seq>
</pdfaSchema:property>
</rdf:li>
@@ -105,13 +111,13 @@ stream
<pdfaProperty:name>publicationName</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationname</pdfaProperty:description>
+ <pdfaProperty:description>Publication name</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>aggregationType</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Publicationtype</pdfaProperty:description>
+ <pdfaProperty:description>Publication type</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>bookEdition</pdfaProperty:name>
@@ -153,7 +159,7 @@ stream
<pdfaProperty:name>isbn</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>ISBNforthepublicationinwhichthedocumentwaspublished</pdfaProperty:description>
+ <pdfaProperty:description>ISBN for the publication in which the document was published</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>doi</pdfaProperty:name>
@@ -183,7 +189,7 @@ stream
<pdfaProperty:name>subtitle</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
- <pdfaProperty:description>Document'ssubtitle</pdfaProperty:description>
+ <pdfaProperty:description>Document's subtitle</pdfaProperty:description>
</rdf:li>
</rdf:Seq>
</pdfaSchema:property>
@@ -204,17 +210,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-08-04T19:34:41+02:00</rdf:li>
+ <rdf:li>2023-08-30T23:14:26+02: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>2023-08-04T19:34:41+02:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-08-04T19:34:41+02:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-08-04T19:34:41+02:00</xmp:MetadataDate>
+ <xmp:CreateDate>2023-08-30T23:14:26+02:00</xmp:CreateDate>
+ <xmp:ModifyDate>2023-08-30T23:14:26+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2023-08-30T23:14:26+02:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:f320abfc-f6ab-4d12-8719-d176f4d947cf</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:b0d16508-7a6f-46eb-85be-98fcc7195b92</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:28e776ee-8e5e-4001-8145-84b430ec9045</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -306,7 +312,7 @@ endobj
<< /list [/L 10 0 R] /quote [/BlockQuote 8 0 R] /quotation [/BlockQuote 8 0 R] /theorem-like [/Sect 10 0 R] /verbatim [/P 10 0 R] /codeline [/Sub 10 0 R] /float [/Aside 10 0 R] /figures [/Sect 10 0 R] /tables [/Sect 10 0 R] >>
endobj
20 0 obj
-<< /Type /Namespace /NS (data:,C915417E-46AD-93ED-CAD8-C7CC31FD4A90) /RoleMapNS 21 0 R >>
+<< /Type /Namespace /NS (data:,E037878-4DB6-BAD6-9BC4-368CC7DA7072) /RoleMapNS 21 0 R >>
endobj
7 0 obj
[ 8 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R ]
@@ -398,56 +404,56 @@ endobj
<< /Type /Catalog /Pages 32 0 R /MarkInfo 33 0 R/Lang (en-US)/Metadata 27 0 R/StructTreeRoot 5 0 R >>
endobj
43 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230804193441+02'00')/ModDate (D:20230804193441+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20230830231426+02'00')/ModDate (D:20230830231426+02'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 44
0000000002 65535 f
-0000011584 00000 n
+0000011932 00000 n
0000000003 00000 f
0000000004 00000 f
0000000009 00000 f
-0000014338 00000 n
-0000011667 00000 n
-0000013766 00000 n
-0000011940 00000 n
+0000014685 00000 n
+0000012015 00000 n
+0000014113 00000 n
+0000012288 00000 n
0000000011 00000 f
-0000012008 00000 n
+0000012356 00000 n
0000000013 00000 f
-0000012078 00000 n
+0000012426 00000 n
0000000000 00000 f
-0000012720 00000 n
-0000012159 00000 n
-0000012998 00000 n
-0000012827 00000 n
-0000013306 00000 n
-0000013105 00000 n
-0000013659 00000 n
-0000013415 00000 n
-0000013834 00000 n
-0000013931 00000 n
-0000014018 00000 n
-0000014105 00000 n
-0000014204 00000 n
+0000013068 00000 n
+0000012507 00000 n
+0000013346 00000 n
+0000013175 00000 n
+0000013654 00000 n
+0000013453 00000 n
+0000014007 00000 n
+0000013763 00000 n
+0000014181 00000 n
+0000014278 00000 n
+0000014365 00000 n
+0000014452 00000 n
+0000014551 00000 n
0000000020 00000 n
-0000011521 00000 n
-0000011386 00000 n
-0000011152 00000 n
-0000016944 00000 n
-0000017298 00000 n
-0000011631 00000 n
-0000011708 00000 n
-0000011840 00000 n
-0000011877 00000 n
-0000014460 00000 n
-0000015901 00000 n
-0000014547 00000 n
-0000016122 00000 n
-0000017098 00000 n
-0000017360 00000 n
-0000017478 00000 n
+0000011869 00000 n
+0000011734 00000 n
+0000011500 00000 n
+0000017291 00000 n
+0000017645 00000 n
+0000011979 00000 n
+0000012056 00000 n
+0000012188 00000 n
+0000012225 00000 n
+0000014807 00000 n
+0000016248 00000 n
+0000014894 00000 n
+0000016469 00000 n
+0000017445 00000 n
+0000017707 00000 n
+0000017825 00000 n
trailer
-<< /Size 44 /Root 42 0 R /Info 43 0 R /ID [ <6547F81A3EBB742947E961C20E32D4E3> <6547F81A3EBB742947E961C20E32D4E3> ] >>
+<< /Size 44 /Root 42 0 R /Info 43 0 R /ID [ <176888C5B80D0D7B066E1A19F543932C> <176888C5B80D0D7B066E1A19F543932C> ] >>
startxref
-17701
+18048
%%EOF
diff --git a/macros/latex/contrib/tagpdf/tagpdf-backend.dtx b/macros/latex/contrib/tagpdf/tagpdf-backend.dtx
index 761fb21a8b..fd13c8fd7e 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.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{implementation}
% \begin{macrocode}
%<@@=tag>
%<*luatex>
-\ProvidesExplFile {tagpdf-luatex.def} {2023-08-04} {0.98k}
+\ProvidesExplFile {tagpdf-luatex.def} {2023-08-30} {0.98l}
{tagpdf~driver~for~luatex}
% \end{macrocode}
% \section{Loading the lua}
@@ -158,8 +158,8 @@
local ProvidesLuaModule = {
name = "tagpdf",
- version = "0.98k", --TAGVERSION
- date = "2023-08-04", --TAGDATE
+ version = "0.98l", --TAGVERSION
+ date = "2023-08-30", --TAGDATE
description = "tagpdf lua code",
license = "The LATEX Project Public License 1.3c"
}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-checks.dtx b/macros/latex/contrib/tagpdf/tagpdf-checks.dtx
index 5bb332ee86..68123ff86c 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.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{documentation}
% \section{Commands}
@@ -85,6 +85,7 @@
% \cs{ShowTagging}{mc-data = num} & log+term & lua-only\\
% \cs{ShowTagging}{mc-current} & log+term & \\
% \cs{ShowTagging}{struck-stack= [log\verb+|+show]} & log or term+stop \\
+% \cs{ShowTagging}{debug/structures = num} & log+termn & debug mode only
% \end{tabular}
%
% \subsection{Messages in checks and commands}
@@ -312,7 +313,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-checks-code} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-checks-code} {2023-08-30} {0.98l}
{part of tagpdf - code related to checks, conditionals, debugging and messages}
%</header>
% \end{macrocode}
@@ -446,13 +447,40 @@
The~structures~are~automatically~closed,\\
but~their~nesting~can~be~wrong.
}
+%</package>
% \end{macrocode}
% \end{macro}
-%
+% The following messages are only needed in debug mode.
+% \begin{macro}{show-struct,show-kids}
+% This two messages are used to show the current structures in the log and terminal.
+% \begin{macrocode}
+%<*debug>
+\msg_new:nnn { tag/debug } { show-struct }
+ {
+ =========================\\
+ The~structure~#1~
+ \tl_if_empty:nTF {#2}
+ { is~empty \\>~ . }
+ { contains: #2 }
+ \\
+ }
+\msg_new:nnn { tag/debug } { show-kids }
+ {
+ The~structure~has~the~following~kids:
+ \tl_if_empty:nTF {#2}
+ { \\>~ NONE }
+ { #2 }
+ \\
+ =========================
+ }
+%</debug>
+% \end{macrocode}
+% \end{macro}
% \subsection{Attributes}
% Not much yet, as attributes aren't used so much.
% \begin{macro}{attr-unknown}
% \begin{macrocode}
+%<*package>
\msg_new:nnn { tag } {attr-unknown} { attribute~#1~is~unknown}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-code.pdf b/macros/latex/contrib/tagpdf/tagpdf-code.pdf
index 89fc6df804..9c50835360 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-code.pdf
+++ b/macros/latex/contrib/tagpdf/tagpdf-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/tagpdf/tagpdf-data.dtx b/macros/latex/contrib/tagpdf/tagpdf-data.dtx
index 77da019ba5..f5e3ca8c73 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.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{documentation}
% This files contains a various data files which are read in
@@ -60,7 +60,7 @@
% It lists the new tag, the rolemap and the namespace of the rolemap.
% \begin{macrocode}
%<*ns-latex>
-%% \ProvidesExplFile {tagpdf-ns-latex.def} {2023-08-04} {0.98k}
+%% \ProvidesExplFile {tagpdf-ns-latex.def} {2023-08-30} {0.98l}
%% {latex} {https://www.latex-project.org/ns/dflt/2022}{}
title, Title, pdf2,
part, Title, pdf2,
@@ -92,7 +92,7 @@ text, P, pdf2,
% It is bound to change
% \begin{macrocode}
%<*ns-latex-book>
-%% \ProvidesExplFile {tagpdf-ns-latex-book.def} {2023-08-04} {0.98k}
+%% \ProvidesExplFile {tagpdf-ns-latex-book.def} {2023-08-30} {0.98l}
%% {latex-book} {https://www.latex-project.org/ns/book/2022}{}
chapter, H1,pdf2,
section, H2,pdf2,
@@ -108,7 +108,7 @@ subparagraph, H6,pdf2,
% loaded.
% \begin{macrocode}
%<*ns-latex-inline>
-%% \ProvidesExplFile {tagpdf-ns-latex-inline.def} {2023-08-04} {0.98k}
+%% \ProvidesExplFile {tagpdf-ns-latex-inline.def} {2023-08-30} {0.98l}
%% {latex-inline} {https://www.latex-project.org/ns/inline/2022}{}
chapter, Span, pdf2,
section, Span, pdf2,
@@ -122,7 +122,7 @@ P, Span, pdf2,
% \section{The pdf namespace data}
% \begin{macrocode}
%<*ns-pdf>
-%% \ProvidesExplFile {tagpdf-ns-pdf.def} {2023-08-04} {0.98k}
+%% \ProvidesExplFile {tagpdf-ns-pdf.def} {2023-08-30} {0.98l}
%% {pdf} {http://iso.org/pdf/ssn}{}
StructTreeRoot,StructTreeRoot,pdf,D,
Document,Document,pdf,D,
@@ -190,7 +190,7 @@ Strong,Span,pdf,I,
% \section{The pdf 2.0 namespace data}
% \begin{macrocode}
%<*ns-pdf2>
-%% \ProvidesExplFile {tagpdf-ns-pdf2.def} {2023-08-04} {0.98k}
+%% \ProvidesExplFile {tagpdf-ns-pdf2.def} {2023-08-30} {0.98l}
%% {pdf2} {http://iso.org/pdf2/ssn}{}
Document,Document,pdf2,D,
Part,Part,pdf2,G,
@@ -246,7 +246,7 @@ Strong,Strong,pdf2,I,
% \section{The mathml namespace data}
% \begin{macrocode}
%<*ns-mathml>
-%% \ProvidesExplFile {tagpdf-ns-mathml.def} {2023-08-04} {0.98k}
+%% \ProvidesExplFile {tagpdf-ns-mathml.def} {2023-08-30} {0.98l}
% {mathml}{http://www.w3.org/1998/Math/MathML}{}
abs,abs,mathml,
and,and,mathml,
@@ -481,7 +481,7 @@ xor,xor,mathml,
% This will perhaps change in future.
% \begin{macrocode}
%<*parent-child>
-%% \ProvidesExplFile {tagpdf-parent-child.csv} {2023-08-04} {0.98k}
+%% \ProvidesExplFile {tagpdf-parent-child.csv} {2023-08-30} {0.98l}
,,,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,∅,∅
@@ -536,7 +536,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} {2023-08-04} {0.98k}
+%% \ProvidesExplFile {tagpdf-parent-child-2.csv} {2023-08-30} {0.98l}
,,,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-mc-generic.dtx b/macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx
index e9654f9ce6..13551c9a5c 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.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{documentation}
% \end{documentation}
@@ -55,27 +55,21 @@
% \begin{macrocode}
%<@@=tag>
%<*generic>
-\ProvidesExplPackage {tagpdf-mc-code-generic} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-mc-code-generic} {2023-08-30} {0.98l}
{part of tagpdf - code related to marking chunks - generic mode}
%</generic>
%<*debug>
-\ProvidesExplPackage {tagpdf-debug-generic} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-debug-generic} {2023-08-30} {0.98l}
{part of tagpdf - debugging code related to marking chunks - generic mode}
%</debug>
% \end{macrocode}
%
%\subsection{Variables}
%
-% \begin{variable}{\g_@@_MCID_byabspage_prop}
-% This property will hold the current maximum on a page
-% it will contain key-value of type \meta{abspagenum}=\meta{max mcid}
-%
% \begin{macrocode}
%<*generic>
-\@@_prop_new:N \g_@@_MCID_byabspage_prop
% \end{macrocode}
-% \end{variable}
-
+%
% \begin{variable}{\l_@@_mc_ref_abspage_tl}
% We need a ref-label system to ensure that the MCID cnt
% restarts at 0 on a new page
@@ -270,8 +264,8 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_mc_insert_extra_tmb:n #1 % #1 stream: e.g. main or footnote
{
- \@@_check_typeout_v:n {=>~ first~ \seq_use:Nn \l__tag_mc_firstmarks_seq {,~}}
- \@@_check_typeout_v:n {=>~ bot~ \seq_use:Nn \l__tag_mc_botmarks_seq {,~}}
+ \@@_check_typeout_v:n {=>~ first~ \seq_use:Nn \l_@@_mc_firstmarks_seq {,~}}
+ \@@_check_typeout_v:n {=>~ bot~ \seq_use:Nn \l_@@_mc_botmarks_seq {,~}}
\@@_check_if_mc_tmb_missing:TF
{
\@@_check_typeout_v:n {=>~ TMB~ ~ missing~ --~ inserted}
@@ -298,7 +292,7 @@
{
\seq_item:cn { g_@@_mc_#1_marks_seq } {2}
}
- { \int_eval:n{\c@g__tag_MCID_abs_int} }
+ { \int_eval:n{\c@g_@@_MCID_abs_int} }
{
\seq_item:cn { g_@@_mc_#1_marks_seq } {3}
}
@@ -435,7 +429,7 @@
% Some debugging info:
% \begin{macrocode}
% \iow_term:n { First~ mark~ from~ this~ box: }
-% \seq_log:N \l__tag_mc_firstmarks_seq
+% \seq_log:N \l_@@_mc_firstmarks_seq
% \end{macrocode}
% If this mark was empty then clearly the bottom mark will too be
% empty. Thus in this case we make use of the saved bot mark from
@@ -450,7 +444,7 @@
\@@_check_typeout_v:n
{
No~ marks~ so~ use~ saved~ bot~ mark:~
- \seq_use:cn {g__tag_mc_#2_marks_seq} {,~} \iow_newline:
+ \seq_use:cn {g_@@_mc_#2_marks_seq} {,~} \iow_newline:
}
\seq_set_eq:Nc \l_@@_mc_firstmarks_seq {g_@@_mc_#2_marks_seq}
% \end{macrocode}
@@ -510,18 +504,19 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{ \@@_mc_bmc:n,\@@_mc_emc:,\@@_mc_bdc:nn,\@@_mc_bdc:nx}
+% \begin{macro}{ \@@_mc_bmc:n,\@@_mc_emc:,\@@_mc_bdc:nn}
% These are the low-level commands. There are now equal to the
% pdfmanagement commands generic mode, but we use an indirection
% in case luamode need something else.
% change 04.08.2018: the commands do not check the validity of the arguments or try
% to escape them, this should be done before using them.
+% change 2023-08-18: we are delaying the writing to the shipout.
% \begin{macrocode}
% #1 tag, #2 properties
\cs_set_eq:NN \@@_mc_bmc:n \pdf_bmc:n
\cs_set_eq:NN \@@_mc_emc: \pdf_emc:
\cs_set_eq:NN \@@_mc_bdc:nn \pdf_bdc:nn
-\cs_generate_variant:Nn \@@_mc_bdc:nn {nx}
+\cs_set_eq:NN \@@_mc_bdc_shipout:ee \pdf_bdc_shipout:ee
% \end{macrocode}
% \end{macro}
%
@@ -536,53 +531,95 @@
% starting with 0 and then successively.
% The first argument is the tag, e.g. |P| or |Span|, the second is used to pass
% more properties.
+% Starting with texlive 2023 this is much simpler and faster as we can use
+% delay the numbering to the shipout.
% We also define a wrapper around the low-level command as luamode will need
% something different.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_mc_bdc_mcid:nn #1 #2
- {
- \int_gincr:N \c@g_@@_MCID_abs_int
- \tl_set:Nx \l_@@_mc_ref_abspage_tl
+\bool_if:NTF\g_@@_delayed_shipout_bool
+ {
+ \hook_gput_code:nnn {shipout/before}{tagpdf}{ \flag_clear:n { @@/mcid } }
+ \cs_set_protected:Npn \@@_mc_bdc_mcid:nn #1 #2
{
- \@@_ref_value:enn %3 args
- {
- mcid-\int_use:N \c@g_@@_MCID_abs_int
+ \int_gincr:N \c@g_@@_MCID_abs_int
+ \@@_ref_label:en
+ {
+ mcid-\int_use:N \c@g_@@_MCID_abs_int
+ }
+ {mc}
+ \@@_mc_bdc_shipout:ee
+ {#1}
+ {
+ /MCID~\flag_height:n { @@/mcid }
+ \flag_raise:n { @@/mcid }~ #2
}
- { tagabspage }
- {-1}
- }
- \prop_get:NoNTF
- \g_@@_MCID_byabspage_prop
- {
- \l_@@_mc_ref_abspage_tl
- }
- \l_@@_mc_tmpa_tl
- {
- %key already present, use value for MCID and add 1 for the next
- \int_gset:Nn \g_@@_MCID_tmp_bypage_int { \l_@@_mc_tmpa_tl }
- \@@_prop_gput:Nxx
- \g_@@_MCID_byabspage_prop
- { \l_@@_mc_ref_abspage_tl }
- { \int_eval:n {\l_@@_mc_tmpa_tl +1} }
- }
- {
- %key not present, set MCID to 0 and insert 1
- \int_gzero:N \g_@@_MCID_tmp_bypage_int
- \@@_prop_gput:Nxx
- \g_@@_MCID_byabspage_prop
- { \l_@@_mc_ref_abspage_tl }
- {1}
}
- \@@_ref_label:en
- {
- mcid-\int_use:N \c@g_@@_MCID_abs_int
- }
- { mc }
- \@@_mc_bdc:nx
- {#1}
- { /MCID~\int_eval:n { \g_@@_MCID_tmp_bypage_int }~ \exp_not:n { #2 } }
- }
-\cs_new_protected:Npn \@@_mc_bdc_mcid:n #1
+ }
+% \end{macrocode}
+% if the engine is too old, we have to revert to earlier method.
+% \begin{macrocode}
+ {
+ \msg_new:nnn { tagpdf } { old-engine }
+ {
+ The~engine~or~the~PDF management~is~too~old or\\
+ delayed~shipout~has~been~disabled.\\
+ Fast~numbering~of~MC-chunks~not~available.\\
+ More~compilations~will~be~needed~in~generic~mode.
+ }
+ \msg_warning:nn { tagpdf} { old-engine }
+ \@@_prop_new:N \g_@@_MCID_byabspage_prop
+ \int_new:N \g_@@_MCID_tmp_bypage_int
+ \cs_generate_variant:Nn \@@_mc_bdc:nn {nx}
+% \end{macrocode}
+% revert the attribute:
+% \begin{macrocode}
+ \ref_attribute_gset:nnnn {tagmcid } {0} { now }
+ { \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:Nx \l_@@_mc_ref_abspage_tl
+ {
+ \@@_ref_value:enn %3 args
+ {
+ mcid-\int_use:N \c@g_@@_MCID_abs_int
+ }
+ { tagabspage }
+ {-1}
+ }
+ \prop_get:NoNTF
+ \g_@@_MCID_byabspage_prop
+ {
+ \l_@@_mc_ref_abspage_tl
+ }
+ \l_@@_mc_tmpa_tl
+ {
+ %key already present, use value for MCID and add 1 for the next
+ \int_gset:Nn \g_@@_MCID_tmp_bypage_int { \l_@@_mc_tmpa_tl }
+ \@@_prop_gput:Nxx
+ \g_@@_MCID_byabspage_prop
+ { \l_@@_mc_ref_abspage_tl }
+ { \int_eval:n {\l_@@_mc_tmpa_tl +1} }
+ }
+ {
+ %key not present, set MCID to 0 and insert 1
+ \int_gzero:N \g_@@_MCID_tmp_bypage_int
+ \@@_prop_gput:Nxx
+ \g_@@_MCID_byabspage_prop
+ { \l_@@_mc_ref_abspage_tl }
+ {1}
+ }
+ \@@_ref_label:en
+ {
+ mcid-\int_use:N \c@g_@@_MCID_abs_int
+ }
+ { mc }
+ \@@_mc_bdc:nx
+ {#1}
+ { /MCID~\int_eval:n { \g_@@_MCID_tmp_bypage_int }~ \exp_not:n { #2 } }
+ }
+ }
+ \cs_new_protected:Npn \@@_mc_bdc_mcid:n #1
{
\@@_mc_bdc_mcid:nn {#1} {}
}
@@ -705,7 +742,7 @@
\tl_if_empty:NF {\l_@@_mc_key_label_tl}
{
\exp_args:NV
- \@@_mc_handle_mc_label:n \l_@@_mc_key_label_tl
+ \@@_mc_handle_mc_label:e \l_@@_mc_key_label_tl
}
\bool_if:NF \l_@@_mc_key_stash_bool
{
diff --git a/macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx b/macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx
index 309ba3fd40..066badb9c4 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.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{implementation}
% The code is splitted into three parts: code shared by all engines,
@@ -86,9 +86,13 @@
% \begin{macrocode}
%<@@=tag>
%<*luamode>
-\ProvidesExplPackage {tagpdf-mc-code-lua} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-mc-code-lua} {2023-08-30} {0.98l}
{tagpdf - mc code only for the luamode }
%</luamode>
+%<*debug>
+\ProvidesExplPackage {tagpdf-debug-lua} {2023-08-30} {0.98l}
+ {part of tagpdf - debugging code related to marking chunks - lua mode}
+%</debug>
% \end{macrocode}
% The main function which wanders through the shipout box to inject the literals.
% if the new callback is there, it is used.
@@ -261,7 +265,10 @@
% This is the lua variant for the command to
% put an mcid absolute number in the current structure.
% \begin{macrocode}
-\cs_new:Nn \@@_mc_handle_stash:n %1 mcidnum
+%</luamode>
+%<*luamode|debug>
+%<luamode>\cs_new_protected:Npn \@@_mc_handle_stash:n #1 %1 mcidnum
+%<debug>\cs_set_protected:Npn \@@_mc_handle_stash:n #1 %1 mcidnum
{
\@@_check_mc_used:n { #1 }
\seq_gput_right:cn % Don't fill a lua table due to the command in the item,
@@ -270,6 +277,12 @@
{
\@@_mc_insert_mcid_kids:n {#1}%
}
+%<debug> \seq_gput_right:cn % Don't fill a lua table due to the command in the item,
+%<debug> % so use the kernel command
+%<debug> { g_@@_struct_debug_kids_\g_@@_struct_stack_current_tl _seq }
+%<debug> {
+%<debug> MC~#1%
+%<debug> }
\lua_now:e
{
ltx.@@.func.store_struct_mcabs
@@ -282,7 +295,8 @@
{ #1 }
{ \g_@@_struct_stack_current_tl }
}
-
+%</luamode|debug>
+%<*luamode>
\cs_generate_variant:Nn \@@_mc_handle_stash:n { x }
% \end{macrocode}
% \end{macro}
@@ -321,7 +335,7 @@
\tl_if_empty:NF {\l_@@_mc_key_label_tl}
{
\exp_args:NV
- \@@_mc_handle_mc_label:n \l_@@_mc_key_label_tl
+ \@@_mc_handle_mc_label:e \l_@@_mc_key_label_tl
}
% if not stashed record the absolute number
\bool_if:NF \l_@@_mc_key_stash_bool
diff --git a/macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx b/macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx
index 85a03ca90e..1fd9ebc559 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.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{documentation}
% \section{Public Commands}
@@ -181,7 +181,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-mc-code-shared} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-mc-code-shared} {2023-08-30} {0.98l}
{part of tagpdf - code related to marking chunks -
code shared by generic and luamode }
%</header>
@@ -227,13 +227,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{variable}{\g_@@_MCID_tmp_bypage_int}
-% The following hold the temporary by page number assigned to a mc.
-% It must be defined in the shared code to avoid problems with labels.
-% \begin{macrocode}
-\int_new:N \g_@@_MCID_tmp_bypage_int
-% \end{macrocode}
-% \end{variable}
%
% \begin{variable}{\g_@@_in_mc_bool}
% This booleans record if a mc is open, to test nesting.
@@ -294,19 +287,17 @@
%
%
% \subsection{Functions}
-% \begin{macro}{\_@@_mc_handle_mc_label:n}
+% \begin{macro}{\@@_mc_handle_mc_label:e}
% The commands labels a mc-chunk. It is used if the user explicitly
% labels the mc-chunk with the |label| key. The argument is the
% value provided by the user. It stores the attributes\\
% |tagabspage|: the absolute page, |\g_shipout_readonly_int|,\\
-% |tagmcabs|: the absolute mc-counter |\c@g_@@_MCID_abs_int|,\\
-% |tagmcid|: the ID of the chunk on the page |\g_@@_MCID_tmp_bypage_int|, this
-% typically settles down after a second compilation.
-% The reference command is defined in tagpdf.dtx and is based on l3ref.
+% |tagmcabs|: the absolute mc-counter |\c@g_@@_MCID_abs_int|.
+% The reference command is based on l3ref.
% \begin{macrocode}
-\cs_new:Nn \_@@_mc_handle_mc_label:n
+\cs_new:Npn \@@_mc_handle_mc_label:e #1
{
- \@@_ref_label:en{tagpdf-#1}{mc}
+ \ref_label:en{tagpdf-#1}{tagabspage,tagmcabs}
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-roles.dtx b/macros/latex/contrib/tagpdf/tagpdf-roles.dtx
index 0e65a4be4e..0e33e7d1af 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.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{documentation}
% \begin{function}
@@ -98,7 +98,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-roles-code} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-roles-code} {2023-08-30} {0.98l}
{part of tagpdf - code related to roles and structure names}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-space.dtx b/macros/latex/contrib/tagpdf/tagpdf-space.dtx
index 70e5f32d59..249460dc72 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.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{documentation}
% \begin{function}{interwordspace (setup-key)}
@@ -64,7 +64,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-space-code} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-space-code} {2023-08-30} {0.98l}
{part of tagpdf - code related to real space chars}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-struct.dtx b/macros/latex/contrib/tagpdf/tagpdf-struct.dtx
index 0b175aa4f1..9e5fbe7fa6 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-struct.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-struct.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Version 0.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{documentation}
% \section{Public Commands}
@@ -247,7 +247,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-struct-code} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-struct-code} {2023-08-30} {0.98l}
{part of tagpdf - code related to storing structure}
%</header>
% \end{macrocode}
@@ -508,7 +508,16 @@
{ g_@@_struct_0_prop }
{ parentrole }
{ {StructTreeRoot}{pdf} }
-
+%</package>
+%<*debug>
+\prop_new:c { g_@@_struct_debug_0_prop }
+\prop_gset_eq:cc
+ { g_@@_struct_debug_0_prop }
+ { g_@@_struct_0_prop }
+\prop_gremove:cn { g_@@_struct_debug_0_prop }{Namespaces}
+\seq_new:c { g_@@_struct_debug_kids_0_seq }
+%</debug>
+%<*package>
% \end{macrocode}
% Namespaces are pdf 2.0.
% If the code moves into the kernel, the setting must be probably delayed.
@@ -573,7 +582,7 @@
{ \l_@@_get_tmpc_tl } %
}
}
- }
+ }
\cs_generate_variant:Nn \@@_struct_set_tag_info:nnn {eVV}
% \end{macrocode}
% \end{macro}
@@ -626,23 +635,30 @@
/MCID \c_space_tl \@@_ref_value:enn{mcid-#1}{tagmcid}{1}
>>
}
+%</package>
% \end{macrocode}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_struct_kid_mc_gput_right:nn #1 #2 %#1 structure num, #2 MCID absnum%
+%<*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%
{
\@@_seq_gput_right:cx
{ g_@@_struct_kids_#1_seq }
{
\@@_struct_mcid_dict:n {#2}
}
+%<debug> \seq_gput_right:cn
+%<debug> { g_@@_struct_debug_kids_#1_seq }
+%<debug> {
+%<debug> MC~#2
+%<debug> }
\@@_seq_gput_right:cn
{ g_@@_struct_kids_#1_seq }
{
\prop_item:Nn \g_@@_struct_cont_mc_prop {#2}
}
}
-\cs_generate_variant:Nn \@@_struct_kid_mc_gput_right:nn {nx}
-
+%<package>\cs_generate_variant:Nn \@@_struct_kid_mc_gput_right:nn {nx}
% \end{macrocode}
% \end{macro}
% \begin{macro}
@@ -652,16 +668,22 @@
% This commands adds a structure as kid. We only need to record the object
% reference in the sequence.
% \begin{macrocode}
-\cs_new_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 %#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
{
\@@_seq_gput_right:cx
{ g_@@_struct_kids_#1_seq }
{
\pdf_object_ref:n { @@/struct/#2 }
}
- }
+%<debug> \seq_gput_right:cn
+%<debug> { g_@@_struct_debug_kids_#1_seq }
+%<debug> {
+%<debug> Struct~#2
+%<debug> }
+ }
-\cs_generate_variant:Nn \@@_struct_kid_struct_gput_right:nn {xx}
+%<package>\cs_generate_variant:Nn \@@_struct_kid_struct_gput_right:nn {xx}
% \end{macrocode}
% \end{macro}
% \begin{macro}
@@ -672,9 +694,10 @@
% object reference
%
% \begin{macrocode}
-\cs_new_protected:Npn\@@_struct_kid_OBJR_gput_right:nnn #1 #2 #3 %#1 num of parent struct,
- %#2 obj reference
- %#3 page object reference
+%<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
+%<debug>\cs_set_protected:Npn\@@_struct_kid_OBJR_gput_right:nnn #1 #2 #3
{
\pdf_object_unnamed_write:nn
{ dict }
@@ -686,10 +709,15 @@
{
\pdf_object_ref_last:
}
+%<debug> \seq_gput_right:cx
+%<debug> { g_@@_struct_debug_kids_#1_seq }
+%<debug> {
+%<debug> OBJR~reference
+%<debug> }
}
-
+%</package|debug>
+%<*package>
\cs_generate_variant:Nn\@@_struct_kid_OBJR_gput_right:nnn { xxx }
-
% \end{macrocode}
% \end{macro}
% \begin{macro}
@@ -1319,8 +1347,10 @@
\group_begin:
\int_gincr:N \c@g_@@_struct_abs_int
\@@_prop_new:c { g_@@_struct_\int_eval:n { \c@g_@@_struct_abs_int }_prop }
+%<debug> \prop_new:c { g_@@_struct_debug_\int_eval:n {\c@g_@@_struct_abs_int}_prop }
\@@_new_output_prop_handler:n {\int_eval:n { \c@g_@@_struct_abs_int }}
\@@_seq_new:c { g_@@_struct_kids_\int_eval:n { \c@g_@@_struct_abs_int }_seq}
+%<debug> \seq_new:c { g_@@_struct_debug_kids_\int_eval:n {\c@g_@@_struct_abs_int}_seq }
\exp_args:Ne
\pdf_object_new:n
{ @@/struct/\int_eval:n { \c@g_@@_struct_abs_int } }
@@ -1461,6 +1491,8 @@
{
\pdf_object_ref:e { @@/struct/\l_@@_struct_stack_parent_tmpa_tl }
}
+% \end{macrocode}
+% \begin{macrocode}
%record this structure as kid:
%\tl_show:N \g_@@_struct_stack_current_tl
%\tl_show:N \l_@@_struct_stack_parent_tmpa_tl
@@ -1470,6 +1502,30 @@
%\prop_show:c { g_@@_struct_\g_@@_struct_stack_current_tl _prop }
%\seq_show:c {g_@@_struct_kids_\l_@@_struct_stack_parent_tmpa_tl _seq}
}
+% \end{macrocode}
+% the debug mode stores in second prop and replaces value with more suitable ones.
+% This must be done outside of the stash boolean.
+% \begin{macrocode}
+%<debug> \prop_gset_eq:cc
+%<debug> { g_@@_struct_debug_\int_eval:n {\c@g_@@_struct_abs_int}_prop }
+%<debug> { g_@@_struct_\int_eval:n {\c@g_@@_struct_abs_int}_prop }
+%<debug> \prop_gput:cnx
+%<debug> { g_@@_struct_debug_\int_eval:n {\c@g_@@_struct_abs_int}_prop }
+%<debug> { P }
+%<debug> {
+%<debug> \bool_if:NTF \l_@@_struct_elem_stash_bool
+%<debug> {no~parent:~stashed}
+%<debug> {
+%<debug> parent~structure:~\l_@@_struct_stack_parent_tmpa_tl\c_space_tl =~
+%<debug> \l_@@_get_parent_tmpa_tl
+%<debug> }
+%<debug> }
+%<debug> \prop_gput:cnx
+%<debug> { g_@@_struct_debug_\int_eval:n {\c@g_@@_struct_abs_int}_prop }
+%<debug> { NS }
+%<debug> { \g_@@_struct_tag_NS_tl }
+% \end{macrocode}
+% \begin{macrocode}
%\prop_show:c { g_@@_struct_\g_@@_struct_stack_current_tl _prop }
%\seq_show:c {g_@@_struct_kids_\l_@@_struct_stack_parent_tmpa_tl _seq}
%<debug> \@@_debug_struct_begin_insert:n { #1 }
@@ -1526,7 +1582,7 @@
% TODO: decide how it should be guarded. Probably by the struct-check.
% \begin{macrocode}
%<base>\cs_new_protected:Npn \tag_struct_use:n #1 {}
-%<*package>
+%<*package|debug>
\cs_set_protected:Npn \tag_struct_use:n #1 %#1 is the label
{
\@@_check_if_active_struct:T
@@ -1547,6 +1603,23 @@
\pdf_object_ref:e { @@/struct/\g_@@_struct_stack_current_tl }
}
% \end{macrocode}
+% debug code
+% \begin{macrocode}
+%<debug> \prop_gset_eq:cc
+%<debug> { g_@@_struct_debug_\@@_ref_value:enn{tagpdfstruct-#1}{tagstruct}{0}_prop }
+%<debug> { g_@@_struct_\@@_ref_value:enn{tagpdfstruct-#1}{tagstruct}{0}_prop }
+%<debug> \prop_gput:cnx
+%<debug> { g_@@_struct_debug_\@@_ref_value:enn{tagpdfstruct-#1}{tagstruct}{0}_prop }
+%<debug> { P }
+%<debug> {
+%<debug> parent~structure:~\g_@@_struct_stack_current_tl\c_space_tl=~
+%<debug> \g_@@_struct_tag_tl
+%<debug> }
+%<debug> \prop_gput:cnx
+%<debug> { g_@@_struct_debug_\int_eval:n {\c@g_@@_struct_abs_int}_prop }
+%<debug> { NS }
+%<debug> { \g_@@_struct_tag_NS_tl }
+% \end{macrocode}
% check if the tag is allowed as child. Here we have to retrieve the
% tag info for the child, while the data for the parent is in
% the global tl-vars:
@@ -1572,14 +1645,14 @@
{ \int_eval:n {\c@g_@@_struct_abs_int} }
\g_@@_struct_tag_tl
\g_@@_struct_tag_NS_tl
- }
+ }
}
{
\msg_warning:nnn{ tag }{struct-label-unknown}{#1}
}
}
}
-%</package>
+%</package|debug>
% \end{macrocode}
% \end{macro}
% \begin{macro}{\tag_struct_use_num:n}
@@ -1740,7 +1813,7 @@
% \section{Attributes and attribute classes}
% \begin{macrocode}
%<*header>
-\ProvidesExplPackage {tagpdf-attr-code} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-attr-code} {2023-08-30} {0.98l}
{part of tagpdf - code related to attributes and attribute classes}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-tree.dtx b/macros/latex/contrib/tagpdf/tagpdf-tree.dtx
index a8b755a1f6..c84ad8a8c5 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.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{implementation}
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-tree-code} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-tree-code} {2023-08-30} {0.98l}
{part of tagpdf - code related to writing trees and dictionaries to the pdf}
%</header>
% \end{macrocode}
@@ -342,10 +342,13 @@
{% page#1:mcid##1:\l_@@_tmpa_tl :content
\tl_put_right:Nx \l_@@_parenttree_content_tl
{
- \pdf_object_if_exist:eT { @@/struct/\l_@@_tmpa_tl }
+ \pdf_object_if_exist:eTF { @@/struct/\l_@@_tmpa_tl }
{
\pdf_object_ref:e { @@/struct/\l_@@_tmpa_tl }
}
+ {
+ null
+ }
\c_space_tl
}
}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-user.dtx b/macros/latex/contrib/tagpdf/tagpdf-user.dtx
index 50afdf6a77..518a341812 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-user.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-user.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Version 0.98k, released 2023-08-04}
+% \date{Version 0.98l, released 2023-08-30}
% \maketitle
% \begin{documentation}
% \section{Setup commands}
@@ -250,7 +250,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-user} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-user} {2023-08-30} {0.98l}
{tagpdf - user commands}
%</header>
% \end{macrocode}
@@ -508,6 +508,44 @@
,struct-stack / show .code:n = \seq_show:N \g_@@_struct_tag_stack_seq
,struct-stack .default:n = show
}
+%</package>
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{debug/structures (show-key)}
+% The following key is available only if the tagpdf-debug package is loaded
+% and shows all structures starting with the one with the number
+% given by the key.
+% \begin{macrocode}
+%<*debug>
+\keys_define:nn { @@ / show }
+ {
+ ,debug/structures .code:n =
+ {
+ \int_step_inline:nnn{#1}{\c@g__tag_struct_abs_int}
+ {
+ \msg_term:nnxxxx
+ { tag/debug } { show-struct }
+ { ##1 }
+ {
+ \prop_map_function:cN
+ {g_@@_struct_debug_##1_prop}
+ \msg_show_item_unbraced:nn
+ }
+ { } { }
+ \msg_term:nnxxxx
+ { tag/debug } { show-kids }
+ { ##1 }
+ {
+ \seq_map_function:cN
+ {g_@@_struct_debug_kids_##1_seq}
+ \msg_show_item_unbraced:n
+ }
+ { } { }
+ }
+ }
+ ,debug/structures .default:n = 0
+ }
+%</debug>
% \end{macrocode}
% \end{macro}
%
@@ -522,7 +560,6 @@
% Until l3ref is in the kernel, we provide a definition for \cs{newlabeldata} in
% the aux-file to avoid errors if a document switches between tagging and non-tagging.
% \begin{macrocode}
-%</package>
%<base>\AddToHook{begindocument}
%<base> {\immediate\write\@mainaux{\string\providecommand\string\newlabeldata[2]{}}}
%<*package>
diff --git a/macros/latex/contrib/tagpdf/tagpdf.dtx b/macros/latex/contrib/tagpdf/tagpdf.dtx
index 6da2ba0122..be94a64070 100644
--- a/macros/latex/contrib/tagpdf/tagpdf.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf.dtx
@@ -93,7 +93,7 @@
% \begin{macrocode}
%<@@=tag>
%<*package>
-\ProvidesExplPackage {tagpdf} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf} {2023-08-30} {0.98l}
{ A package to experiment with pdf tagging }
\bool_if:nF
@@ -119,7 +119,7 @@
% \end{macrocode}
%<*debug>
% \begin{macrocode}
-\ProvidesExplPackage {tagpdf-debug} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-debug} {2023-08-30} {0.98l}
{ debug code for tagpdf }
\@ifpackageloaded{tagpdf}{}{\PackageWarning{tagpdf-debug}{tagpdf~not~loaded,~quitting}\endinput}
% \end{macrocode}
@@ -142,18 +142,28 @@
% we define a base package with dummy functions
% \begin{macrocode}
%<*base>
-\ProvidesExplPackage {tagpdf-base} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdf-base} {2023-08-30} {0.98l}
{part of tagpdf - provide base, no-op versions of the user commands }
%</base>
% \end{macrocode}
%\section{Package options}
-% There are only two options to switch for luatex between generic and luamode,
+% There are only two documented options to switch for luatex between generic and luamode,
% TODO try to get rid of them.
+% The option \texttt{disabledelayedshipout} is only temporary to be able to debug
+% problem with the new shipout keyword if needed.
% \begin{macrocode}
%<*package>
\bool_new:N\g_@@_mode_lua_bool
+\bool_new:N\g_@@_delayed_shipout_bool
+\bool_lazy_and:nnT
+ { \bool_if_exist_p:N \l__pdfmanagement_delayed_shipout_bool }
+ { \l__pdfmanagement_delayed_shipout_bool }
+ {
+ \bool_gset_true:N\g_@@_delayed_shipout_bool
+ }
\DeclareOption {luamode} { \sys_if_engine_luatex:T { \bool_gset_true:N \g_@@_mode_lua_bool } }
\DeclareOption {genericmode}{ \bool_gset_false:N\g_@@_mode_lua_bool }
+\DeclareOption {disabledelayedshipout}{ \bool_gset_false:N\g_@@_delayed_shipout_bool }
\ExecuteOptions{luamode}
\ProcessOptions
% \end{macrocode}
@@ -350,7 +360,7 @@
%
% \section{Variants of l3 commands}
% \begin{macrocode}
-\prg_generate_conditional_variant:Nnn \pdf_object_if_exist:n {e}{T,F}
+\prg_generate_conditional_variant:Nnn \pdf_object_if_exist:n {e}{T,F,TF}
\cs_generate_variant:Nn \pdf_object_ref:n {e}
\cs_generate_variant:Nn \pdfannot_dict_put:nnn {nnx}
\cs_generate_variant:Nn \pdffile_embed_stream:nnn {nxx,oxx}
@@ -388,8 +398,11 @@
{ \int_use:N \g_shipout_readonly_int }
\ref_attribute_gset:nnnn { tagmcabs } {0} { now }
{ \int_use:N \c@g_@@_MCID_abs_int }
-\ref_attribute_gset:nnnn {tagmcid } {0} { now }
- { \int_use:N \g_@@_MCID_tmp_bypage_int }
+
+\flag_new:n { @@/mcid }
+\ref_attribute_gset:nnnn {tagmcid } {0} { shipout }
+ { \flag_height:n { @@/mcid } }
+
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex/contrib/tagpdf/tagpdf.pdf b/macros/latex/contrib/tagpdf/tagpdf.pdf
index d99d76ff95..0118e4bb22 100644
--- a/macros/latex/contrib/tagpdf/tagpdf.pdf
+++ b/macros/latex/contrib/tagpdf/tagpdf.pdf
Binary files differ
diff --git a/macros/latex/contrib/tagpdf/tagpdf.tex b/macros/latex/contrib/tagpdf/tagpdf.tex
index b89709b1a9..259e9dfc38 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.98k}
-\def\UlrikeFischer@package@date{2023-08-04}
+\def\UlrikeFischer@package@version{0.98l}
+\def\UlrikeFischer@package@date{2023-08-30}
\makeatother
\documentclass[bibliography=totoc,a4paper]{article}
@@ -537,6 +537,11 @@ chars will work, but are currently not taken from the current font. This will
be improved in the next luaotfload version. The compilation with dvilualatex
is not much tested yet.
+\subsection{Changes in version 0.98l}
+
+In 2023 the primitives to write literal code into the pdf have been extended in all engines
+and now allow to delay the expansion of their argument to the shipout. This made it possible to greatly simplify and speed up the code used in generic mode to number the MC-chunks. In most 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{Proof of concept: the tagging of the documentation itself}
Starting with version 0.6 the documentation itself has been tagged. The
@@ -2446,6 +2451,13 @@ This command takes as argument a key-val list which implements a number of show
With the value |log| the info is only
written to the log-file, |show| stops the compilation and shows on the terminal.
If no value is used, then the default is |show|.
+
+ \item[\PrintKeyName{debug/structures}] This key is only available if
+ the package \pkg{tagpdf-debug} has been loaded too. It takes as
+ value a number (the default is 0), and shows on the terminal and
+ in the log information about all structures with a number equal or
+ larger than the number. The data avoids to show PDF object numbers
+ to make it more usable for test suites.
\end{description}
diff --git a/macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty b/macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty
index 114ac7646b..af9efe1f75 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} {2023-08-04} {0.98k}
+\ProvidesExplPackage {tagpdfdocu-patches} {2023-08-30} {0.98l}
{patches/commands for the tagpdf documentation}
\RequirePackage{etoolbox,xpatch}
diff --git a/macros/luatex/generic/luaotfload/NEWS b/macros/luatex/generic/luaotfload/NEWS
index ffc67f5fe1..d263b2e002 100644
--- a/macros/luatex/generic/luaotfload/NEWS
+++ b/macros/luatex/generic/luaotfload/NEWS
@@ -1,5 +1,11 @@
Change History
--------------
+2023-08-31 luaotfload v3.26
+
+ * Reimplement mathsize feature recently dropped from fontloader
+
+luaotfload v3.25 has been skipped
+
2023-08-19 luaotfload v3.24
* Add experimental configuration option to change default font lookup location
diff --git a/macros/luatex/generic/luaotfload/README.md b/macros/luatex/generic/luaotfload/README.md
index 3f84eccafc..e22815220c 100644
--- a/macros/luatex/generic/luaotfload/README.md
+++ b/macros/luatex/generic/luaotfload/README.md
@@ -1,8 +1,8 @@
# The Luaotfload Package
-VERSION: 3.24
+VERSION: 3.26
-DATE: 2023-08-19
+DATE: 2023-08-31
## Description
diff --git a/macros/luatex/generic/luaotfload/filegraph.pdf b/macros/luatex/generic/luaotfload/filegraph.pdf
index 950b5fe6b3..f4d68bbf6f 100644
--- a/macros/luatex/generic/luaotfload/filegraph.pdf
+++ b/macros/luatex/generic/luaotfload/filegraph.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua b/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua
index 6325ba19d2..5e2022a18b 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-auxiliary.lua
@@ -6,8 +6,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-auxiliary",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / auxiliary functions",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-colors.lua b/macros/luatex/generic/luaotfload/luaotfload-colors.lua
index 35962ee074..2d8942a3d9 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-colors.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-colors.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-colors",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / color",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang, Dohyun Kim, David Carlisle",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-conf.pdf b/macros/luatex/generic/luaotfload/luaotfload-conf.pdf
index 9a1cbab1a8..078ba7de52 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-conf.pdf
+++ b/macros/luatex/generic/luaotfload/luaotfload-conf.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/luaotfload-configuration.lua b/macros/luatex/generic/luaotfload/luaotfload-configuration.lua
index fda9b4dbff..b59897b217 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-configuration.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-configuration.lua
@@ -7,8 +7,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-configuration",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / config file reader",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-database.lua b/macros/luatex/generic/luaotfload/luaotfload-database.lua
index 3a2d87ead9..9b81f6a3d0 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-database.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-database.lua
@@ -5,8 +5,8 @@
do -- block to avoid to many local variables error
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-database",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / database",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua b/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua
index 9bde02fc1f..1a48ec9a08 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-diagnostics.lua
@@ -7,8 +7,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-diagnostics",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload-tool submodule / diagnostics",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-dvi.lua b/macros/luatex/generic/luaotfload/luaotfload-dvi.lua
index e2ea8c82ed..c1b6d227c9 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-dvi.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-dvi.lua
@@ -6,8 +6,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-dvi",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / DVI",
license = "GPL v2.0",
author = "Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-embolden.lua b/macros/luatex/generic/luaotfload/luaotfload-embolden.lua
index 66c4b1c2d6..fad5ce7b2c 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-embolden.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-embolden.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-embolden",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / embolden",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-fallback.lua b/macros/luatex/generic/luaotfload/luaotfload-fallback.lua
index 4b257455fb..ef0ce1fb63 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-fallback.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-fallback.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-fallback",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / fallback",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-features.lua b/macros/luatex/generic/luaotfload/luaotfload-features.lua
index 9b753aac82..862f50aad3 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-features.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-features.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-features",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / features",
license = "GPL v2.0",
author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
@@ -891,6 +891,40 @@ fonts.constructors.features.otf.register {
},
}
+-- mathsize feature for compatibility with older fontloader versions
+-- Not all that useful in most cases since it leads to messy font sizes,
+-- especially reloading a font using this feature based on it's \fontname
+-- will load a wrong size.
+-- Only supported for base mode since the other modes don't make sense for
+-- math fonts.
+local calculatescale = fonts.constructors.calculatescale
+function fonts.constructors.calculatescale(tfmdata, size, _, spec)
+ local parameters = tfmdata.parameters
+ local sizepercentage = parameters and parameters.sizepercentage
+ if sizepercentage then
+ size = size * sizepercentage / 100
+ end
+ return calculatescale(tfmdata, size, _, spec)
+end
+
+fonts.constructors.features.otf.register {
+ name = 'mathsize',
+ description = 'Scale math fonts based on their scriptpercentage parameters',
+ initializers = {
+ base = function(tfmdata, mathsize)
+ local mathdata = tfmdata.shared.rawdata.metadata.math
+ if not mathdata then return end
+
+ if mathsize == 1 then
+ tfmdata.parameters.sizepercentage = 100
+ elseif mathsize == 2 then
+ tfmdata.parameters.sizepercentage = mathdata.ScriptPercentScaleDown
+ elseif mathsize == 3 then
+ tfmdata.parameters.sizepercentage = mathdata.ScriptScriptPercentScaleDown
+ end
+ end,
+ },
+}
return function ()
if not fonts and fonts.handlers then
diff --git a/macros/luatex/generic/luaotfload/luaotfload-filelist.lua b/macros/luatex/generic/luaotfload/luaotfload-filelist.lua
index c428e08be9..fea69928b5 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-filelist.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-filelist.lua
@@ -6,8 +6,8 @@
if luaotfload_module then luaotfload_module {
name = "luaotfload-filelist",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / filelist",
license = "GPL v2.0"
} end
diff --git a/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua b/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua
index 484b0e63b0..370cfbd611 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-glyphlist.lua
@@ -1,8 +1,8 @@
if luaotfload_module then
luaotfload_module {
name = "luaotfload-glyphlist",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / autogenerated glyphlist",
copyright = "derived from https://raw.githubusercontent.com/adobe-type-tools/agl-aglfn/master/glyphlist.txt",
original = "Adobe Glyph List, version 2.0, September 20, 2002",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua
index 069513bc5a..32cad5fc54 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-define.lua
@@ -5,8 +5,8 @@
do -- block to avoid to many local variables error
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-harf-define",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / HarfBuzz font loading",
license = "GPL v2.0",
author = "Khaled Hosny, Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua
index 296a99c9b6..e9d4a15b9f 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-plug.lua
@@ -4,8 +4,8 @@
-----------------------------------------------------------------------
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-harf-plug",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / HarfBuzz shaping",
license = "GPL v2.0",
author = "Khaled Hosny, Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua
index 3cf3aec64f..063b99c2be 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-var-cff2.lua
@@ -5,8 +5,8 @@
do
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-harf-var-cff2",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / CFF2 table processing",
license = "GPL v2.0",
author = "Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua
index 52feadf7f7..491c127f9c 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-var-t2-writer.lua
@@ -5,8 +5,8 @@
do
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-harf-var-t2-writer",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / Type 2 charstring writer",
license = "GPL v2.0",
author = "Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua b/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua
index 1fb8555f6d..0853a62fc4 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-harf-var-ttf.lua
@@ -5,8 +5,8 @@
do
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-harf-var-ttf",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / gvar table processing",
license = "GPL v2.0",
author = "Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-init.lua b/macros/luatex/generic/luaotfload/luaotfload-init.lua
index 2796fff22a..78cb99ff7e 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-init.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-init.lua
@@ -7,8 +7,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-init",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / initialization",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-latex.pdf b/macros/luatex/generic/luaotfload/luaotfload-latex.pdf
index 0005cba543..8368bd9db3 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-latex.pdf
+++ b/macros/luatex/generic/luaotfload/luaotfload-latex.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua b/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua
index 8942e9234c..d641b028bf 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-letterspace.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-letterspace",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / letterspacing",
license = "GPL v2.0",
copyright = "PRAGMA ADE / ConTeXt Development Team",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-loaders.lua b/macros/luatex/generic/luaotfload/luaotfload-loaders.lua
index e2ca0c38c8..eceaff8188 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-loaders.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-loaders.lua
@@ -8,8 +8,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-loaders",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / callback handling",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-log.lua b/macros/luatex/generic/luaotfload/luaotfload-log.lua
index 24e2dbfbbe..95f02beed5 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-log.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-log.lua
@@ -6,8 +6,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-log",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / logging",
license = "GPL v2.0",
author = "Khaled Hosny, Elie Roux, Philipp Gesang",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-main.tex b/macros/luatex/generic/luaotfload/luaotfload-main.tex
index cb94e854c6..1df20a5cee 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-main.tex
+++ b/macros/luatex/generic/luaotfload/luaotfload-main.tex
@@ -32,7 +32,7 @@
\beginfrontmatter
\setdocumenttitle {The \identifier{luaotfload} package}
- \setdocumentdate {2023-08-19 v3.24}
+ \setdocumentdate {2023-08-31 v3.26}
\setdocumentauthor {LaTeX3 Project\\
Elie Roux · Khaled Hosny · Philipp Gesang · Ulrike Fischer · Marcel Krüger\\
Home: \hyperlink {https://github.com/latex3/luaotfload}}
@@ -2291,7 +2291,7 @@ is structured in \LuaTeX’s memory, what elements it is composed of,
and in what ways it can be rearranged.
The \luaident{pre_shaping_filter} and \luaident{post_shaping_filter}
-callbacks is a pair of \identifier{(reverse)list} callbacks running
+callbacks are a pair of \identifier{(reverse)list} callbacks running
immediately before and after \identifier{luaotfload} shapes the text.
They both use the interface
\beginlisting
@@ -2304,7 +2304,7 @@ where \luaident{head} is the head of the to be shaped list,
Since most font processing happens during shaping, \LuaTeX's
\luaident{ligaturing} and \luaident{kerning} callbacks are not involved
-in most ligature generation and kerning decisions ans should therefore not be
+in most ligature generation and kerning decisions and should therefore not be
relied upon. Font processing for fonts loaded with \luaident{mode=base} might
happen in any of these places.
diff --git a/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua b/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
index 370d86d093..2b2136ff68 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-multiscript.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-multiscript",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / multiscript",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-notdef.lua b/macros/luatex/generic/luaotfload/luaotfload-notdef.lua
index b8c0c02346..311a377148 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-notdef.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-notdef.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-notdef",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / notdef",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-parsers.lua b/macros/luatex/generic/luaotfload/luaotfload-parsers.lua
index 00630a14a6..2650e21e61 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-parsers.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-parsers.lua
@@ -7,8 +7,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-parsers",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / parsers",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua b/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua
index 7b2c7ac6aa..a719d8f91b 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-resolvers.lua
@@ -11,8 +11,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-resolvers",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / resolvers",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-scripts.lua b/macros/luatex/generic/luaotfload/luaotfload-scripts.lua
index 9430223332..5ee0b451a5 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-scripts.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-scripts.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-script",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / Script helpers",
license = "CC0 1.0 Universal",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-status.lua b/macros/luatex/generic/luaotfload/luaotfload-status.lua
index 263982a2ca..78d097c0f2 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-status.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-status.lua
@@ -56,44 +56,44 @@ return {
{ "fontloader-reference.lua", "50f2268d2d34d5f2ad630151fc1e5b8e" },
{ "fontloader-basics-gen.lua", "4bc43036e9796fccb0b8869f4b05bf2e" },
{ "mktests", "918cb50be9ee8bd645ac1a27dc501e8c" },
- { "mkstatus", "0c93345ef76bb5458ea7b58144f8a716" },
+ { "mkstatus", "590e9cffec69376c1888aa78c5b9275e" },
{ "mkcharacters", "bfca0e96e1e351afe7077502f9595af9" },
{ "mkglyphlist", "7a8a8fdc0eac7fac2f13ec8f4e8e7aa9" },
{ "mkimport", "7d62f1042e548f8b9368f26b9ba4be5c" },
- { "luaotfload-glyphlist.lua", "d07f2134f3e0f2339f278b8a168f85df" },
+ { "luaotfload-glyphlist.lua", "fa2a4b91221ca59a6af8ebf8f6d36092" },
{ "luaotfload-characters.lua", "76415ca3ede312cad6e09038323489ae" },
- { "luaotfload-dvi.lua", "1f7115699a2b1e2b2dde2b2b06ecd6ea" },
- { "luaotfload-tounicode.lua", "57ebeb53c32ecf935c1f112e4d24e5a9" },
- { "luaotfload-unicode.lua", "6120395bbbd42023921c1e6eb5052fd8" },
- { "luaotfload-resolvers.lua", "84b3b14ab66c0c1b333cbd9f663908c9" },
- { "luaotfload-parsers.lua", "23650dae431d465b1f6599ffed4ee83f" },
- { "luaotfload-fallback.lua", "c5e14a494096dc9b1c20c04483f4fef3" },
- { "luaotfload-szss.lua", "3407719a32287f12a3f807f71ab5f24e" },
- { "luaotfload-scripts.lua", "01e3be892a2a4faa9d84d84ada15c367" },
- { "luaotfload-multiscript.lua", "5967d18a69e3b0dda2c5c1413e793984" },
- { "luaotfload-loaders.lua", "de540857896f6407e991dd00d8a9ccef" },
- { "luaotfload-harf-plug.lua", "7c8b3a70bc9e3989195ef8023620bb41" },
- { "luaotfload-harf-define.lua", "c39204ae392eebf0b121023a77b97e8e" },
- { "luaotfload-notdef.lua", "5dd6d665246f2af6225936cfde4a90c0" },
- { "luaotfload-embolden.lua", "7c1a7a88620b651b2564bfd6c2080e72" },
- { "luaotfload-letterspace.lua", "9907c492ff6c0c917578d1477ac3c16d" },
- { "luaotfload-features.lua", "902db5fc4316aa7c63c9f3e6565a2302" },
- { "luaotfload-database.lua", "99e8682432de72337f4f635c31b373c2" },
- { "luaotfload-configuration.lua", "261b1e6e7c1d79958008162bd376be52" },
- { "luaotfload-colors.lua", "238f8d1c9a0a296341ebc9b6522d668e" },
- { "luaotfload-auxiliary.lua", "a1a411bc17c7d147250ab04da62d205e" },
- { "luaotfload-filelist.lua", "c141386c0b9262d1e6e54228b35dac13" },
- { "luaotfload-tool.lua", "cea092171f0ca1ffc342aa66ad261d8f" },
- { "luaotfload-diagnostics.lua", "c54effd99e8412784d5c9876c6d298de" },
- { "luaotfload-log.lua", "01c847f9d12312f80971ae4eb04fa0ce" },
- { "luaotfload-init.lua", "aa5b3603a1b2696a27cd055e9174478a" },
+ { "luaotfload-dvi.lua", "2c42e84f6c9cfdbe19bcc544f74bc3c8" },
+ { "luaotfload-tounicode.lua", "c5b104d6d5d1d86f13d45294df8ac77f" },
+ { "luaotfload-unicode.lua", "2ac5fb697191fbe7f30f4ab4e5f7037b" },
+ { "luaotfload-resolvers.lua", "70abe38786679abb1ca55cc5911bba83" },
+ { "luaotfload-parsers.lua", "72ab0dbd52fba0249530872bfde6163b" },
+ { "luaotfload-fallback.lua", "653007bbe201edfe3d3841af3ec39b70" },
+ { "luaotfload-szss.lua", "df7e044b32e6fa3105ebd7f31e5b03cf" },
+ { "luaotfload-scripts.lua", "0d7bf2d895f46c408c26f23f5035affb" },
+ { "luaotfload-multiscript.lua", "47e8a08c7271b9d660321631f3140a4c" },
+ { "luaotfload-loaders.lua", "3acb9dc1e0f02d2ecee1ef144597caf6" },
+ { "luaotfload-harf-plug.lua", "5274ff4eec2421572adbf4bf293fcd8c" },
+ { "luaotfload-harf-define.lua", "0074c52e9baf538bfec8d4636552e466" },
+ { "luaotfload-notdef.lua", "d1797bb1db42c691a1196a713c2e1936" },
+ { "luaotfload-embolden.lua", "9b611178cd9acaa482f8be85f384d201" },
+ { "luaotfload-letterspace.lua", "66348b58834d4cc954acd02bab149085" },
+ { "luaotfload-features.lua", "23685ea0c4f4ba1adc4f9bdc467cfe34" },
+ { "luaotfload-database.lua", "2c2ae0362806ef21ef2862326bc09c60" },
+ { "luaotfload-configuration.lua", "34e76cd86a01213964c0f4d8b32c8858" },
+ { "luaotfload-colors.lua", "1dadb911d3763a9517bc499d2652f431" },
+ { "luaotfload-auxiliary.lua", "77787effc3f19842cd3df8641c1b1db5" },
+ { "luaotfload-filelist.lua", "7a7aef4439461fa4b00231ac898abe82" },
+ { "luaotfload-tool.lua", "6d582c12a960d475eeedf4dcd1ac5669" },
+ { "luaotfload-diagnostics.lua", "4791249fede247e2c4346ab7f20d0d35" },
+ { "luaotfload-log.lua", "dcd5da60663d042e45c60852b7edd23b" },
+ { "luaotfload-init.lua", "2dc0709188f1ce7741f103949ebc9e67" },
{ "luaotfload-main.lua", "b19c9cc34cf1d676c39f872cfb41aef6" },
},
["notes"]={
["committer"]="Marcel Fabian Krüger <tex@2krueger.de>",
- ["description"]="v3.24/2023-08-19",
+ ["description"]="v3.26/2023-08-31",
["loader"]="fontloader-2023-08-19.lua",
- ["revision"]="fc1177f247ae78a916f4ef5387ec7e29b8cd8155",
- ["timestamp"]="2023-08-19 23:56:21 +0200",
+ ["revision"]="dc84dc80eeefae198d20f414ce1a3547f721446e",
+ ["timestamp"]="2023-08-31 20:10:15 +0200",
},
} \ No newline at end of file
diff --git a/macros/luatex/generic/luaotfload/luaotfload-suppress.lua b/macros/luatex/generic/luaotfload/luaotfload-suppress.lua
index a8f283d972..c9fcfc8c2e 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-suppress.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-suppress.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-suppress",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / suppress",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-szss.lua b/macros/luatex/generic/luaotfload/luaotfload-szss.lua
index 30e9000064..95ac6b4d08 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-szss.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-szss.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-szss",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / Special feature handling",
license = "GPL v2.0",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.1 b/macros/luatex/generic/luaotfload/luaotfload-tool.1
index 58b9122109..cd100af1f0 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.1
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.1
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
-.TH LUAOTFLOAD-TOOL 1 "2023-08-19" "3.24" "text processing"
+.TH LUAOTFLOAD-TOOL 1 "2023-08-31" "3.26" "text processing"
.SH NAME
luaotfload-tool \- generate and query the Luaotfload font names database
.
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.lua b/macros/luatex/generic/luaotfload/luaotfload-tool.lua
index 0883ee5ad2..9eeed6dc2c 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.lua
@@ -9,8 +9,8 @@
local ProvidesLuaModule = {
name = "luaotfload-tool",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload-tool / database functionality",
license = "GPL v2.0"
}
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.pdf b/macros/luatex/generic/luaotfload/luaotfload-tool.pdf
index 9f39d422c1..e1a613e4b1 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.pdf
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tool.rst b/macros/luatex/generic/luaotfload/luaotfload-tool.rst
index 92c7839ddf..6ef9270430 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tool.rst
+++ b/macros/luatex/generic/luaotfload/luaotfload-tool.rst
@@ -6,9 +6,9 @@
generate and query the Luaotfload font names database
-----------------------------------------------------------------------
-:Date: 2023-08-19
+:Date: 2023-08-31
:Copyright: GPL v2.0
-:Version: 3.24
+:Version: 3.26
:Manual section: 1
:Manual group: text processing
diff --git a/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua b/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua
index a78218f09b..00496d9ea8 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-tounicode.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-tounicode",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / tounicode",
license = "GPL v2.0",
author = "Hans Hagen, Khaled Hosny, Elie Roux, Philipp Gesang, Marcel Krüger",
diff --git a/macros/luatex/generic/luaotfload/luaotfload-unicode.lua b/macros/luatex/generic/luaotfload/luaotfload-unicode.lua
index cd67be7b75..975813d468 100644
--- a/macros/luatex/generic/luaotfload/luaotfload-unicode.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload-unicode.lua
@@ -5,8 +5,8 @@
assert(luaotfload_module, "This is a part of luaotfload and should not be loaded independently") {
name = "luaotfload-unicode",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "luaotfload submodule / Unicode helpers",
license = "CC0 1.0 Universal",
author = "Marcel Krüger"
diff --git a/macros/luatex/generic/luaotfload/luaotfload.conf.5 b/macros/luatex/generic/luaotfload/luaotfload.conf.5
index 56160f89fe..457025497e 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.conf.5
+++ b/macros/luatex/generic/luaotfload/luaotfload.conf.5
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText.
.
-.TH LUAOTFLOAD.CONF 5 "2023-08-19" "3.24" "text processing"
+.TH LUAOTFLOAD.CONF 5 "2023-08-31" "3.26" "text processing"
.SH NAME
luaotfload.conf \- Luaotfload configuration file
.
diff --git a/macros/luatex/generic/luaotfload/luaotfload.conf.rst b/macros/luatex/generic/luaotfload/luaotfload.conf.rst
index 3604422099..877699a404 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.conf.rst
+++ b/macros/luatex/generic/luaotfload/luaotfload.conf.rst
@@ -6,9 +6,9 @@
Luaotfload configuration file
-----------------------------------------------------------------------
-:Date: 2023-08-19
+:Date: 2023-08-31
:Copyright: GPL v2.0
-:Version: 3.24
+:Version: 3.26
:Manual section: 5
:Manual group: text processing
diff --git a/macros/luatex/generic/luaotfload/luaotfload.lua b/macros/luatex/generic/luaotfload/luaotfload.lua
index 2125387b90..798fa8d45f 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.lua
+++ b/macros/luatex/generic/luaotfload/luaotfload.lua
@@ -20,8 +20,8 @@ local authors = "\z
-- version number is used below!
local ProvidesLuaModule = {
name = "luaotfload",
- version = "3.24", --TAGVERSION
- date = "2023-08-19", --TAGDATE
+ version = "3.26", --TAGVERSION
+ date = "2023-08-31", --TAGDATE
description = "Lua based OpenType font support",
author = authors,
copyright = authors,
diff --git a/macros/luatex/generic/luaotfload/luaotfload.sty b/macros/luatex/generic/luaotfload/luaotfload.sty
index 44fce07432..c68e171cbc 100644
--- a/macros/luatex/generic/luaotfload/luaotfload.sty
+++ b/macros/luatex/generic/luaotfload/luaotfload.sty
@@ -39,7 +39,7 @@
\fi
\ifdefined\ProvidesPackage
\ProvidesPackage{luaotfload}%
- [2023/08/19 v3.24 OpenType layout system]
+ [2023/08/31 v3.26 OpenType layout system]
\fi
\directlua{
if xpcall(function ()%
diff --git a/macros/luatex/generic/luaotfload/scripts-demo.pdf b/macros/luatex/generic/luaotfload/scripts-demo.pdf
index b6d0e7dd4c..ab6d26d476 100644
--- a/macros/luatex/generic/luaotfload/scripts-demo.pdf
+++ b/macros/luatex/generic/luaotfload/scripts-demo.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf b/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf
index 0c0ca16b3d..129ca94725 100644
--- a/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf
+++ b/macros/luatex/generic/luaotfload/shaper-demo-graphite.pdf
Binary files differ
diff --git a/macros/luatex/generic/luaotfload/shaper-demo.pdf b/macros/luatex/generic/luaotfload/shaper-demo.pdf
index a51bc51822..01f952dcca 100644
--- a/macros/luatex/generic/luaotfload/shaper-demo.pdf
+++ b/macros/luatex/generic/luaotfload/shaper-demo.pdf
Binary files differ