summaryrefslogtreecommitdiff
path: root/macros/latex/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib')
-rw-r--r--macros/latex/contrib/acmart/ACM-Reference-Format.cbx5
-rw-r--r--macros/latex/contrib/acmart/Makefile37
-rw-r--r--macros/latex/contrib/acmart/README5
-rw-r--r--macros/latex/contrib/acmart/acmart.dtx70
-rw-r--r--macros/latex/contrib/acmart/acmart.pdfbin863525 -> 866366 bytes
-rw-r--r--macros/latex/contrib/acmart/acmauthoryear.bbx900
-rw-r--r--macros/latex/contrib/acmart/acmauthoryear.cbx219
-rw-r--r--macros/latex/contrib/acmart/acmdatamodel.dbx (renamed from macros/latex/contrib/acmart/ACM-Reference-Format.dbx)17
-rw-r--r--macros/latex/contrib/acmart/acmguide.pdfbin420338 -> 424543 bytes
-rw-r--r--macros/latex/contrib/acmart/acmnumeric.bbx (renamed from macros/latex/contrib/acmart/ACM-Reference-Format.bbx)71
-rw-r--r--macros/latex/contrib/acmart/acmnumeric.cbx5
-rw-r--r--macros/latex/contrib/acmart/samples/abbrev.bib86
-rw-r--r--macros/latex/contrib/acmart/samples/sample-acmlarge.pdfbin610121 -> 606012 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-acmsmall-biblatex.pdfbin0 -> 628553 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-acmsmall-conf.pdfbin1054227 -> 1050052 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-acmsmall-submission.pdfbin622637 -> 618411 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-acmsmall.pdfbin620122 -> 615907 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-acmtog.pdfbin567307 -> 563275 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-authordraft.pdfbin1047403 -> 1043258 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-lualatex.pdfbin781211 -> 780356 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-manuscript.pdfbin622255 -> 618058 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-sigconf-biblatex.pdfbin0 -> 615620 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-sigconf-i13n.pdfbin1059382 -> 1055507 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-sigconf.pdfbin1043594 -> 1039457 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-sigplan.pdfbin1052136 -> 1048146 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/sample-xelatex.pdfbin659566 -> 659217 bytes
-rw-r--r--macros/latex/contrib/acmart/samples/samples.dtx137
-rw-r--r--macros/latex/contrib/acmart/samples/samples.ins2
-rw-r--r--macros/latex/contrib/acmart/samples/software.bib145
-rw-r--r--macros/latex/contrib/l3backend/CHANGELOG.md16
-rw-r--r--macros/latex/contrib/l3backend/README.md2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-basics.dtx43
-rw-r--r--macros/latex/contrib/l3backend/l3backend-box.dtx2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-code.pdfbin896928 -> 896719 bytes
-rw-r--r--macros/latex/contrib/l3backend/l3backend-color.dtx205
-rw-r--r--macros/latex/contrib/l3backend/l3backend-draw.dtx2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-graphics.dtx412
-rw-r--r--macros/latex/contrib/l3backend/l3backend-header.dtx2
-rw-r--r--macros/latex/contrib/l3backend/l3backend-opacity.dtx45
-rw-r--r--macros/latex/contrib/l3backend/l3backend-pdf.dtx26
-rw-r--r--macros/latex/contrib/l3experimental/CHANGELOG.md13
-rw-r--r--macros/latex/contrib/l3experimental/README.md2
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.pdfbin308229 -> 308189 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3bitset.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3bitset.pdfbin404059 -> 404028 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-boxes.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-code.pdfbin667718 -> 667715 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-layers.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-paths.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-points.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-scopes.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-softpath.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-state.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-transforms.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.pdfbin517401 -> 517374 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3galley.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3galley.pdfbin408601 -> 408561 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.dtx546
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.pdfbin383689 -> 381794 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3opacity.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3opacity.pdfbin334749 -> 334716 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3str-format.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3str-format.pdfbin367684 -> 367649 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.dtx6
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.pdfbin347717 -> 347684 bytes
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.pdfbin394161 -> 394120 bytes
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.pdfbin299384 -> 299343 bytes
-rw-r--r--macros/latex/contrib/l3kernel/CHANGELOG.md23
-rw-r--r--macros/latex/contrib/l3kernel/README.md2
-rw-r--r--macros/latex/contrib/l3kernel/expl3.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/expl3.pdfbin622328 -> 622447 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.pdfbin1766307 -> 1763985 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3basics.dtx9
-rw-r--r--macros/latex/contrib/l3kernel/l3bootstrap.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3box.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3candidates.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3cctab.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3clist.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3coffins.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3color.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3debug.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3deprecation.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.dtx64
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.pdfbin551310 -> 554414 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.pdfbin151420 -> 151536 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3expan.dtx30
-rw-r--r--macros/latex/contrib/l3kernel/l3file.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3flag.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-assign.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-aux.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-expo.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-extended.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-logic.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-parse.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-random.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-round.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-traps.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-trig.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fparray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3int.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3intarray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3kernel-functions.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3keys.dtx125
-rw-r--r--macros/latex/contrib/l3kernel/l3legacy.dtx16
-rw-r--r--macros/latex/contrib/l3kernel/l3luatex.dtx3
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3names.dtx25
-rw-r--r--macros/latex/contrib/l3kernel/l3news.pdfbin395879 -> 395879 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news01.pdfbin122710 -> 122710 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news02.pdfbin150676 -> 150676 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news03.pdfbin148702 -> 148702 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news04.pdfbin114588 -> 114588 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news05.pdfbin112487 -> 112487 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news06.pdfbin151573 -> 151573 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news07.pdfbin128309 -> 128309 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news08.pdfbin163454 -> 163454 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news09.pdfbin250139 -> 250139 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news10.pdfbin150279 -> 150279 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news11.pdfbin170063 -> 170063 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news12.pdfbin204990 -> 204990 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3pdf.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.csv5
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.pdfbin80970 -> 81407 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prg.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prop.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3quark.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3regex.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3seq.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3skip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3sort.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str.dtx148
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.pdfbin295811 -> 295942 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.pdfbin242479 -> 242612 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3sys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.pdfbin230878 -> 230994 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-case.dtx33
-rw-r--r--macros/latex/contrib/l3kernel/l3text-purify.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text.dtx68
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-analysis.dtx55
-rw-r--r--macros/latex/contrib/l3kernel/l3tl.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3token.dtx34
-rw-r--r--macros/latex/contrib/l3kernel/l3unicode.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/source3.pdfbin6939209 -> 6952124 bytes
-rw-r--r--macros/latex/contrib/l3kernel/source3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/source3body.tex4
158 files changed, 2858 insertions, 965 deletions
diff --git a/macros/latex/contrib/acmart/ACM-Reference-Format.cbx b/macros/latex/contrib/acmart/ACM-Reference-Format.cbx
deleted file mode 100644
index 7ec588b2cb..0000000000
--- a/macros/latex/contrib/acmart/ACM-Reference-Format.cbx
+++ /dev/null
@@ -1,5 +0,0 @@
-\ProvidesFile{ACM-Reference-Format.cbx}[2017-09-27 v0.1]
-
-\RequireCitationStyle{numeric}
-
-\endinput
diff --git a/macros/latex/contrib/acmart/Makefile b/macros/latex/contrib/acmart/Makefile
index 916c87c9f1..44f80ef195 100644
--- a/macros/latex/contrib/acmart/Makefile
+++ b/macros/latex/contrib/acmart/Makefile
@@ -11,8 +11,10 @@ PACKAGE=acmart
PDF = $(PACKAGE).pdf acmguide.pdf
-all: ${PDF} ALLSAMPLES
+BIBLATEXFILES= $(wildcard *.bbx) $(wildcard *.cbx) $(wildcard *.dbx) $(wildcard *.lbx)
+SAMPLEBIBLATEXFILES=$(patsubst %,samples/%,$(BIBLATEXFILES))
+all: ${PDF} ALLSAMPLES
%.pdf: %.dtx $(PACKAGE).cls
pdflatex $<
@@ -36,7 +38,7 @@ acmguide.pdf: $(PACKAGE).dtx $(PACKAGE).cls
pdflatex $<
-ALLSAMPLES:
+ALLSAMPLES: $(SAMPLEBIBLATEXFILES)
cd samples; pdflatex samples.ins; cd ..
for texfile in samples/*.tex; do \
pdffile=$${texfile%.tex}.pdf; \
@@ -50,6 +52,17 @@ samples/%: %
samples/$(PACKAGE).cls: $(PACKAGE).cls
samples/ACM-Reference-Format.bst: ACM-Reference-Format.bst
+samples/abbrev.bib: ACM-Reference-Format.bst
+ perl -pe 's/MACRO ({[^}]*}) *\n/MACRO \1/' ACM-Reference-Format.bst \
+ | grep MACRO | sed 's/MACRO {/@STRING{/' \
+ | sed 's/} *{/ = /' > samples/abbrev.bib
+
+
+samples/%.bbx: %.bbx
+samples/%.cbx: %.cbx
+samples/%.dbx: %.dbx
+samples/%.lbx: %.lbx
+
samples/%.pdf: samples/%.tex samples/$(PACKAGE).cls samples/ACM-Reference-Format.bst
cd $(dir $@) && pdflatex-dev $(notdir $<)
- cd $(dir $@) && bibtex $(notdir $(basename $<))
@@ -58,6 +71,22 @@ samples/%.pdf: samples/%.tex samples/$(PACKAGE).cls samples/ACM-Reference-For
while ( grep -q '^LaTeX Warning: Label(s) may have changed' $(basename $<).log) \
do cd $(dir $@) && pdflatex-dev $(notdir $<); done
+samples/sample-sigconf-biblatex.pdf: samples/sample-sigconf-biblatex.tex $(SAMPLEBIBLATEXFILES)
+ cd $(dir $@) && pdflatex-dev $(notdir $<)
+ - cd $(dir $@) && biber $(notdir $(basename $<))
+ cd $(dir $@) && pdflatex-dev $(notdir $<)
+ cd $(dir $@) && pdflatex-dev $(notdir $<)
+ while ( grep -q '^LaTeX Warning: Label(s) may have changed' $(basename $<).log) \
+ do cd $(dir $@) && pdflatex-dev $(notdir $<); done
+
+samples/sample-acmsmall-biblatex.pdf: samples/sample-acmsmall-biblatex.tex $(SAMPLEBIBLATEXFILES)
+ cd $(dir $@) && pdflatex-dev $(notdir $<)
+ - cd $(dir $@) && biber $(notdir $(basename $<))
+ cd $(dir $@) && pdflatex-dev $(notdir $<)
+ cd $(dir $@) && pdflatex-dev $(notdir $<)
+ while ( grep -q '^LaTeX Warning: Label(s) may have changed' $(basename $<).log) \
+ do cd $(dir $@) && pdflatex-dev $(notdir $<); done
+
samples/sample-xelatex.pdf: samples/sample-xelatex.tex samples/$(PACKAGE).cls samples/ACM-Reference-Format.bst
cd $(dir $@) && xelatex-dev $(notdir $<)
- cd $(dir $@) && bibtex $(notdir $(basename $<))
@@ -86,8 +115,8 @@ docclean:
*.dvi *.ps *.thm *.tgz *.zip *.rpi \
samples/$(PACKAGE).cls samples/ACM-Reference-Format.bst \
samples/*.log samples/*.aux samples/*.out \
- samples/*.bbl samples/*.blg samples/*.cut
-
+ samples/*.bbl samples/*.blg samples/*.cut \
+ samples/*.run.xml samples/*.bcf $(SAMPLEBIBLATEXFILES)
clean: docclean
diff --git a/macros/latex/contrib/acmart/README b/macros/latex/contrib/acmart/README
index 0e67fae461..fd58d1d82e 100644
--- a/macros/latex/contrib/acmart/README
+++ b/macros/latex/contrib/acmart/README
@@ -12,6 +12,11 @@ The production version is the one on CTAN and ACM sites.
Changes
+Version 1.84 Support for BibLaTeX rewritten (thanks to
+ Roberto Di Cosmo and Kartik Singhal)
+ Corrected German translation (thanks to Dirk Beyer)
+ New journals
+
Version 1.83 Support for multilanguage papers
ISSN changes for some journals
diff --git a/macros/latex/contrib/acmart/acmart.dtx b/macros/latex/contrib/acmart/acmart.dtx
index 01f6c81eba..e33a089ce8 100644
--- a/macros/latex/contrib/acmart/acmart.dtx
+++ b/macros/latex/contrib/acmart/acmart.dtx
@@ -1,6 +1,6 @@
% \iffalse
%
-% Copyright 2016-2021, Association for Computing Machinery
+% Copyright 2016-2022, Association for Computing Machinery
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3 of this license or (at your option) any
@@ -57,7 +57,7 @@
% \ifx\currentjob\guide\OnlyDescription\fi
% \GetFileInfo{acmart.dtx}
% \title{\LaTeX{} Class for the \emph{Association for Computing
-% Machinery}\thanks{\copyright 2016--2021, Association for Computing Machinery}}
+% Machinery}\thanks{\copyright 2016--2022, Association for Computing Machinery}}
% \author{Boris Veytsman\thanks{%
% \href{mailto:borisv@lk.net}{\texttt{borisv@lk.net}},
% \href{mailto:boris@varphi.com}{\texttt{boris@varphi.com}}}}
@@ -106,6 +106,7 @@
% Yegor Bugayenko,
% Benjamin Byholm,
% John Collins,
+% Roberto Di Cosmo,
% Nils Anders Danielsson,
% Michael Ekstrand,
% Matthew Fluet,
@@ -301,7 +302,7 @@
% \midrule
% manuscript & A manuscript. This is the default. \\
% acmsmall & Small single-column format. Used for CIE, CSUR,
-% DLT, FAC, JACM, JDIQ, JEA, JERIC,
+% DLT, FAC, GAMES, JACM, JDIQ, JDS, JEA, JERIC,
% JETC, PACMCGIT, PACMHCI, PACMPL, TAAS, TACCESS, TACO,
% TALG, TALLIP (formerly TALIP), TCPS, TDS,
% TEAC, TECS, TELO, THRI, TIIS, TIOT, TISSEC, TIST, TKDD, TMIS,
@@ -1506,7 +1507,11 @@
%\subsection{Bibliography}
%\label{sec:ug_bibliography}
%
-% The ACM uses the |natbib| package for formatting references and
+% The ACM lets you use either Bib\TeX\ or Bib\LaTeX\ to process your references:
+% they require slightly different setup of your \LaTeX\ file, as detailed in
+% the following subsections.
+%\subsubsection{Processing using Bib\TeX}
+% This uses the |natbib| package for formatting references and
% the Bib\TeX\ style file \path{ACM-Reference-Format.bst} for Bib\TeX\
% processing. You can disable loading of |natbib| using the
% option |natbib=false| in \cs{documentclass}. However, it is not
@@ -1702,7 +1707,44 @@
% are includes, so you can use strings like |journal = taccess| for
% \emph{ACM Transactions on Accessible Computing}.
%
+%\subsubsection{Processing using Bib\LaTeX}
+% You will find in this package two sets of style files for Bib\LaTeX,
+% \verb|acmnumeric| and \verb|acmauthoryear|, that mimic the behaviour
+% of the ACM-Reference-Format.bst Bib\TeX\ sytle. They provide you
+% access to all the power of Bib\LaTeX\ and already include
+% support for advanced citation of software artefact from the
+% \verb|biblatex-software| package, also separately available on CTAN.
+% Look at the \verb|biblatex-software| documentation to learn more about
+% what it offers.
+%
+% There are a few key differences in how the \LaTeX\ sources are set up
+% when using Bib\LaTeX\ instead of Bib\TeX, that we summarize briefly
+% here (please refer to the official Bib\LaTeX\ documentation for more details).
%
+% In the preamble of your document you need to load the Bib\LaTeX\ package
+% and select the approriate bibliography style, as follows
+% \begin{verbatim}
+% \RequirePackage[
+% datamodel=acmdatamodel,
+% style=acmnumeric, % use style=acmauthoryear for publications that require it
+% ]{biblatex}
+% \end{verbatim}
+%
+% Also in the preamble, you need to declare the bibliography sources files
+% using the \verb|\addbibresouce| directe (one \verb|\addbibresource|
+% command per source file), e.g.:
+% \begin{verbatim}
+% \addbibresource{software.bib}
+% \addbibresource{sample-base.bib}
+% \end{verbatim}
+%
+% At the end of the document, where you want the bibliography to appear,
+% you need to place the command \verb|\printbibliography|.
+%
+% Look at the \verb|sample-*-biblatex.tex| files that can be found in the samples
+% directory after running \verb|make| for templates showcasing
+% these Bib\LaTeX\ styles.
+
%\subsection{Colors}
%\label{sec:ug_colors}
%
@@ -1910,11 +1952,13 @@
% DGOV & Digital Government: Research and Practice \\
% DTRAP & Digital Threats: Research and Practice\\
% FAC & Formal Aspects of Computing \\
+% GAMES & ACM Games: Research and Practice\\
% HEALTH & ACM Transactions on Computing for Healthcare\\
% IMWUT & PACM on Interactive, Mobile, Wearable and Ubiquitous
% Technologies\\
% JACM & Journal of the ACM \\
% JDIQ & ACM Journal of Data and Information Quality \\
+% JDS & ACM/IMS Journal of Data Science \\
% JEA & ACM Journal of Experimental Algorithmics \\
% JERIC & ACM Journal of Educational Resources in Computing\\
% JETC & ACM Journal on Emerging Technologies in Computing Systems \\
@@ -2043,7 +2087,7 @@
\ProvidesFile{acmart.dtx}
%</gobble>
%<class>\ProvidesClass{acmart}
-[2022/02/19 v1.83 Typesetting articles for the Association for Computing Machinery]
+[2022/04/09 v1.84 Typesetting articles for the Association for Computing Machinery]
% \end{macrocode}
%
% \changes{v1.00}{2016/04/14}{First released version}
@@ -2151,6 +2195,7 @@
% fonts}
% \changes{1.75}{2020/10/29}{Documentation update}
% \changes{1.78}{2021/05/01}{Documentation update: Word count}
+% \changes{1.84}{2022/04/09}{New journals: JDS, GAMES}
%
% And the driver code:
% \begin{macrocode}
@@ -2821,9 +2866,9 @@
}%
\addto\captionsgerman{%
\if@ACM@journal
- \renewcommand\keywordsname{Zusätzliche Schlüsselwörter und Phrasen}%
+ \renewcommand\keywordsname{Zusätzliche Schlagwörter und Phrasen}%
\else
- \renewcommand\keywordsname{Schlüsselwörter}%
+ \renewcommand\keywordsname{Schlagwörter}%
\fi
\renewcommand\acksname{Danksagungen}%
}%
@@ -4004,6 +4049,7 @@
% \changes{1.80}{2021/09/24}{Added DLT and FAC}
% \changes{1.82}{2022/02/05}{Updated abbreviations and codes for
% several journals}
+% \changes{1.84}{2022/04/09}{New journals: JDS, GAMES}
%
% We use the |xkeyval| interface to define journal titles and the relevant
% information
@@ -4015,10 +4061,12 @@
DLT,%
DTRAP,%
FAC,%
+ GAMES,%
HEALTH,%
IMWUT,%
JACM,%
JDIQ,%
+ JDS,%
JEA,%
JERIC,%
JETC,%
@@ -4099,6 +4147,9 @@
\def\@journalNameShort{Form. Asp. Comput.}%
\def\@permissionCodeOne{0934-5043}%
\def\@permissionCodeTwo{1433-299X}%
+\or % GAMES
+ \def\@journalName{ACM Games: Research and Practice}%
+ \def\@journalNameShort{ACM Games}%
\or % HEALTH
\def\@journalName{ACM Transactions on Computing for Healthcare}%
\def\@journalNameShort{ACM Trans. Comput. Healthcare}%
@@ -4118,6 +4169,11 @@
\def\@journalName{ACM Journal of Data and Information Quality}%
\def\@journalNameShort{ACM J. Data Inform. Quality}%
\def\@permissionCodeOne{1936-1955}%
+\or % JDS
+ \def\@journalName{ACM/JMS Journal of Data Science}%
+ \def\@journalNameShort{ACM/IMS J. Data Sci.}%
+ \def\@permissionCodeOne{2831-3194}%
+ \def\@permissionCodeTwo{2831-3194}%
\or % JEA
\def\@journalName{ACM Journal of Experimental Algorithmics}%
\def\@journalNameShort{ACM J. Exp. Algor.}%
diff --git a/macros/latex/contrib/acmart/acmart.pdf b/macros/latex/contrib/acmart/acmart.pdf
index cdeaf52e2f..eff9c12b4a 100644
--- a/macros/latex/contrib/acmart/acmart.pdf
+++ b/macros/latex/contrib/acmart/acmart.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/acmauthoryear.bbx b/macros/latex/contrib/acmart/acmauthoryear.bbx
new file mode 100644
index 0000000000..de5e3c6c06
--- /dev/null
+++ b/macros/latex/contrib/acmart/acmauthoryear.bbx
@@ -0,0 +1,900 @@
+\ProvidesFile{acmauthoryear.bbx}[2022-02-14 v0.1 biblatex bibliography style]
+
+% Inherit a default style
+\RequireBibliographyStyle{authoryear-comp}
+
+%%% New command definitions from trad-standard.bbx
+
+\newcommand*{\newcommaunit}{\@ifstar\newcommaunitStar\newcommaunitNoStar}
+\newcommand*{\newcommaunitStar}{\setunit*{\addcomma\space}}
+\newcommand*{\newcommaunitNoStar}{\setunit{\addcomma\space}}
+
+%%% Forward compatibility for date+extradate
+
+\ifcsundef{ifbibmacroundef}{
+ \ifcsundef{abx@macro@date+extradate}{ %%% For really really old biblatex that miss \ifbibmacroundef
+ \blx@warning{bibmacro 'date+extradate' is missing.\MessageBreak
+ Please consider updating your version of biblatex.\MessageBreak
+ Using 'date+extrayear' instead}%
+ \providebibmacro*{date+extradate}{\usebibmacro{date+extrayear}}
+ }{}
+ }
+ {
+ \ifbibmacroundef{date+extradate}{
+ \blx@warning{bibmacro 'date+extradate' is missing.\MessageBreak
+ Please consider updating your version of biblatex.\MessageBreak
+ Using 'date+extrayear' instead}%
+ \providebibmacro*{date+extradate}{\usebibmacro{date+extrayear}}
+ }{}
+ }
+
+%%% Localisation strings for ACM
+
+\DefineBibliographyStrings{american}{%
+ mathesis = {Master's thesis},
+ phdthesis = {Ph\adddot{}D\adddotspace Dissertation},
+ editor = {(Ed\adddot)},
+ editors = {(Eds\adddot)},
+ edition = {ed\adddot},
+}
+
+
+
+%%% Formatting for fields
+
+%\DeclareFieldFormat
+% [article,inbook,incollection,inproceedings,patent,thesis,unpublished]
+% {title}{#1}
+\DeclareFieldFormat{pages}{#1}
+
+\DeclareFieldFormat{numpages}{#1 pages}
+
+\DeclareFieldFormat{number}{#1}
+
+\DeclareFieldFormat{articleno}{Article #1}
+
+\DeclareFieldFormat{key}{#1}
+
+\DeclareFieldFormat{urldate}{Retrieved\space{}#1\space{}from}
+\DeclareFieldFormat{lastaccessed}{Retrieved\space{}#1\space{}from}
+
+\DeclareFieldFormat{url}{\url{#1}}
+
+\DeclareFieldFormat{edition}{%
+ \printtext[parens]{\ifinteger{#1}
+ {\mkbibordedition{#1}~\bibstring{edition}}
+ {#1\isdot~\bibstring{edition}}}}
+
+
+% Handle urls field containing 'and' separated list of URLs
+% https://github.com/plk/biblatex/issues/229
+\DeclareListFormat{urls}{%
+ \url{#1}%
+ \ifthenelse{\value{listcount}<\value{liststop}}
+ {\addcomma\space}
+ {}}
+\renewbibmacro*{url}{\iffieldundef{url}{\printlist{urls}}{\printfield{url}}}
+
+%%% Bibmacro definitions
+
+\renewbibmacro*{translator+others}{%
+ \ifboolexpr{
+ test \ifusetranslator
+ and
+ not test {\ifnameundef{translator}}
+ }
+ {\printnames{translator}%
+ \setunit{\addcomma\space}%
+ \usebibmacro{translator+othersstrg}%
+ \clearname{translator}}
+ {\printfield{key}}}
+
+\newbibmacro*{year}{%
+ \iffieldundef{year}%
+ {\printtext{[n.\ d.]}}%
+ {\printfield{year}}%
+}
+
+\renewbibmacro*{date}{\printtext[parens]{\printdate}}
+
+
+\renewbibmacro*{url+urldate}{\iffieldundef{urlyear}
+ {\iffieldundef{lastaccessed}
+ {}
+ {\printfield{lastaccessed}%
+ \setunit*{\addspace}}%
+ }
+ {\usebibmacro{urldate}%
+ \setunit*{\addspace}}%
+ \usebibmacro{url}%
+ }
+
+\renewbibmacro*{journal+issuetitle}{%
+ \usebibmacro{journal}%
+ \setunit*{\addcomma\space}%
+ \iffieldundef{series}
+ {}
+ {\newunit%
+ \printfield{series}%
+ \setunit{\addspace}}%
+ \usebibmacro{volume+number+date+pages+eid}%
+ \newcommaunit%
+% \setunit{\addspace}%
+ \usebibmacro{issue-issue}%
+ \setunit*{\addcolon\space}%
+ \usebibmacro{issue}%
+ \newunit}
+
+
+
+\newbibmacro*{volume+number+date+pages+eid}{%
+ \printfield{volume}%
+ \setunit*{\addcomma\space}%
+ \printfield{number}%
+ \setunit*{\addcomma\space}%
+ \printfield{articleno}
+ \setunit{\addcomma\space}
+ \usebibmacro{date-ifmonth}
+ \setunit{\addcomma\space}%
+ \iffieldundef{pages}%
+ {\printfield{numpages}}%
+ {\printfield{pages}}%
+ \newcommaunit%
+ \printfield{eid}}%
+
+\renewbibmacro*{chapter+pages}{%
+ \printfield{chapter}%
+ \setunit{\bibpagespunct}%
+ \iffieldundef{pages}%
+ {\printfield{numpages}}%
+ {\printfield{pages}}%
+ \newunit}
+
+\renewbibmacro*{editor+others}{%
+ \ifboolexpr{
+ test \ifuseeditor
+ and
+ not test {\ifnameundef{editor}}
+ }
+ {\printnames{editor}%
+ \setunit{\addcomma\space}%
+ \usebibmacro{editor+othersstrg}%
+ \clearname{editor}}
+ {\iflistundef{organization}{}{\printlist{organization}}}
+ \usebibmacro{date+extradate}
+ }
+
+
+\newbibmacro*{issue-issue}{%
+ \iffieldundef{issue}%
+ {}%
+ {\printfield{issue}%
+ \setunit*{\addcomma\space}%
+ \usebibmacro{date-ifmonth}%
+ }%
+ \newunit}
+
+
+
+
+\newbibmacro*{maintitle+booktitle+series+number}{%
+ \iffieldundef{maintitle}
+ {}
+ {\usebibmacro{maintitle}%
+ \newunit\newblock
+ \iffieldundef{volume}
+ {}
+ {\printfield{volume}%
+ \printfield{part}%
+ \setunit{\addcolon\space}}}%
+ \usebibmacro{booktitle}%
+ \setunit*{\addspace}
+ \printfield[parens]{series}%
+ \setunit*{\addspace}%
+ \printfield{number}%
+ \setunit*{\addcomma\space}%
+ \printfield{articleno}
+ \newunit
+ }
+
+\renewbibmacro*{booktitle}{%
+ \ifboolexpr{
+ test {\iffieldundef{booktitle}}
+ and
+ test {\iffieldundef{booksubtitle}}
+ }
+ {}
+ {\printtext[booktitle]{%
+ \printfield[titlecase]{booktitle}%
+ \iffieldundef{booksubtitle}{}{
+ \setunit{\subtitlepunct}%
+ \printfield[titlecase]{booksubtitle}}%
+ }%
+ }%
+ \printfield{booktitleaddon}}
+
+\renewbibmacro*{volume+number+eid}{%
+ \printfield{volume}%
+ \setunit*{\addcomma\space}%
+ \printfield{number}%
+ \setunit*{\addcomma\space}%
+ \printfield{articleno}
+ \setunit{\addcomma\space}%
+ \printfield{eid}}
+
+
+\renewbibmacro*{publisher+location+date}{%
+ \printlist{publisher}%
+ \setunit*{\addcomma\space}%
+ \printlist{location}%
+ \setunit*{\addcomma\space}%
+ \usebibmacro{date-ifmonth}%
+ \newunit}
+
+
+\newbibmacro{date-ifmonth}{%
+ \iffieldundef{month}{}{%
+ \usebibmacro{date}
+ }%
+}
+
+
+\renewbibmacro*{institution+location+date}{%
+ \printlist{school}%
+ \setunit*{\addcomma\space}%
+ \printlist{institution}%
+ \setunit*{\addcomma\space}%
+ \printlist{location}%
+ \setunit*{\addcomma\space}%
+ \usebibmacro{date-ifmonth}%
+ \newunit}
+
+
+\renewbibmacro*{periodical}{%
+ \iffieldundef{title}
+ {}
+ {\printtext[title]{%
+ \printfield[titlecase]{title}%
+ \setunit{\subtitlepunct}%
+ \printfield[titlecase]{subtitle}}}%
+ \newunit%
+ \usebibmacro{journal}}
+
+\renewbibmacro*{issue+date}{%
+ \iffieldundef{issue}
+ {\usebibmacro{date}}
+ {\printfield{issue}%
+ \setunit*{\addspace}%
+ \usebibmacro{date}}%
+ \newunit}
+
+\renewbibmacro*{title+issuetitle}{%
+ \usebibmacro{periodical}%
+ \setunit*{\addspace}%
+ \iffieldundef{series}
+ {}
+ {\newunit
+ \printfield{series}%
+ \setunit{\addspace}}%
+ \printfield{volume}%
+ \setunit*{\addcomma\space}%
+ \printfield{number}%
+ \setunit*{\addcomma\space}%
+ \printfield{articleno}
+ \setunit{\addcomma\space}%
+ \printfield{eid}%
+ \setunit{\addspace}%
+ \usebibmacro{issue+date}%
+ \setunit{\addcolon\space}%
+ \usebibmacro{issue}%
+ \newunit}
+
+\renewbibmacro*{doi+eprint+url}{%
+ \iftoggle{bbx:url}
+ {\iffieldundef{doi}{
+ \usebibmacro{url+urldate}
+ }{\iffieldundef{distinctURL}
+ {}
+ {\usebibmacro{url+urldate}}
+ }
+ }%
+ \newunit\newblock
+ \iftoggle{bbx:eprint}
+ {\usebibmacro{eprint}}
+ {}%
+ \newunit\newblock
+ \iftoggle{bbx:doi}
+ {\printfield{doi}}
+ {}}
+
+
+%%% Definitions for drivers (alphabetical)
+
+
+
+\DeclareBibliographyDriver{article}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{author/translator+others}%
+ \setunit{\labelnamepunct}\newblock%
+ \usebibmacro{title}%
+ \newunit%
+ \printlist{language}%
+ \newunit\newblock%
+ \usebibmacro{byauthor}%
+ \newunit\newblock%
+ \usebibmacro{bytranslator+others}%
+ \newunit\newblock%
+ \printfield{version}%
+ \newunit\newblock%
+ \usebibmacro{journal+issuetitle}%
+ \newunit%
+ \usebibmacro{byeditor+others}%
+ \newunit%
+ \printfield{note}%
+ \newunit\newblock%
+ \iftoggle{bbx:isbn}
+ {\printfield{isbn}}
+ {}%
+ \newunit\newblock%
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock%
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock%
+ \usebibmacro{related}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareBibliographyDriver{book}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{author/editor+others/translator+others}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{maintitle+title}%
+ \newunit%
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byauthor}%
+ \newunit\newblock
+ \usebibmacro{byeditor+others}%
+ \newunit\newblock
+ \printfield{edition}%
+ \newunit
+ \usebibmacro{series+number}%
+ \iffieldundef{maintitle}
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
+ \newunit
+ \newunit\newblock
+ \printfield{volumes}%
+ \newunit\newblock
+ \printfield{note}%
+ \newunit\newblock
+ \usebibmacro{publisher+location+date}%
+ \newunit\newblock
+ \usebibmacro{chapter+pages}%
+ \newunit
+ \printfield{pagetotal}%
+ \newunit\newblock
+ \iftoggle{bbx:isbn}
+ {\printfield{isbn}}
+ {}%
+ \newunit\newblock
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareBibliographyDriver{inbook}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \iffieldundef{author}%
+ {\usebibmacro{byeditor+others}}%
+ {\usebibmacro{author/translator+others}}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{title}%
+ \newunit
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byauthor}%
+ \newunit\newblock
+% \usebibmacro{in:}%
+ \usebibmacro{bybookauthor}%
+ \newunit\newblock
+ \usebibmacro{maintitle+booktitle}%
+ \newunit\newblock
+ \iffieldundef{author}{}%if undef then we already printed editor
+ {\usebibmacro{byeditor+others}}%
+ \newunit\newblock
+ \printfield{edition}%
+ \newunit
+ \iffieldundef{maintitle}
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
+ \newunit
+ \printfield{volumes}%
+ \newunit\newblock
+ \usebibmacro{series+number}%
+ \newunit\newblock
+ \printfield{note}%
+ \newunit\newblock
+ \usebibmacro{publisher+location+date}%
+ \newunit\newblock
+ \usebibmacro{chapter+pages}%
+ \newunit\newblock
+ \iftoggle{bbx:isbn}
+ {\printfield{isbn}}
+ {}%
+ \newunit\newblock
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareBibliographyDriver{incollection}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{author/translator+others}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{title}%
+ \newunit
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byauthor}%
+ \newunit\newblock
+ \usebibmacro{in:}%
+ \usebibmacro{maintitle+booktitle}%
+ \newunit\newblock
+ \usebibmacro{series+number}%
+ \newunit\newblock
+ \printfield{edition}%
+ \newunit
+ \iffieldundef{maintitle}
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
+ \newunit
+ \printfield{volumes}%
+ \newunit\newblock
+ \usebibmacro{byeditor+others}%
+ \newunit\newblock
+ \printfield{note}%
+ \newunit\newblock
+ \usebibmacro{publisher+location+date}%
+ \newunit\newblock
+ \usebibmacro{chapter+pages}%
+ \newunit\newblock
+ \iftoggle{bbx:isbn}
+ {\printfield{isbn}}
+ {}%
+ \newunit\newblock
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareBibliographyDriver{inproceedings}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{author/translator+others}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{title}%
+ \newunit
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byauthor}%
+ \newunit\newblock
+ \usebibmacro{in:}%
+ \usebibmacro{maintitle+booktitle+series+number}%
+ \newunit\newblock
+ \usebibmacro{event+venue+date}%
+ \newunit\newblock
+ \usebibmacro{byeditor+others}%
+ \newunit\newblock
+ \iffieldundef{maintitle}
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
+ \newunit
+ \printfield{volumes}%
+ \newunit\newblock
+ \printfield{note}%
+ \newunit\newblock
+ \printlist{organization}%
+ \newunit
+ \usebibmacro{publisher+location+date}%
+ \newunit\newblock
+ \usebibmacro{chapter+pages}%
+ \newunit\newblock
+ \iftoggle{bbx:isbn}
+ {\printfield{isbn}}
+ {}%
+ \newunit\newblock
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareBibliographyDriver{manual}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{author/editor+others}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{title}%
+ \newunit
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byauthor}%
+ \newunit\newblock
+ \usebibmacro{byeditor}%
+ \newunit\newblock
+ \printfield{edition}%
+ \newunit\newblock
+ \usebibmacro{series+number}%
+ \newunit\newblock
+ \printfield{type}%
+ \newunit
+ \printfield{version}%
+ \newunit
+ \printfield{note}%
+ \newunit\newblock
+ \printlist{organization}%
+ \newunit
+ \usebibmacro{publisher+location+date}%
+ \newunit\newblock
+ \usebibmacro{chapter+pages}%
+ \newunit
+ \printfield{pagetotal}%
+ \newunit\newblock
+ \iftoggle{bbx:isbn}
+ {\printfield{isbn}}
+ {}%
+ \newunit\newblock
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareBibliographyDriver{misc}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{author/editor+others/translator+others}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{title}%
+ \newunit
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byauthor}%
+ \newunit\newblock
+ \usebibmacro{byeditor+others}%
+ \newunit\newblock
+ \printfield{howpublished}%
+ \newunit\newblock
+ \printfield{type}%
+ \newunit
+ \printfield{version}%
+ \newunit
+ \printfield{note}%
+ \newunit\newblock
+ \usebibmacro{organization+location+date}%
+ \newunit\newblock
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareBibliographyDriver{online}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{author/editor+others/translator+others}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{title}%
+ \newunit
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byauthor}%
+ \newunit\newblock
+ \usebibmacro{byeditor+others}%
+ \newunit\newblock
+ \printfield{version}%
+ \newunit
+ \printfield{note}%
+ \newunit\newblock
+ \printlist{organization}%
+ \newunit\newblock
+ \usebibmacro{date-ifmonth}%
+ \newunit\newblock
+ \iftoggle{bbx:eprint}
+ {\usebibmacro{eprint}}
+ {}%
+ \newunit\newblock
+ \usebibmacro{url+urldate}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareFieldFormat[patent]{number}{Patent No.~#1}
+
+\DeclareBibliographyDriver{patent}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{author}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{title}%
+ \newunit
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byauthor}%
+ \newunit\newblock
+ \usebibmacro{date}%
+ \newunit\newblock
+ \printfield{type}%
+ \setunit*{\addspace}%
+ \printfield{number}%
+ \iflistundef{location}
+ {}
+ {\setunit*{\addspace}%
+ \printtext[parens]{%
+ \printlist[][-\value{listtotal}]{location}}}%
+ \newunit\newblock
+ \usebibmacro{byholder}%
+ \newunit\newblock
+ \printfield{note}%
+ \newunit\newblock
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareBibliographyDriver{periodical}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{editor}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{title+issuetitle}%
+ \newunit
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byeditor}%
+ \newunit\newblock
+ \printfield{note}%
+ \newunit\newblock
+ \iftoggle{bbx:isbn}
+ {\printfield{issn}}
+ {}%
+ \newunit\newblock
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareBibliographyDriver{report}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{author}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{title}%
+ \newunit
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byauthor}%
+ \newunit\newblock
+ \printfield{type}%
+ \setunit*{\addspace}%
+ \printfield{number}%
+ \newunit\newblock
+ \printfield{version}%
+ \newunit
+ \printfield{note}%
+ \newunit\newblock
+ \usebibmacro{institution+location+date}%
+ \newunit\newblock
+ \usebibmacro{chapter+pages}%
+ \newunit
+ \printfield{pagetotal}%
+ \newunit\newblock
+ \iftoggle{bbx:isbn}
+ {\printfield{isrn}}
+ {}%
+ \newunit\newblock
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+
+
+\DeclareBibliographyDriver{thesis}{%
+ \usebibmacro{bibindex}%
+ \usebibmacro{begentry}%
+ \usebibmacro{author}%
+ \setunit{\labelnamepunct}\newblock
+ \usebibmacro{title}%
+ \newunit
+ \printlist{language}%
+ \newunit\newblock
+ \usebibmacro{byauthor}%
+ \newunit\newblock
+ \printfield{type}%
+ \newunit
+ \usebibmacro{institution+location+date}%
+ \newunit\newblock
+ \usebibmacro{chapter+pages}%
+ \newunit
+ \printfield{pagetotal}%
+ \newunit\newblock
+ \iftoggle{bbx:isbn}
+ {\printfield{isbn}}
+ {}%
+ \newunit\newblock
+ \usebibmacro{doi+eprint+url}%
+ \newunit\newblock
+ \usebibmacro{addendum+pubstate}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
+ \newunit\newblock
+ \printfield{note}%
+ \newunit\newblock
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \usebibmacro{finentry}}
+
+%
+% Include support for software entries
+%
+\blx@inputonce{software.bbx}{biblatex style for software}{}{}{}{}
+
+%
+% Handle ACM specific ArtifactSoftware entry exactly as the software entry (a soft alias will not work)
+%
+\DeclareStyleSourcemap{
+ \maps[datatype=bibtex]{
+ \map{
+ \step[typesource=artifactsoftware,typetarget=software]
+ \step[typesource=artifactdataset,typetarget=dataset]
+ }
+ }
+}
+
+%%% Compatibility with ACM bibtex formatting
+
+
+%
+% Show given name first in the reference list
+%
+\DeclareNameAlias{sortname}{given-family}
+
+%
+% Produce a bibliography with small font size
+%
+\renewcommand*{\bibfont}{\bibliofont\footnotesize}
+
+%
+% Remove parentheses from date+extradate
+%
+\RequirePackage{xpatch}
+\xpatchbibmacro{date+extradate}{%
+ \printtext[parens]%
+}{%
+ \newblock\setunit*{.\space}%
+ \printtext%
+}{}{}
+
+
+%%% Set option values for ACM style
+
+\ExecuteBibliographyOptions{
+ dashed=false, % Do not use dashes for bibliography items with the same set of authors
+ labeldate=year,
+ abbreviate=true,
+ dateabbrev=true,
+ isbn=true,
+ doi=true,
+ urldate=comp,
+ url=true,
+ maxbibnames=9,
+ maxcitenames=2,
+ backref=false,
+ sorting=nty,
+ halid=true,
+ swhid=true,
+ swlabels=true,
+ vcs=true,
+ license=false,
+ language=american
+ }
diff --git a/macros/latex/contrib/acmart/acmauthoryear.cbx b/macros/latex/contrib/acmart/acmauthoryear.cbx
new file mode 100644
index 0000000000..5c21110a39
--- /dev/null
+++ b/macros/latex/contrib/acmart/acmauthoryear.cbx
@@ -0,0 +1,219 @@
+\ProvidesFile{acmauthoryear.cbx}[2022-02-14 v0.1]
+
+\RequireCitationStyle{authoryear-comp}
+\RequirePackage{xpatch}
+
+%
+% Hyperlink citations like acmart natbib implementation
+%
+% From https://tex.stackexchange.com/a/27615/133551
+
+% Combine label and labelyear links
+\xpatchbibmacro{cite}
+ {\usebibmacro{cite:label}%
+ \setunit{\printdelim{nonameyeardelim}}%
+ \usebibmacro{cite:labeldate+extradate}}
+ {\printtext[bibhyperref]{%
+ \DeclareFieldAlias{bibhyperref}{default}%
+ \usebibmacro{cite:label}%
+ \setunit{\printdelim{nonameyeardelim}}%
+ \usebibmacro{cite:labeldate+extradate}}}
+ {}
+ {\PackageWarning{biblatex-patch}
+ {Failed to patch cite bibmacro}}
+
+% Include labelname in labelyear link
+\xpatchbibmacro{cite}
+ {\printnames{labelname}%
+ \setunit{\printdelim{nameyeardelim}}%
+ \usebibmacro{cite:labeldate+extradate}}
+ {\printtext[bibhyperref]{%
+ \DeclareFieldAlias{bibhyperref}{default}%
+ \printnames{labelname}%
+ \setunit{\printdelim{nameyeardelim}}%
+ \usebibmacro{cite:labeldate+extradate}}}
+ {}
+ {\PackageWarning{biblatex-patch}
+ {Failed to patch cite bibmacro}}
+
+\renewbibmacro*{textcite}{%
+ \iffieldequals{namehash}{\cbx@lasthash}
+ {\iffieldundef{shorthand}
+ {\ifthenelse{\iffieldequals{labelyear}{\cbx@lastyear}\AND
+ \(\value{multicitecount}=0\OR\iffieldundef{postnote}\)}
+ {\setunit{\addcomma}%
+ \usebibmacro{cite:extradate}}
+ {\setunit{\compcitedelim}%
+ \usebibmacro{cite:labeldate+extradate}%
+ \savefield{labelyear}{\cbx@lastyear}}}
+ {\setunit{\compcitedelim}%
+ \usebibmacro{cite:shorthand}%
+ \global\undef\cbx@lastyear}}
+ {\ifnameundef{labelname}
+ {\iffieldundef{shorthand}
+ {\usebibmacro{cite:label}%
+ \setunit{%
+ \global\booltrue{cbx:parens}%
+ \printdelim{nonameyeardelim}\bibopenbracket}%
+ \ifnumequal{\value{citecount}}{1}
+ {\usebibmacro{prenote}}
+ {}%
+ \usebibmacro{cite:labeldate+extradate}}
+ {\usebibmacro{cite:shorthand}}}
+ {\printnames{labelname}%
+ \setunit{%
+ \global\booltrue{cbx:parens}%
+ \printdelim{nameyeardelim}\bibopenbracket}%
+ \ifnumequal{\value{citecount}}{1}
+ {\usebibmacro{prenote}}
+ {}%
+ \iffieldundef{shorthand}
+ {\iffieldundef{labelyear}
+ {\usebibmacro{cite:label}}
+ {\usebibmacro{cite:labeldate+extradate}}%
+ \savefield{labelyear}{\cbx@lastyear}}
+ {\usebibmacro{cite:shorthand}%
+ \global\undef\cbx@lastyear}}%
+ \stepcounter{textcitecount}%
+ \savefield{namehash}{\cbx@lasthash}}%
+ \setunit{%
+ \ifbool{cbx:parens}
+ {\bibclosebracket\global\boolfalse{cbx:parens}}
+ {}%
+ \textcitedelim}}
+
+\xpatchbibmacro{textcite}
+ {\printnames{labelname}}
+ {\printtext[bibhyperref]{\printnames{labelname}}}
+ {}
+ {\PackageWarning{biblatex-patch}
+ {Failed to patch textcite bibmacro}}
+
+\renewbibmacro*{textcite:postnote}{%
+ \usebibmacro{postnote}%
+ \ifthenelse{\value{multicitecount}=\value{multicitetotal}}
+ {\setunit{}%
+ \printtext{%
+ \ifbool{cbx:parens}
+ {\bibclosebracket\global\boolfalse{cbx:parens}}
+ {}}}
+ {\setunit{%
+ \ifbool{cbx:parens}
+ {\bibclosebracket\global\boolfalse{cbx:parens}}
+ {}%
+ \textcitedelim}}}
+
+% NEW
+\newbibmacro*{citeauthor}{%
+ \ifnameundef{labelname}
+ {\iffieldundef{shorthand}
+ {\printtext[bibhyperref]{%
+ \usebibmacro{cite:label}}%
+ \setunit{%
+ \global\booltrue{cbx:parens}%
+ \printdelim{nonameyeardelim}\bibopenbracket}%
+ \ifnumequal{\value{citecount}}{1}
+ {\usebibmacro{prenote}}
+ {}%
+ \printtext[bibhyperref]{\usebibmacro{cite:labeldate+extradate}}}
+ {\printtext[bibhyperref]{\usebibmacro{cite:shorthand}}}}
+ \printtext[bibhyperref]{\printnames{labelname}}}
+
+%
+% Put brackets around citations
+%
+
+\DeclareCiteCommand{\cite}[\mkbibbrackets]
+ {\usebibmacro{cite:init}%
+ \usebibmacro{prenote}}
+ {\usebibmacro{citeindex}%
+ \usebibmacro{cite}}
+ {}
+ {\usebibmacro{postnote}}
+
+\DeclareCiteCommand*{\cite}[\mkbibbrackets]
+ {\usebibmacro{cite:init}%
+ \usebibmacro{prenote}}
+ {\usebibmacro{citeindex}%
+ \usebibmacro{citeyear}}
+ {}
+ {\usebibmacro{postnote}}
+
+\DeclareCiteCommand{\parencite}[\mkbibbrackets]
+ {\usebibmacro{cite:init}%
+ \usebibmacro{prenote}}
+ {\usebibmacro{citeindex}%
+ \usebibmacro{cite}}
+ {}
+ {\usebibmacro{postnote}}
+
+\DeclareCiteCommand*{\parencite}[\mkbibbrackets]
+ {\usebibmacro{cite:init}%
+ \usebibmacro{prenote}}
+ {\usebibmacro{citeindex}%
+ \usebibmacro{citeyear}}
+ {}
+ {\usebibmacro{postnote}}
+
+\DeclareMultiCiteCommand{\parencites}[\mkbibbrackets]{\parencite}
+ {\setunit{\multicitedelim}}
+
+\DeclareCiteCommand{\footcite}[\mkbibfootnote]
+ {\usebibmacro{cite:init}%
+ \usebibmacro{prenote}}
+ {\usebibmacro{citeindex}%
+ \usebibmacro{cite}}
+ {}
+ {\usebibmacro{postnote}}
+
+\DeclareCiteCommand{\footcitetext}[\mkbibfootnotetext]
+ {\usebibmacro{cite:init}%
+ \usebibmacro{prenote}}
+ {\usebibmacro{citeindex}%
+ \usebibmacro{cite}}
+ {}
+ {\usebibmacro{postnote}}
+
+\DeclareCiteCommand{\smartcite}[\iffootnote\mkbibbrackets\mkbibfootnote]
+ {\usebibmacro{cite:init}%
+ \usebibmacro{prenote}}
+ {\usebibmacro{citeindex}%
+ \usebibmacro{cite}}
+ {}
+ {\usebibmacro{postnote}}
+
+\DeclareMultiCiteCommand{\smartcites}[\iffootnote\mkbibbrackets\mkbibfootnote]
+ {\smartcite}{\setunit{\multicitedelim}}
+
+\DeclareCiteCommand{\citeauthor}
+ {\usebibmacro{cite:init}%
+ \usebibmacro{prenote}}
+ {\usebibmacro{citeindex}%
+ \usebibmacro{citeauthor}}
+ {}
+ {\usebibmacro{postnote}}
+
+\DeclareCiteCommand{\citeyear}
+ {\usebibmacro{cite:init}%
+ \usebibmacro{prenote}}
+ {\usebibmacro{citeindex}%
+ \usebibmacro{citeyear}}
+ {}
+ {\usebibmacro{postnote}}
+
+\DeclareCiteCommand{\citeyearpar}[\mkbibbrackets]
+ {\usebibmacro{cite:init}%
+ \usebibmacro{prenote}}
+ {\usebibmacro{citeindex}%
+ \usebibmacro{citeyear}}
+ {}
+ {\usebibmacro{postnote}}
+
+%
+% Provide aliases for natbib-compatible commands
+%
+\newcommand*{\citep}{\parencite}
+\newcommand*{\citet}{\textcite}
+% add others here
+
+\endinput
diff --git a/macros/latex/contrib/acmart/ACM-Reference-Format.dbx b/macros/latex/contrib/acmart/acmdatamodel.dbx
index 76ff1f1759..6bfb5843b5 100644
--- a/macros/latex/contrib/acmart/ACM-Reference-Format.dbx
+++ b/macros/latex/contrib/acmart/acmdatamodel.dbx
@@ -15,4 +15,19 @@
\DeclareDatamodelEntryfields[thesis]{school}
\DeclareDatamodelFields[type=field, datatype=literal]{key}
-\DeclareDatamodelEntryfields{key} \ No newline at end of file
+\DeclareDatamodelEntryfields{key}
+
+% Teach biblatex about lastaccessed field
+\DeclareDatamodelFields[type=field,datatype=literal]{lastaccessed}
+\DeclareDatamodelEntryfields{lastaccessed}
+
+% Teach biblatex about distincturl field
+\DeclareDatamodelFields[type=field, datatype=literal]{distinctURL}
+\DeclareDatamodelEntryfields{distinctURL}
+
+
+%
+% include software data model from biblatex-software
+%
+
+\blx@inputonce{software.dbx}{biblatex data model extension for software}{}{}{}{}
diff --git a/macros/latex/contrib/acmart/acmguide.pdf b/macros/latex/contrib/acmart/acmguide.pdf
index fcebb0ab63..7ae163f224 100644
--- a/macros/latex/contrib/acmart/acmguide.pdf
+++ b/macros/latex/contrib/acmart/acmguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/ACM-Reference-Format.bbx b/macros/latex/contrib/acmart/acmnumeric.bbx
index e9cb545300..c13e40137f 100644
--- a/macros/latex/contrib/acmart/ACM-Reference-Format.bbx
+++ b/macros/latex/contrib/acmart/acmnumeric.bbx
@@ -1,4 +1,4 @@
-\ProvidesFile{ACM-Reference-Format.bbx}[2017-09-27 v0.1 biblatex bibliography style]
+\ProvidesFile{acmnumeric.bbx}[2017-09-27 v0.1 biblatex bibliography style]
% Inherit a default style
\RequireBibliographyStyle{trad-plain}
@@ -33,7 +33,7 @@
\DeclareFieldFormat{key}{#1}
\DeclareFieldFormat{urldate}{Retrieved\space{}#1\space{}from}
-\DeclareFieldAlias{lastaccessed}{urldate}
+\DeclareFieldFormat{lastaccessed}{Retrieved\space{}#1\space{}from}
\DeclareFieldFormat{url}{\url{#1}}
@@ -78,13 +78,16 @@
\renewbibmacro*{url+urldate}{\iffieldundef{urlyear}
- {}
+ {\iffieldundef{lastaccessed}
+ {}
+ {\printfield{lastaccessed}%
+ \setunit*{\addspace}}%
+ }
{\usebibmacro{urldate}%
\setunit*{\addspace}}%
\usebibmacro{url}%
}
-
\renewbibmacro*{journal+issuetitle}{%
\usebibmacro{journal}%
\setunit*{\addcomma\space}%
@@ -265,8 +268,13 @@
\renewbibmacro*{doi+eprint+url}{%
\iftoggle{bbx:url}
- {\iffieldundef{doi}{\usebibmacro{url+urldate}}{}}
- {}%
+ {\iffieldundef{doi}{
+ \usebibmacro{url+urldate}
+ }{\iffieldundef{distinctURL}
+ {}
+ {\usebibmacro{url+urldate}}
+ }
+ }%
\newunit\newblock
\iftoggle{bbx:eprint}
{\usebibmacro{eprint}}
@@ -305,7 +313,7 @@
\printfield{note}%
\newunit\newblock%
\iftoggle{bbx:isbn}
- {\printfield{issn}}
+ {\printfield{isbn}}
{}%
\newunit\newblock%
\usebibmacro{doi+eprint+url}%
@@ -827,4 +835,51 @@
{}%
\usebibmacro{finentry}}
-
+%
+% Include support for software entries
+%
+\blx@inputonce{software.bbx}{biblatex style for software}{}{}{}{}
+
+%
+% Handle ACM specific ArtifactSoftware entry exactly as the software entry (a soft alias will not work)
+%
+\DeclareStyleSourcemap{
+ \maps[datatype=bibtex]{
+ \map{
+ \step[typesource=artifactsoftware,typetarget=software]
+ \step[typesource=artifactdataset,typetarget=dataset]
+ }
+ }
+}
+
+%
+% Show given name first in the reference list
+%
+\DeclareNameAlias{sortname}{given-family}
+
+%
+% Produce a bibliography with small font size
+%
+\renewcommand*{\bibfont}{\bibliofont\footnotesize}
+
+%%% Set option values for ACM style
+
+\ExecuteBibliographyOptions{
+ labeldate=year,
+ abbreviate=true,
+ dateabbrev=true,
+ isbn=true,
+ doi=true,
+ urldate=comp,
+ url=true,
+ maxbibnames=9,
+ maxcitenames=2,
+ backref=false,
+ sorting=nty,
+ halid=true,
+ swhid=true,
+ swlabels=true,
+ vcs=true,
+ license=false,
+ language=american
+ } \ No newline at end of file
diff --git a/macros/latex/contrib/acmart/acmnumeric.cbx b/macros/latex/contrib/acmart/acmnumeric.cbx
new file mode 100644
index 0000000000..99be1a0151
--- /dev/null
+++ b/macros/latex/contrib/acmart/acmnumeric.cbx
@@ -0,0 +1,5 @@
+\ProvidesFile{acmnumeric.cbx}[2017-09-27 v0.1]
+
+\RequireCitationStyle{numeric}
+
+\endinput
diff --git a/macros/latex/contrib/acmart/samples/abbrev.bib b/macros/latex/contrib/acmart/samples/abbrev.bib
new file mode 100644
index 0000000000..02e544b676
--- /dev/null
+++ b/macros/latex/contrib/acmart/samples/abbrev.bib
@@ -0,0 +1,86 @@
+@STRING{jan = "Jan."}
+@STRING{feb = "Feb."}
+@STRING{mar = "March"}
+@STRING{apr = "April"}
+@STRING{may = "May"}
+@STRING{jun = "June"}
+@STRING{jul = "July"}
+@STRING{aug = "Aug."}
+@STRING{sep = "Sept."}
+@STRING{oct = "Oct."}
+@STRING{nov = "Nov."}
+@STRING{dec = "Dec."}
+@STRING{cie = "ACM Computers in Entertainment"}
+@STRING{csur = "ACM Computing Surveys"}
+@STRING{dgov = "Digital Government: Research and Practice"}
+@STRING{dtrap = "Digital Threats: Research and Practice"}
+@STRING{health = "ACM Transactions on Computing for Healthcare"}
+@STRING{imwut = "PACM on Interactive, Mobile, Wearable and Ubiquitous Technologies"}
+@STRING{jacm = "Journal of the ACM"}
+@STRING{jdiq = "ACM Journal of Data and Information Quality"}
+@STRING{jea = "ACM Journal of Experimental Algorithmics"}
+@STRING{jeric = "ACM Journal of Educational Resources in Computing"}
+@STRING{jetc = "ACM Journal on Emerging Technologies in Computing Systems"}
+@STRING{jocch = "ACM Journal on Computing and Cultural Heritage"}
+@STRING{pacmcgit = "Proceedings of the ACM on Computer Graphics and Interactive Techniques"}
+@STRING{pacmhci = "PACM on Human-Computer Interaction"}
+@STRING{pacmpl = "PACM on Programming Languages"}
+@STRING{pomacs = "PACM on Measurement and Analysis of Computing Systems"}
+@STRING{taas = "ACM Transactions on Autonomous and Adaptive Systems"}
+@STRING{taccess = "ACM Transactions on Accessible Computing"}
+@STRING{taco = "ACM Transactions on Architecture and Code Optimization"}
+@STRING{talg = "ACM Transactions on Algorithms"}
+@STRING{tallip = "ACM Transactions on Asian and Low-Resource Language Information Processing"}
+@STRING{tap = "ACM Transactions on Applied Perception"}
+@STRING{tcps = "ACM Transactions on Cyber-Physical Systems"}
+@STRING{tds = "ACM/IMS Transactions on Data Science"}
+@STRING{teac = "ACM Transactions on Economics and Computation"}
+@STRING{tecs = "ACM Transactions on Embedded Computing Systems"}
+@STRING{telo = "ACM Transactions on Evolutionary Learning"}
+@STRING{thri = "ACM Transactions on Human-Robot Interaction"}
+@STRING{tiis = "ACM Transactions on Interactive Intelligent Systems"}
+@STRING{tiot = "ACM Transactions on Internet of Things"}
+@STRING{tissec = "ACM Transactions on Information and System Security"}
+@STRING{tist = "ACM Transactions on Intelligent Systems and Technology"}
+@STRING{tkdd = "ACM Transactions on Knowledge Discovery from Data"}
+@STRING{tmis = "ACM Transactions on Management Information Systems"}
+@STRING{toce = "ACM Transactions on Computing Education"}
+@STRING{tochi = "ACM Transactions on Computer-Human Interaction"}
+@STRING{tocl = "ACM Transactions on Computational Logic"}
+@STRING{tocs = "ACM Transactions on Computer Systems"}
+@STRING{toct = "ACM Transactions on Computation Theory"}
+@STRING{todaes = "ACM Transactions on Design Automation of Electronic Systems"}
+@STRING{tods = "ACM Transactions on Database Systems"}
+@STRING{tog = "ACM Transactions on Graphics"}
+@STRING{tois = "ACM Transactions on Information Systems"}
+@STRING{toit = "ACM Transactions on Internet Technology"}
+@STRING{tomacs = "ACM Transactions on Modeling and Computer Simulation"}
+@STRING{tomm = "ACM Transactions on Multimedia Computing, Communications and Applications"}
+@STRING{tompecs = "ACM Transactions on Modeling and Performance Evaluation of Computing Systems"}
+@STRING{toms = "ACM Transactions on Mathematical Software"}
+@STRING{topc = "ACM Transactions on Parallel Computing"}
+@STRING{toplas = "ACM Transactions on Programming Languages and Systems"}
+@STRING{tops = "ACM Transactions on Privacy and Security"}
+@STRING{tos = "ACM Transactions on Storage"}
+@STRING{tosem = "ACM Transactions on Software Engineering and Methodology"}
+@STRING{tosn = "ACM Transactions on Sensor Networks"}
+@STRING{tqc = "ACM Transactions on Quantum Computing"}
+@STRING{trets = "ACM Transactions on Reconfigurable Technology and Systems"}
+@STRING{tsas = "ACM Transactions on Spatial Algorithms and Systems"}
+@STRING{tsc = "ACM Transactions on Social Computing"}
+@STRING{tslp = "ACM Transactions on Speech and Language Processing"}
+@STRING{tweb = "ACM Transactions on the Web"}
+@STRING{acmcs = "ACM Computing Surveys"}
+@STRING{acta = "Acta Informatica"}
+@STRING{cacm = "Communications of the ACM"}
+@STRING{ibmjrd = "IBM Journal of Research and Development"}
+@STRING{ibmsj = "IBM Systems Journal"}
+@STRING{ieeese = "IEEE Transactions on Software Engineering"}
+@STRING{ieeetc = "IEEE Transactions on Computers"}
+@STRING{ieeetcad = "IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
+@STRING{ipl = "Information Processing Letters"}
+@STRING{jcss = "Journal of Computer and System Sciences"}
+@STRING{scp = "Science of Computer Programming"}
+@STRING{sicomp = "SIAM Journal on Computing"}
+@STRING{toois = "ACM Transactions on Office Information Systems"}
+@STRING{tcs = "Theoretical Computer Science"}
diff --git a/macros/latex/contrib/acmart/samples/sample-acmlarge.pdf b/macros/latex/contrib/acmart/samples/sample-acmlarge.pdf
index b5dcfd9ca7..712051ef4b 100644
--- a/macros/latex/contrib/acmart/samples/sample-acmlarge.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-acmlarge.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-acmsmall-biblatex.pdf b/macros/latex/contrib/acmart/samples/sample-acmsmall-biblatex.pdf
new file mode 100644
index 0000000000..c8359ae059
--- /dev/null
+++ b/macros/latex/contrib/acmart/samples/sample-acmsmall-biblatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-acmsmall-conf.pdf b/macros/latex/contrib/acmart/samples/sample-acmsmall-conf.pdf
index 9b3ca788b6..6825c8a90f 100644
--- a/macros/latex/contrib/acmart/samples/sample-acmsmall-conf.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-acmsmall-conf.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-acmsmall-submission.pdf b/macros/latex/contrib/acmart/samples/sample-acmsmall-submission.pdf
index be9729af33..bd3a38698d 100644
--- a/macros/latex/contrib/acmart/samples/sample-acmsmall-submission.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-acmsmall-submission.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-acmsmall.pdf b/macros/latex/contrib/acmart/samples/sample-acmsmall.pdf
index 6873d96090..627a0f494d 100644
--- a/macros/latex/contrib/acmart/samples/sample-acmsmall.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-acmsmall.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-acmtog.pdf b/macros/latex/contrib/acmart/samples/sample-acmtog.pdf
index d78ce126dc..8558edb183 100644
--- a/macros/latex/contrib/acmart/samples/sample-acmtog.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-acmtog.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-authordraft.pdf b/macros/latex/contrib/acmart/samples/sample-authordraft.pdf
index e51ee62a27..37f660358a 100644
--- a/macros/latex/contrib/acmart/samples/sample-authordraft.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-authordraft.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-lualatex.pdf b/macros/latex/contrib/acmart/samples/sample-lualatex.pdf
index d06751562f..e52aea57e9 100644
--- a/macros/latex/contrib/acmart/samples/sample-lualatex.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-manuscript.pdf b/macros/latex/contrib/acmart/samples/sample-manuscript.pdf
index 25cca1bc7f..ae1d5b4670 100644
--- a/macros/latex/contrib/acmart/samples/sample-manuscript.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-manuscript.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-sigconf-biblatex.pdf b/macros/latex/contrib/acmart/samples/sample-sigconf-biblatex.pdf
new file mode 100644
index 0000000000..77e4cc038b
--- /dev/null
+++ b/macros/latex/contrib/acmart/samples/sample-sigconf-biblatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-sigconf-i13n.pdf b/macros/latex/contrib/acmart/samples/sample-sigconf-i13n.pdf
index 8960ce2ff4..54f5fdf09c 100644
--- a/macros/latex/contrib/acmart/samples/sample-sigconf-i13n.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-sigconf-i13n.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-sigconf.pdf b/macros/latex/contrib/acmart/samples/sample-sigconf.pdf
index bd85371e7e..0267a91592 100644
--- a/macros/latex/contrib/acmart/samples/sample-sigconf.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-sigconf.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-sigplan.pdf b/macros/latex/contrib/acmart/samples/sample-sigplan.pdf
index d8c8f67f1c..df60a4d500 100644
--- a/macros/latex/contrib/acmart/samples/sample-sigplan.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-sigplan.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/sample-xelatex.pdf b/macros/latex/contrib/acmart/samples/sample-xelatex.pdf
index 25a4bdef54..3a4a9dc312 100644
--- a/macros/latex/contrib/acmart/samples/sample-xelatex.pdf
+++ b/macros/latex/contrib/acmart/samples/sample-xelatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/acmart/samples/samples.dtx b/macros/latex/contrib/acmart/samples/samples.dtx
index 3d8fc9abda..a0f638aecb 100644
--- a/macros/latex/contrib/acmart/samples/samples.dtx
+++ b/macros/latex/contrib/acmart/samples/samples.dtx
@@ -1,4 +1,4 @@
-%<*manuscript|acmsmall|acmsmall-submission|acmlarge|acmtog|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
+%<*manuscript|acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog|sigconf|sigconf-biblatex|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
%%
%%
%% Commands for TeXCount
@@ -18,10 +18,12 @@
%% The first command in your LaTeX source must be the \documentclass command.
%<manuscript>\documentclass[manuscript,screen,review]{acmart}
%<acmsmall|acmsmall-conf>\documentclass[acmsmall]{acmart}
+%<acmsmall-biblatex>\documentclass[acmsmall,natbib=false]{acmart}
%<acmsmall-submission>\documentclass[acmsmall,screen,review]{acmart}
%<acmlarge>\documentclass[acmlarge]{acmart}
%<acmtog>\documentclass[acmtog]{acmart}
%<sigconf>\documentclass[sigconf]{acmart}
+%<sigconf-biblatex>\documentclass[sigconf,natbib=false]{acmart}
%<authordraft>\documentclass[sigconf,authordraft]{acmart}
%<sigplan>\documentclass[sigplan,screen]{acmart}
%<sigchi>\documentclass[sigchi]{acmart}
@@ -33,7 +35,7 @@
%% \BibTeX command to typeset BibTeX logo in the docs
\AtBeginDocument{%
\providecommand\BibTeX{{%
- \normalfont B\kern-0.5em{\scshape i\kern-0.25em b}\kern-0.8em\TeX}}}
+ Bib\TeX}}}
%% Rights management information. This information is sent to you
%% when you complete the rights form. These commands have SAMPLE
@@ -46,7 +48,7 @@
\acmYear{2018}
\acmDOI{XXXXXXX.XXXXXXX}
-%</manuscript|acmsmall|acmsmall-submission|acmlarge|acmtog|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
+%</manuscript|acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog|sigconf|sigconf-biblatex|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
%<*manuscript|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
%% These commands are for a PROCEEDINGS abstract or paper.
\acmConference[Conference acronym 'XX]{Make sure to enter the correct
@@ -62,18 +64,18 @@
\acmISBN{978-1-4503-XXXX-X/18/06}
%</manuscript|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
-%<*acmsmall|acmsmall-submission|acmlarge|acmtog>
+%<*acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog>
%%
%% These commands are for a JOURNAL article.
-%<acmsmall|acmsmall-submission>\acmJournal{JACM}
+%<acmsmall|acmsmall-submission|acmsmall-biblatex>\acmJournal{JACM}
%<acmlarge>\acmJournal{POMACS}
%<acmtog>\acmJournal{TOG}
\acmVolume{37}
\acmNumber{4}
\acmArticle{111}
\acmMonth{8}
-%</acmsmall|acmsmall-submission|acmlarge|acmtog>
-%<*manuscript|acmsmall|acmsmall-submission|acmlarge|acmtog|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
+%</acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog>
+%<*manuscript|acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog|sigconf|sigconf-biblatex|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
%%
@@ -82,8 +84,22 @@
%% receive a unique submission ID from the organizers
%% of the event, and this ID should be used as the parameter to this command.
%%\acmSubmissionID{123-A56-BU3}
+%</manuscript|acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog|sigconf|sigconf-biblatex|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
+%%
+%% For managing citations, it is recommended to use bibliography
+%% files in BibTeX format.
+%%
+%% You can then either use BibTeX with the ACM-Reference-Format style,
+%% or BibLaTeX with the acmnumeric or acmauthoryear sytles, that include
+%% support for advanced citation of software artefact from the
+%% biblatex-software package, also separately available on CTAN.
+%%
+%% Look at the sample-*-biblatex.tex files for templates showcasing
+%% the biblatex styles.
+%%
+%<*manuscript|acmsmall|acmsmall-submission|acmlarge|acmtog|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
%%
%% The majority of ACM publications use numbered citations and
%% references. The command \citestyle{authoryear} switches to the
@@ -96,6 +112,31 @@
%<!acmtog>%% the next command will enable that style.
%<!acmtog>%%\citestyle{acmauthoryear}
%<acmtog>\citestyle{acmauthoryear}
+%</manuscript|acmsmall|acmsmall-submission|acmlarge|acmtog|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
+
+%<*acmsmall-biblatex|sigconf-biblatex>
+%%
+%% The majority of ACM publications use numbered citations and
+%% references, obtained by selecting the acmnumeric BibLaTeX style.
+%% The acmauthoryear BibLaTeX style switches to the "author year" style.
+%%
+%% If you are preparing content for an event
+%% sponsored by ACM SIGGRAPH, you must use the acmauthoryear style of
+%% citations and references.
+%%
+%% Bibliography style
+\RequirePackage[
+ datamodel=acmdatamodel,
+%<!acmsmall-biblatex> style=acmnumeric,
+%<acmsmall-biblatex> style=acmauthoryear,
+ ]{biblatex}
+
+%% Declare bibliography sources (one \addbibresource command per source)
+\addbibresource{software.bib}
+\addbibresource{sample-base.bib}
+%</acmsmall-biblatex|sigconf-biblatex>
+
+%<*manuscript|acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog|sigconf|sigconf-biblatex|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
%%
%% end of the preamble, start of the body of the document source.
@@ -104,9 +145,9 @@
%%
%% The "title" command has an optional parameter,
%% allowing the author to define a "short title" to be used in page headers.
-\title{The Name of the Title is Hope}
+\title{The Name of the Title Is Hope}
%<sigconf-i13n>\translatedtitle{french}{Le nom du titre est l'espoir}
-%<sigconf-i13n>\translatedtitle{german}{Der Name des Titels ist Hoffnung}
+%<sigconf-i13n>\translatedtitle{german}{Der Name des Titels ist 'Hoffnung'}
%<sigconf-i13n>\translatedtitle{spanish}{El nombre del título es esperanza}
%%
@@ -193,7 +234,7 @@
%% other information printed in the page headers. This command allows
%% the author to define a more concise list
%% of authors' names for this purpose.
-\renewcommand{\shortauthors}{Trovato and Tobin, et al.}
+\renewcommand{\shortauthors}{Trovato et al.}
%%
%% The abstract is a short summary of the work to be presented in the
@@ -206,7 +247,7 @@
as many of the formatting elements an author may use in the
preparation of the documentation of their work.
\end{abstract}
-%</manuscript|acmsmall|acmsmall-submission|acmlarge|acmtog|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
+%</manuscript|acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog|sigconf|sigconf-biblatex|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
%<*sigconf-i13n>
\begin{translatedabstract}{french}
@@ -220,13 +261,12 @@
\end{translatedabstract}
\begin{translatedabstract}{german}
- Ein übersichtliches und gut dokumentiertes \LaTeX\-Dokument wird als
- Artikel, der für die Veröffentlichung durch ACM in einem Tagungsband
- formatiert wurde oder Zeitschriftenveröffentlichung. Basierend auf
- der Dokumentenklasse ``acmart'', this Artikel präsentiert und
- erklärt auch viele der gängigen Variationen so viele der
- Formatierungselemente, die ein Autor in der verwenden darf
- Vorbereitung der Dokumentation ihrer Arbeit.
+ Es wird ein übersichtliches und gut dokumentiertes \LaTeX\-Dokument präsentiert,
+ welches für die Veröffentlichung durch ACM in einem Tagungsband oder
+ als Zeitschriftenpublikation formatiert wurde.
+ Basierend auf der Dokumentenklasse ``acmart'' präsentiert und erklärt dieser Artikel
+ viele der Formatierungselemente sowie auch viele der gängigen Variationen,
+ die ein Autor bei der Beschreibung seiner Arbeit verwenden darf.
\end{translatedabstract}
\begin{translatedabstract}{spanish}
@@ -239,7 +279,7 @@
trabajo.
\end{translatedabstract}
%</sigconf-i13n>
-%<*manuscript|acmsmall|acmsmall-submission|acmlarge|acmtog|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
+%<*manuscript|acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog|sigconf|sigconf-biblatex|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
%%
%% The code below is generated by the tool at http://dl.acm.org/ccs.cfm.
@@ -282,12 +322,11 @@
%<sigconf-i13n>\translatedkeywords{french}{ensembles de données,
%<sigconf-i13n> réseaux de neurones,
%<sigconf-i13n> détection du regard, marquage de texte}
-%<sigconf-i13n> \translatedkeywords{german}{Datensätze,
-%<sigconf-i13n> neuronale Netze, Blickerkennung, Text-Tagging}
+%<sigconf-i13n> \translatedkeywords{german}{Datensammlungen,
+%<sigconf-i13n> neuronale Netze, Blickerkennung, Textklassifizierung}
%<sigconf-i13n> \translatedkeywords{spanish}{conjuntos de datos,
%<sigconf-i13n> redes neuronales, detección de mirada, etiquetado de texto}
-
-%</manuscript|acmsmall|acmsmall-submission|acmlarge|acmtog|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
+%</manuscript|acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog|sigconf|sigconf-biblatex|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
%<*sigconf|authordraft|sigplan|acmsmall-conf|sigconf-i13n>
%% A "teaser" image appears between the author and affiliation
%% information and the body of the document, and typically spans the
@@ -300,7 +339,7 @@
\label{fig:teaser}
\end{teaserfigure}
%</sigconf|authordraft|sigplan|acmsmall-conf|sigconf-i13n>
-%<*manuscript|acmsmall|acmsmall-submission|acmlarge|acmtog|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
+%<*manuscript|acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog|sigconf|sigconf-biblatex|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
%%
%% This command processes the author and affiliation and title
@@ -709,6 +748,7 @@ references is strongly recommended. Authors' names should be complete
reference should be included: title, year, volume, number, pages,
article DOI, etc.
+%<*!(acmsmall-biblatex|sigconf-biblatex)>
The bibliography is included in your source document with these two
commands, placed just before the \verb|\end{document}| command:
\begin{verbatim}
@@ -726,6 +766,31 @@ command in the {\bfseries preamble} (before the command
\begin{verbatim}
\citestyle{acmauthoryear}
\end{verbatim}
+%</!(acmsmall-biblatex|sigconf-biblatex)>
+
+%<*acmsmall-biblatex|sigconf-biblatex>
+Using the BibLaTeX system, the bibliography is included in your source
+document with the following command, placed just before the \verb|\end{document}| command:
+\begin{verbatim}
+ \printbibliography
+\end{verbatim}
+
+The command \verb|\addbibresource{bibfile}| declares the \BibTeX\ file to use
+in the {\bfseries preamble} (before the command
+``\verb|\begin{document}|'') of your \LaTeX\ source
+where ``\verb|bibfile|'' is the name, \emph{with} the ``\verb|.bib|'' suffix.
+Notice that \verb|\addbibresource| takes only one argument: to declare multiple files,
+use multiple instances of the command.
+
+Citations and references are numbered by default. A small number of
+ACM publications have citations and references formatted in the
+``author year'' style; for these exceptions, please pass the option \verb|style=acmauthoryear|
+to the \verb|biblatex| package loaded in the {\bfseries preamble} (before the command
+``\verb|\begin{document}|'') of your \LaTeX\ source.
+
+%</acmsmall-biblatex|sigconf-biblatex>
+
+
Some examples. A paginated journal article \cite{Abril07}, an
enumerated journal article \cite{Cohen07}, a reference to an entire
@@ -755,9 +820,16 @@ command in the {\bfseries preamble} (before the command
multi-volume works as books \cite{MR781536} and \cite{MR781537}. A
couple of citations with DOIs:
\cite{2004:ITE:1009386.1010128,Kirschmer:2010:AEI:1958016.1958018}. Online
- citations: \cite{TUGInstmem, Thornburg01, CTANacmart}. Artifacts:
- \cite{R} and \cite{UMassCitations}.
-
+ citations: \cite{TUGInstmem, Thornburg01, CTANacmart}.
+%<*!(acmsmall-biblatex|sigconf-biblatex)>
+ Artifacts: \cite{R} and \cite{UMassCitations}.
+%</!(acmsmall-biblatex|sigconf-biblatex)>
+%<*acmsmall-biblatex|sigconf-biblatex>
+ Data Artifacts: \cite{UMassCitations}.
+ Software project: ~\cite{cgal,delebecque:hal-02090402}. Software Version: ~\cite{gf-tag-sound-repo,}. Software Module: ~\cite{cgal:lp-gi-20a}. Code fragment: ~\cite{simplemapper}.
+%</acmsmall-biblatex|sigconf-biblatex>
+
+
\section{Acknowledgments}
Identification of funding sources and other support, and thanks to
@@ -838,11 +910,20 @@ the margin:
To Robert, for the bagels and explaining CMYK and color spaces.
\end{acks}
+%<*!(acmsmall-biblatex|sigconf-biblatex)>
%%
%% The next two lines define the bibliography style to be used, and
%% the bibliography file.
\bibliographystyle{ACM-Reference-Format}
\bibliography{sample-base}
+%</!(acmsmall-biblatex|sigconf-biblatex)>
+
+%<*(acmsmall-biblatex|sigconf-biblatex)>
+%%
+%% Print the bibliography
+%%
+\printbibliography
+%</(acmsmall-biblatex|sigconf-biblatex)>
%%
%% If your work has an appendix, this is the place to put it.
@@ -879,4 +960,4 @@ rhoncus. Maecenas eu arcu ac neque placerat aliquam. Nunc pulvinar
massa et mattis lacinia.
\end{document}
-%</manuscript|acmsmall|acmsmall-submission|acmlarge|acmtog|sigconf|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
+%</manuscript|acmsmall|acmsmall-submission|acmsmall-biblatex|acmlarge|acmtog|sigconf|sigconf-biblatex|authordraft|sigplan|sigchi|sigchi-a|acmsmall-conf|sigconf-i13n>
diff --git a/macros/latex/contrib/acmart/samples/samples.ins b/macros/latex/contrib/acmart/samples/samples.ins
index 7c5c974a66..af2d55e4d9 100644
--- a/macros/latex/contrib/acmart/samples/samples.ins
+++ b/macros/latex/contrib/acmart/samples/samples.ins
@@ -10,9 +10,11 @@
\file{sample-manuscript.tex}{\from{samples.dtx}{manuscript}}
\file{sample-acmsmall.tex}{\from{samples.dtx}{acmsmall}}
\file{sample-acmsmall-submission.tex}{\from{samples.dtx}{acmsmall-submission}}
+ \file{sample-acmsmall-biblatex.tex}{\from{samples.dtx}{acmsmall-biblatex}}
\file{sample-acmlarge.tex}{\from{samples.dtx}{acmlarge}}
\file{sample-acmtog.tex}{\from{samples.dtx}{acmtog}}
\file{sample-sigconf.tex}{\from{samples.dtx}{sigconf}}
+ \file{sample-sigconf-biblatex.tex}{\from{samples.dtx}{sigconf-biblatex}}
\file{sample-authordraft.tex}{\from{samples.dtx}{authordraft}}
\file{sample-xelatex.tex}{\from{samples.dtx}{sigconf}}
\file{sample-lualatex.tex}{\from{samples.dtx}{sigconf}}
diff --git a/macros/latex/contrib/acmart/samples/software.bib b/macros/latex/contrib/acmart/samples/software.bib
new file mode 100644
index 0000000000..f12ffba46d
--- /dev/null
+++ b/macros/latex/contrib/acmart/samples/software.bib
@@ -0,0 +1,145 @@
+@softwareversion {delebecque:hal-02090402-condensed,
+ title = {Scilab},
+ author = {Delebecque, Fran{\c c}ois and Gomez, Claude and Goursat, Maurice
+ and Nikoukhah, Ramine and Steer, Serge and Chancelier, Jean-Philippe},
+ url = {https://www.scilab.org/},
+ date = {1994-01},
+ file = {https://hal.inria.fr/hal-02090402/file/scilab-1.1.tar.gz},
+ institution = {Inria},
+ license = {Scilab license},
+ hal_id = {hal-02090402},
+ hal_version = {v1},
+ swhid = {swh:1:dir:1ba0b67b5d0c8f10961d878d91ae9d6e499d746a;
+ origin=https://hal.archives-ouvertes.fr/hal-02090402},
+ version = {1.1},
+ note = {First Scilab version. It was distributed by anonymous ftp.},
+ repository= {https://github.com/scilab/scilab},
+ abstract = {Software for Numerical Computation freely distributed.}
+}
+@software {delebecque:hal-02090402,
+ title = {Scilab},
+ author = {Delebecque, Fran{\c c}ois and Gomez, Claude and Goursat, Maurice
+ and Nikoukhah, Ramine and Steer, Serge and Chancelier, Jean-Philippe},
+ date = {1994},
+ institution = {Inria},
+ license = {Scilab license},
+ hal_id = {hal-02090402},
+ hal_version = {v1},
+ url = {https://www.scilab.org/},
+ abstract = {Software for Numerical Computation freely distributed.},
+ repository= {https://github.com/scilab/scilab},
+}
+
+@softwareversion {delebecque:hal-02090402v1,
+ version = {1.1},
+ date = {1994-01},
+ file = {https://hal.inria.fr/hal-02090402/file/scilab-1.1.tar.gz},
+ swhid = {swh:1:dir:1ba0b67b5d0c8f10961d878d91ae9d6e499d746a;
+ origin=https://hal.archives-ouvertes.fr/hal-02090402},
+ note = {First Scilab version. It was distributed by anonymous ftp.},
+ crossref = {delebecque:hal-02090402}
+}
+ @software {cgal,
+ title = {The Computational Geometry Algorithms Library},
+ author = {{The CGAL Project}},
+ editor = {{CGAL Editorial Board}},
+ date = {1996},
+ url = {https://cgal.org/}
+ }
+
+ @softwareversion{cgal:5-0-2,
+ crossref = {cgal},
+ version = {{5.0.2}},
+ url = {https://docs.cgal.org/5.02},
+ date = {2020},
+ swhid = {swh:1:rel:636541bbf6c77863908eae744610a3d91fa58855;
+ origin=https://github.com/CGAL/cgal/}
+ }
+
+ @softwaremodule{cgal:lp-gi-20a,
+ crossref = {cgal:5-0-2},
+ author = {Menelaos Karavelas},
+ subtitle = {{2D} Voronoi Diagram Adaptor},
+ license = {GPL},
+ introducedin = {cgal:3-1},
+ url = {https://doc.cgal.org/5.0.2/Manual/packages.html#PkgVoronoiDiagram2},
+ }
+ @softwaremodule{cgal:lp-gi-20a-condensed,
+ title = {The Computational Geometry Algorithms Library},
+ subtitle = {{2D} Voronoi Diagram Adaptor},
+ author = {Menelaos Karavelas},
+ editor = {{CGAL Editorial Board}},
+ license = {GPL},
+ version = {{5.0.2}},
+ introducedin = {cgal:3-1},
+ date = {2020},
+ swhid = {swh:1:rel:636541bbf6c77863908eae744610a3d91fa58855;
+ origin=https://github.com/CGAL/cgal/},
+ url = {https://doc.cgal.org/5.0.2/Manual/packages.html#PkgVoronoiDiagram2},
+ }
+@software {parmap,
+ title = {The Parmap library},
+ author = {Di Cosmo, Roberto and Marco Danelutto},
+ date = {2012},
+ institution = {{Inria} and {University of Paris} and {University of Pisa}},
+ license = {LGPL-2.0},
+ url = {https://rdicosmo.github.io/parmap/},
+ repository= {https://github.com/rdicosmo/parmap},
+}
+
+@softwareversion {parmap-1.1.1,
+ crossref = {parmap},
+ date = {2020},
+ version = {1.1.1},
+ swhid = {swh:1:rel:373e2604d96de4ab1d505190b654c5c4045db773;
+ origin=https://github.com/rdicosmo/parmap;
+ visit=swh:1:snp:2a6c348c53eb77d458f24c9cbcecaf92e3c45615},
+}
+
+@codefragment {simplemapper,
+ subtitle = {Core mapping routine},
+ swhid = {swh:1:cnt:43a6b232768017b03da934ba22d9cc3f2726a6c5;
+ origin=https://github.com/rdicosmo/parmap;
+ visit=swh:1:snp:2a6c348c53eb77d458f24c9cbcecaf92e3c45615;
+ anchor=swh:1:rel:373e2604d96de4ab1d505190b654c5c4045db773;
+ path=/src/parmap.ml;
+ lines=192-228},
+ crossref = {parmap-1.1.1}
+}
+@codefragment {simplemapper-condensed,
+ title = {The Parmap library},
+ author = {Di Cosmo, Roberto and Marco Danelutto},
+ date = {2020},
+ institution = {{Inria} and {University of Paris} and {University of Pisa}},
+ license = {LGPL-2.0},
+ url = {https://rdicosmo.github.io/parmap/},
+ repository= {https://github.com/rdicosmo/parmap},
+ version = {1.1.1},
+ subtitle = {Core mapping routine},
+ swhid = {swh:1:cnt:43a6b232768017b03da934ba22d9cc3f2726a6c5;
+ origin=https://github.com/rdicosmo/parmap;
+ visit=swh:1:snp:2a6c348c53eb77d458f24c9cbcecaf92e3c45615;
+ anchor=swh:1:rel:373e2604d96de4ab1d505190b654c5c4045db773;
+ path=/src/parmap.ml;
+ lines=192-228}
+}
+
+@article{ad-wood-2003,
+ author = {Christopher Anderson and Sophia Drossopoulou},
+ title = {{BabyJ}: from Object Based to Class Based Programming via Types},
+ journal = {{WOOD}},
+ volume = {82},
+ number = {7},
+ pages = {53--81},
+ year = {2003}
+}
+
+@softwareversion{gf-tag-sound-repo,
+ title={tag-sound},
+ author={Ben Greenman and Matthias Felleisen},
+ swhid={swh:1:dir:cd0b0abeee707e57cd699e2e2ebd075da8ebf1f7;origin=https://github.com/nuprl/tag-sound;visit=swh:1:snp:7967bc0abee8bf3bfffb9252207a07b73538525a;anchor=swh:1:rev:4cc09ca228947a99c8f4ac45eefb76e96ee96e53},
+ repository={https://github.com/nuprl/tag-sound},
+ version={4cc09ca},
+ date={2020}
+}
+
diff --git a/macros/latex/contrib/l3backend/CHANGELOG.md b/macros/latex/contrib/l3backend/CHANGELOG.md
index 68a0f8e377..e94dbb881d 100644
--- a/macros/latex/contrib/l3backend/CHANGELOG.md
+++ b/macros/latex/contrib/l3backend/CHANGELOG.md
@@ -6,6 +6,19 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2022-04-10]
+
+### Added
+- Support for graphics (PDF) page count extraction
+
+### Fixed
+- Setup for graphics extension searching
+- Various internal issues in graphics inclusion
+- Some missing functions for `dvisvgm` color support added
+
+### Removed
+- Support for pre-2020-11-11 `dvipdfmx`
+
## [2022-02-07]
### Fixed
@@ -217,7 +230,8 @@ this project uses date-based 'snapshot' version identifiers.
- Include `l3backend` in file names
- Moved backend code to internal for each 'parent' module
-[Unreleased]: https://github.com/latex3/latex3/compare/2022-02-07...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2022-04-10...HEAD
+[2022-04-10]: https://github.com/latex3/latex3/compare/2022-02-07...2022-04-10
[2022-02-07]: https://github.com/latex3/latex3/compare/2022-01-12...2022-02-07
[2022-01-12]: https://github.com/latex3/latex3/compare/2021-12-14...2022-01-12
[2021-12-14]: https://github.com/latex3/latex3/compare/2021-10-17...2021-12-14
diff --git a/macros/latex/contrib/l3backend/README.md b/macros/latex/contrib/l3backend/README.md
index 31dccaaa60..470d6914a0 100644
--- a/macros/latex/contrib/l3backend/README.md
+++ b/macros/latex/contrib/l3backend/README.md
@@ -1,7 +1,7 @@
LaTeX3 Backend Drivers
======================
-Release 2022-02-07
+Release 2022-04-10
This package forms parts of `expl3`, and contains the code used to interface
with backends (drivers) across the `expl3` codebase. The functions here are
diff --git a/macros/latex/contrib/l3backend/l3backend-basics.dtx b/macros/latex/contrib/l3backend/l3backend-basics.dtx
index d7c3c6e4c3..f4bf61fe70 100644
--- a/macros/latex/contrib/l3backend/l3backend-basics.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -70,27 +70,27 @@
% \begin{macrocode}
\ProvidesExplFile
%<*dvipdfmx>
- {l3backend-dvipdfmx.def}{2022-02-07}{}
+ {l3backend-dvipdfmx.def}{2022-04-10}{}
{L3 backend support: dvipdfmx}
%</dvipdfmx>
%<*dvips>
- {l3backend-dvips.def}{2022-02-07}{}
+ {l3backend-dvips.def}{2022-04-10}{}
{L3 backend support: dvips}
%</dvips>
%<*dvisvgm>
- {l3backend-dvisvgm.def}{2022-02-07}{}
+ {l3backend-dvisvgm.def}{2022-04-10}{}
{L3 backend support: dvisvgm}
%</dvisvgm>
%<*luatex>
- {l3backend-luatex.def}{2022-02-07}{}
+ {l3backend-luatex.def}{2022-04-10}{}
{L3 backend support: PDF output (LuaTeX)}
%</luatex>
%<*pdftex>
- {l3backend-pdftex.def}{2022-02-07}{}
+ {l3backend-pdftex.def}{2022-04-10}{}
{L3 backend support: PDF output (pdfTeX)}
%</pdftex>
%<*xetex>
- {l3backend-xetex.def}{2022-02-07}{}
+ {l3backend-xetex.def}{2022-04-10}{}
{L3 backend support: XeTeX}
%</xetex>
% \end{macrocode}
@@ -395,35 +395,6 @@
% \end{macro}
%
% \begin{macrocode}
-%<@@=sys>
-% \end{macrocode}
-%
-% \begin{macro}{\c__kernel_sys_dvipdfmx_version_int}
-% A short excursion into the |sys| module to set up the backend version
-% information.
-% \begin{macrocode}
-\group_begin:
- \cs_set:Npn \@@_tmp:w #1 Version ~ #2 ~ #3 \q_stop {#2}
- \sys_get_shell:nnNTF { extractbb~--version }
- { \char_set_catcode_space:n { `\ } }
- \l_@@_internal_tl
- {
- \int_const:Nn \c__kernel_sys_dvipdfmx_version_int
- {
- \exp_after:wN \@@_tmp:w \l_@@_internal_tl
- \q_stop
- }
- }
- { \int_const:Nn \c__kernel_sys_dvipdfmx_version_int { 0 } }
-\group_end:
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-%<@@=>
-% \end{macrocode}
-%
-% \begin{macrocode}
%</dvipdfmx|xetex>
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3backend/l3backend-box.dtx b/macros/latex/contrib/l3backend/l3backend-box.dtx
index 1d3450c78c..a732d60564 100644
--- a/macros/latex/contrib/l3backend/l3backend-box.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-code.pdf b/macros/latex/contrib/l3backend/l3backend-code.pdf
index a3f052df2c..960a45053c 100644
--- a/macros/latex/contrib/l3backend/l3backend-code.pdf
+++ b/macros/latex/contrib/l3backend/l3backend-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3backend/l3backend-color.dtx b/macros/latex/contrib/l3backend/l3backend-color.dtx
index 064c55fa60..815b41302a 100644
--- a/macros/latex/contrib/l3backend/l3backend-color.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-color.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -203,54 +203,50 @@
% In \texttt{(x)dvipdfmx}, the base color stack is not set up, so we have to
% force that, as well as providing a mechanism more generally.
% \begin{macrocode}
-\int_compare:nNnTF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
- { \cs_new_protected:Npn \__kernel_color_backend_stack_init:Nnn #1#2#3 { } }
+\int_new:N \g_@@_backend_stack_int
+\cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3
{
- \int_new:N \g_@@_backend_stack_int
- \cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3
+ \int_gincr:N \exp_not:N \g_@@_backend_stack_int
+ \int_const:Nn #1 { \exp_not:N \g_@@_backend_stack_int }
+ \use:x
{
- \int_gincr:N \exp_not:N \g_@@_backend_stack_int
- \int_const:Nn #1 { \exp_not:N \g_@@_backend_stack_int }
- \use:x
+ \__kernel_backend_first_shipout:n
{
- \__kernel_backend_first_shipout:n
+ \__kernel_backend_literal:n
{
- \__kernel_backend_literal:n
- {
- pdfcolorstackinit ~
- \exp_not:N \int_use:N \exp_not:N \g_@@_backend_stack_int
- \c_space_tl
- \exp_not:N \tl_if_blank:nF {#2} { #2 ~ }
- (#3)
- }
+ pdfcolorstackinit ~
+ \exp_not:N \int_use:N \exp_not:N \g_@@_backend_stack_int
+ \c_space_tl
+ \exp_not:N \tl_if_blank:nF {#2} { #2 ~ }
+ (#3)
}
- }
- }
- \cs_if_exist:cTF { main@pdfcolorstack }
- {
- \int_set:Nn \l_@@_backend_stack_int
- { \int_use:c { main@pdfcolorstack } }
- }
- {
- \__kernel_color_backend_stack_init:Nnn \c_@@_backend_main_stack_int
- { page ~ direct } { 0 ~ g ~ 0 ~ G }
- \int_set_eq:NN \l_@@_backend_stack_int
- \c_@@_backend_main_stack_int
- \int_const:cn { main@pdfcolorstack } { \c_@@_backend_main_stack_int }
+ }
}
+ }
+\cs_if_exist:cTF { main@pdfcolorstack }
+ {
+ \int_set:Nn \l_@@_backend_stack_int
+ { \int_use:c { main@pdfcolorstack } }
+ }
+ {
+ \__kernel_color_backend_stack_init:Nnn \c_@@_backend_main_stack_int
+ { page ~ direct } { 0 ~ g ~ 0 ~ G }
+ \int_set_eq:NN \l_@@_backend_stack_int
+ \c_@@_backend_main_stack_int
+ \int_const:cn { main@pdfcolorstack } { \c_@@_backend_main_stack_int }
+ }
% \end{macrocode}
% The backend automatically restores the stack color from the \enquote{classical}
% approach (\texttt{pdf:bcolor}) after a scope. That will be an issue for us, so
% we manually ensure that the one we are using is inserted.
% \begin{macrocode}
- \cs_gset_protected:Npn \__kernel_backend_scope_end:
+\cs_gset_protected:Npn \__kernel_backend_scope_end:
+ {
+ \__kernel_backend_literal:n { x:grestore }
+ \__kernel_backend_literal:x
{
- \__kernel_backend_literal:n { x:grestore }
- \__kernel_backend_literal:x
- {
- pdfcolorstack ~
- \int_use:N \g_@@_backend_stack_int \c_space_tl current
- }
+ pdfcolorstack ~
+ \int_use:N \g_@@_backend_stack_int \c_space_tl current
}
}
% \end{macrocode}
@@ -261,26 +257,23 @@
% \begin{macro}{\__kernel_color_backend_stack_pop:n}
% Simple enough but needs a version check.
% \begin{macrocode}
-\int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+\cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2
{
- \cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2
+ \__kernel_backend_literal:x
{
- \__kernel_backend_literal:x
- {
- pdfcolorstack ~
- \int_eval:n {#1} ~
- push ~ (#2)
- }
+ pdfcolorstack ~
+ \int_eval:n {#1} ~
+ push ~ (#2)
}
- \cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx }
- \cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1
+ }
+\cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx }
+\cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1
+ {
+ \__kernel_backend_literal:x
{
- \__kernel_backend_literal:x
- {
- pdfcolorstack ~
- \int_eval:n {#1} ~
- pop
- }
+ pdfcolorstack ~
+ \int_eval:n {#1} ~
+ pop
}
}
% \end{macrocode}
@@ -440,10 +433,6 @@
%
% \subsubsection{\texttt{dvipmdfx}/\XeTeX{}}
%
-% \begin{macrocode}
-%<*dvipdfmx|xetex>
-% \end{macrocode}
-%
% These backends have the most possible approaches: it recognises both
% \texttt{dvips}-based color specials and it's own format, plus one can
% include PDF statements directly. Recent releases also have a color stack
@@ -452,32 +441,6 @@
% we have. Thus it is used in preference to the \texttt{dvips}-style interface
% or the \enquote{native} color specials (which have only one stack).
%
-% \begin{macro}
-% {
-% \@@_backend_select_cmyk:n ,
-% \@@_backend_select_gray:n ,
-% \@@_backend_select_rgb:n
-% }
-% \begin{macro}{\@@_backend_reset:}
-% Push the data to the stack.
-% \begin{macrocode}
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
- {
- \cs_gset_protected:Npn \@@_backend_select_cmyk:n #1
- { \__kernel_backend_literal:n { pdf: bc ~ [#1] } }
- \cs_gset_eq:NN \@@_backend_select_gray:n \@@_backend_select_cmyk:n
- \cs_gset_eq:NN \@@_backend_select_rgb:n \@@_backend_select_cmyk:n
- \cs_gset_protected:Npn \@@_backend_reset:
- { \__kernel_backend_literal:n { pdf: ec } }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macrocode}
-%</dvipdfmx|xetex>
-% \end{macrocode}
-%
% \subsection{Separations}
%
% Here, life gets interesting and we need essentially one approach per
@@ -1097,28 +1060,6 @@
%</dvipdfmx|luatex|pdftex|xetex>
% \end{macrocode}
%
-% \begin{macrocode}
-%<*dvipdfmx|xetex>
-% \end{macrocode}
-%
-% \begin{macro}{\@@_backend_select_separation:nn, \@@_backend_select_devicen:nn}
-% For older \texttt{(x)dvipdfmx}, we \emph{could} support separations using a
-% dedicated mechanism, but it was not added that long before the color
-% stacks. So instead of having two complex paths, just disable here.
-% \begin{macrocode}
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
- {
- \cs_gset_protected:Npn \@@_backend_select_separation:nn #1#2 { }
- \cs_gset_eq:NN \@@_backend_select_devicen:nn
- \@@_backend_select_separation:nn
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-%</dvipdfmx|xetex>
-% \end{macrocode}
-%
% \subsection{Fill and stroke color}
%
% Here, \texttt{dvipdfmx}/\XeTeX{} follows \LuaTeX{} and \pdfTeX{},
@@ -1198,52 +1139,6 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<*dvipdfmx|xetex>
-% \end{macrocode}
-%
-% \begin{macro}
-% {
-% \@@_backend_fill_cmyk:n ,
-% \@@_backend_fill_gray:n ,
-% \@@_backend_fill_rgb:n
-% }
-% \begin{macro}{\@@_backend_reset:}
-% \begin{macro}{\@@_backend_stroke:n}
-% \begin{macro}{\@@_backend_fill_separation:nn, \@@_backend_stroke_separation:nn}
-% Deal with older \texttt{(x)dvipdfmx}.
-% \begin{macrocode}
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
- {
- \cs_gset_protected:Npn \@@_backend_fill_cmyk:n #1
- {
- \__kernel_backend_literal:n { pdf: bc ~ [#1] }
- \group_insert_after:N \@@_backend_reset:
- }
- \cs_gset_eq:NN \@@_backend_fill_gray:n \@@_backend_fill_cmyk:n
- \cs_gset_eq:NN \@@_backend_fill_rgb:n \@@_backend_fill_cmyk:n
- \cs_gset_protected:Npn \@@_backend_reset:
- { \__kernel_backend_literal:n { pdf: ec } }
- \cs_gset_protected:Npn \@@_backend_stroke:n #1
- { \__kernel_backend_literal:n {#1} }
- \cs_gset_protected:Npn \@@_backend_fill_separation:nn #1#2 { }
- \cs_gset_eq:NN \@@_backend_fill_devicen:nn
- \@@_backend_fill_separation:nn
- \cs_gset_eq:NN \@@_backend_stroke_separation:nn
- \@@_backend_fill_separation:nn
- \cs_gset_eq:NN \@@_backend_stroke_devicen:nn
- \@@_backend_stroke_separation:nn
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macrocode}
-%</dvipdfmx|xetex>
-% \end{macrocode}
-%
-% \begin{macrocode}
%<*dvips>
% \end{macrocode}
%
@@ -1414,6 +1309,14 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_backend_devicen_init:nnn, \@@_backend_iccbased_init:nnn}
+% No support at present.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_devicen_init:nnn #1#2#3 { }
+\cs_new_protected:Npn \@@_backend_iccbased_init:nnn #1#2#3 { }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
%</dvisvgm>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3backend/l3backend-draw.dtx b/macros/latex/contrib/l3backend/l3backend-draw.dtx
index 43da62e394..0f9fcb6008 100644
--- a/macros/latex/contrib/l3backend/l3backend-draw.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-draw.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-graphics.dtx b/macros/latex/contrib/l3backend/l3backend-graphics.dtx
index 37122b9a74..1bd6a7e336 100644
--- a/macros/latex/contrib/l3backend/l3backend-graphics.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-graphics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -60,20 +60,48 @@
%<@@=graphics>
% \end{macrocode}
%
+% \begin{macro}{\@@_backend_loaded:n}
+% To deal with file load ordering. Plain users are on their own.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_loaded:n #1
+ {
+ \cs_if_exist:NTF \hook_gput_code:nnn
+ {
+ \hook_gput_code:nnn
+ { file / l3graphics.sty / after }
+ { backend }
+ {#1}
+ }
+ {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{\texttt{dvips} backend}
%
% \begin{macrocode}
%<*dvips>
% \end{macrocode}
%
-% \begin{macro}{\@@_backend_getbb_eps:n}
+% \begin{variable}{\l_graphics_search_ext_seq}
+% \begin{macrocode}
+\@@_backend_loaded:n
+ { \seq_set_from_clist:Nn \l_graphics_search_ext_seq { .eps , .ps } }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_backend_getbb_eps:n, \@@_backend_getbb_ps:n}
% Simply use the generic function.
% \begin{macrocode}
-\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n
+\@@_backend_loaded:n
+ {
+ \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n
+ \cs_new_eq:NN \@@_backend_getbb_ps:n \@@_read_bb:n
+ }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_backend_include_eps:n}
+% \begin{macro}{\@@_backend_include_eps:n, \@@_backend_include_ps:n}
% The special syntax is relatively clear here: remember we need PostScript
% sizes here.
% \begin{macrocode}
@@ -82,12 +110,20 @@
\__kernel_backend_literal:x
{
PSfile = #1 \c_space_tl
- llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
- lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
- urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
- ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+ llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl
+ lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl
+ urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl
+ ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim
}
}
+\cs_new_eq:NN \@@_backend_include_ps:n \@@_backend_include_eps:n
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_backend_get_pagecount:n}
+% \begin{macrocode}
+\@@_backend_loaded:n
+ { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n }
% \end{macrocode}
% \end{macro}
%
@@ -101,6 +137,17 @@
%<*luatex|pdftex>
% \end{macrocode}
%
+% \begin{variable}{\l_graphics_search_ext_seq}
+% \begin{macrocode}
+\@@_backend_loaded:n
+ {
+ \seq_set_from_clist:Nn
+ \l_graphics_search_ext_seq
+ { .pdf , .eps , .png , .jpg , .jpeg }
+ }
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\l_@@_graphics_attr_tl}
% In PDF mode, additional attributes of an graphic (such as page number) are
% needed both to obtain the bounding box and when inserting the graphic: this
@@ -115,12 +162,18 @@
%
% \begin{macro}
% {
-% \@@_backend_getbb_jpg:n,
-% \@@_backend_getbb_pdf:n,
+% \@@_backend_getbb_jpg:n ,
+% \@@_backend_getbb_jpeg:n ,
+% \@@_backend_getbb_pdf:n ,
% \@@_backend_getbb_png:n
% }
% \begin{macro}
-% {\@@_backend_getbb_auxi:n, \@@_backend_getbb_auxii:n}
+% {
+% \@@_backend_getbb_auxi:n ,
+% \@@_backend_getbb_auxii:n ,
+% \@@_backend_getbb_auxiii:n
+% }
+% \begin{macro}[EXP]{\@@_backend_dequote:w}
% Getting the bounding box here requires us to box up the graphic and
% measure it. To deal with the difference in feature support in bitmap
% and vector graphics but keeping the common parts, there is a little work
@@ -130,78 +183,88 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_getbb_jpg:n #1
{
- \int_zero:N \l_graphics_page_int
- \tl_clear:N \l_graphics_pagebox_tl
+ \int_zero:N \l_@@_page_int
+ \tl_clear:N \l_@@_pagebox_tl
\tl_set:Nx \l_@@_graphics_attr_tl
{
- \tl_if_empty:NF \l_graphics_decodearray_tl
- { :D \l_graphics_decodearray_tl }
- \bool_if:NT \l_graphics_interpolate_bool
+ \tl_if_empty:NF \l_@@_decodearray_str
+ { :D \l_@@_decodearray_str }
+ \bool_if:NT \l_@@_interpolate_bool
{ :I }
}
\tl_clear:N \l_@@_graphics_attr_tl
\@@_backend_getbb_auxi:n {#1}
}
+\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n
\cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n
\cs_new_protected:Npn \@@_backend_getbb_pdf:n #1
{
- \tl_clear:N \l_graphics_decodearray_tl
- \bool_set_false:N \l_graphics_interpolate_bool
+ \tl_clear:N \l_@@_decodearray_str
+ \bool_set_false:N \l_@@_interpolate_bool
\tl_set:Nx \l_@@_graphics_attr_tl
{
- : \l_graphics_pagebox_tl
- \int_compare:nNnT \l_graphics_page_int > 1
- { :P \int_use:N \l_graphics_page_int }
+ : \l_@@_pagebox_tl
+ \int_compare:nNnT \l_@@_page_int > 1
+ { :P \int_use:N \l_@@_page_int }
}
\@@_backend_getbb_auxi:n {#1}
}
\cs_new_protected:Npn \@@_backend_getbb_auxi:n #1
{
- \graphics_bb_restore:xF { #1 \l_@@_graphics_attr_tl }
+ \@@_bb_restore:xF { #1 \l_@@_graphics_attr_tl }
{ \@@_backend_getbb_auxii:n {#1} }
}
% \end{macrocode}
% Measuring the graphic is done by boxing up: for PDF graphics we could
% use |\tex_pdfximagebbox:D|, but if doesn't work for other types.
% As the box always starts at $(0,0)$ there is no need to worry about
-% the lower-left position.
+% the lower-left position. Quotes need to be \emph{removed} as \LuaTeX{}
+% does not like them here.
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_getbb_auxii:n #1
{
+ \exp_args:Ne \@@_backend_getbb_auxiii:n
+ { \@@_backend_dequote:w #1 " #1 " \s_@@_stop }
+ \int_const:cn { c_@@_ #1 \l_@@_graphics_attr_tl _int }
+ { \tex_the:D \tex_pdflastximage:D }
+ \@@_bb_save:x { #1 \l_@@_graphics_attr_tl }
+ }
+\cs_new_protected:Npn \@@_backend_getbb_auxiii:n #1
+ {
\tex_immediate:D \tex_pdfximage:D
\bool_lazy_or:nnT
- { \l_graphics_interpolate_bool }
- { ! \tl_if_empty_p:N \l_graphics_decodearray_tl }
+ { \l_@@_interpolate_bool }
+ { ! \tl_if_empty_p:N \l_@@_decodearray_str }
{
attr ~
{
- \tl_if_empty:NF \l_graphics_decodearray_tl
- { /Decode~[ \l_graphics_decodearray_tl ] }
- \bool_if:NT \l_graphics_interpolate_bool
+ \tl_if_empty:NF \l_@@_decodearray_str
+ { /Decode~[ \l_@@_decodearray_str ] }
+ \bool_if:NT \l_@@_interpolate_bool
{ /Interpolate~true }
}
}
- \int_compare:nNnT \l_graphics_page_int > 0
- { page ~ \int_use:N \l_graphics_page_int }
- \tl_if_empty:NF \l_graphics_pagebox_tl
- { \l_graphics_pagebox_tl }
+ \int_compare:nNnT \l_@@_page_int > 0
+ { page ~ \int_use:N \l_@@_page_int }
+ \tl_if_empty:NF \l_@@_pagebox_tl
+ { \l_@@_pagebox_tl }
{#1}
\hbox_set:Nn \l_@@_internal_box
{ \tex_pdfrefximage:D \tex_pdflastximage:D }
- \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l_@@_internal_box }
- \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l_@@_internal_box }
- \int_const:cn { c_@@_graphics_ #1 \l_@@_graphics_attr_tl _int }
- { \tex_the:D \tex_pdflastximage:D }
- \graphics_bb_save:x { #1 \l_@@_graphics_attr_tl }
+ \dim_set:Nn \l_@@_urx_dim { \box_wd:N \l_@@_internal_box }
+ \dim_set:Nn \l_@@_ury_dim { \box_ht:N \l_@@_internal_box }
}
+\cs_new:Npn \@@_backend_dequote:w #1 " #2 " #3 \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {
-% \@@_backend_include_jpg:n,
-% \@@_backend_include_pdf:n,
+% \@@_backend_include_jpg:n ,
+% \@@_backend_include_jpeg:n ,
+% \@@_backend_include_pdf:n ,
% \@@_backend_include_png:n
% }
% Images are already loaded for the measurement part of the code, so
@@ -211,8 +274,9 @@
\cs_new_protected:Npn \@@_backend_include_jpg:n #1
{
\tex_pdfrefximage:D
- \int_use:c { c_@@_graphics_ #1 \l_@@_graphics_attr_tl _int }
+ \int_use:c { c_@@_ #1 \l_@@_graphics_attr_tl _int }
}
+\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_jpg:n
\cs_new_eq:NN \@@_backend_include_pdf:n \@@_backend_include_jpg:n
\cs_new_eq:NN \@@_backend_include_png:n \@@_backend_include_jpg:n
% \end{macrocode}
@@ -241,8 +305,12 @@
\l_@@_backend_ext_str
\exp_args:Nx \@@_backend_getbb_eps:nn
{
- \l_@@_backend_name_str - \str_tail:N \l_@@_backend_ext_str
- -converted-to.pdf
+ \exp_args:Ne \__kernel_file_name_quote:n
+ {
+ \l_@@_backend_name_str
+ - \str_tail:N \l_@@_backend_ext_str
+ -converted-to.pdf
+ }
}
{#1}
}
@@ -253,7 +321,7 @@
\sys_shell_now:n
{ repstopdf ~ #2 ~ #1 }
}
- \tl_set:Nn \l_graphics_name_tl {#1}
+ \tl_set:Nn \l_@@_final_name_str {#1}
\@@_backend_getbb_pdf:n {#1}
}
\cs_new_protected:Npn \@@_backend_include_eps:n #1
@@ -262,8 +330,12 @@
\l_@@_backend_dir_str \l_@@_backend_name_str \l_@@_backend_ext_str
\exp_args:Nx \@@_backend_include_pdf:n
{
- \l_@@_backend_name_str - \str_tail:N \l_@@_backend_ext_str
- -converted-to.pdf
+ \exp_args:Ne \__kernel_file_name_quote:n
+ {
+ \l_@@_backend_name_str
+ - \str_tail:N \l_@@_backend_ext_str
+ -converted-to.pdf
+ }
}
}
}
@@ -273,6 +345,18 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\@@_backend_get_pagecount:n}
+% Simply load and store.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_get_pagecount:n #1
+ {
+ \tex_immediate:D \tex_pdfximage:D {#1}
+ \int_const:cn { c_@@_ #1 _pages_int }
+ { \int_use:N \tex_pdflastximagepages:D }
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
%</luatex|pdftex>
% \end{macrocode}
@@ -283,28 +367,46 @@
%<*dvipdfmx|xetex>
% \end{macrocode}
%
+% \begin{variable}{\l_graphics_search_ext_seq}
+% \begin{macrocode}
+\@@_backend_loaded:n
+ {
+ \seq_set_from_clist:Nn \l_graphics_search_ext_seq
+ { .pdf , .eps , .ps , .png , .jpg ., jpeg , .bmp }
+ }
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}
% {
-% \@@_backend_getbb_eps:n, \@@_backend_getbb_jpg:n,
-% \@@_backend_getbb_pdf:n, \@@_backend_getbb_png:n
+% \@@_backend_getbb_eps:n ,
+% \@@_backend_getbb_jpg:n , \@@_backend_getbb_jpeg:n ,
+% \@@_backend_getbb_pdf:n , \@@_backend_getbb_png:n ,
+% \@@_backend_getbb_bmp:n
% }
% Simply use the generic functions: only for \texttt{dvipdfmx} in the
% extraction cases.
% \begin{macrocode}
-\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n
+\@@_backend_loaded:n
+ {
+ \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n
+ \cs_new_eq:NN \@@_backend_getbb_ps:n \@@_read_bb:n
+ }
%<*dvipdfmx>
\cs_new_protected:Npn \@@_backend_getbb_jpg:n #1
{
- \int_zero:N \l_graphics_page_int
- \tl_clear:N \l_graphics_pagebox_tl
- \graphics_extract_bb:n {#1}
+ \int_zero:N \l_@@_page_int
+ \tl_clear:N \l_@@_pagebox_tl
+ \@@_extract_bb:n {#1}
}
+\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n
\cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n
+\cs_new_eq:NN \@@_backend_getbb_bmp:n \@@_backend_getbb_jpg:n
\cs_new_protected:Npn \@@_backend_getbb_pdf:n #1
{
- \tl_clear:N \l_graphics_decodearray_tl
- \bool_set_false:N \l_graphics_interpolate_bool
- \graphics_extract_bb:n {#1}
+ \tl_clear:N \l_@@_decodearray_str
+ \bool_set_false:N \l_@@_interpolate_bool
+ \@@_extract_bb:n {#1}
}
%</dvipdfmx>
% \end{macrocode}
@@ -319,8 +421,10 @@
%
% \begin{macro}
% {
-% \@@_backend_include_eps:n, \@@_backend_include_jpg:n,
-% \@@_backend_include_pdf:n, \@@_backend_include_png:n
+% \@@_backend_include_eps:n , \@@_backend_include_ps:n ,
+% \@@_backend_include_jpg:n , \@@_backend_include_jpseg:n ,
+% \@@_backend_include_pdf:n , \@@_backend_include_png:n ,
+% \@@_backend_include_bmp:n ,
% }
% \begin{macro}{\@@_backend_include_auxi:nn}
% \begin{macro}{\@@_backend_include_auxii:nnn, \@@_backend_include_auxii:xnn}
@@ -335,15 +439,18 @@
\__kernel_backend_literal:x
{
PSfile = #1 \c_space_tl
- llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
- lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
- urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
- ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+ llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl
+ lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl
+ urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl
+ ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim
}
}
+\cs_new_eq:NN \@@_backend_include_ps:n \@@_backend_include_eps:n
\cs_new_protected:Npn \@@_backend_include_jpg:n #1
{ \@@_backend_include_auxi:nn {#1} { image } }
+\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_jpg:n
\cs_new_eq:NN \@@_backend_include_png:n \@@_backend_include_jpg:n
+\cs_new_eq:NN \@@_backend_include_bmp:n \@@_backend_include_jpg:n
%<*dvipdfmx>
\cs_new_protected:Npn \@@_backend_include_pdf:n #1
{ \@@_backend_include_auxi:nn {#1} { epdf } }
@@ -358,23 +465,23 @@
{
\@@_backend_include_auxii:xnn
{
- \tl_if_empty:NF \l_graphics_pagebox_tl
- { : \l_graphics_pagebox_tl }
- \int_compare:nNnT \l_graphics_page_int > 1
- { :P \int_use:N \l_graphics_page_int }
- \tl_if_empty:NF \l_graphics_decodearray_tl
- { :D \l_graphics_decodearray_tl }
- \bool_if:NT \l_graphics_interpolate_bool
+ \tl_if_empty:NF \l_@@_pagebox_tl
+ { : \l_@@_pagebox_tl }
+ \int_compare:nNnT \l_@@_page_int > 1
+ { :P \int_use:N \l_@@_page_int }
+ \tl_if_empty:NF \l_@@_decodearray_str
+ { :D \l_@@_decodearray_str }
+ \bool_if:NT \l_@@_interpolate_bool
{ :I }
}
{#1} {#2}
}
\cs_new_protected:Npn \@@_backend_include_auxii:nnn #1#2#3
{
- \int_if_exist:cTF { c_@@_graphics_ #2#1 _int }
+ \int_if_exist:cTF { c_@@_ #2#1 _int }
{
\__kernel_backend_literal:x
- { pdf:usexobj~@graphic \int_use:c { c_@@_graphics_ #2#1 _int } }
+ { pdf:usexobj~@graphic \int_use:c { c_@@_ #2#1 _int } }
}
{ \@@_backend_include_auxiii:nnn {#2} {#1} {#3} }
}
@@ -388,31 +495,31 @@
\cs_new_protected:Npn \@@_backend_include_auxiii:nnn #1#2#3
{
\int_gincr:N \g_@@_track_int
- \int_const:cn { c_@@_graphics_ #1#2 _int } { \g_@@_track_int }
+ \int_const:cn { c_@@_ #1#2 _int } { \g_@@_track_int }
\__kernel_backend_literal:x
{
pdf:#3~
- @graphic \int_use:c { c_@@_graphics_ #1#2 _int } ~
- \int_compare:nNnT \l_graphics_page_int > 1
- { page ~ \int_use:N \l_graphics_page_int \c_space_tl }
- \tl_if_empty:NF \l_graphics_pagebox_tl
+ @graphic \int_use:c { c_@@_ #1#2 _int } ~
+ \int_compare:nNnT \l_@@_page_int > 1
+ { page ~ \int_use:N \l_@@_page_int \c_space_tl }
+ \tl_if_empty:NF \l_@@_pagebox_tl
{
- pagebox ~ \l_graphics_pagebox_tl \c_space_tl
+ pagebox ~ \l_@@_pagebox_tl \c_space_tl
bbox ~
- \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
- \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
- \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
- \dim_to_decimal_in_bp:n \l_graphics_ury_dim \c_space_tl
+ \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl
+ \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl
+ \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl
+ \dim_to_decimal_in_bp:n \l_@@_ury_dim \c_space_tl
}
(#1)
\bool_lazy_or:nnT
- { \l_graphics_interpolate_bool }
- { ! \tl_if_empty_p:N \l_graphics_decodearray_tl }
+ { \l_@@_interpolate_bool }
+ { ! \tl_if_empty_p:N \l_@@_decodearray_str }
{
<<
- \tl_if_empty:NF \l_graphics_decodearray_tl
- { /Decode~[ \l_graphics_decodearray_tl ] }
- \bool_if:NT \l_graphics_interpolate_bool
+ \tl_if_empty:NF \l_@@_decodearray_str
+ { /Decode~[ \l_@@_decodearray_str ] }
+ \bool_if:NT \l_@@_interpolate_bool
{ /Interpolate~true> }
>>
}
@@ -424,6 +531,15 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\@@_backend_get_pagecount:n}
+% \begin{macrocode}
+%<*dvipdfmx>
+\@@_backend_loaded:n
+ { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n }
+%</dvipdfmx>
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
%</dvipdfmx|xetex>
% \end{macrocode}
@@ -434,13 +550,13 @@
%<*xetex>
% \end{macrocode}
%
-% \subsubsection{Images}
-%
% \begin{macro}
% {
-% \@@_backend_getbb_jpg:n,
-% \@@_backend_getbb_pdf:n,
-% \@@_backend_getbb_png:n
+% \@@_backend_getbb_jpg:n ,
+% \@@_backend_getbb_jpeg:n ,
+% \@@_backend_getbb_pdf:n ,
+% \@@_backend_getbb_png:n ,
+% \@@_backend_getbb_bmp:n
% }
% \begin{macro}{\@@_backend_getbb_auxi:nN}
% \begin{macro}{\@@_backend_getbb_auxii:nnN, \@@_backend_getbb_auxii:VnN}
@@ -456,21 +572,23 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_getbb_jpg:n #1
{
- \int_zero:N \l_graphics_page_int
- \tl_clear:N \l_graphics_pagebox_tl
+ \int_zero:N \l_@@_page_int
+ \tl_clear:N \l_@@_pagebox_tl
\@@_backend_getbb_auxi:nN {#1} \tex_XeTeXpicfile:D
}
+\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n
\cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n
+\cs_new_eq:NN \@@_backend_getbb_bmp:n \@@_backend_getbb_jpg:n
\cs_new_protected:Npn \@@_backend_getbb_pdf:n #1
{
- \tl_clear:N \l_graphics_decodearray_tl
- \bool_set_false:N \l_graphics_interpolate_bool
+ \tl_clear:N \l_@@_decodearray_str
+ \bool_set_false:N \l_@@_interpolate_bool
\@@_backend_getbb_auxi:nN {#1} \tex_XeTeXpdffile:D
}
\cs_new_protected:Npn \@@_backend_getbb_auxi:nN #1#2
{
- \int_compare:nNnTF \l_graphics_page_int > 1
- { \@@_backend_getbb_auxii:VnN \l_graphics_page_int {#1} #2 }
+ \int_compare:nNnTF \l_@@_page_int > 1
+ { \@@_backend_getbb_auxii:VnN \l_@@_page_int {#1} #2 }
{ \@@_backend_getbb_auxiii:nNnn {#1} #2 { :P 1 } { page 1 } }
}
\cs_new_protected:Npn \@@_backend_getbb_auxii:nnN #1#2#3
@@ -478,8 +596,8 @@
\cs_generate_variant:Nn \@@_backend_getbb_auxii:nnN { V }
\cs_new_protected:Npn \@@_backend_getbb_auxiii:nNnn #1#2#3#4
{
- \tl_if_empty:NTF \l_graphics_pagebox_tl
- { \@@_backend_getbb_auxiv:VnNnn \l_graphics_pagebox_tl }
+ \tl_if_empty:NTF \l_@@_pagebox_tl
+ { \@@_backend_getbb_auxiv:VnNnn \l_@@_pagebox_tl }
{ \@@_backend_getbb_auxv:nNnn }
{#1} #2 {#3} {#4}
}
@@ -488,21 +606,25 @@
\use:x
{
\@@_backend_getbb_auxv:nNnn {#2} #3 { : #1 #4 }
- { #5 ~ \@@_backend_getbb_pagebox:w #1 }
+ {
+ #5
+ \tl_if_blank:nF {#1}
+ { \c_space_tl \@@_backend_getbb_pagebox:w #1 }
+ }
}
}
\cs_generate_variant:Nn \@@_backend_getbb_auxiv:nnNnn { V }
\cs_new_protected:Npn \@@_backend_getbb_auxv:nNnn #1#2#3#4
{
- \graphics_bb_restore:nF {#1#3}
+ \@@_bb_restore:nF {#1#3}
{ \@@_backend_getbb_auxvi:nNnn {#1} #2 {#3} {#4} }
}
\cs_new_protected:Npn \@@_backend_getbb_auxvi:nNnn #1#2#3#4
{
\hbox_set:Nn \l_@@_internal_box { #2 #1 ~ #4 }
- \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l_@@_internal_box }
- \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l_@@_internal_box }
- \graphics_bb_save:n {#1#3}
+ \dim_set:Nn \l_@@_urx_dim { \box_wd:N \l_@@_internal_box }
+ \dim_set:Nn \l_@@_ury_dim { \box_ht:N \l_@@_internal_box }
+ \@@_bb_save:n {#1#3}
}
\cs_new:Npn \@@_backend_getbb_pagebox:w #1 box {#1}
% \end{macrocode}
@@ -515,7 +637,6 @@
% \end{macro}
%
% \begin{macro}{\@@_backend_include_pdf:n}
-% \begin{macro}{\@@_backend_include_bitmap_quote:w}
% For PDF graphics, properly supporting the |pagebox| concept in \XeTeX{}
% is best done using the |\tex_XeTeXpdffile:D| primitive. The syntax here
% is the same as for the graphic measurement part, although we know at this
@@ -523,16 +644,27 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_include_pdf:n #1
{
- \tex_XeTeXpdffile:D
- \@@_backend_include_pdf_quote:w #1 "#1" \s_@@_stop \c_space_tl
- \int_compare:nNnT \l_graphics_page_int > 0
- { page ~ \int_use:N \l_graphics_page_int \c_space_tl }
- \exp_after:wN \@@_backend_getbb_pagebox:w \l_graphics_pagebox_tl
+ \tex_XeTeXpdffile:D #1 ~
+ \int_compare:nNnT \l_@@_page_int > 0
+ { page ~ \int_use:N \l_@@_page_int \c_space_tl }
+ \exp_after:wN \@@_backend_getbb_pagebox:w \l_@@_pagebox_tl
}
-\cs_new:Npn \@@_backend_include_pdf_quote:w #1 " #2 " #3 \s_@@_stop
- { " #2 " }
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\@@_backend_get_pagecount:n}
+% Very little to do here other than cover the case of a non-PDF file.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_get_pagecount:n #1
+ {
+ \int_const:cn { c_@@_ #1 _pages_int }
+ {
+ \int_max:nn
+ { \int_use:N \tex_XeTeXpdfpagecount:D #1 ~ }
+ { 1 }
+ }
+ }
+% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
@@ -545,22 +677,35 @@
%<*dvisvgm>
% \end{macrocode}
%
+% \begin{variable}{\l_graphics_search_ext_seq}
+% \begin{macrocode}
+\@@_backend_loaded:n
+ {
+ \seq_set_from_clist:Nn
+ \l_graphics_search_ext_seq
+ { .pdf , .eps , .png , .jpg , .jpeg }
+ }
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\@@_backend_getbb_eps:n}
% Simply use the generic function.
% \begin{macrocode}
-\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n
+\@@_backend_loaded:n
+ { \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_backend_getbb_png:n, \@@_backend_getbb_jpg:n}
+% \begin{macro}{\@@_backend_getbb_png:n, \@@_backend_getbb_jpg:n, \@@_backend_getbb_jpeg:n}
% These can be included by extracting the bounding box data.
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_getbb_jpg:n #1
{
- \int_zero:N \l_graphics_page_int
- \tl_clear:N \l_graphics_pagebox_tl
- \graphics_extract_bb:n {#1}
+ \int_zero:N \l_@@_page_int
+ \tl_clear:N \l_@@_pagebox_tl
+ \@@_extract_bb:n {#1}
}
+\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n
\cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n
% \end{macrocode}
% \end{macro}
@@ -570,9 +715,9 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_getbb_pdf:n #1
{
- \tl_clear:N \l_graphics_decodearray_tl
- \bool_set_false:N \l_graphics_interpolate_bool
- \graphics_extract_bb:n {#1}
+ \tl_clear:N \l_@@_decodearray_str
+ \bool_set_false:N \l_@@_interpolate_bool
+ \@@_extract_bb:n {#1}
}
% \end{macrocode}
% \end{macro}
@@ -583,25 +728,30 @@
% sizes here. (This is the same as the \texttt{dvips} code.)
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_include_eps:n #1
- { @@_backend_include:nn { PSfile } {#1} }
+ { \@@_backend_include:nn { PSfile } {#1} }
\cs_new_protected:Npn \@@_backend_include_pdf:n #1
- { @@_backend_include:nn { pdffile } {#1} }
+ { \@@_backend_include:nn { pdffile } {#1} }
\cs_new_protected:Npn \@@_backend_include:nn #1#2
{
\__kernel_backend_literal:x
{
#1 = #2 \c_space_tl
- llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
- lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
- urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
- ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+ llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl
+ lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl
+ urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl
+ ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim
}
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_backend_include_png:n, \@@_backend_include_jpg:n}
+% \begin{macro}
+% {
+% \@@_backend_include_png:n ,
+% \@@_backend_include_jpg:n ,
+% \@@_backend_include_jpeg:n
+% }
% \begin{macro}{\@@_backend_include_bitmap_quote:w}
% The backend here has built-in support for basic graphic inclusion (see
% \texttt{dvisvgm.def} for a more complex approach, needed if clipping,
@@ -615,11 +765,12 @@
\__kernel_backend_literal:x
{
dvisvgm:img~
- \dim_to_decimal:n { \l_graphics_ury_dim } ~
- \dim_to_decimal:n { \l_graphics_ury_dim } ~
+ \dim_to_decimal:n { \l_@@_ury_dim } ~
+ \dim_to_decimal:n { \l_@@_ury_dim } ~
\@@_backend_include_bitmap_quote:w #1 " #1 " \s_@@_stop
}
}
+\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_png:n
\cs_new_eq:NN \@@_backend_include_jpg:n \@@_backend_include_png:n
\cs_new:Npn \@@_backend_include_bitmap_quote:w #1 " #2 " #3 \s_@@_stop
{ " #2 " }
@@ -627,6 +778,13 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\@@_backend_get_pagecount:n}
+% \begin{macrocode}
+\@@_backend_loaded:n
+ { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
%</dvisvgm>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3backend/l3backend-header.dtx b/macros/latex/contrib/l3backend/l3backend-header.dtx
index fe05e97760..5eacda7b9f 100644
--- a/macros/latex/contrib/l3backend/l3backend-header.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-header.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3backend/l3backend-opacity.dtx b/macros/latex/contrib/l3backend/l3backend-opacity.dtx
index a38736bc5a..89d60de0df 100644
--- a/macros/latex/contrib/l3backend/l3backend-opacity.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-opacity.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -239,49 +239,6 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<*dvipdfmx|xdvipdfmx>
-% \end{macrocode}
-%
-% \begin{macro}{\@@_backend_select:n}
-% Older backends have no stack support, so everything is done directly.
-% \begin{macrocode}
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
- {
- \cs_gset_protected:Npn \@@_backend_select_aux:n #1
- {
- \tl_set:Nn \l_@@_backend_fill_tl {#1}
- \tl_set:Nn \l_@@_backend_stroke_tl {#1}
- \pdfmanagement_add:nnn { Page / Resources / ExtGState }
- { opacity #1 }
- { << /ca ~ #1 /CA ~ #1 >> }
- \__kernel_backend_literal_pdf:n { /opacity #1 ~ gs }
- }
- \cs_gset_protected:Npn \@@_backend_fill_stroke:nn #1#2
- {
- \str_if_eq:nnTF {#1} {#2}
- { \@@_backend_select_aux:n {#1} }
- {
- \tl_set:Nn \l_@@_backend_fill_tl {#1}
- \tl_set:Nn \l_@@_backend_stroke_tl {#2}
- \pdfmanagement_add:nnn { Page / Resources / ExtGState }
- { opacity.fill #1 }
- { << /ca ~ #1 >> }
- \pdfmanagement_add:nnn { Page / Resources / ExtGState }
- { opacity.stroke #1 }
- { << /CA ~ #2 >> }
- \__kernel_backend_literal_pdf:n
- { /opacity.fill #1 ~ gs /opacity.stroke #2 ~ gs }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-%</dvipdfmx|xdvipdfmx>
-% \end{macrocode}
-%
-% \begin{macrocode}
%<*dvisvgm>
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3backend/l3backend-pdf.dtx b/macros/latex/contrib/l3backend/l3backend-pdf.dtx
index 7b642b1a46..03435b2454 100644
--- a/macros/latex/contrib/l3backend/l3backend-pdf.dtx
+++ b/macros/latex/contrib/l3backend/l3backend-pdf.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -1421,19 +1421,13 @@
{ \@@_backend_link_begin:n {#1#2} }
\cs_new_protected:Npx \@@_backend_link_begin:n #1
{
- \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
- {
- \exp_not:N \int_gincr:N \exp_not:N \g_@@_backend_link_int
- }
+ \exp_not:N \int_gincr:N \exp_not:N \g_@@_backend_link_int
\@@_backend:x
{
bann ~
- \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
- {
- @pdf.lnk
- \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int
- \c_space_tl
- }
+ @pdf.lnk
+ \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int
+ \c_space_tl
<<
/Type /Annot
#1
@@ -1451,14 +1445,8 @@
% Available using the backend mechanism with a suitably-recent
% version.
% \begin{macrocode}
-\cs_new:Npx \@@_backend_link_last:
- {
- \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
- {
- @pdf.lnk
- \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int
- }
- }
+\cs_new:Npn \@@_backend_link_last:
+ { @pdf.lnk \int_use:N \g_@@_backend_link_int }
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex/contrib/l3experimental/CHANGELOG.md b/macros/latex/contrib/l3experimental/CHANGELOG.md
index adb32cd3b1..eb5896536a 100644
--- a/macros/latex/contrib/l3experimental/CHANGELOG.md
+++ b/macros/latex/contrib/l3experimental/CHANGELOG.md
@@ -7,6 +7,16 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2022-04-10]
+
+### Added
+- `\graphics_get_pagecount:nN(TF)`
+
+### Changed
+- Return an empty `seq` when `\sys_shell_split_ls:nN` is applied with a
+ glob which matched no entries
+- Heavily revise `l3graphics` to provide only necessary public interfaces
+
## [2022-02-05]
### Changed
@@ -236,7 +246,8 @@ this project uses date-based 'snapshot' version identifiers.
- New `l3color` module using `xcolor`-like expression syntax
- New `l3draw` module, based on `pgf` layer of the TikZ system
-[Unreleased]: https://github.com/latex3/latex3/compare/2022-02-05...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2022-04-10...HEAD
+[2022-04-10]: https://github.com/latex3/latex3/compare/2022-02-05...2022-04-10
[2022-02-05]: https://github.com/latex3/latex3/compare/2021-11-12...2022-02-05
[2021-11-12]: https://github.com/latex3/latex3/compare/2021-08-27...2021-11-12
[2021-08-27]: https://github.com/latex3/latex3/compare/2021-08-04...2021-08-27
diff --git a/macros/latex/contrib/l3experimental/README.md b/macros/latex/contrib/l3experimental/README.md
index 279ce50562..8d02dbf001 100644
--- a/macros/latex/contrib/l3experimental/README.md
+++ b/macros/latex/contrib/l3experimental/README.md
@@ -1,7 +1,7 @@
Experimental LaTeX3 Concepts
============================
-Release 2022-02-05
+Release 2022-04-10
Overview
--------
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.dtx b/macros/latex/contrib/l3experimental/l3benchmark.dtx
index e5d50ecf58..0eb34e5c0c 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.dtx
+++ b/macros/latex/contrib/l3experimental/l3benchmark.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -122,7 +122,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3benchmark}{2022-02-05}{}
+\ProvidesExplPackage{l3benchmark}{2022-04-10}{}
{L3 Experimental benchmarking}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.pdf b/macros/latex/contrib/l3experimental/l3benchmark.pdf
index 951852e501..e5f7ea9bc1 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.pdf
+++ b/macros/latex/contrib/l3experimental/l3benchmark.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3bitset.dtx b/macros/latex/contrib/l3experimental/l3bitset.dtx
index 7eba4d0315..3443ca7d25 100644
--- a/macros/latex/contrib/l3experimental/l3bitset.dtx
+++ b/macros/latex/contrib/l3experimental/l3bitset.dtx
@@ -42,7 +42,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
% \begin{documentation}
@@ -264,7 +264,7 @@
%<@@=bitset>
% \end{macrocode}
% \begin{macrocode}
-\ProvidesExplPackage{l3bitset}{2022-02-05}{}
+\ProvidesExplPackage{l3bitset}{2022-04-10}{}
{L3 Experimental bitset support}
% \end{macrocode}
% A bitset is a string variable.
diff --git a/macros/latex/contrib/l3experimental/l3bitset.pdf b/macros/latex/contrib/l3experimental/l3bitset.pdf
index 410e5313ac..47e6e50d2b 100644
--- a/macros/latex/contrib/l3experimental/l3bitset.pdf
+++ b/macros/latex/contrib/l3experimental/l3bitset.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3draw-boxes.dtx b/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
index 40e6f265ae..926ff3387e 100644
--- a/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-code.pdf b/macros/latex/contrib/l3experimental/l3draw-code.pdf
index b8cb75e007..31b8834d68 100644
--- a/macros/latex/contrib/l3experimental/l3draw-code.pdf
+++ b/macros/latex/contrib/l3experimental/l3draw-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3draw-layers.dtx b/macros/latex/contrib/l3experimental/l3draw-layers.dtx
index d161240988..e82e7a1e2a 100644
--- a/macros/latex/contrib/l3experimental/l3draw-layers.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-layers.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-paths.dtx b/macros/latex/contrib/l3experimental/l3draw-paths.dtx
index 0c78addf92..024faef324 100644
--- a/macros/latex/contrib/l3experimental/l3draw-paths.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-paths.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-points.dtx b/macros/latex/contrib/l3experimental/l3draw-points.dtx
index 379dc45e4a..fe3c28351e 100644
--- a/macros/latex/contrib/l3experimental/l3draw-points.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-points.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-scopes.dtx b/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
index 339e7dde97..2fcc7e8ac0 100644
--- a/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-softpath.dtx b/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
index 04a05acc57..53dfd48728 100644
--- a/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-state.dtx b/macros/latex/contrib/l3experimental/l3draw-state.dtx
index bda3a14ace..b93f593a7e 100644
--- a/macros/latex/contrib/l3experimental/l3draw-state.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-state.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-transforms.dtx b/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
index 6e60b8bddf..bdc96e0c88 100644
--- a/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw.dtx b/macros/latex/contrib/l3experimental/l3draw.dtx
index a309d0ffb7..31ac35f042 100644
--- a/macros/latex/contrib/l3experimental/l3draw.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw.dtx
@@ -110,7 +110,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -1173,7 +1173,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3draw}{2022-02-05}{}
+\ProvidesExplPackage{l3draw}{2022-04-10}{}
{L3 Experimental core drawing support}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3draw.pdf b/macros/latex/contrib/l3experimental/l3draw.pdf
index bf801c3593..d58318d5d3 100644
--- a/macros/latex/contrib/l3experimental/l3draw.pdf
+++ b/macros/latex/contrib/l3experimental/l3draw.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3galley.dtx b/macros/latex/contrib/l3experimental/l3galley.dtx
index f52c7fb59c..5dd9d565eb 100644
--- a/macros/latex/contrib/l3experimental/l3galley.dtx
+++ b/macros/latex/contrib/l3experimental/l3galley.dtx
@@ -61,7 +61,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -686,7 +686,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3galley}{2022-02-05}{}
+\ProvidesExplPackage{l3galley}{2022-04-10}{}
{L3 Experimental galley code}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3galley.pdf b/macros/latex/contrib/l3experimental/l3galley.pdf
index 1bcda6a650..af4ba00c96 100644
--- a/macros/latex/contrib/l3experimental/l3galley.pdf
+++ b/macros/latex/contrib/l3experimental/l3galley.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3graphics.dtx b/macros/latex/contrib/l3experimental/l3graphics.dtx
index 8b97a562ed..cf4a70983d 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.dtx
+++ b/macros/latex/contrib/l3experimental/l3graphics.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -54,140 +54,60 @@
%
% \section{\pkg{l3graphics} documentation}
%
-% \subsection{Driver functions}
+% \subsection{Graphics keys}
%
% Inclusion of graphic files requires a range of low-level data be passed to
-% the driver layer. These functions are primarily aimed at supporting this
-% work.
+% the backend. This is set up using a small number of key--value settings,
+% which are stored in the |graphics| tree.
%
-% \begin{variable}{\l_graphics_decodearray_tl}
+% \begin{variable}{decodearray}
% Array to decode color in bitmap graphic: when non-empty, this should
% be in the form of one, two or three pairs of real numbers in the range
% $[0,1]$, separated by spaces.
% \end{variable}
%
-% \begin{variable}{\l_graphics_interpolate_bool}
-% Indicates whether interpolation should be applied to bitmap graphic files.
+% \begin{variable}{draft}
+% Switch to enable draft mode: graphics are read but not included when this is
+% true.
+% \end{variable}
+%
+% \begin{variable}{interpolate}
+% Switch which indicates whether interpolation should be applied to bitmap
+% graphic files.
% \end{variable}
%
-% \begin{variable}{\l_graphics_page_int}
+% \begin{variable}{page}
% The page to extract from a multi-page graphic file: used for |.pdf| files
% which may contain multiple pages.
% \end{variable}
%
-% \begin{variable}{\l_graphics_pagebox_tl}
+% \begin{variable}{pagebox}
% The nature of the page box setting used to determine the bounding box of
% material: used for |.pdf| files which feature multiple page box
-% specifications.
+% specifications. A choice from |art|, |bleed|, |crop|, |media|, |trim|.
+% The standard setting is |crop|.
% \end{variable}
%
-% \begin{variable}{\l_graphics_draft_bool}
+% \begin{variable}{draft}
% Switch to enable draft mode: graphics are read but not included when this is
% true.
% \end{variable}
%
-% \begin{variable}
-% {\l_graphics_llx_dim, \l_graphics_lly_dim, \l_graphics_urx_dim, \l_graphics_ury_dim}
-% Dimensions which return the points $(\meta{llx},\meta{lly})$ and
-% $(\meta{urx},\meta{ury})$ for the graphic. For many graphics only the resulting
-% height and width are significant, but this is driver-dependent.
-% \end{variable}
-%
-% \begin{variable}{\l_graphics_name_bool}
-% The name of a graphics file being loaded: usually the same as the
-% input file name, but may be altered by some drivers.
+% \begin{variable}{type}
+% The type of graphic file beign included: if this key is not set, the
+% \emph{type} is determined from the file extension.
% \end{variable}
%
-% \begin{function}
-% {
-% \graphics_bb_save:n, \graphics_bb_save:x,
-% \graphics_bb_restore:nF, \graphics_bb_restore:xF
-% }
-% \begin{syntax}
-% \cs{graphics_bb_save:n} \Arg{graphic}
-% \cs{graphics_bb_restore:nF} \Arg{graphic} \Arg{false code}
-% \end{syntax}
-% This pair of functions are used to cache the bounding box of an \meta{graphic}
-% so that extraction/reading is only required once. The \texttt{save}
-% function stores the values from \cs{l_graphics_llx_dim},
-% \cs{l_graphics_lly_dim}, \cs{l_graphics_urx_dim} and
-% \cs{l_graphics_ury_dim} as constants. The \texttt{restore} function will then
-% look up values for the bounding box of an \meta{graphic} and set the four
-% dimensions appropriately. For any one \meta{graphic} the bounding box will
-% be constant, so the \texttt{save} function should only be called once. Thus
-% a typical use case is
-% \begin{verbatim}
-% \graphics_bb_restore:nF { <name> }
-% {
-% % Code to read the bb
-% \graphics_bb_save:n { <name> }
-% }
-% \end{verbatim}
-% \emph{i.e.}~every use of a bounding box will attempt to restore saved data,
-% and saving will only take place where that is not possible.
-%
-% Note that the \meta{graphic} may not be a simple file name: a multi-page PDF,
-% for example, will need to have the bounding box cached for each page used.
-% \end{function}
+% \subsection{Including graphics}
%
-% \begin{function}{\graphics_extract_bb:n}
+% \begin{function}{\graphics_include:nn, \graphics_include:nV}
% \begin{syntax}
-% \cs{graphics_extract_bb:n} \Arg{file}
+% \cs{graphics_include:nn} \Arg{keys} \Arg{file}
% \end{syntax}
-% Extracts bounding box data for the graphic \meta{file} using the |extractbb|
-% utility, and stores the bounding box of the graphic file in
-% \cs{l_graphics_llx_dim}, \cs{l_graphics_lly_dim}, \cs{l_graphics_urx_dim} and
-% \cs{l_graphics_ury_dim}.
-%
-% The \meta{file} name should be fully-qualified and sanitized: no search
-% or other manipulation is carried out at this level. No check is made on
-% the file \emph{type} at this stage: it is assumed that the driver code
-% using this function has made such a check. File types such as |.pdf| and
-% |.jpg| are appropriate for parsing using this function.
-%
-% When \cs{l_graphics_page_int} is positive the appropriate page will be
-% queried from the graphic file.
-%
-% Note that this function requires pipe shell calls to be enabled: this is
-% generally true but may require the option |--enable-pipes| to be enabled
-% when running the \TeX{} job.
-% \end{function}
-%
-% \begin{function}{\graphics_read_bb:n}
-% \begin{syntax}
-% \cs{graphics_read_bb:n} \Arg{file}
-% \end{syntax}
-% Parses the graphic \meta{file} to find a PostScript-style bounding box
-% line of the form
-% \begin{verbatim}
-% %%BoundingBox: llx lly urx urx
-% \end{verbatim}
-% where \meta{llx}, \meta{lly}, \meta{urx} and \meta{ury} are the corners
-% of the bounding box expressed in PostScript (\enquote{big}) points. The
-% values are stored in \cs{l_graphics_llx_dim}, \cs{l_graphics_lly_dim},
-% \cs{l_graphics_urx_dim} and \cs{l_graphics_ury_dim}.
-%
-% The \meta{file} name should be fully-qualified and sanitized: no search
-% or other manipulation is carried out at this level. No check is made on
-% the file \emph{type} at this stage: it is assumed that the driver code
-% using this function has made such a check. File types such as |.eps| and
-% |.bb|/|.xbb| are appropriate for parsing using this function.
-% \end{function}
-%
-% \begin{function}{\graphics_include:n, \graphics_include:nn}
-% \begin{syntax}
-% \cs{graphics_include:n} \Arg{file}
-% \cs{graphics_include:nn} \Arg{file} \Arg{type}
-% \end{syntax}
-% Horizontal-mode commands which include the \meta{file} as an graphic
-% at the current location. The file \meta{type} is given explicitly in
-% the two-argument version, or is inferred from the file extension extracted
-% in the single-argument form. The exact graphic types supported depend upon
-% the driver in use.
-%
-% Where the \meta{file} is not found and the \meta{type} is \emph{not}
-% given, a search for possible graphic files is undertaken using the extensions
-% stored in \cs{l_graphics_search_ext_seq}.
+% Horizontal-mode command which includes the \meta{file} as an graphic
+% at the current location. The file \meta{type} may be given as one of the
+% \meta{keys}, or will otherwise be determined from file extension. The
+% \meta{keys} is used to pass settings as detailed above.
% \end{function}
%
% \begin{variable}{\l_graphics_ext_type_prop}
@@ -200,11 +120,6 @@
% \end{verbatim}
% \end{variable}
%
-% \begin{variable}{\l_graphics_search_ext_seq}
-% Extensions to use for graphic searching when the given \meta{file} name is not
-% found by \cs{graphics_include:n}.
-% \end{variable}
-%
% \begin{variable}{\l_graphics_search_path_seq}
% Each entry is the path to a directory which should be searched when
% seeking an graphic file. Each path can be relative or absolute, and should
@@ -213,6 +128,36 @@
% variable content. Spaces need not be quoted.
% \end{variable}
%
+% \subsection{Utility functions}
+%
+% \begin{function}[noTF]{\graphics_get_full_name:nN}
+% \begin{syntax}
+% \cs{graphics_get_full_name:nN} \Arg{file} \meta{tl~var}
+% \cs{graphics_get_full_name:nNTF} \Arg{file} \meta{tl~var} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Searches for \meta{file} first as given and then using the extensions
+% listed in \cs{l_graphics_search_ext_seq}. The search path used will be
+% the entries of \cs{l_graphics_search_path_seq}. If found, the full file
+% name including any path and extension will be returned in the
+% \meta{tl~var}. In the non-branching version, the \meta{tl var} will be
+% set to \cs{q_no_value} in the case that the graphics is not found.
+% \end{function}
+%
+% \begin{variable}{\l_graphics_search_ext_seq}
+% Extensions to use for graphic searching when the given \meta{file} name is not
+% found by \cs{graphics_get_full_name:nN}.
+% \end{variable}
+%
+% \begin{function}{\graphics_get_pagecount:nN}
+% \begin{syntax}
+% \cs{graphics_get_pagecount:nn} \Arg{file} \meta{tl~var}
+% \end{syntax}
+% Reads the graphics \meta{file} and extracts the number of pages, which
+% are stored in the \meta{tl~var}.
+% \end{function}
+%
+% \subsection{Showing and logging included graphics}
+%
% \begin{function}{\graphics_show_list:, \graphics_log_list:}
% \begin{syntax}
% \cs{graphics_show_list:}
@@ -240,15 +185,15 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3graphics}{2022-02-05}{}
+\ProvidesExplPackage{l3graphics}{2022-04-10}{}
{L3 Experimental graphics inclusion support}
% \end{macrocode}
%
-% \begin{variable}{\l_@@_tmp_ior, \l_@@_tmp_tl}
+% \begin{variable}{\l_@@_internal_ior, \l_@@_internal_tl}
% Scratch space.
% \begin{macrocode}
-\ior_new:N \l_@@_tmp_ior
-\tl_new:N \l_@@_tmp_tl
+\ior_new:N \l_@@_internal_ior
+\tl_new:N \l_@@_internal_tl
% \end{macrocode}
% \end{variable}
%
@@ -259,24 +204,47 @@
% \end{macrocode}
% \end{variable}
%
-% \subsection{Image feature support}
+% \subsection{Graphics keys}
%
% \begin{macro}
% {
-% \l_graphics_decodearray_tl ,
-% \l_graphics_interpolate_bool,
-% \l_graphics_page_int ,
-% \l_graphics_pagebox_tl
+% \l_@@_decodearray_str ,
+% \l__@@_draft_bool ,
+% \l_@@_interpolate_bool ,
+% \l_@@_page_int ,
+% \l_@@_pagebox_tl ,
+% \l_@@_type_str
% }
% Keys which control features of graphics. The standard value of |pagebox|
-% set up here should match the default for the drivers themselves: in
-% the absence of any other setting the |cropbox| should be used.
+% set up here should match the default for the backends themselves: in
+% the absence of any other setting the |crop| should be used. Note that
+% the variable \cs{l_@@_pagebox_str} can be empty internally, as backends
+% which do not support |pagebox| are set up to clear it entirely. The
+% store for |pagebox| is a |tl| as that makes extracting the data
+% easier for some backends.
% \begin{macrocode}
-\tl_new:N \l_graphics_decodearray_tl
-\tl_new:N \l_graphics_pagebox_tl
-\bool_new:N \l_graphics_interpolate_bool
-\tl_set:Nn \l_graphics_pagebox_tl { cropbox }
-\int_new:N \l_graphics_page_int
+\tl_new:N \l_@@_pagebox_tl
+\keys_define:nn { graphics }
+ {
+ decodearray .str_set:N =
+ \l_@@_decodearray_str ,
+ draft .bool_set:N =
+ \l_@@_draft_bool ,
+ interpolate .bool_set:N =
+ \l_@@_interpolate_bool ,
+ pagebox .choices:nn =
+ { art , bleed , crop , media , trim }
+ {
+ \tl_set:Nx \l_@@_pagebox_tl
+ { \tl_use:N \l_keys_choice_tl box }
+ } ,
+ pagebox .initial:n =
+ crop ,
+ page .int_set:N =
+ \l_@@_page_int ,
+ type . str_set:N =
+ \l_@@_type_str
+ }
% \end{macrocode}
% \end{macro}
%
@@ -284,60 +252,60 @@
%
% \begin{variable}
% {
-% \l_graphics_llx_dim , \l_graphics_lly_dim,
-% \l_graphics_urx_dim , \l_graphics_ury_dim
+% \l_@@_llx_dim , \l_@@_lly_dim,
+% \l_@@_urx_dim , \l_@@_ury_dim
% }
% Storage for the return of bounding box.
% \begin{macrocode}
-\dim_new:N \l_graphics_llx_dim
-\dim_new:N \l_graphics_lly_dim
-\dim_new:N \l_graphics_urx_dim
-\dim_new:N \l_graphics_ury_dim
+\dim_new:N \l_@@_llx_dim
+\dim_new:N \l_@@_lly_dim
+\dim_new:N \l_@@_urx_dim
+\dim_new:N \l_@@_ury_dim
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\graphics_bb_save:n, \graphics_bb_save:x}
-% \begin{macro}{\graphics_bb_restore:nF, \graphics_bb_restore:xF}
+% \begin{macro}{\@@_bb_save:n, \@@_bb_save:x}
+% \begin{macro}{\@@_bb_restore:nF, \@@_bb_restore:xF}
% Caching graphic bounding boxes is sensible, and these functions are needed both
% here and for drive-specific work. So they are made available as documented
% functions. To save on registers, the \enquote{origin} is only saved if it is
% not at zero.
% \begin{macrocode}
-\cs_new_protected:Npn \graphics_bb_save:n #1
+\cs_new_protected:Npn \@@_bb_save:n #1
{
\dim_if_exist:cTF { c_@@_ #1 _urx_dim }
{ \msg_error:nnn { graphic } { bb-already-cached } {#1} }
{
- \dim_compare:nNnF \l_graphics_llx_dim = { 0pt }
- { \dim_const:cn { c_@@_ #1 _llx_dim } { \l_graphics_llx_dim } }
- \dim_compare:nNnF \l_graphics_lly_dim = { 0pt }
- { \dim_const:cn { c_@@_ #1 _lly_dim } { \l_graphics_lly_dim } }
- \dim_const:cn { c_@@_ #1 _urx_dim } { \l_graphics_urx_dim }
- \dim_const:cn { c_@@_ #1 _ury_dim } { \l_graphics_ury_dim }
+ \dim_compare:nNnF \l_@@_llx_dim = { 0pt }
+ { \dim_const:cn { c_@@_ #1 _llx_dim } { \l_@@_llx_dim } }
+ \dim_compare:nNnF \l_@@_lly_dim = { 0pt }
+ { \dim_const:cn { c_@@_ #1 _lly_dim } { \l_@@_lly_dim } }
+ \dim_const:cn { c_@@_ #1 _urx_dim } { \l_@@_urx_dim }
+ \dim_const:cn { c_@@_ #1 _ury_dim } { \l_@@_ury_dim }
}
}
-\cs_generate_variant:Nn \graphics_bb_save:n { x }
-\cs_new_protected:Npn \graphics_bb_restore:nF #1#2
+\cs_generate_variant:Nn \@@_bb_save:n { x }
+\cs_new_protected:Npn \@@_bb_restore:nF #1#2
{
\dim_if_exist:cTF { c_@@_ #1 _urx_dim }
{
- \dim_set_eq:Nc \l_graphics_urx_dim { c_@@_ #1 _urx_dim }
- \dim_set_eq:Nc \l_graphics_ury_dim { c_@@_ #1 _ury_dim }
+ \dim_set_eq:Nc \l_@@_urx_dim { c_@@_ #1 _urx_dim }
+ \dim_set_eq:Nc \l_@@_ury_dim { c_@@_ #1 _ury_dim }
\dim_if_exist:cTF { c_@@_ #1 _llx_dim }
- { \dim_set_eq:Nc \l_graphics_llx_dim { c_@@_ #1 _llx_dim } }
- { \dim_zero:N \l_graphics_llx_dim }
+ { \dim_set_eq:Nc \l_@@_llx_dim { c_@@_ #1 _llx_dim } }
+ { \dim_zero:N \l_@@_llx_dim }
\dim_if_exist:cTF { c_@@_ #1 _lly_dim }
- { \dim_set_eq:Nc \l_graphics_lly_dim { c_@@_ #1 _lly_dim } }
- { \dim_zero:N \l_graphics_lly_dim }
+ { \dim_set_eq:Nc \l_@@_lly_dim { c_@@_ #1 _lly_dim } }
+ { \dim_zero:N \l_@@_lly_dim }
}
{#2}
}
-\cs_generate_variant:Nn \graphics_bb_restore:nF { x }
+\cs_generate_variant:Nn \@@_bb_restore:nF { x }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\graphics_extract_bb:n, \graphics_read_bb:n}
+% \begin{macro}{\@@_extract_bb:n, \@@_read_bb:n}
% \begin{macro}{\@@_extract_bb_auix:nn, \@@_extract_bb_auix:Vn}
% \begin{macro}{\@@_extract_bb_auxii:nnn}
% \begin{macro}{\@@_extract_bb_auxiii:nnnn, \@@_extract_bb_auxiii:Vnnn}
@@ -357,10 +325,10 @@
% box has to be calculated by |extractbb|, with just the initial phase
% different.
% \begin{macrocode}
-\cs_new_protected:Npn \graphics_extract_bb:n #1
+\cs_new_protected:Npn \@@_extract_bb:n #1
{
- \int_compare:nNnTF \l_graphics_page_int > 0
- { \@@_extract_bb_auxi:Vn \l_graphics_page_int {#1} }
+ \int_compare:nNnTF \l_@@_page_int > 0
+ { \@@_extract_bb_auxi:Vn \l_@@_page_int {#1} }
{ \@@_extract_bb_auxii:nnn {#1} { } { } }
}
\cs_new_protected:Npn \@@_extract_bb_auxi:nn #1#2
@@ -368,9 +336,9 @@
\cs_generate_variant:Nn \@@_extract_bb_auxi:nn { Vn }
\cs_new_protected:Npn \@@_extract_bb_auxii:nnn #1#2#3
{
- \tl_if_empty:NTF \l_graphics_pagebox_tl
+ \tl_if_empty:NTF \l_@@_pagebox_tl
{ \@@_extract_bb_auxiv:nnn }
- { \@@_extract_bb_auxiii:Vnnn \l_graphics_pagebox_tl }
+ { \@@_extract_bb_auxiii:Vnnn \l_@@_pagebox_tl }
{#1} {#2} {#3}
}
\cs_new_protected:Npn \@@_extract_bb_auxiii:nnnn #1#2#3#4
@@ -379,13 +347,13 @@
\cs_new_protected:Npn \@@_extract_bb_auxiv:nnn #1#2#3
{
\@@_read_bb_auxi:nnnn {#1} {#2}
- { \ior_shell_open:Nn \l_@@_tmp_ior { extractbb~#3-O~#1 } }
+ { \ior_shell_open:Nn \l_@@_internal_ior { extractbb~#3-O~#1 } }
{ pipe-failed }
}
-\cs_new_protected:Npn \graphics_read_bb:n #1
+\cs_new_protected:Npn \@@_read_bb:n #1
{
\@@_read_bb_auxi:nnnn {#1} { }
- { \ior_open:Nn \l_@@_tmp_ior {#1} }
+ { \ior_open:Nn \l_@@_internal_ior {#1} }
{ graphic-not-found }
}
% \end{macrocode}
@@ -401,31 +369,23 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_read_bb_auxi:nnnn #1#2#3#4
{
- \graphics_bb_restore:nF {#1#2}
+ \@@_bb_restore:nF {#1#2}
{ \@@_read_bb_auxii:nnnn {#3} {#4} {#1} {#2} }
}
\cs_new_protected:Npx \@@_read_bb_auxii:nnnn #1#2#3#4
{
#1
- \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_tmp_ior
+ \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_internal_ior
{ \msg_error:nnn { graphics } {#2} {#3} }
{
- \ior_str_map_inline:Nn \exp_not:N \l_@@_tmp_ior
+ \ior_str_map_inline:Nn \exp_not:N \l_@@_internal_ior
{
\exp_not:N \@@_read_bb_auxiii:w
##1 ~ \c_colon_str \s_@@_stop
}
+ \@@_bb_save:n {#3#4}
}
- \exp_not:n
- {
- \ior_close:N \l_@@_tmp_ior
- \dim_compare:nNnF \l_graphics_llx_dim = { 0pt }
- { \dim_const:cn { c_@@_ #3#4 _llx_dim } { \l_graphics_llx_dim } }
- \dim_compare:nNnF \l_graphics_lly_dim = { 0pt }
- { \dim_const:cn { c_@@_ #3#4 _lly_dim } { \l_graphics_lly_dim } }
- \dim_const:cn { c_@@_ #3#4 _urx_dim } { \l_graphics_urx_dim }
- \dim_const:cn { c_@@_ #3#4 _ury_dim } { \l_graphics_ury_dim }
- }
+ \ior_close:N \exp_not:N \l_@@_internal_ior
}
\use:x
{
@@ -450,13 +410,13 @@
{
\str_if_eq:nnF {#2} { atend }
{
- \tl_set_rescan:Nnx \l_@@_tmp_tl
+ \tl_set_rescan:Nnx \l_@@_internal_tl
{
\char_set_catcode_space:n { 9 }
\char_set_catcode_space:n { 32 }
}
{ \use:n #1 }
- \exp_after:wN \@@_read_bb_auxv:w \l_@@_tmp_tl \s_@@_stop
+ \exp_after:wN \@@_read_bb_auxv:w \l_@@_internal_tl \s_@@_stop
}
}
% \end{macrocode}
@@ -465,10 +425,10 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_read_bb_auxv:w #1~#2~#3~#4~#5 \s_@@_stop
{
- \dim_set:Nn \l_graphics_llx_dim { #1 bp }
- \dim_set:Nn \l_graphics_lly_dim { #2 bp }
- \dim_set:Nn \l_graphics_urx_dim { #3 bp }
- \dim_set:Nn \l_graphics_ury_dim { #4 bp }
+ \dim_set:Nn \l_@@_llx_dim { #1 bp }
+ \dim_set:Nn \l_@@_lly_dim { #2 bp }
+ \dim_set:Nn \l_@@_urx_dim { #3 bp }
+ \dim_set:Nn \l_@@_ury_dim { #4 bp }
\ior_map_break:
}
% \end{macrocode}
@@ -480,17 +440,13 @@
% \end{macro}
% \end{macro}
%
-% \begin{variable}{\l_graphics_draft_bool}
-% Relevant to including graphics but not to reading them.
-% \begin{macrocode}
-\bool_new:N \l_graphics_draft_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_graphics_name_tl, \l_@@_name_tl}
+% \begin{variable}{\l_@@_final_name_str, \l_@@_full_name_str}
+% The full name is as you'd expect the name including path and extension.
+% The final name here reflects any conversions carried out by the backend,
+% for example if an |.eps| is converted to |.pdf|.
% \begin{macrocode}
-\tl_new:N \l_graphics_name_tl
-\tl_new:N \l_@@_name_tl
+\str_new:N \l_@@_final_name_str
+\str_new:N \l_@@_full_name_str
% \end{macrocode}
% \end{variable}
%
@@ -515,7 +471,7 @@
% \end{variable}
%
% \begin{variable}{\l_graphics_search_ext_seq}
-% Used to specify fall-back extensions: actually set on a per-driver basis.
+% Used to specify fall-back extensions: actually set on a per-backend basis.
% \begin{macrocode}
\seq_new:N \l_graphics_search_ext_seq
% \end{macrocode}
@@ -536,66 +492,49 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\graphics_include:n}
+% \begin{macro}{\graphics_include:nn, \graphics_include:nV}
% \begin{macro}{\@@_include_search:n}
% \begin{macro}{\@@_include:}
-% \begin{macro}{\graphics_include:nn}
% \begin{macro}
% {
-% \@@_include_auxi:n, \@@_include_auxii:n,
+% \@@_include_auxi:n, \@@_include_auxi:e, \@@_include_auxii:n,
% \@@_include_auxiii:n, \@@_include_auxiv:n
% }
% Actually including an graphic is relatively straight-forward: most of the
-% work is done by the driver. We only have to deal with making sure the
+% work is done by the backend. We only have to deal with making sure the
% box has no apparent depth. Where the first given name is not found, we
% search based on extension only if the \meta{type} was not given. The one
% wrinkle is that we may have found a \texttt{.tex} file matching the file
% name stem: that's not what we want, so we have to filter out.
% \begin{macrocode}
-\cs_new_protected:Npn \graphics_include:n #1
+\cs_new_protected:Npn \graphics_include:nn #1#2
{
\group_begin:
+ \keys_set:nn { graphics } {#1}
\seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
- \file_get_full_name:nNTF {#1} \l_@@_name_tl
+ \file_get_full_name:nNTF {#2} \l_@@_full_name_str
{
- \str_if_eq:eeTF { \l_@@_name_tl } { #1 .tex }
- { \@@_include_search:n {#1} }
+ \str_if_eq:eeTF { \l_@@_full_name_str } { #2 .tex }
+ { \msg_error:nnn { graphics } { graphic-not-found } {#2} }
{ \@@_include: }
}
- { \@@_include_search:n {#1} }
+ { \msg_error:nnn { graphics } { graphic-not-found } {#2} }
\group_end:
}
-\cs_new_protected:Npn \@@_include_search:n #1
- {
- \seq_map_inline:Nn \l_graphics_search_ext_seq
- {
- \file_get_full_name:nNT { #1 . ##1 } \l_@@_name_tl
- { \seq_map_break:n { \use_i:nnn \@@_include: } }
- }
- \use:n
- { \msg_error:nnn { graphics } { graphic-not-found } {#1} }
- }
+\cs_generate_variant:Nn \graphics_include:nn { nV }
\cs_new_protected:Npn \@@_include:
{
- \file_parse_full_name:VNNN \l_@@_name_tl
- \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
- \exp_args:Ne \@@_include_auxi:n
+ \str_if_empty:NTF \l_@@_type_str
{
- \exp_args:Ne \str_tail:n
- { \str_foldcase:V \l_@@_ext_str }
- }
- }
-\cs_new_protected:Npn \graphics_include:nn #1#2
- {
- \group_begin:
- \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
- \file_get_full_name:nNTF {#1} \l_@@_name_tl
- {
- \exp_args:Ne \@@_include_auxi:n
- { \str_foldcase:n {#1} }
- }
- { \msg_error:nnn { graphics } { graphic-not-found } {#1} }
- \group_end:
+ \file_parse_full_name:VNNN \l_@@_full_name_str
+ \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
+ \@@_include_auxi:e
+ {
+ \exp_args:Ne \str_tail:n
+ { \str_foldcase:V \l_@@_ext_str }
+ }
+ }
+ { \@@_include_auxi:e { \l_@@_type_str } }
}
\cs_new_protected:Npn \@@_include_auxi:n #1
{
@@ -603,20 +542,21 @@
{ \tl_set:Nn \l_@@_internal_tl {#1} }
\exp_args:NV \@@_include_auxii:n \l_@@_internal_tl
}
+\cs_generate_variant:Nn \@@_include_auxi:n { e }
\cs_new_protected:Npn \@@_include_auxii:n #1
{
\mode_leave_vertical:
\cs_if_exist:cTF { @@_backend_include_ #1 :n }
{
- \tl_set_eq:NN \l_graphics_name_tl \l_@@_name_tl
+ \tl_set_eq:NN \l_@@_final_name_str \l_@@_full_name_str
+ \str_set:Nx \l_@@_full_name_str
+ { \exp_args:NV \__kernel_file_name_quote:n \l_@@_full_name_str }
\exp_args:NnV \use:c { @@_backend_getbb_ #1 :n }
- \l_@@_name_tl
- \seq_gput_right:NV \g_@@_record_seq \l_graphics_name_tl
-%<*package>
+ \l_@@_full_name_str
+ \seq_gput_right:NV \g_@@_record_seq \l_@@_final_name_str
\clist_if_exist:NT \@filelist
- { \exp_args:NV \@addtofilelist \l_graphics_name_tl }
-%</package>
- \bool_if:NTF \l_graphics_draft_bool
+ { \exp_args:NV \@addtofilelist \l_@@_final_name_str }
+ \bool_if:NTF \l_@@_draft_bool
{ \@@_include_auxiii:n }
{ \@@_include_auxiv:n }
{#1}
@@ -625,23 +565,21 @@
}
\cs_new_protected:Npn \@@_include_auxiii:n #1
{
- \hbox_to_wd:nn { \l_graphics_urx_dim - \l_graphics_llx_dim }
+ \hbox_to_wd:nn { \l_@@_urx_dim - \l_@@_llx_dim }
{
\tex_vrule:D
\tex_hss:D
\vbox_to_ht:nn
- { \l_graphics_ury_dim - \l_graphics_lly_dim }
+ { \l_@@_ury_dim - \l_@@_lly_dim }
{
\tex_hrule:D width
- \dim_eval:n { \l_graphics_urx_dim - \l_graphics_llx_dim }
+ \dim_eval:n { \l_@@_urx_dim - \l_@@_llx_dim }
\tex_vss:D
\hbox_to_wd:nn
- { \l_graphics_urx_dim - \l_graphics_llx_dim }
+ { \l_@@_urx_dim - \l_@@_llx_dim }
{
-%<*package>
\ttfamily
-%</package>
- \tex_hss:D \l_@@_name_tl \tex_hss:D
+ \tex_hss:D \l_@@_full_name_str \tex_hss:D
}
\tex_vss:D
\tex_hrule:D
@@ -655,13 +593,13 @@
\hbox_set:Nn \l_@@_internal_box
{
\exp_args:NnV \use:c { @@_backend_include_ #1 :n }
- \l_@@_name_tl
+ \l_@@_full_name_str
}
\box_set_dp:Nn \l_@@_internal_box { 0pt }
\box_set_ht:Nn \l_@@_internal_box
- { \l_graphics_ury_dim - \l_graphics_lly_dim }
+ { \l_@@_ury_dim - \l_@@_lly_dim }
\box_set_wd:Nn \l_@@_internal_box
- { \l_graphics_urx_dim - \l_graphics_llx_dim }
+ { \l_@@_urx_dim - \l_@@_llx_dim }
\box_use_drop:N \l_@@_internal_box
}
% \end{macrocode}
@@ -669,7 +607,6 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
%
% \begin{macro}{\graphics_show_list:, \graphics_log_list:, \@@_list:N}
% \begin{macro}[EXP]{\@@_list_aux:n}
@@ -680,7 +617,7 @@
\cs_new_protected:Npn \@@_list:N #1
{
\seq_remove_duplicates:N \g_@@_record_seq
- #1 { LaTeX/kernel } { file-list }
+ #1 { kernel } { file-list }
{ \seq_map_function:NN \g_@@_record_seq \@@_list_aux:n }
{ } { } { }
}
@@ -689,14 +626,123 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Utility functions}
+%
+% \begin{macro}{\graphics_get_full_name:nN}
+% \begin{macro}[TF]{\graphics_get_full_name:nN}
+% \begin{macro}{\@@_get_full_name:n}
+% A simple search.
+% \begin{macrocode}
+\cs_new_protected:Npn \graphics_get_full_name:nN #1#2
+ {
+ \graphics_get_full_name:nNF {#1} #2
+ { \tl_set:Nn #2 { \q_no_value } }
+ }
+\prg_new_protected_conditional:Npnn \graphics_get_full_name:nN #1#2
+ { T , F , TF }
+ {
+ \group_begin:
+ \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
+ \file_get_full_name:nNTF {#1} \l_@@_full_name_str
+ {
+ \str_if_eq:eeT { \l_@@_full_name_str } { #1 .tex }
+ { \@@_get_full_name:n {#1} }
+ }
+ { \@@_get_full_name:n {#1} }
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn #2 \l_@@_full_name_str
+ \tl_if_empty:NTF #2
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+\cs_new_protected:Npn \@@_get_full_name:n #1
+ {
+ \str_clear:N \l_@@_full_name_str
+ \seq_map_inline:Nn \l_graphics_search_ext_seq
+ {
+ \file_get_full_name:nNT { #1 ##1 } \l_@@_full_name_str
+ { \seq_map_break:n { \use_none:nn } }
+ }
+ \use:n
+ { \str_clear:N \l_@@_full_name_str }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\graphics_get_pagecount:nN}
+% \begin{macro}{\@@_get_pagecount:n}
+% \begin{macro}{\@@_get_pagecount:nw}
+% A generic function to read the number of pages in a graphic file. This is
+% used by all of the backend where there is not a dedicated primitive. The
+% plan is essentially the same as reading the bounding box. To avoid multiple
+% calls, the value is cached either here or in the backend.
+% \begin{macrocode}
+\cs_new_protected:Npn \graphics_get_pagecount:nN #1#2
+ {
+ \group_begin:
+ \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
+ \file_get_full_name:nNTF {#1} \l_@@_full_name_str
+ {
+ \int_if_exist:cF { c_@@_ \l_@@_full_name_str _pages_int }
+ {
+ \exp_args:NV \@@_backend_get_pagecount:n
+ \l_@@_full_name_str
+ }
+ \tl_set:Nv #2 { c_@@_ \l_@@_full_name_str _pages_int }
+ }
+ {
+ \tl_set:Nn #2 { 0 }
+ \msg_error:nnn { graphics } { graphic-not-found } {#1}
+ }
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn #2 #2
+ }
+\cs_new_protected:Npx \@@_get_pagecount:n #1
+ {
+ \ior_shell_open:Nn \exp_not:N \l_@@_internal_ior
+ { extractbb~-O~#1 }
+ \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_internal_ior
+ { \msg_error:nnn { graphics } { pipe-failed } }
+ {
+ \ior_str_map_inline:Nn \exp_not:N \l_@@_internal_ior
+ {
+ \exp_not:N \@@_get_pagecount:nw {#1}
+ ##1 ~ \c_colon_str \c_colon_str \s_@@_stop
+ }
+ \exp_not:N \int_if_exist:cF { c_@@_ #1 _pages_int }
+ { \int_const:cn { c_@@_ #1 _pages_int } { 1 } }
+ }
+ \ior_close:N \exp_not:N \l_@@_internal_ior
+ }
+\use:x
+ {
+ \cs_new_protected:Npn \exp_not:N \@@_get_pagecount:nw
+ ##1##2 \c_colon_str ##3 \c_colon_str ##4 \s_@@_stop
+ {
+ \exp_not:N \str_if_eq:nnT
+ { \c_percent_str \c_percent_str Pages }
+ {##2}
+ {
+ \int_const:cn { c_@@_ ##1 _pages_int } {##3}
+ \exp_not:N \ior_map_break:
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Messages}
%
% \begin{macrocode}
\msg_new:nnnn { graphics } { graphic-not-found }
{ Image~file~'#1'~not~found. }
{
- LaTeX~tried~to~open~graphic~file~'#1',
- ~but~the~file~could~not~be~read.
+ LaTeX~tried~to~open~graphic~file~'#1',~
+ but~the~file~could~not~be~read.
}
\msg_new:nnnn { graphics } { pipe-failed }
{ Cannot~run~piped~system~commands. }
diff --git a/macros/latex/contrib/l3experimental/l3graphics.pdf b/macros/latex/contrib/l3experimental/l3graphics.pdf
index 9827216d8f..3d5ce27457 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.pdf
+++ b/macros/latex/contrib/l3experimental/l3graphics.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3opacity.dtx b/macros/latex/contrib/l3experimental/l3opacity.dtx
index 85de4479ae..192f6b6818 100644
--- a/macros/latex/contrib/l3experimental/l3opacity.dtx
+++ b/macros/latex/contrib/l3experimental/l3opacity.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -97,7 +97,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3opacity}{2022-02-05}{}
+\ProvidesExplPackage{l3opacity}{2022-04-10}{}
{L3 Experimental opacity support}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3opacity.pdf b/macros/latex/contrib/l3experimental/l3opacity.pdf
index 01bca12cc7..ffdc658846 100644
--- a/macros/latex/contrib/l3experimental/l3opacity.pdf
+++ b/macros/latex/contrib/l3experimental/l3opacity.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3str-format.dtx b/macros/latex/contrib/l3experimental/l3str-format.dtx
index 51193487ac..c84c77c608 100644
--- a/macros/latex/contrib/l3experimental/l3str-format.dtx
+++ b/macros/latex/contrib/l3experimental/l3str-format.dtx
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -166,7 +166,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3str-format}{2022-02-05}{}
+\ProvidesExplPackage{l3str-format}{2022-04-10}{}
{L3 Experimental string formatting}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/l3str-format.pdf b/macros/latex/contrib/l3experimental/l3str-format.pdf
index 7b9c5ab087..74e1f21ef0 100644
--- a/macros/latex/contrib/l3experimental/l3str-format.pdf
+++ b/macros/latex/contrib/l3experimental/l3str-format.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.dtx b/macros/latex/contrib/l3experimental/l3sys-shell.dtx
index cf8ecdf188..db10bbbf60 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.dtx
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -151,7 +151,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3sys-shell}{2022-02-05}{}
+\ProvidesExplPackage{l3sys-shell}{2022-04-10}{}
{L3 Experimental system shell functions}
% \end{macrocode}
%
@@ -393,6 +393,8 @@
\seq_set_split:NnV #2 { \char_generate:nn { `\^^M } { 12 } }
\exp_not:N \l_@@_tmp_tl
\seq_pop_right:NN #2 \exp_not:N \l_@@_tmp_tl
+ \exp_not:N \tl_if_blank:eTF { \exp_not:N \seq_item:Nn #2 { 1 } }
+ { \seq_clear:N #2 }
}
}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.pdf b/macros/latex/contrib/l3experimental/l3sys-shell.pdf
index 610ff8e175..8baa8395b8 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.pdf
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/xcoffins.dtx b/macros/latex/contrib/l3experimental/xcoffins.dtx
index 18e0c0deed..e7773188c0 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.dtx
+++ b/macros/latex/contrib/l3experimental/xcoffins.dtx
@@ -53,7 +53,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -672,7 +672,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2022-02-05}{}
+\ProvidesExplPackage{xcoffins}{2022-04-10}{}
{L3 Experimental design level coffins}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/xcoffins.pdf b/macros/latex/contrib/l3experimental/xcoffins.pdf
index eb412538c9..269b1c2ffa 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.pdf
+++ b/macros/latex/contrib/l3experimental/xcoffins.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/xgalley.dtx b/macros/latex/contrib/l3experimental/xgalley.dtx
index dca97d5fb6..2e541d6550 100644
--- a/macros/latex/contrib/l3experimental/xgalley.dtx
+++ b/macros/latex/contrib/l3experimental/xgalley.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -731,7 +731,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2022-02-05}{}
+\ProvidesExplPackage{xgalley}{2022-04-10}{}
{L3 Experimental galley}
\RequirePackage{xtemplate,l3galley}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/xgalley.pdf b/macros/latex/contrib/l3experimental/xgalley.pdf
index 1b2a990971..7addf4afe8 100644
--- a/macros/latex/contrib/l3experimental/xgalley.pdf
+++ b/macros/latex/contrib/l3experimental/xgalley.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md
index ba245c3c95..81af951ced 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/contrib/l3kernel/CHANGELOG.md
@@ -7,6 +7,26 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2022-04-10]
+
+### Added
+- `\keys_precompile:nnN` for conversion of keyvals to fast-to-apply token
+ lists
+- Missing `\str_if_empty:n(TF)` (see issue \#1071)
+- Missing `\str_case:Nn(TF)` (see issue \#1071)
+- `\tex_...:D` names for primitives added in TeX Live 2022
+
+### Changed
+- Definition of `\legacy_if:n(TF)` to support primitive conditionals
+- `\str_<type>case:n` now case changes codepoints above 127 with all engines
+- `\char_generate:nn` now also allows to generate category 10 tokens (spaces)
+ except for char code 0
+
+### Fixed
+- Handling of 'misplaced' `\protect` by `\text_expand:n`
+- Nesting of `\tl_analysis_map_inline:nn`
+- Naming of an error message
+
## [2022-02-24]
### Changed
@@ -1053,7 +1073,8 @@ this project uses date-based 'snapshot' version identifiers.
- Step functions have been added for dim variables,
e.g. `\dim_step_inline:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2022-02-24...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2022-04-10...HEAD
+[2022-04-10]: https://github.com/latex3/latex3/compare/2022-02-24...2022-04-10
[2022-02-24]: https://github.com/latex3/latex3/compare/2022-02-21...2022-02-24
[2022-02-21]: https://github.com/latex3/latex3/compare/2022-02-05...2022-02-21
[2022-02-05]: https://github.com/latex3/latex3/compare/2022-01-21...2022-02-05
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md
index cc869f47ab..c3054ed481 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/contrib/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2022-02-24
+Release 2022-04-10
Overview
--------
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx
index 51fb5f5e02..34e12e7d55 100644
--- a/macros/latex/contrib/l3kernel/expl3.dtx
+++ b/macros/latex/contrib/l3kernel/expl3.dtx
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2022-02-24}%
+\def\ExplFileDate{2022-04-10}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf
index 250532d701..17f1287430 100644
--- a/macros/latex/contrib/l3kernel/expl3.pdf
+++ b/macros/latex/contrib/l3kernel/expl3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf
index 0fbf0fe246..fa6f123061 100644
--- a/macros/latex/contrib/l3kernel/interface3.pdf
+++ b/macros/latex/contrib/l3kernel/interface3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex
index 24a3861ab8..9274fe46c3 100644
--- a/macros/latex/contrib/l3kernel/interface3.tex
+++ b/macros/latex/contrib/l3kernel/interface3.tex
@@ -54,7 +54,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2022-02-24}
+\date{Released 2022-04-10}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx
index 8f94eefe1f..c945620ece 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -727,13 +727,6 @@
% \meta{control sequence name} must, when fully expanded, consist of
% character tokens, typically a mixture of category code $10$ (space),
% $11$ (letter) and $12$ (other).
-% \begin{texnote}
-% Protected macros that appear in a \texttt{c}-type argument are
-% expanded despite being protected; \cs{exp_not:n} also has no
-% effect. An internal error occurs if non-characters or active
-% characters remain after full expansion, as the conversion to a
-% control sequence is not possible.
-% \end{texnote}
% \end{function}
%
% As an example of the \cs{use:c} function, both
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
index 7afadf6f4b..5b137477ca 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx
index 5a0f8bd807..7c19e49bfd 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/contrib/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3candidates.dtx b/macros/latex/contrib/l3kernel/l3candidates.dtx
index 664f4a5306..d8e01d0d0b 100644
--- a/macros/latex/contrib/l3kernel/l3candidates.dtx
+++ b/macros/latex/contrib/l3kernel/l3candidates.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -596,7 +596,7 @@
%
% \begin{function}[added = 2018-04-01]{\tl_build_get:NN}
% \begin{syntax}
-% \cs{tl_build_get:N} \meta{tl~var_1} \meta{tl~var_2}
+% \cs{tl_build_get:NN} \meta{tl~var_1} \meta{tl~var_2}
% \end{syntax}
% Stores the contents of the \meta{tl~var_1} in the \meta{tl~var_2}.
% The \meta{tl~var_1} must have been set up with \cs{tl_build_begin:N}
@@ -1415,7 +1415,7 @@
\tl_if_in:nnTF {#1} { " }
{
\msg_error:nnx
- { ior } { quote-in-shell } {#1}
+ { kernel } { quote-in-shell } {#1}
}
{ \__kernel_ior_open:Nn #2 { |#1 } }
}
diff --git a/macros/latex/contrib/l3kernel/l3cctab.dtx b/macros/latex/contrib/l3kernel/l3cctab.dtx
index e10527fedd..69409085fe 100644
--- a/macros/latex/contrib/l3kernel/l3cctab.dtx
+++ b/macros/latex/contrib/l3kernel/l3cctab.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx
index 0e3d0de492..a2e5dd0ec0 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/contrib/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx
index 3b9bff45e0..d00fe3918d 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/contrib/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3color.dtx b/macros/latex/contrib/l3kernel/l3color.dtx
index 1a16326219..93f42374ef 100644
--- a/macros/latex/contrib/l3kernel/l3color.dtx
+++ b/macros/latex/contrib/l3kernel/l3color.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx
index 81d3d81c47..65457cbdea 100644
--- a/macros/latex/contrib/l3kernel/l3debug.dtx
+++ b/macros/latex/contrib/l3kernel/l3debug.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -1015,7 +1015,7 @@
{ \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } }
}
{ }
- { \@@_cmd_set:nn }
+ { \@@_cmd_set_direct:nn }
%<@@=msg>
\__kernel_patch:nnn
{ }
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx
index b5c495de2b..4d48f2a007 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx
index e3251058b3..0db227edf9 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/contrib/l3kernel/l3doc.dtx
@@ -85,7 +85,7 @@ and all files in that bundle must be distributed together.
% require you to do updates, if the class changes.}}
%
% \author{\Team}
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
% \maketitle
% \tableofcontents
%
@@ -361,69 +361,81 @@ and all files in that bundle must be distributed together.
% \subsection{Describing functions in the documentation}
%
% \DescribeEnv{function}
+% \DescribeEnv{variable}
+% Two heavily-used environments are defined to describe \pkg{expl3} functions
+% and variables. If describing a variable, use the latter environment; it
+% behaves identically to the \env{function} environment.
% \DescribeEnv{syntax}
-% Two heavily-used environments are defined to describe the syntax of
-% \pkg{expl3} functions and variables.
+% Both of the above environments are typically combined with the \env{syntax}
+% environment, to describe their syntax.
% \begin{framed}
% \vspace{-\baselineskip}
% \begin{verbatim}
-% \begin{function}{\function_one:, \function_two:}
+% \begin{function}{\package_function_one:N, \package_function_two:n}
% \begin{syntax}
-% |\foo_bar:| \Arg{meta} \meta{test_1}
+% \cs{package_function_one:N} \meta{cs}
+% \cs{package_function_two:n} \marg{Argument}
% \end{syntax}
-% \meta{description}
+% Descriptive text here ...
% \end{function}
% \end{verbatim}
% \hrulefill
% \par
% \hspace*{0.25\textwidth}
% \begin{minipage}{0.5\textwidth}
-% \begin{function}{\function_one:, \function_two:}
+% \begin{function}{\package_function_one:N, \package_function_two:n}
% \begin{syntax}
-% |\foo_bar:| \Arg{meta} \meta{test_1}
+% \cs[no-index]{package_function_one:N} \meta{cs}
+% \cs[no-index]{package_function_two:n} \marg{Argument}
% \end{syntax}
-% \meta{description}
+% \emph{Descriptive text here …}
% \end{function}
% \end{minipage}
% \end{framed}
%
% Function environments take an optional argument to indicate whether
-% the function(s) it describes are expandable or restricted-expandable
-% or defined in conditional forms. Use |EXP|, |rEXP|, |TF|, |pTF|, or |noTF| for
-% this; note that |pTF| implies |EXP| since predicates must always be
-% expandable, and that |noTF| means that the function without |TF|
-% should be documented in addition to |TF|. As an example:
+% the function(s) it describes are expandable (use |EXP|) or
+% restricted-expandable (use |rEXP|) or defined in conditional forms
+% (use |TF|, |pTF|, or |noTF|). Note that |pTF| implies |EXP| since
+% predicates must always be expandable, and that |noTF| means that the
+% function without |TF| should be documented in addition to |TF|. For
+% the conditional forms |TF| and |pTF|, the argument of the
+% \env{function} environment is \emph{not} in fact a command that
+% exists: in the example below, \cs[no-index]{tl_if_empty:N} does not
+% exist, but its conditional forms \cs{tl_if_empty:NT},
+% \cs{tl_if_empty:NF}, \cs{tl_if_empty:NTF} and predicate form
+% \cs{tl_if_empty_p:N} exist:
% \begin{framed}
% \vspace{-\baselineskip}
% \begin{verbatim}
-% \begin{function}[pTF]{\cs_if_exist:N}
+% \begin{function}[pTF]{\tl_if_empty:N, \tl_if_empty:c}
% \begin{syntax}
-% \cs{cs_if_exist_p:N} \meta{cs}
+% \cs{tl_if_empty_p:N} \meta{tl~var}
+% \cs{tl_if_empty:NTF} \meta{tl~var} \Arg{true code} \Arg{false code}
% \end{syntax}
-% \meta{description}
+% Tests if the \meta{token list variable} is entirely empty
+% (\emph{i.e.}~contains no tokens at all).
% \end{function}
% \end{verbatim}
% \hrulefill
% \par
% \hspace*{0.25\textwidth}
% \begin{minipage}{0.5\textwidth}
-% \begin{function}[pTF]{\cs_if_exist:N}
+% \begin{function}[pTF]{\tl_if_empty:N, \tl_if_empty:c}
% \begin{syntax}
-% \cs{cs_if_exist_p:N} \meta{cs}
+% \cs{tl_if_empty_p:N} \meta{tl~var}
+% \cs{tl_if_empty:NTF} \meta{tl~var} \Arg{true code} \Arg{false code}
% \end{syntax}
-% \meta{description}
+% Tests if the \meta{token list variable} is entirely empty
+% (\emph{i.e.}~contains no tokens at all).
% \end{function}
% \end{minipage}
% \end{framed}
%
-% \DescribeEnv{variable}
-% If you are documenting a variable instead of a function, use the
-% \env{variable} environment instead; it behaves identically to the
-% \env{function} environment above.
-%
% \DescribeEnv{texnote}
% This environment is used to call out sections within \env{function}
-% and similar that are only of interest to seasoned \TeX{} developers.
+% and similar environments that are only of interest to seasoned
+% \TeX{} developers.
%
% \subsection{Describing functions in the implementation}
%
diff --git a/macros/latex/contrib/l3kernel/l3doc.pdf b/macros/latex/contrib/l3kernel/l3doc.pdf
index 57f82896e7..1577ec2375 100644
--- a/macros/latex/contrib/l3kernel/l3doc.pdf
+++ b/macros/latex/contrib/l3kernel/l3doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx
index 6dbb029c6d..9319cd39e5 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf
index a2b49464e9..c4ccf58249 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.pdf
+++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx
index f84a0928dc..614a73d29e 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/contrib/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -331,13 +331,6 @@
%
% The |:cc| variant constructs the \meta{function} name in the same
% manner as described for the \meta{tokens}.
-% \begin{texnote}
-% Protected macros that appear in a \texttt{c}-type argument are
-% expanded despite being protected; \cs{exp_not:n} also has no
-% effect. An internal error occurs if non-characters or active
-% characters remain after full expansion, as the conversion to a
-% control sequence is not possible.
-% \end{texnote}
% \end{function}
%
% \begin{function}[EXP]{\exp_args:No}
@@ -374,13 +367,6 @@
% recovered and placed inside braces into the input stream \emph{after}
% reinsertion of the \meta{function}. Thus the \meta{function} may take more
% than one argument: all others are left unchanged.
-% \begin{texnote}
-% Protected macros that appear in a \texttt{v}-type argument are
-% expanded despite being protected; \cs{exp_not:n} also has no
-% effect. An internal error occurs if non-characters or active
-% characters remain after full expansion, as the conversion to a
-% control sequence is not possible.
-% \end{texnote}
% \end{function}
%
% \begin{function}[EXP, added = 2018-05-15]{\exp_args:Ne}
@@ -683,13 +669,6 @@
% converts this into a control sequence.
% Further expansion of this control sequence is then inhibited using
% \cs{exp_not:N}.
-% \begin{texnote}
-% Protected macros that appear in a \texttt{c}-type argument are
-% expanded despite being protected; \cs{exp_not:n} also has no
-% effect. An internal error occurs if non-characters or active
-% characters remain after full expansion, as the conversion to a
-% control sequence is not possible.
-% \end{texnote}
% \end{function}
%
% \begin{function}[EXP]{\exp_not:n}
@@ -736,13 +715,6 @@
% name.
% The content of the \meta{variable} is recovered, and further
% expansion in |x|-type or \texttt{e}-type arguments is prevented using \cs{exp_not:n}.
-% \begin{texnote}
-% Protected macros that appear in a \texttt{v}-type argument are
-% expanded despite being protected; \cs{exp_not:n} also has no
-% effect. An internal error occurs if non-characters or active
-% characters remain after full expansion, as the conversion to a
-% control sequence is not possible.
-% \end{texnote}
% \end{function}
%
% \begin{function}[EXP]{\exp_not:e}
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx
index 296680046c..adf73279bc 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/contrib/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx
index 5e35f1920d..22fae08ae6 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/contrib/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
index 1558d3015a..38f6d3ff6a 100644
--- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
index 7a441e4161..9ae275ac22 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
index 1bd233dbbb..8cd126989a 100644
--- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
index d3f2ea5613..6fc2681f56 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
index aa6b45f1f3..fdaece8932 100644
--- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
index f452cf3abb..d116ce9221 100644
--- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
index dd4c419968..7c24b0822c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
index 3b1bd6f1b8..307a848a08 100644
--- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx
index 65802f5fbf..8ad1b84880 100644
--- a/macros/latex/contrib/l3kernel/l3fp-random.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx
index 2a55019509..8cb45a097b 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
index 3cb310052a..6cd2dd1b9b 100644
--- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
index 0d10240c4e..993db8a0b6 100644
--- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx
index ed69fe5fc6..c0f2daa482 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx
index 0060743cbb..2b279e18d7 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/contrib/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx
index 9d459317a7..e8dc857816 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/contrib/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx
index 8a7434f170..916cef5db2 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/contrib/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
index 5f810a6bd1..bd62a0dbca 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx
index 360a008995..81eb124edd 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/contrib/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -882,6 +882,18 @@
% group and are thus never set.
% \end{function}
%
+% \section{Digesting keys}
+%
+% \begin{function}[added = 2022-03-09]{\keys_precompile:nnN}
+% \begin{syntax}
+% \cs{keys_precompile:nnN} \Arg{module} \Arg{keyval list} \meta{tl}
+% \end{syntax}
+% Parses the \meta{keyval list} as for \cs{keys_set:nn}, placing the
+% resulting code for those which set variables or functions into the
+% \meta{tl}. Thus this function \enquote{precompiles} the keyval list into
+% a set of results which can be applied rapidly.
+% \end{function}
+%
% \section{Utility functions for keys}
%
% \begin{function}[EXP, pTF, updated = 2022-01-10]
@@ -1661,6 +1673,14 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\l_@@_precompile_bool, \l_@@_precompile_tl}
+% For digesting keys.
+% \begin{macrocode}
+\bool_new:N \l_@@_precompile_bool
+\tl_new:N \l_@@_precompile_tl
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\l_keys_usage_load_prop, \l_keys_usage_preamble_prop}
% Global data for document-level information.
% \begin{macrocode}
@@ -1694,6 +1714,19 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_precompile:n}
+% An auxiliary to allow cleaner showing of code.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_precompile:n #1
+ {
+ \bool_if:NTF \l_@@_precompile_bool
+ { \tl_put_right:Nn \l_@@_precompile_tl }
+ { \use:n }
+ {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{The key defining mechanism}
%
% \begin{macro}{\keys_define:nn}
@@ -1866,7 +1899,7 @@
{ \exp_not:c { bool_ #2 set_ #3 :N } \exp_not:N #1 }
\@@_cmd_set:nx { \l_keys_path_str / false }
{ \exp_not:c { bool_ #2 set_ #4 :N } \exp_not:N #1 }
- \@@_cmd_set:nn { \l_keys_path_str / unknown }
+ \@@_cmd_set_direct:nn { \l_keys_path_str / unknown }
{
\msg_error:nnx { keys } { boolean-values-only }
\l_keys_key_str
@@ -1909,8 +1942,8 @@
{
\cs_set_nopar:cpn { \c_@@_type_root_str \l_keys_path_str }
{ choice }
- \@@_cmd_set:nn \l_keys_path_str { #1 {##1} }
- \@@_cmd_set:nn { \l_keys_path_str / unknown }
+ \@@_cmd_set_direct:nn \l_keys_path_str { #1 {##1} }
+ \@@_cmd_set_direct:nn { \l_keys_path_str / unknown }
{
\msg_error:nnxx { keys } { choice-unknown }
\l_keys_path_str {##1}
@@ -1952,13 +1985,18 @@
% \end{macro}
%
% \begin{macro}
-% {\@@_cmd_set:nn, \@@_cmd_set:nx, \@@_cmd_set:Vn, \@@_cmd_set:Vo}
+% {
+% \@@_cmd_set:nn, \@@_cmd_set:nx, \@@_cmd_set:Vn, \@@_cmd_set:Vo,
+% \@@_cmd_set_direct:nn
+% }
% Setting the code for a key first logs if appropriate that we are
% defining a new key, then saves the code.
% \begin{macrocode}
\cs_new_protected:Npn \@@_cmd_set:nn #1#2
- { \cs_set_protected:cpn { \c_@@_code_root_str #1 } ##1 {#2} }
+ { \@@_cmd_set_direct:nn {#1} { \@@_precompile:n {#2} } }
\cs_generate_variant:Nn \@@_cmd_set:nn { nx , Vn , Vo }
+\cs_new_protected:Npn \@@_cmd_set_direct:nn #1#2
+ { \cs_set_protected:cpn { \c_@@_code_root_str #1 } ##1 {#2} }
% \end{macrocode}
% \end{macro}
%
@@ -1970,7 +2008,10 @@
\cs_new_protected:Npn \@@_cs_set:NNpn #1#2#3#
{
\cs_set_protected:cpx { \c_@@_code_root_str \l_keys_path_str } ##1
- { #1 \exp_not:N #2 \exp_not:n {#3} {##1} }
+ {
+ \@@_precompile:n
+ { #1 \exp_not:N #2 \exp_not:n {#3} {##1} }
+ }
\use_none:n
}
\cs_generate_variant:Nn \@@_cs_set:NNpn { Nc }
@@ -2089,13 +2130,17 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_meta_make:n #1
{
- \@@_cmd_set:Vo \l_keys_path_str
+ \exp_args:NVo \@@_cmd_set_direct:nn \l_keys_path_str
{
- \exp_after:wN \keys_set:nn \exp_after:wN { \l_@@_module_str } {#1}
+ \exp_after:wN \keys_set:nn \exp_after:wN
+ { \l_@@_module_str } {#1}
}
}
\cs_new_protected:Npn \@@_meta_make:nn #1#2
- { \@@_cmd_set:Vn \l_keys_path_str { \keys_set:nn {#1} {#2} } }
+ {
+ \exp_args:NV \@@_cmd_set_direct:nn
+ \l_keys_path_str { \keys_set:nn {#1} {#2} }
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2895,6 +2940,20 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\keys_precompile:nnN}
+% A simple wrapper.
+% \begin{macrocode}
+\cs_new_protected:Npn \keys_precompile:nnN #1#2#3
+ {
+ \bool_set_true:N \l_@@_precompile_bool
+ \tl_clear:N \l_@@_precompile_tl
+ \keys_set:nn {#1} {#2}
+ \bool_set_false:N \l_@@_precompile_bool
+ \tl_set_eq:NN #3 \l_@@_precompile_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_set_keyval:n, \@@_set_keyval:nn}
% \begin{macro}{\@@_set_keyval:nnn, \@@_set_keyval:onn}
% \begin{macro}{\@@_find_key_module:wNN}
@@ -3379,7 +3438,11 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\keys_show:nn, \keys_log:nn, \@@_show:Nnn}
+% \begin{macro}{\keys_show:nn, \keys_log:nn}
+% \begin{macro}{\@@_show:Nnn}
+% \begin{macro}{\@@_show:n}
+% \begin{macro}{\@@_show:w}
+% \begin{macro}{\@@_show:Nw}
% To show a key, show its code using a message.
% \begin{macrocode}
\cs_new_protected:Npn \keys_show:nn
@@ -3395,18 +3458,52 @@
{
\exp_args:Nnf \msg_show_item_unbraced:nn { code }
{
- \exp_args:Nc \cs_replacement_spec:N
+ \exp_args:Ne \@@_show:n
{
- \c_@@_code_root_str
- \@@_trim_spaces:n { #2 / #3 }
+ \exp_args:Nc \cs_replacement_spec:N
+ {
+ \c_@@_code_root_str
+ \@@_trim_spaces:n { #2 / #3 }
+ }
}
}
}
}
{ } { }
}
+\cs_new:Npx \@@_show:n #1
+ {
+ \exp_not:N \@@_show:w
+ #1
+ \tl_to_str:n { \@@_precompile:n }
+ #1
+ \tl_to_str:n { \@@_precompile:n }
+ \exp_not:N \s_@@_stop
+ }
+\use:x
+ {
+ \cs_new:Npn \exp_not:N \@@_show:w
+ ##1 \tl_to_str:n { \@@_precompile:n }
+ ##2 \tl_to_str:n { \@@_precompile:n }
+ ##3 \exp_not:N \s_@@_stop
+ }
+ {
+ \tl_if_blank:nTF {#2}
+ {#1}
+ { \@@_show:Nw #2 \s_@@_stop }
+ }
+\use:x
+ {
+ \cs_new:Npn \exp_not:N \@@_show:Nw ##1##2
+ \c_right_brace_str \exp_not:N \s_@@_stop
+ }
+ {#2}
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \subsection{Messages}
%
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx
index fb04de0adf..534d37be27 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/contrib/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -100,15 +100,19 @@
% \end{macrocode}
%
% \begin{macro}[EXP,pTF]{\legacy_if:n}
-% A friendly wrapper.
+% A friendly wrapper. We need to use the \cs{if:w} approach here, rather than
+% testing against \tn{iftrue}/\tn{iffalse} as the latter approach fails for
+% primitive conditionals such as \tn{ifmmode}. The \cs{reverse_if:N} here
+% means that we get a slightly more useful error if the name is undefined.
% \begin{macrocode}
\prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF }
{
- \exp_args:Nc \if_meaning:w { if#1 } \iftrue
- \prg_return_true:
- \else:
+ \exp_after:wN \reverse_if:N
+ \cs:w if#1 \cs_end:
\prg_return_false:
- \fi:
+ \else:
+ \prg_return_true:
+ \fi:
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx
index 456a02293d..04786d3c1f 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/contrib/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -317,6 +317,7 @@ local scan_string = token.scan_string
local scan_keyword = token.scan_keyword
local put_next = token.put_next
local token_create = token.create
+local token_new = token.new
% \end{macrocode}
%
% Since token.create only returns useful values after the tokens
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
index 23add4a7c6..ef95cabf99 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/contrib/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -1854,9 +1854,7 @@
{ Cannot~generate~null~char~as~a~space. }
\msg_new:nnn { char } { out-of-range }
{ Charcode~requested~out~of~engine~range. }
-\msg_new:nnn { char } { space }
- { Cannot~generate~space~chars. }
-\msg_new:nnnn { ior } { quote-in-shell }
+\msg_new:nnnn { kernel } { quote-in-shell }
{ Quotes~in~shell~command~'#1'. }
{ Shell~commands~cannot~contain~quotes~("). }
\msg_new:nnnn { keys } { no-property }
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx
index f330647e3f..50512593c3 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/contrib/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -1140,12 +1140,14 @@
\@@_primitive:NN \kcatcode \tex_kcatcode:D
\@@_primitive:NN \kuten \tex_kuten:D
\@@_primitive:NN \lastnodechar \tex_lastnodechar:D
+ \@@_primitive:NN \lastnodefont \tex_lastnodefont:D
\@@_primitive:NN \lastnodesubtype \tex_lastnodesubtype:D
\@@_primitive:NN \noautospacing \tex_noautospacing:D
\@@_primitive:NN \noautoxspacing \tex_noautoxspacing:D
\@@_primitive:NN \pagefistretch \tex_pagefistretch:D
\@@_primitive:NN \postbreakpenalty \tex_postbreakpenalty:D
\@@_primitive:NN \prebreakpenalty \tex_prebreakpenalty:D
+ \@@_primitive:NN \ptexlineendmode \tex_lineendmode:D
\@@_primitive:NN \ptexminorversion \tex_ptexminorversion:D
\@@_primitive:NN \ptexrevision \tex_ptexrevision:D
\@@_primitive:NN \ptexversion \tex_ptexversion:D
@@ -1161,6 +1163,8 @@
\@@_primitive:NN \textbaselineshiftfactor
\tex_textbaselineshiftfactor:D
\@@_primitive:NN \tfont \tex_tfont:D
+ \@@_primitive:NN \toucs \tex_toucs:D
+ \@@_primitive:NN \ucs \tex_ucs:D
\@@_primitive:NN \xkanjiskip \tex_xkanjiskip:D
\@@_primitive:NN \xspcode \tex_xspcode:D
\@@_primitive:NN \ybaselineshift \tex_ybaselineshift:D
@@ -1176,7 +1180,6 @@
\@@_primitive:NN \kchar \tex_kchar:D
\@@_primitive:NN \kchardef \tex_kchardef:D
\@@_primitive:NN \kuten \tex_kuten:D
- \@@_primitive:NN \ucs \tex_ucs:D
\@@_primitive:NN \uptexrevision \tex_uptexrevision:D
\@@_primitive:NN \uptexversion \tex_uptexversion:D
% \end{macrocode}
@@ -1195,6 +1198,7 @@
% \begin{macrocode}
\@@_primitive:NN \partokencontext \tex_partokencontext:D
\@@_primitive:NN \partokenname \tex_partokenname:D
+ \@@_primitive:NN \showstream \tex_showstream:D
\@@_primitive:NN \tracingstacklevels \tex_tracingstacklevels:D
% \end{macrocode}
% End of the \enquote{just the names} part of the source.
@@ -1470,9 +1474,9 @@
% Here \enquote{smaller} refers to codepoint order which does not correspond to
% the user expected order for most non-ASCII strings.
% \begin{macrocode}
-local minus_tok = token.new(string.byte'-', 12)
-local zero_tok = token.new(string.byte'0', 12)
-local one_tok = token.new(string.byte'1', 12)
+local minus_tok = token_new(string.byte'-', 12)
+local zero_tok = token_new(string.byte'0', 12)
+local one_tok = token_new(string.byte'1', 12)
luacmd('tex_strcmp:D', function()
local first = scan_string()
local second = scan_string()
@@ -1487,14 +1491,19 @@ end, 'global')
%
% \begin{macro}{\tex_Ucharcat:D}
% Creating arbitrary chars using |tex.cprint|.
-% The alternative approach using |token.put_next(token.create(...))|
-% would be about 10\% slower.
+% The alternative approach using |token.new(...)| is about 10\% slower
+% but needed to create arbitrary space tokens.
% \begin{macrocode}
+local sprint = tex.sprint
local cprint = tex.cprint
luacmd('tex_Ucharcat:D', function()
local charcode = scan_int()
local catcode = scan_int()
- cprint(catcode, utf8_char(charcode))
+ if catcode == 10 then
+ sprint(token_new(charcode, 10))
+ else
+ cprint(catcode, utf8_char(charcode))
+ end
end, 'global')
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf
index 41629c69b0..9ca06a0a68 100644
--- a/macros/latex/contrib/l3kernel/l3news.pdf
+++ b/macros/latex/contrib/l3kernel/l3news.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/contrib/l3kernel/l3news01.pdf
index db35f561cc..1976dbbfc5 100644
--- a/macros/latex/contrib/l3kernel/l3news01.pdf
+++ b/macros/latex/contrib/l3kernel/l3news01.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/contrib/l3kernel/l3news02.pdf
index 9a55490e56..96c2a09157 100644
--- a/macros/latex/contrib/l3kernel/l3news02.pdf
+++ b/macros/latex/contrib/l3kernel/l3news02.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/contrib/l3kernel/l3news03.pdf
index 8af2efbdcd..68b424976f 100644
--- a/macros/latex/contrib/l3kernel/l3news03.pdf
+++ b/macros/latex/contrib/l3kernel/l3news03.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/contrib/l3kernel/l3news04.pdf
index 3732cec9c7..4337d21355 100644
--- a/macros/latex/contrib/l3kernel/l3news04.pdf
+++ b/macros/latex/contrib/l3kernel/l3news04.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/contrib/l3kernel/l3news05.pdf
index 79a1463cf8..6a23c7d8bb 100644
--- a/macros/latex/contrib/l3kernel/l3news05.pdf
+++ b/macros/latex/contrib/l3kernel/l3news05.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/contrib/l3kernel/l3news06.pdf
index 40f1de1db6..07b0787506 100644
--- a/macros/latex/contrib/l3kernel/l3news06.pdf
+++ b/macros/latex/contrib/l3kernel/l3news06.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/contrib/l3kernel/l3news07.pdf
index 7ae558a916..221fdc815a 100644
--- a/macros/latex/contrib/l3kernel/l3news07.pdf
+++ b/macros/latex/contrib/l3kernel/l3news07.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/contrib/l3kernel/l3news08.pdf
index b9b64ff4a2..88dce29221 100644
--- a/macros/latex/contrib/l3kernel/l3news08.pdf
+++ b/macros/latex/contrib/l3kernel/l3news08.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/contrib/l3kernel/l3news09.pdf
index 2029fe30fb..0e81abd093 100644
--- a/macros/latex/contrib/l3kernel/l3news09.pdf
+++ b/macros/latex/contrib/l3kernel/l3news09.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/contrib/l3kernel/l3news10.pdf
index aaad79b8ab..96bbed2245 100644
--- a/macros/latex/contrib/l3kernel/l3news10.pdf
+++ b/macros/latex/contrib/l3kernel/l3news10.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/contrib/l3kernel/l3news11.pdf
index 127719deb2..39754d32c5 100644
--- a/macros/latex/contrib/l3kernel/l3news11.pdf
+++ b/macros/latex/contrib/l3kernel/l3news11.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/contrib/l3kernel/l3news12.pdf
index 3fce91c694..9035265fc7 100644
--- a/macros/latex/contrib/l3kernel/l3news12.pdf
+++ b/macros/latex/contrib/l3kernel/l3news12.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3pdf.dtx b/macros/latex/contrib/l3kernel/l3pdf.dtx
index c6841148de..b2ed19cb08 100644
--- a/macros/latex/contrib/l3kernel/l3pdf.dtx
+++ b/macros/latex/contrib/l3kernel/l3pdf.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.csv b/macros/latex/contrib/l3kernel/l3prefixes.csv
index d9786a1a1e..2648b9b874 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.csv
+++ b/macros/latex/contrib/l3kernel/l3prefixes.csv
@@ -40,6 +40,7 @@ clist,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https
cmd,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2021-01-20,2021-03-03,
code,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2021-04-23,2021-04-23,
codedoc,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,Somewhat experimental: may change
+codehigh,codehigh,Jianrui Lyu,https://github.com/lvjr/codehigh,https://github.com/lvjr/codehigh.git,https://github.com/lvjr/codehigh/issues,2022-04-02,2022-04-02,
coffin,"l3kernel,xcoffins",The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
colon,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
color,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
@@ -89,6 +90,7 @@ fnpct,fnpct,Clemens Niederberger,https://github.com/cgnieder/fnpct/,https://gith
fontsizes,fontsizes,Julien Rivaud,,,,,2018-06-13,
fontspec,fontspec,Will Robertson,https://github.com/wspr/fontspec,https://github.com/wspr/fontspec.git,https://github.com/wspr/fontspec/issues,2013-03-16,2013-03-16,
fp,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+fun,functional,Jianrui Lyu,https://github.com/lvjr/functional,https://github.com/lvjr/functional.git,https://github.com/lvjr/functional/issues,2022-04-02,2022-04-02,
galley,l3galley,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
gatherenum,gatherenum,Julien Rivaud,,,,2018-06-13,2018-06-14,
getree,genealogytree,Thomas F. Sturm,https://github.com/T-F-S/genealogytree,https://github.com/T-F-S/genealogytree.git,https://github.com/T-F-S/genealogytree/issues,2020-02-19,2020-02-19,
@@ -125,6 +127,7 @@ lltxmath,lualatex-math,Philipp Stephani,https://github.com/phst/lualatex-math,ht
log,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
lua,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
luatex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+lwc,lua-widow-control,Max Chernoff,https://github.com/gucci-on-fleek/lua-widow-control,https://github.com/gucci-on-fleek/lua-widow-control.git,https://github.com/gucci-on-fleek/lua-widow-control/issues,2022-02-24,2022-02-24,
mark,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
markdown,markdown,Vít Novotný,https://ctan.org/pkg/markdown,https://github.com/witiko/markdown.git,https://github.com/witiko/markdown/issues,2021-09-08,2021-09-08,
marks,l3kernel/xmarks,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2020-02-17,2020-02-17,
@@ -149,6 +152,7 @@ namedef,namedef,Phelype Oleinik,https://github.com/PhelypeOleinik/namedef,https:
nan,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
nicematrix,nicematrix,François Pantigny,,,,2019-12-19,2019-12-19,
nil,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
+ninecolors,ninecolors,Jianrui Lyu,https://github.com/lvjr/ninecolors,https://github.com/lvjr/ninecolors.git,https://github.com/lvjr/ninecolors/issues,2022-04-02,2022-04-02,
nmc,numerica,Andrew Parsloe,,,,2021-06-30,2021-06-30,
no,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
notestobib,notes2bib,Joseph Wright,https://github.com/josephwright/notes2bib,https://github.com/josephwright/notes2bib.git,https://github.com/josephwright/notes2bib/issues,2012-11-07,2012-11-07,
@@ -218,6 +222,7 @@ substances,substances,Clemens Niederberger,https://github.com/cgnieder/substance
sys,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-09-07,2015-09-08,
tag,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02,
tasks,tasks,Clemens Niederberger,https://github.com/cgnieder/tasks/,https://github.com/cgnieder/tasks.git,https://github.com/cgnieder/cgnieder/tasks/issues,2013-03-16,2020-04-14,
+tblr,tabularray,Jianrui Lyu,https://github.com/lvjr/tabularray,https://github.com/lvjr/tabularray.git,https://github.com/lvjr/tabularray/issues,2022-04-02,2022-04-02
tcobox,tcolorbox,Thomas F. Sturm,https://github.com/T-F-S/tcolorbox,https://github.com/T-F-S/tcolorbox.git,https://github.com/T-F-S/tcolorbox/issues,2020-02-19,2020-02-19,
term,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
tex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf
index 7724db3c3b..433569b9b2 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.pdf
+++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx
index 1742e7c0a5..98f6211187 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/contrib/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx
index de14307b84..1d0694fe6a 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/contrib/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx
index a31d883016..53ea8dfc18 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/contrib/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx
index 4eb2dacf10..e9c254bb02 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/contrib/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index c6300a8447..bf285df964 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx
index d6ba0a90c1..75e80b0c54 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/contrib/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx
index 75509e1e54..11604bbf81 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/contrib/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx
index f854e3ea2e..8646c378e5 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx
index 897f4b962b..ddfdd10279 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/contrib/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -222,8 +222,8 @@
%
% \section{String conditionals}
%
-% \begin{function}[EXP,pTF, added = 2015-09-18]
-% {\str_if_empty:N, \str_if_empty:c}
+% \begin{function}[EXP,pTF, added = 2015-09-18, updated = 2022-03-21]
+% {\str_if_empty:N, \str_if_empty:c, \str_if_empty:n}
% \begin{syntax}
% \cs{str_if_empty_p:N} \meta{str~var}
% \cs{str_if_empty:NTF} \meta{str~var} \Arg{true code} \Arg{false code}
@@ -282,8 +282,8 @@
% tests whether \meta{string_2} is found inside \meta{string_1}.
% \end{function}
%
-% \begin{function}[added = 2013-07-24, updated = 2015-02-28, EXP, noTF]
-% {\str_case:nn, \str_case:Vn, \str_case:on, \str_case:nV, \str_case:nv}
+% \begin{function}[added = 2013-07-24, updated = 2022-03-21, EXP, noTF]
+% {\str_case:nn, \str_case:Vn, \str_case:Nn, \str_case:on, \str_case:nV, \str_case:nv}
% \begin{syntax}
% \cs{str_case:nnTF} \Arg{test string} \\
% ~~|{| \\
@@ -747,16 +747,6 @@
% correctly deal with context-dependence and other factors appropriate
% to text case changing.
% \end{itemize}
-%
-% \begin{texnote}
-% As with all \pkg{expl3} functions, the input supported by
-% \cs{str_foldcase:n} is \emph{engine-native} characters which are or
-% interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{}
-% \emph{only} the Latin alphabet characters A--Z are case-folded
-% (\emph{i.e.}~the \textsc{ascii} range which coincides with
-% \textsc{utf-8}). Full \textsc{utf-8} support is available with both
-% \XeTeX{} and \LuaTeX{}.
-% \end{texnote}
% \end{function}
%
% \begin{function}[EXP, added = 2019-11-26]
@@ -789,18 +779,6 @@
% a language-insensitive process, there is no special treatment of
% Turkic input (\emph{i.e.}~\texttt{I} always folds to \texttt{i} and
% not to \texttt{\i}).
-%
-% \begin{texnote}
-% As with all \pkg{expl3} functions, the input supported by
-% \cs{str_foldcase:n} is \emph{engine-native} characters which are or
-% interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{}
-% \emph{only} the Latin alphabet characters A--Z are case-folded
-% (\emph{i.e.}~the \textsc{ascii} range which coincides with
-% \textsc{utf-8}). Full \textsc{utf-8} support is available with both
-% \XeTeX{} and \LuaTeX{}, subject only to the fact that \XeTeX{} in
-% particular has issues with characters of code above hexadecimal
-% $0\mathrm{xFFFF}$ when interacting with \cs{tl_to_str:n}.
-% \end{texnote}
% \end{function}
%
% \section{Viewing strings}
@@ -1113,7 +1091,7 @@
%
% \begin{macro}[pTF, EXP]
% {
-% \str_if_empty:N, \str_if_empty:c,
+% \str_if_empty:N, \str_if_empty:c, \str_if_empty:n,
% \str_if_exist:N, \str_if_exist:c
% }
% More copy-paste!
@@ -1126,6 +1104,8 @@
{ p , T , F , TF }
\prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c
{ p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_empty:n \tl_if_empty:n
+ { p , T , F , TF }
% \end{macrocode}
% \end{macro}
%
@@ -1224,7 +1204,7 @@
% \end{macro}
%
% \begin{macro}[EXP, noTF]
-% {\str_case:nn, \str_case:Vn, \str_case:on, \str_case:nV, \str_case:nv, \str_case_e:nn}
+% {\str_case:nn, \str_case:Vn, \str_case:Nn, \str_case:on, \str_case:nV, \str_case:nv, \str_case_e:nn}
% \begin{macro}[EXP]{\@@_case:nnTF, \@@_case_e:nnTF}
% \begin{macro}[EXP]
% {\@@_case:nw, \@@_case_e:nw, \@@_case_end:nw}
@@ -1254,6 +1234,10 @@
\cs_new:Npn \@@_case:nnTF #1#2#3#4
{ \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_generate_variant:Nn \str_case:nn { V , o , nV , nv }
+\cs_new_eq:NN \str_case:Nn \str_case:Vn
+\cs_new_eq:NN \str_case:NnT \str_case:VnT
+\cs_new_eq:NN \str_case:NnF \str_case:VnF
+\cs_new_eq:NN \str_case:NnTF \str_case:VnTF
\prg_generate_conditional_variant:Nnn \str_case:nn
{ V , o , nV , nv } { T , F , TF }
\cs_new:Npn \@@_case:nw #1#2#3
@@ -1918,10 +1902,21 @@
% \begin{macro}[EXP]{\@@_change_case_loop:nw}
% \begin{macro}[EXP]{\@@_change_case_space:n}
% \begin{macro}[EXP]{\@@_change_case_char:nN}
+% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNN}
+% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNN}
+% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNNN}
+% \begin{macro}[EXP]
+% {
+% \@@_change_case_char_UTFviii:nn ,
+% \@@_change_case_char_UTFviii_lower:nn ,
+% \@@_change_case_char_UTFviii_upper:nn ,
+% \@@_change_case_char_UTFviii_fold:nn
+% }
% Case changing for programmatic reasons is done by first detokenizing
% input then doing a simple loop that only has to worry about spaces
% and everything else. The output is detokenized to allow data sharing
-% with text-based case changing.
+% with text-based case changing. Similarly, for $8$-bit engines the
+% multi-byte information is shared.
% \begin{macrocode}
\cs_new:Npn \str_foldcase:n #1 { \@@_change_case:nn {#1} { fold } }
\cs_new:Npn \str_lowercase:n #1 { \@@_change_case:nn {#1} { lower } }
@@ -1965,7 +1960,100 @@
{ \use:c { char_str_ #1 case:N } #2 }
\@@_change_case_loop:nw {#1}
}
+\if_int_compare:w 0
+ \cs_if_exist:NT \tex_XeTeXversion:D { 1 }
+ \cs_if_exist:NT \tex_luatexversion:D { 1 }
+ > 0 \exp_stop_f:
+\else:
+ \cs_gset:Npn \@@_change_case_char:nN #1#2
+ {
+ \@@_if_recursion_tail_stop_do:Nn #2
+ { \@@_change_case_end:wn }
+ \int_compare:nNnTF { `#2 } > { "80 }
+ {
+ \int_compare:nNnTF { `#2 } < { "E0 }
+ { \@@_change_case_char_UTFviii:nNN }
+ {
+ \int_compare:nNnTF { `#2 } < { "F0 }
+ { \@@_change_case_char_UTFviii:nNNN }
+ { \@@_change_case_char_UTFviii:nNNNN }
+ }
+ {#1} #2
+ }
+ {
+ \@@_change_case_output:fw
+ { \use:c { char_str_ #1 case:N } #2 }
+ \@@_change_case_loop:nw {#1}
+ }
+ }
+ \cs_new:Npn \@@_change_case_char_UTFviii:nNN #1#2#3
+ { \@@_change_case_char_UTFviii:nn {#1} {#2#3} }
+ \cs_new:Npn \@@_change_case_char_UTFviii:nNNN #1#2#3#4
+ { \@@_change_case_char_UTFviii:nn {#1} {#2#3#4} }
+ \cs_new:Npn \@@_change_case_char_UTFviii:nNNNN #1#2#3#4#5
+ { \@@_change_case_char_UTFviii:nn {#1} {#2#3#4#5} }
% \end{macrocode}
+% Skip high chars for the Japanese engines.
+% \begin{macrocode}
+ \cs_if_exist:NF \tex_pdftexversion:D
+ {
+ \cs_gset:Npn \@@_change_case_char_UTFviii:nNNN #1#2#3#4
+ {
+ \@@_change_case_output:nw {#2#3#4}
+ \@@_change_case_loop:nw {#1}
+ }
+ \cs_gset:Npn \@@_change_case_char_UTFviii:nNNNN #1#2#3#4#5
+ {
+ \@@_change_case_output:nw {#2#3#4#5}
+ \@@_change_case_loop:nw {#1}
+ }
+ }
+ \cs_new:Npn \@@_change_case_char_UTFviii:nn #1#2
+ {
+ \use:c { @@_change_case_char_UTFviii_ #1 :nn } {#1} {#2}
+ }
+ \cs_new:Npn \@@_change_case_char_UTFviii_upper:nn #1#2
+ {
+ \@@_change_case_output:fw
+ {
+ \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl }
+ {
+ \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN
+ { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: }
+ }
+ {#2}
+ }
+ \@@_change_case_loop:nw {#1}
+ }
+ \cs_new_eq:NN \@@_change_case_char_UTFviii_lower:nn
+ \@@_change_case_char_UTFviii_upper:nn
+ \cs_new:Npn \@@_change_case_char_UTFviii_fold:nn #1#2
+ {
+ \@@_change_case_output:fw
+ {
+ \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl }
+ {
+ \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN
+ { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: }
+ }
+ {
+ \cs_if_exist:cTF { c__kernel_lowercase_ #2 _tl }
+ {
+ \__kernel_tl_to_str:w
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ { \cs:w c__kernel_lowercase_ #2 _tl \cs_end: }
+ }
+ {#2}
+ }
+ }
+ \@@_change_case_loop:nw {#1}
+ }
+\fi:
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf
index 63989dbdbf..21449e7b02 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.pdf
+++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.tex b/macros/latex/contrib/l3kernel/l3styleguide.tex
index 86f5230696..6fd43ce801 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.tex
+++ b/macros/latex/contrib/l3kernel/l3styleguide.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2022-02-24}
+\date{Released 2022-04-10}
\begin{document}
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
index 3d449d0537..587c0c8b36 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.tex b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
index 430b3cb056..722a90977a 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.tex
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2022-02-24}
+\date{Released 2022-04-10}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx
index 4134831b8b..a211af619b 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/contrib/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
index 4cf56475bb..d200cd3e0c 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.tex b/macros/latex/contrib/l3kernel/l3term-glossary.tex
index bd10abf6f2..90b3a71af2 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.tex
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2022-02-24}
+\date{Released 2022-04-10}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx
index 61681108e2..faa9960f79 100644
--- a/macros/latex/contrib/l3kernel/l3text-case.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-case.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -670,10 +670,10 @@
{ \@@_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5#6#7} }
\cs_new:Npn \@@_change_case_char_UTFviii:nnnn #1#2#3#4
{
- \cs_if_exist:cTF { c_@@_ #1 case_ \tl_to_str:n {#4} _tl }
+ \cs_if_exist:cTF { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl }
{
\@@_change_case_store:v
- { c_@@_ #1 case_ \tl_to_str:n {#4} _tl }
+ { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl }
}
{ \@@_change_case_store:n {#4} }
\use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3}
@@ -1536,11 +1536,11 @@
%
% For $8$-bit engines we now need to define the case-change data for
% the multi-octet mappings. This data is here not in the \pkg{char} module
-% as the multi-byte nature means they are never |N|-type.
-% These need a list of what code points are
-% doable in |T1| so the list is hard coded (there's no saving in loading
-% the mappings dynamically). All of the straight-forward ones have two
-% octets, so that is taken as read.
+% as the multi-byte nature means they are never |N|-type. As this data is
+% needed both for text and string work, it is stored as |kernel|: it remains
+% internal as it is not really suitable for wider exposure.
+%
+% The first set of codepoints are those in |T1|: all of these are two bytes.
% \begin{macrocode}
\group_begin:
\bool_lazy_or:nnF
@@ -1562,7 +1562,7 @@
{
\tl_const:cx
{
- c_@@_ #1 case_
+ c__kernel_ #1 case_
\char_generate:nn {#2} { 12 }
\char_generate:nn {#3} { 12 }
_tl
@@ -1578,7 +1578,7 @@
{
\tl_const:cx
{
- c_@@_lowercase_
+ c__kernel_lowercase_
\char_generate:nn {#1} { 12 }
\char_generate:nn {#2} { 12 }
_tl
@@ -1694,8 +1694,7 @@
{ 0218 } { 0219 }
{ 021A } { 021B }
% \end{macrocode}
-% Add |T2| (Cyrillic) as this is doable using a classical \tn{MakeUppercase}
-% approach.
+% Add |T2| (Cyrillic) : again two bytes.
% \begin{macrocode}
{ 0400 } { 0450 }
{ 0401 } { 0451 }
@@ -1818,7 +1817,7 @@
{
\tl_const:cx
{
- c_@@_ #3 case_
+ c__kernel_ #3 case_
\char_generate:nn {##1} { 12 }
\char_generate:nn {##2} { 12 }
_tl
@@ -1859,7 +1858,7 @@
{
\tl_const:cn
{
- c_@@_ #3 case_
+ c__kernel_ #3 case_
\char_generate:nn {##1} { 12 }
\char_generate:nn {##2} { 12 }
_tl
@@ -1880,7 +1879,7 @@
{
\tl_const:cx
{
- c_@@_ #1 case_
+ c__kernel_ #1 case_
\char_generate:nn {#2} { 12 }
\char_generate:nn {#3} { 12 }
\char_generate:nn {#4} { 12 }
@@ -1899,7 +1898,7 @@
{
\tl_const:cx
{
- c_@@_lowercase_
+ c__kernel_lowercase_
\char_generate:nn {#1} { 12 }
\char_generate:nn {#2} { 12 }
\char_generate:nn {#3} { 12 }
@@ -2025,7 +2024,7 @@
{
\tl_const:cx
{
- c_@@_ #3 case_
+ c__kernel_ #3 case_
\char_generate:nn {##1} { 12 }
\char_generate:nn {##2} { 12 }
\char_generate:nn {##3} { 12 }
diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/contrib/l3kernel/l3text-purify.dtx
index 922a371d33..a055aec838 100644
--- a/macros/latex/contrib/l3kernel/l3text-purify.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-purify.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx
index 0d1365c8d2..3cb5795a5d 100644
--- a/macros/latex/contrib/l3kernel/l3text.dtx
+++ b/macros/latex/contrib/l3kernel/l3text.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -562,11 +562,45 @@
% \end{variable}
%
% \begin{variable}{\l_text_expand_exclude_tl}
-% Commands which need not to expand.
+% Commands which need not to expand. We start with a somewhat historical
+% list, and tidy up if possible.
% \begin{macrocode}
\tl_new:N \l_text_expand_exclude_tl
\tl_set:Nn \l_text_expand_exclude_tl
{ \begin \cite \end \label \ref }
+\bool_lazy_and:nnT
+ { \str_if_eq_p:Vn \fmtname { LaTeX2e } }
+ { \tl_if_exist_p:N \@expl@finalise@setup@@@@ }
+ {
+ \tl_gput_right:Nn \@expl@finalise@setup@@@@
+ {
+ \tl_gput_right:Nn \@kernel@after@begindocument
+ {
+ \group_begin:
+ \cs_set_protected:Npn \@@_tmp:w #1
+ {
+ \tl_clear:N \l_text_expand_exclude_tl
+ \tl_map_inline:nn {#1}
+ {
+ \bool_lazy_any:nF
+ {
+ { \token_if_protected_macro_p:N ##1 }
+ { \token_if_protected_long_macro_p:N ##1 }
+ {
+ \str_if_eq_p:ee
+ { \cs_replacement_spec:N ##1 }
+ { \exp_not:n { \protect ##1 } \c_space_tl }
+ }
+ }
+ { \tl_put_right:Nn \l_text_expand_exclude_tl {##1} }
+ }
+ }
+ \exp_args:NV \@@_tmp:w \l_text_expand_exclude_tl
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l_text_expand_exclude_tl \l_text_expand_exclude_tl
+ }
+ }
+ }
% \end{macrocode}
% \end{variable}
%
@@ -632,13 +666,14 @@
% \begin{macro}[EXP]{\@@_expand_accent:NN}
% \begin{macro}[EXP]{\@@_expand_letterlike:N}
% \begin{macro}[EXP]{\@@_expand_letterlike:NN}
-% \begin{macro}[EXP]{\@@_expand_cs:N, \@@_expand_encoding:N}
-% \begin{macro}[EXP]{\@@_expand_encoding_escape:N}
+% \begin{macro}[EXP]{\@@_expand_cs:N}
+% \begin{macro}[EXP]{\@@_expand_protect:w}
% \begin{macro}[EXP]{\@@_expand_protect:N}
% \begin{macro}[EXP]{\@@_expand_protect:nN}
% \begin{macro}[EXP]{\@@_expand_protect:Nw}
% \begin{macro}[EXP]{\@@_expand_testopt:N}
% \begin{macro}[EXP]{\@@_expand_testopt:NNn}
+% \begin{macro}[EXP]{\@@_expand_encoding:N, \@@_expand_encoding_escape:N}
% \begin{macro}[EXP]{\@@_expand_replace:N}
% \begin{macro}[EXP]{\@@_expand_replace:n}
% \begin{macro}[EXP]{\@@_expand_cs_expand:N}
@@ -947,14 +982,15 @@
% \end{macrocode}
% \LaTeXe{}'s \cs{protect} makes life interesting. Where possible, we
% simply remove it and replace with the \enquote{parent} command; of course,
-% the \cs{protect} might be explicit, in which case we need to leave it alone
-% if it's required. There is also the case of a straight \tn{@protected@testopt}
-% to cover.
+% the \cs{protect} might be explicit, in which case we need to leave it alone.
+% That includes the case where it's not even followed by an \texttt{N}-type
+% token. There is also the case of a straight \tn{@protected@testopt} to
+% cover.
% \begin{macrocode}
\cs_new:Npx \@@_expand_cs:N #1
{
\exp_not:N \str_if_eq:nnTF {#1} { \exp_not:N \protect }
- { \exp_not:N \@@_expand_protect:N }
+ { \exp_not:N \@@_expand_protect:w }
{
\bool_lazy_and:nnTF
{ \cs_if_exist_p:N \fmtname }
@@ -963,8 +999,23 @@
{ \exp_not:N \@@_expand_replace:N #1 }
}
}
+\cs_new:Npn \@@_expand_protect:w #1 \q_@@_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#1}
+ { \@@_expand_protect:N }
+ {
+ \@@_expand_store:n { \protect }
+ \@@_expand_loop:w
+ }
+ #1 \q_@@_recursion_stop
+ }
\cs_new:Npn \@@_expand_protect:N #1
{
+ \@@_if_recursion_tail_stop_do:Nn #1
+ {
+ \@@_expand_store:n { \protect }
+ \@@_expand_end:w
+ }
\exp_args:Ne \@@_expand_protect:nN
{ \cs_to_str:N #1 } #1
}
@@ -1122,6 +1173,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
index 9f6527b505..0db5f15d7a 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -90,7 +90,7 @@
% characters, and the value of registers.
% \end{function}
%
-% \begin{function}[added = 2018-04-09]
+% \begin{function}[added = 2018-04-09, updated = 2022-03-26]
% {\tl_analysis_map_inline:nn, \tl_analysis_map_inline:Nn}
% \begin{syntax}
% \cs{tl_analysis_map_inline:nn} \Arg{token list} \Arg{inline function}
@@ -935,47 +935,46 @@
%
% \subsection{Mapping through the analysis}
%
-% \begin{macro}{\tl_analysis_map_inline:nn, \tl_analysis_map_inline:Nn}
-% \begin{macro}{\@@_analysis_map_inline_aux:Nn}
-% \begin{macro}{\@@_analysis_map_inline_aux:nnn}
+% \begin{macro}{\tl_analysis_map_inline:Nn, \tl_analysis_map_inline:nn}
+% \begin{macro}{\@@_analysis_map:Nn}
+% \begin{macro}{\@@_analysis_map:NwNw}
% First obtain the analysis of the token list into
% \cs{g_@@_analysis_result_tl}. To allow nested mappings, increase the
-% nesting depth \cs{g__kernel_prg_map_int} (shared between all modules), then
-% define the looping macro, which has a name specific to that nesting
-% depth. That looping grabs the \meta{tokens}, \meta{catcode} and
-% \meta{char code}; it checks for the end of the loop with
-% \cs{use_none:n} |##2|, normally empty, but which becomes
-% \cs{tl_map_break:} at the end; it then performs the user's code
-% |#2|, and loops by calling itself. When the loop ends, remember to
-% decrease the nesting depth.
+% nesting depth \cs{g__kernel_prg_map_int} (shared between all
+% modules), then define the payload macro, which runs the user code
+% and has a name specific to that nesting depth. The looping macro
+% grabs the \meta{tokens}, \meta{catcode} and \meta{char code}; it
+% checks for the end of the loop with \cs{use_none:n} |##2|, normally
+% empty, but which becomes \cs{tl_map_break:} at the end; it then
+% calls the payload macro with the arguments in the correct order
+% (this is the reason why we cannot directly use the same macro for
+% looping and payload), and loops by calling itself. When the loop
+% ends, remember to decrease the nesting depth.
% \begin{macrocode}
+\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1
+ { \exp_args:No \tl_analysis_map_inline:nn #1 }
\cs_new_protected:Npn \tl_analysis_map_inline:nn #1
{
\@@_analysis:n {#1}
\int_gincr:N \g__kernel_prg_map_int
- \exp_args:Nc \@@_analysis_map_inline_aux:Nn
+ \exp_args:Nc \@@_analysis_map:Nn
{ @@_analysis_map_inline_ \int_use:N \g__kernel_prg_map_int :wNw }
}
-\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1
- { \exp_args:No \tl_analysis_map_inline:nn #1 }
-\cs_new_protected:Npn \@@_analysis_map_inline_aux:Nn #1#2
+\cs_new_protected:Npn \@@_analysis_map:Nn #1#2
{
- \cs_gset_protected:Npn #1 ##1 \s_@@ ##2 ##3 \s_@@
- {
- \use_none:n ##2
- \@@_analysis_map_inline_aux:nnn {##1} {##3} {##2}
- }
- \cs_gset_protected:Npn \@@_analysis_map_inline_aux:nnn ##1##2##3
- {
- #2
- #1
- }
- \exp_after:wN #1
+ \cs_gset_protected:Npn #1 ##1##2##3 {#2}
+ \exp_after:wN \@@_analysis_map:NwNw \exp_after:wN #1
\g_@@_analysis_result_tl
\s_@@ { ? \tl_map_break: } \s_@@
\prg_break_point:Nn \tl_map_break:
{ \int_gdecr:N \g__kernel_prg_map_int }
}
+\cs_new_protected:Npn \@@_analysis_map:NwNw #1 #2 \s_@@ #3 #4 \s_@@
+ {
+ \use_none:n #3
+ #1 {#2} {#4} {#3}
+ \@@_analysis_map:NwNw #1
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx
index bd78c69bde..68d2cdaf8a 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx
index 909dff2b7e..3d5858a37a 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/contrib/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
@@ -139,12 +139,14 @@
% \item $6$ (parameter)
% \item $7$ (math superscript)
% \item $8$ (math subscript)
+% \item $10$ (space)
% \item $11$ (letter)
% \item $12$ (other)
% \item $13$ (active)
% \end{itemize}
% and other values raise an error. The \meta{charcode} may be any one valid
-% for the engine in use.
+% for the engine in use, except that for \meta{catcode} $10$, \meta{charcode}
+% $0$ is not allowed.
% Active characters cannot be generated in older versions of \XeTeX{}.
% Another way to build token lists with unusual category codes is
% \cs{regex_replace:nnN} |{.*}| \Arg{replacement} \meta{tl~var}.
@@ -1527,26 +1529,22 @@
% \begin{macrocode}
\cs_new:Npn \@@_generate_aux:w #1 ; #2 ;
{
- \if_int_compare:w #2 = 10 \exp_stop_f:
- \if_int_compare:w #1 = \c_zero_int
- \msg_expandable_error:nn { char } { null-space }
- \else:
- \msg_expandable_error:nn { char } { space }
- \fi:
+ \if_int_odd:w 0
+ \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi:
+ \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
+ \msg_expandable_error:nn { char }
+ { invalid-catcode }
\else:
\if_int_odd:w 0
- \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi:
- \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi:
- \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi:
- \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
+ \if_int_compare:w #1 < \c_zero_int 1 \fi:
+ \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f:
\msg_expandable_error:nn { char }
- { invalid-catcode }
+ { out-of-range }
\else:
- \if_int_odd:w 0
- \if_int_compare:w #1 < \c_zero_int 1 \fi:
- \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f:
- \msg_expandable_error:nn { char }
- { out-of-range }
+ \if_int_compare:w #2#1 = 100 \exp_stop_f:
+ \msg_expandable_error:nn { char } { null-space }
\else:
\@@_generate_aux:nnw {#1} {#2}
\fi:
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx
index 317630568d..db57bd0f38 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/contrib/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf
index abe5195e41..c00c8648b5 100644
--- a/macros/latex/contrib/l3kernel/source3.pdf
+++ b/macros/latex/contrib/l3kernel/source3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/source3.tex b/macros/latex/contrib/l3kernel/source3.tex
index 774083a4a8..3defa4b47a 100644
--- a/macros/latex/contrib/l3kernel/source3.tex
+++ b/macros/latex/contrib/l3kernel/source3.tex
@@ -53,7 +53,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2022-02-24}
+\date{Released 2022-04-10}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/source3body.tex b/macros/latex/contrib/l3kernel/source3body.tex
index a2e87856bd..20e1875361 100644
--- a/macros/latex/contrib/l3kernel/source3body.tex
+++ b/macros/latex/contrib/l3kernel/source3body.tex
@@ -207,7 +207,9 @@ following argument specifiers:
\item[\texttt{c}] This means \emph{csname}, and indicates that the
argument will be turned into a csname before being used. So
|\foo:c| |{ArgumentOne}| will act in the same way as |\foo:N|
- |\ArgumentOne|.
+ |\ArgumentOne|. All macros that appear in the argument are expanded.
+ An internal error will occur if the result of expansion inside
+ a \texttt{c}-type argument is not a series of character tokens.
\item[\texttt{V} and \texttt{v}] These mean \emph{value
of variable}. The \texttt{V} and \texttt{v} specifiers are used to
get the content of a variable without needing to worry about the