summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
Diffstat (limited to 'macros')
-rw-r--r--macros/latex/contrib/beamer-contrib/beamerappendixnote/README.md28
-rw-r--r--macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.dtx180
-rw-r--r--macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.ins39
-rw-r--r--macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.pdfbin0 -> 53574 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/beamerappendixnote/example-basic.pdfbin0 -> 10737 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/beamerappendixnote/example-basic.tex9
-rw-r--r--macros/latex/contrib/etoc/README.md11
-rw-r--r--macros/latex/contrib/etoc/etoc-DE.pdfbin565252 -> 566467 bytes
-rw-r--r--macros/latex/contrib/etoc/etoc.dtx56
-rw-r--r--macros/latex/contrib/etoc/etoc.pdfbin620437 -> 622143 bytes
-rw-r--r--macros/latex/contrib/l3kernel/CHANGELOG.md8
-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.pdfbin584879 -> 584791 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.pdfbin1544503 -> 1544412 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3alloc.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3basics.dtx2
-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.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-base.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3debug.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3deprecation.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.pdfbin263493 -> 263380 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3expan.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3file.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3final.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.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3legacy.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3luatex.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3names.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3news.pdfbin379248 -> 384379 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news01.pdfbin113529 -> 113548 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news02.pdfbin140776 -> 140795 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news03.pdfbin144784 -> 144801 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news04.pdfbin107117 -> 107135 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news05.pdfbin105090 -> 105108 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news06.pdfbin140797 -> 140817 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news07.pdfbin119092 -> 119111 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news08.pdfbin152413 -> 152430 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news09.pdfbin235323 -> 235343 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news10.pdfbin147096 -> 147116 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news11.pdfbin165956 -> 165975 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news12.pdfbin199153 -> 199172 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.csv1
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.pdfbin75377 -> 75465 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.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.pdfbin280191 -> 280126 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.pdfbin228503 -> 228422 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.pdfbin186719 -> 186637 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-case.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-purify.dtx96
-rw-r--r--macros/latex/contrib/l3kernel/l3text.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-analysis.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3token.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3unicode.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/source3.pdfbin5898773 -> 5901010 bytes
-rw-r--r--macros/latex/contrib/l3kernel/source3.tex2
-rw-r--r--macros/latex/contrib/l3packages/CHANGELOG.md5
-rw-r--r--macros/latex/contrib/l3packages/README.md2
-rw-r--r--macros/latex/contrib/l3packages/l3keys2e.dtx4
-rw-r--r--macros/latex/contrib/l3packages/l3keys2e.pdfbin347720 -> 347627 bytes
-rw-r--r--macros/latex/contrib/l3packages/xfp.dtx4
-rw-r--r--macros/latex/contrib/l3packages/xfp.pdfbin310099 -> 309995 bytes
-rw-r--r--macros/latex/contrib/l3packages/xfrac.dtx4
-rw-r--r--macros/latex/contrib/l3packages/xfrac.pdfbin454527 -> 481419 bytes
-rw-r--r--macros/latex/contrib/l3packages/xparse.dtx100
-rw-r--r--macros/latex/contrib/l3packages/xparse.pdfbin506103 -> 505994 bytes
-rw-r--r--macros/latex/contrib/l3packages/xtemplate.dtx4
-rw-r--r--macros/latex/contrib/l3packages/xtemplate.pdfbin416612 -> 416503 bytes
-rw-r--r--macros/luatex/generic/lua-uni-algos/README.md30
-rw-r--r--macros/luatex/generic/lua-uni-algos/lua-uni-algos.lua20
-rw-r--r--macros/luatex/generic/lua-uni-algos/lua-uni-algos.pdfbin0 -> 60471 bytes
-rw-r--r--macros/luatex/generic/lua-uni-algos/lua-uni-algos.tex171
-rw-r--r--macros/luatex/generic/lua-uni-algos/lua-uni-case.lua67
-rw-r--r--macros/luatex/generic/lua-uni-algos/lua-uni-graphemes.lua168
-rw-r--r--macros/luatex/generic/lua-uni-algos/lua-uni-normalize.lua269
-rw-r--r--macros/luatex/generic/lua-uni-algos/lua-uni-parse.lua71
-rw-r--r--macros/xetex/latex/bidi/README4
-rw-r--r--macros/xetex/latex/bidi/bidi-bibitem.pdf (renamed from macros/xetex/latex/bidi/bibitem.pdf)bin2936 -> 2936 bytes
-rw-r--r--macros/xetex/latex/bidi/bidi-doc-intro.ltx2
-rw-r--r--macros/xetex/latex/bidi/bidi-doc-title.ltx4
-rw-r--r--macros/xetex/latex/bidi/bidi-doc.ltx2
-rw-r--r--macros/xetex/latex/bidi/bidi-doc.pdfbin172895 -> 172890 bytes
-rw-r--r--macros/xetex/latex/bidi/bidi.dtx26
-rw-r--r--macros/xetex/latex/bidi/bidi.pdfbin3110998 -> 3111015 bytes
123 files changed, 1304 insertions, 207 deletions
diff --git a/macros/latex/contrib/beamer-contrib/beamerappendixnote/README.md b/macros/latex/contrib/beamer-contrib/beamerappendixnote/README.md
new file mode 100644
index 0000000000..48321f6dc4
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/beamerappendixnote/README.md
@@ -0,0 +1,28 @@
+Beamer appendix note introduces the `\beamerappxnote` command, which puts the note's content on a separate beamer frame, shown by the command `\printappxnotes`. It also creates interactive buttons to move back and forth between the two frames.
+
+# Licence
+
+The `beamerappendixnote` package is made available under the [LaTeX Project Public License (LPPL)](http://www.latex-project.org/lppl.txt), either version 1.3c of this license or (at your option) any later version.
+
+# Installation
+
+To install the package, copy beamersubframe.sty into your `texmf` folder. If you wish to build this file from the source code, follow the following instructions.
+
+# Build
+
+1. Generate beamersubframe.sty
+```
+tex beamersubframe.ins
+```
+
+2. Compile examples
+```
+xelatex example*
+```
+
+3. Compile documentation
+```
+xelatex beamersubframe.dtx
+xelatex beamersubframe.dtx
+```
+
diff --git a/macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.dtx b/macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.dtx
new file mode 100644
index 0000000000..05445b6b65
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.dtx
@@ -0,0 +1,180 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2020 Christoph Semken <christoph.ban@semken.info>
+% -------------------------------------------------------
+%
+% This file 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 later version.
+% The latest version of this license is in:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% \fi
+%
+% \iffalse
+%
+%
+%<*driver>
+\ProvidesFile{beamerappendixnote.dtx}
+%</driver>
+%<package> \ProvidesPackage{beamerappendixnote}
+%<*package>
+ [2020/05/13 v1.0 initial version]
+%</package>
+%<*driver>
+\documentclass{l3doc}
+\usepackage{beamerappendixnote}
+
+\usepackage{listings}
+\lstset{
+ basicstyle=\ttfamily,
+ columns=fullflexible,
+ keepspaces=true,
+}
+\usepackage{graphicx}
+
+\begin{document}
+
+\changes{v1.0}{2020/05/13}{Initial version}
+
+\GetFileInfo{beamerappendixnote.dtx}
+
+\title{The \pkg{beamerappendixnote} package}
+
+\author{Christoph Semken%
+ \thanks{E-mail:
+ \href{mailto:christoph.ban@semken.info}
+ {christoph.ban@semken.info}%
+ }%
+}
+
+\date{\fileversion\ --- \filedate}
+
+\maketitle
+
+\begin{documentation}
+
+\noindent Beamer appendix note introduces the \cs{beamerappxnote} command, which puts the note's content on a separate beamer frame, shown by the command \cs{printappxnotes}. It also creates interactive buttons to move back and forth between the two frames:
+
+\lstinputlisting{example-basic.tex}
+\includegraphics[page=1,width=.49\linewidth]{example-basic.pdf}
+\includegraphics[page=2,width=.49\linewidth]{example-basic.pdf}
+
+\clearpage
+\section{Usage}
+
+\begin{function}{\appxnote}
+ \begin{syntax}
+ \cs{appxnote}\marg{title}\marg{content}
+ \end{syntax}
+
+ Create a new appendix note. Inserts a \cs{beamergotobutton} to a frame that contains \marg{content}. The appendix frame is created using \cs{printappxnotes}. The button’s text and the title of the appendix frame are both set to \marg{title}.
+\end{function}
+
+\begin{function}{\printappxnotes}
+ \begin{syntax}
+ \cs{printappxnotes}
+ \end{syntax}
+
+ Prints appendix notes in the order they are created using \cs{appxnote}. Has to be used after the last appendix note. Uses one frame per note. Inserts a \cs{beamerreturnbutton} button to the frame where \cs{appxnote} was called, followed by the content, separated by a \cs{vfill}.
+\end{function}
+
+\end{documentation}
+
+
+\begin{implementation}
+ \section{Implementation}
+ \DocInput{beamerappendixnote.dtx}
+\end{implementation}
+
+
+\end{document}
+%</driver>
+% \fi
+% \iffalse
+%<*package>
+%<@@=ban>
+% \fi
+%
+% \subsection{Dependencies}
+%
+% Load the essential support (\pkg{expl3}).
+% \begin{macrocode}
+\RequirePackage{expl3}
+% \end{macrocode}
+%
+% Make sure that the version of \pkg{l3kernel} in use is sufficiently new.
+% \begin{macrocode}
+\@ifpackagelater {expl3}{2018/04/22} {} {%
+ \PackageError {beamerappendixnote} {Support package expl3 too old}
+ {%
+ You need to update your installation of the bundles 'l3kernel' and
+ 'l3packages'.\MessageBreak
+ Loading~beamerappendixnote~will~abort!%
+ }%
+ \endinput
+}%
+% \end{macrocode}
+%
+% Identify the package and give the over all version information.
+% \begin{macrocode}
+\ProvidesExplPackage {beamerappendixnote} {2020/05/07} {1.0}
+ {Create notes in appendix frames}
+% \end{macrocode}
+%
+% User level interfaces are all created by \pkg{xparse}
+% \begin{macrocode}
+\RequirePackage {xparse}
+% \end{macrocode}
+%
+% \subsection{Data structures}
+%
+% Initialise sequences used to store notes.
+% \begin{macrocode}
+\seq_new:N \g_ban_titles
+\seq_new:N \g_ban_content
+% \end{macrocode}
+%
+% \subsection{Macros}
+%
+% \begin{macro}{\appxnote}
+% Create a new appendix note and insert a link
+% \begin{macrocode}
+\NewDocumentCommand{\appxnote}{m m}{
+ \seq_gput_right:Nn \g_ban_titles {#1}
+ \seq_gput_right:Nn \g_ban_content {#2}
+ \hyperlink{ban-\seq_count:N \g_ban_titles}{\beamergotobutton{#1}}%
+ \label{ban-back-\seq_count:N \g_ban_titles}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_print_func:n}
+% Print an appendix note
+% \begin{macrocode}
+\cs_set:Npn \print_func:n #1 {
+ \begin{frame}[label=ban-#1]{\seq_item:Nn \g_ban_titles {#1}}
+ \hyperlink{ ban-back-#1 }{\beamerreturnbutton{Back}}
+ \vfill
+ \seq_item:Nn \g_ban_content {#1}
+ \end{frame}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\printappxnotes}
+% Print all appendix notes
+% \begin{macrocode}
+\NewDocumentCommand{\printappxnotes}{}{
+ \int_step_function:nN {\seq_count:N \g_ban_titles} \print_func:n
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</package>
+% \fi
diff --git a/macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.ins b/macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.ins
new file mode 100644
index 0000000000..9ed4a61322
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.ins
@@ -0,0 +1,39 @@
+%% Copyright (C) 2020 by Christoph Semken <christoph.ban@semken.info>
+%%
+%% This file 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 later version. The latest version of this
+%% license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3 or later is part of all distributions of LaTeX version
+%% 2005/12/01 or later.
+%%
+
+\input docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\usedir{tex/latex/beamerappendixnote}
+
+\preamble
+
+----------------------------------------------------------------
+beamerappendixnote --- insert notes on appendix slides
+Author: Christoph Semken
+E-mail: christoph.ban@semken.info
+License: Released under the LaTeX Project Public License v1.3c or later
+See: http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+\endpreamble
+
+\generate{
+ \file{beamerappendixnote.sty}{
+ \from{beamerappendixnote.dtx}{package}
+ }
+}
+
+\endbatchfile
diff --git a/macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.pdf b/macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.pdf
new file mode 100644
index 0000000000..cc3d4de9e8
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/beamerappendixnote/beamerappendixnote.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/beamerappendixnote/example-basic.pdf b/macros/latex/contrib/beamer-contrib/beamerappendixnote/example-basic.pdf
new file mode 100644
index 0000000000..1e560098a0
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/beamerappendixnote/example-basic.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/beamerappendixnote/example-basic.tex b/macros/latex/contrib/beamer-contrib/beamerappendixnote/example-basic.tex
new file mode 100644
index 0000000000..e0eb2b68b8
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/beamerappendixnote/example-basic.tex
@@ -0,0 +1,9 @@
+\documentclass[20pt]{beamer}
+\usepackage{beamerappendixnote}
+\begin{document}
+\begin{frame}{Main frame}
+ Main content \vfill
+ \appxnote{Appendix note}{Note content}
+\end{frame}
+\printappxnotes
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/etoc/README.md b/macros/latex/contrib/etoc/README.md
index 9a186ade41..555755615d 100644
--- a/macros/latex/contrib/etoc/README.md
+++ b/macros/latex/contrib/etoc/README.md
@@ -1,12 +1,12 @@
<!-- -->
- Source: etoc.dtx (v1.09b-2019/11/17)
+ Source: etoc.dtx (v1.09c-2020/05/15)
Author: Jean-Francois Burnol
Author: Christine Roemer et al. (German tranlation)
Info: Completely customisable TOCs
License: LPPL 1.3c
- Copyright (C) 2012-2019 Jean-Francois Burnol.
- Copyright (C) 2014-2019 Christine Roemer and collaborators for
+ Copyright (C) 2012-2020 Jean-Francois Burnol.
+ Copyright (C) 2014-2020 Christine Roemer and collaborators for
the translation into German of the documentation.
<jfbu at free dot fr> <Christine_Roemer at t-online dot de>
@@ -107,6 +107,11 @@ etoc.pdf, etoc-DE.pdf, etoc.dvi, etoc-DE.dvi.
RECENT CHANGES
==============
+v1.09c \[2020/05/05\]
+---------------------
+
+Syncs with KOMA-script deprecation of `\iftocfeature`.
+
v1.09a, v1.09b \[2019/11/17\]
-----------------------------
diff --git a/macros/latex/contrib/etoc/etoc-DE.pdf b/macros/latex/contrib/etoc/etoc-DE.pdf
index 6b443b78ae..57f8f97060 100644
--- a/macros/latex/contrib/etoc/etoc-DE.pdf
+++ b/macros/latex/contrib/etoc/etoc-DE.pdf
Binary files differ
diff --git a/macros/latex/contrib/etoc/etoc.dtx b/macros/latex/contrib/etoc/etoc.dtx
index a500a3b01d..6809655d29 100644
--- a/macros/latex/contrib/etoc/etoc.dtx
+++ b/macros/latex/contrib/etoc/etoc.dtx
@@ -2,27 +2,27 @@
% N.B.: this dtx file is NOT for use with \DocInput. The latex source of the
% user manual is not prefixed with percent signs.
%<*none>
-\def\etocdtxtimestamp {Time-stamp: <17-11-2019 at 13:36:39 CET>}%
+\def\etocdtxtimestamp {Time-stamp: <15-05-2020 at 19:18:31 CEST>}%
%</none>
%<*!readme>
%%
%% Package: etoc
-%% Version: 1.09b-2019/11/17
+%% Version: 1.09c-2020/05/15
%% License: LPPL 1.3c
-%% Copyright (C) 2012-2019 Jean-Francois Burnol
+%% Copyright (C) 2012-2020 Jean-Francois Burnol
%% <jfbu at free dot fr>
-%% Copyright (C) 2014-2019 Christine Roemer
+%% Copyright (C) 2014-2020 Christine Roemer
%% <Christine_Roemer at t-online dot de>
%% and collaborators for the translation into German of the documentation
%%
%</!readme>
%<*none>
-\def\etocpkgdate {2019/11/17}
-\def\etocdocdate {2019/11/17}
-\def\etocpkgversion {v1.09b}
+\def\etocpkgdate {2020/05/15}
+\def\etocdocdate {2020/05/15}
+\def\etocpkgversion {v1.09c}
\def\etocpkgdescription {Completely customisable TOCs (JFB)}
-\def\etocDEpkgdate {17.11.2019}% METTRE À JOUR À CHAQUE BUMP!
-\def\etocDEdocdate {17.11.2019}
+\def\etocDEpkgdate {15.05.2020}% METTRE À JOUR À CHAQUE BUMP!
+\def\etocDEdocdate {15.05.2020}
\def\etocDEDEdocdate {09.04.2015}%
\def\etocDEDEpkgversion {v1.08d}%
% Definition of \etocLicense
@@ -33,10 +33,10 @@
\catcode32=13\catcode`\\=12^^Brelax^^A
^^Bfirstofone{^^Bendgroup^^Bdef^^BetocLicense^^A
{% Package: etoc
-% Version: 1.09b-2019/11/17
+% Version: 1.09c-2020/05/15
% License: LPPL 1.3c
-% Copyright (C) 2012-2019 Jean-Francois Burnol <jfbu at free dot fr>
-% Copyright (C) 2014-2019 Christine Roemer <Christine_Roemer at t-online dot de>
+% Copyright (C) 2012-2020 Jean-Francois Burnol <jfbu at free dot fr>
+% Copyright (C) 2014-2020 Christine Roemer <Christine_Roemer at t-online dot de>
% and collaborators for the translation into German of the documentation
%
% This Work may be distributed and/or modified under the
@@ -67,13 +67,13 @@
%<*readme>
<!-- -->
- Source: etoc.dtx (v1.09b-2019/11/17)
+ Source: etoc.dtx (v1.09c-2020/05/15)
Author: Jean-Francois Burnol
Author: Christine Roemer et al. (German tranlation)
Info: Completely customisable TOCs
License: LPPL 1.3c
- Copyright (C) 2012-2019 Jean-Francois Burnol.
- Copyright (C) 2014-2019 Christine Roemer and collaborators for
+ Copyright (C) 2012-2020 Jean-Francois Burnol.
+ Copyright (C) 2014-2020 Christine Roemer and collaborators for
the translation into German of the documentation.
<jfbu at free dot fr> <Christine_Roemer at t-online dot de>
@@ -174,6 +174,11 @@ etoc.pdf, etoc-DE.pdf, etoc.dvi, etoc-DE.dvi.
RECENT CHANGES
==============
+v1.09c \[2020/05/05\]
+---------------------
+
+Syncs with KOMA-script deprecation of `\iftocfeature`.
+
v1.09a, v1.09b \[2019/11/17\]
-----------------------------
@@ -10719,7 +10724,11 @@ Dokumentation erzeugt von der Quelldatei mit dem Stempel
\begin{multicols}{2}
\begin{jfverbatim}
-v1.09a, v1.09b [2019/11/17]^
+v1.09c [2020/05/05]^
+
+ Syncs with KOMA-script deprecation of \iftocfeature.
+
+~v1.09a, v1.09b [2019/11/17]^
Sync with memoir v3.7i which has a better location of the TOC
hyperref anchor. The \etocaftertitlehook can now freely be
@@ -13383,14 +13392,17 @@ v1.09a, v1.09b [2019/11/17]^
\parskip \cftparskip \@nameuse {cfttocbeforelisthook}}
{\@nameuse {cfttocafterlisthook}\endgroup\restorefromonecol}}
% \end{macrocode}
-% placeholder for comments
+% |1.09c| (|2020/05/15|) does an update as KOMA-script has deprecated
+% |\iftocfeature|. Thanks to Bilel Omrani for report. I did not check
+% if cloning of KOMA code required some further updates.
% \begin{macrocode}
+\ifdefined\Iftocfeature\def\etoc@Iftocfeature{\Iftocfeature}\else\def\etoc@Iftocfeature{\iftocfeature}\fi
\def\etocscrartclstyle{%
\etocsettocstyle
{\let\if@dynlist\if@tocleft
\def\@currext{toc}% added 1.07m 2015/01/23
- \iftocfeature {toc}{onecolumn}
- {\iftocfeature {toc}{leveldown}
+ \etoc@Iftocfeature {toc}{onecolumn}
+ {\etoc@Iftocfeature {toc}{leveldown}
{}
{\if@twocolumn \aftergroup \twocolumn \onecolumn \fi }}
{}%
@@ -13398,14 +13410,14 @@ v1.09a, v1.09b [2019/11/17]^
% |1.07k|: next line to do as within current |scrartcl 2013/12/19 v3.12|
% KOMA-Script article class.
% \begin{macrocode}
- \iftocfeature {toc}{numberline}{\def \nonumberline {\numberline {}}}{}%
+ \etoc@Iftocfeature {toc}{numberline}{\def \nonumberline {\numberline {}}}{}%
\tocbasic@listhead {\listoftocname}%
\begingroup \expandafter \expandafter \expandafter
\endgroup \expandafter
\ifx
\csname microtypesetup\endcsname \relax
\else
- \iftocfeature {toc}{noprotrusion}{}
+ \etoc@Iftocfeature {toc}{noprotrusion}{}
{\microtypesetup {protrusion=false}%
\PackageInfo {tocbasic}%
{character protrusion at toc deactivated}}%
@@ -13772,7 +13784,7 @@ v1.09a, v1.09b [2019/11/17]^
Grave accent \` Left brace \{ Vertical bar \|
Right brace \} Tilde \~}
-\CheckSum{3506}%
+\CheckSum{3516}%
\csname check@checksum\endcsname
\Finale
diff --git a/macros/latex/contrib/etoc/etoc.pdf b/macros/latex/contrib/etoc/etoc.pdf
index 111b8b2b7e..929e58aea3 100644
--- a/macros/latex/contrib/etoc/etoc.pdf
+++ b/macros/latex/contrib/etoc/etoc.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md
index 41cffac254..608fd1b57f 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/contrib/l3kernel/CHANGELOG.md
@@ -7,6 +7,11 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2020-05-15]
+
+### Changed
+- Make `\text_purify:n` `f`-type expandable
+
## [2020-05-14]
### Changed
@@ -683,7 +688,8 @@ this project uses date-based 'snapshot' version identifiers.
- Step func­tions have been added for dim vari­ables,
e.g. `\dim_step_in­line:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-05-14...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-05-15...HEAD
+[2020-05-15]: https://github.com/latex3/latex3/compare/2020-05-14...2020-05-15
[2020-05-14]: https://github.com/latex3/latex3/compare/2020-05-11...2020-05-14
[2020-05-11]: https://github.com/latex3/latex3/compare/2020-05-05...2020-05-11
[2020-05-05]: https://github.com/latex3/latex3/compare/2020-04-06...2020-05-05
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md
index 99f233c0e8..5681142aae 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/contrib/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2020-05-14
+Release 2020-05-15
Overview
--------
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx
index c03cfc436e..1abb69d728 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{2020-05-14}%
+\def\ExplFileDate{2020-05-15}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf
index 454be4b399..9b4fe1854e 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 5914895ef1..b05f2e5d2d 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 5007307c17..9674e7eda2 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 2020-05-14}
+\date{Released 2020-05-15}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/l3alloc.dtx b/macros/latex/contrib/l3kernel/l3alloc.dtx
index 4e3ffdbe20..7d54407af6 100644
--- a/macros/latex/contrib/l3kernel/l3alloc.dtx
+++ b/macros/latex/contrib/l3kernel/l3alloc.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx
index 8069dbafa8..44085b9b53 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
index 88682ead64..6efb99a6cc 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx
index 9279b3a1da..8576615d6e 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/contrib/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3candidates.dtx b/macros/latex/contrib/l3kernel/l3candidates.dtx
index 90d433dcd9..e5995e626c 100644
--- a/macros/latex/contrib/l3kernel/l3candidates.dtx
+++ b/macros/latex/contrib/l3kernel/l3candidates.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx
index b6c9390cee..f05a10aa2b 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/contrib/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx
index 2dd3f49c12..eda6dcbd21 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/contrib/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3color-base.dtx b/macros/latex/contrib/l3kernel/l3color-base.dtx
index 5f0d01d420..d44274517d 100644
--- a/macros/latex/contrib/l3kernel/l3color-base.dtx
+++ b/macros/latex/contrib/l3kernel/l3color-base.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx
index d3be8e5fd0..9c7bb162eb 100644
--- a/macros/latex/contrib/l3kernel/l3debug.dtx
+++ b/macros/latex/contrib/l3kernel/l3debug.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx
index 3143cbcd9f..eaa3b19256 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx
index 1f9bb20394..9c8e7be645 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/contrib/l3kernel/l3doc.dtx
@@ -79,7 +79,7 @@ and all files in that bundle must be distributed together.
%
% \title{The \cls{l3doc} class}
% \author{\Team}
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
% \maketitle
% \tableofcontents
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx
index 8177c56ddc..54e806acd0 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf
index c01f5c6666..e11a3d19b2 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 6357eb7317..839b255623 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/contrib/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx
index 2aba70b29e..6e2af80659 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/contrib/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3final.dtx b/macros/latex/contrib/l3kernel/l3final.dtx
index 79b816bfd8..e51ee44441 100644
--- a/macros/latex/contrib/l3kernel/l3final.dtx
+++ b/macros/latex/contrib/l3kernel/l3final.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx
index 301f78a340..d09d1bb596 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/contrib/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
index 64e67f8fad..00bdfef069 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 2020-05-14}
+% \date{Released 2020-05-15}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
index 85a31450c9..f251d60c4f 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
index b634f3a949..c97cd6c83d 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 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
index 9ede33c378..cd317883bc 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
index 8f2c090d5b..70ad1c58f3 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 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
index 28b2eaca4f..c5377c74dd 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 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
index a76ba25fb4..9371abf9ef 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 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
index bc0a4c1e64..17eac4a16b 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 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx
index 61e8d09b8f..d5e52059b9 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 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx
index 0edd5bf20c..6dfd891fae 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
index 093fdccffe..96083857d1 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 2020-05-14}
+% \date{Released 2020-05-15}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
index 1d4ce7f6a6..b8c7aa1657 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 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx
index 4dd9a6815c..287c60c8ff 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx
index 9295a0d05a..455dcaf33e 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/contrib/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx
index 6b58e379da..73043231ef 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/contrib/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx
index c8ea3e3172..1c5ff9c6e6 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/contrib/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
index 52dd498f57..b042b96d3f 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx
index 621f3776de..2433d16162 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/contrib/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx
index b491255503..344e7997e5 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/contrib/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx
index fd8c5ed6e0..fc654e2b17 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/contrib/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
index 5547c3ddc7..f8b68f8c23 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/contrib/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx
index 3f9a7309c9..a400eaf1aa 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/contrib/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf
index 5d5f7c9e6e..03794ae5be 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 214fd413d7..e4af9d1475 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 3842c435e3..db213ca44b 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 b8be0aefda..14fd4f5f10 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 a63902984d..d9b407c1f6 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 db82fc240e..707d39b18c 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 cfd3bd38e4..f32bb37c19 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 d78833f8b5..03b1ea05bf 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 5757976cef..c82c137d39 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 6be892cf79..7a58dcd35f 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 b79ce66624..57ee772bb9 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 a6e2878426..7a0f2044c4 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 4988c454a7..8970788a4d 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/l3prefixes.csv b/macros/latex/contrib/l3kernel/l3prefixes.csv
index ad48bfaa10..c3fb308f0e 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.csv
+++ b/macros/latex/contrib/l3kernel/l3prefixes.csv
@@ -53,6 +53,7 @@ duckuments,duckuments,Jonathan P. Spratte,https://github.com/Skillmon/ltx_duckum
e,l3kernel,The LaTeX3 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,
else,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-28,2012-09-28,
emoji,emoji,Xiangdong Zeng,https://github.com/stone-zeng/latex-emoji,https://github.com/stone-zeng/latex-emoji.git,https://github.com/stone-zeng/latex-emoji/issues,2020-03-08,2020-03-08,
+emojicite,emojicite,Leon Sixt,https://github.com/berleon/emojicite,https://github.com/berleon/emojicite.git,https://github.com/berleon/emojicite/issues/,2020-04-14,2020-04-20,
empty,l3kernel,The LaTeX3 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,
enotez,enotez,Clemens Niederberger,https://github.com/cgnieder/enotez/,https://github.com/cgnieder/enotez.git,https://github.com/cgnieder/enotez/issues,2013-03-16,2020-04-14,
etex,l3kernel,The LaTeX3 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 3b412e4338..1ec1ee1526 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 34a14829c7..a7ddadeef6 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/contrib/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx
index 33741fecf0..f5076b9ffb 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/contrib/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx
index 9068f7bbec..d0ed90c4e7 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/contrib/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx
index 80e2ffa896..39f97fd1c1 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/contrib/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index 830adba2cb..0f6c9dbfbe 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx
index a4973652c1..fcc18befca 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/contrib/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx
index 89c085f778..4c781cd471 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/contrib/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx
index 88bf391f25..5836bea27b 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx
index d15ee54ed1..efd5d4f6f8 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/contrib/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf
index caccebc3f6..dfeabc06a9 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 0f04182896..358bf451e8 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 2020-05-14}
+\date{Released 2020-05-15}
\begin{document}
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
index 5366e6446b..1760654ff2 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 c11fe2002f..25fcd7a1c1 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 2020-05-14}
+\date{Released 2020-05-15}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx
index fe96f7aec5..15b06c4926 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/contrib/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
index 06e770e291..651110e948 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 3e35a2e3b8..2550fc5ae5 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 2020-05-14}
+\date{Released 2020-05-15}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx
index 51819ed514..ed23d7204a 100644
--- a/macros/latex/contrib/l3kernel/l3text-case.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-case.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/contrib/l3kernel/l3text-purify.dtx
index 54266ba72c..312d7e180d 100644
--- a/macros/latex/contrib/l3kernel/l3text-purify.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-purify.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
@@ -72,40 +72,61 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[rEXP]{\text_purify:n, \@@_purify:n}
-% \begin{macro}[rEXP]{\@@_purify_loop:w}
-% \begin{macro}[rEXP]{\@@_purify_group:n}
-% \begin{macro}[rEXP]{\@@_purify_space:w}
-% \begin{macro}[rEXP]{\@@_purify_N_type:N, \@@_purify_N_type_aux:N}
-% \begin{macro}[rEXP]{\@@_purify_math_search:NNN}
-% \begin{macro}[rEXP]{\@@_purify_math_start:NNw}
-% \begin{macro}[rEXP]{\@@_purify_math_store:n}
-% \begin{macro}[rEXP]{\@@_purify_math_store:nw}
-% \begin{macro}[rEXP]{\@@_purify_math_end:w}
-% \begin{macro}[rEXP]{\@@_purify_math_loop:NNw}
-% \begin{macro}[rEXP]{\@@_purify_math_N_type:NNN}
-% \begin{macro}[rEXP]{\@@_purify_math_group:NNn}
-% \begin{macro}[rEXP]{\@@_purify_math_space:NNw}
-% \begin{macro}[rEXP]{\@@_purify_math_cmd:N}
-% \begin{macro}[rEXP]{\@@_purify_math_cmd:NN}
-% \begin{macro}[rEXP]{\@@_purify_math_cmd:Nn}
-% \begin{macro}[rEXP]{\@@_purify_replace:N}
-% \begin{macro}[rEXP]{\@@_purify_replace:n}
-% \begin{macro}[rEXP]{\@@_purify_expand:N, \@@_purify_protect:N}
+% \begin{macro}[EXP]{\text_purify:n, \@@_purify:n}
+% \begin{macro}[EXP]{\@@_purify_store:n}
+% \begin{macro}[EXP]{\@@_purify_store:nw}
+% \begin{macro}[EXP]{\@@_purify_end:w}
+% \begin{macro}[EXP]{\@@_purify_loop:w}
+% \begin{macro}[EXP]{\@@_purify_group:n}
+% \begin{macro}[EXP]{\@@_purify_space:w}
+% \begin{macro}[EXP]{\@@_purify_N_type:N, \@@_purify_N_type_aux:N}
+% \begin{macro}[EXP]{\@@_purify_math_search:NNN}
+% \begin{macro}[EXP]{\@@_purify_math_start:NNw}
+% \begin{macro}[EXP]{\@@_purify_math_store:n}
+% \begin{macro}[EXP]{\@@_purify_math_store:nw}
+% \begin{macro}[EXP]{\@@_purify_math_end:w}
+% \begin{macro}[EXP]{\@@_purify_math_loop:NNw}
+% \begin{macro}[EXP]{\@@_purify_math_N_type:NNN}
+% \begin{macro}[EXP]{\@@_purify_math_group:NNn}
+% \begin{macro}[EXP]{\@@_purify_math_space:NNw}
+% \begin{macro}[EXP]{\@@_purify_math_cmd:N}
+% \begin{macro}[EXP]{\@@_purify_math_cmd:NN}
+% \begin{macro}[EXP]{\@@_purify_math_cmd:Nn}
+% \begin{macro}[EXP]{\@@_purify_replace:N}
+% \begin{macro}[EXP]{\@@_purify_replace:n}
+% \begin{macro}[EXP]{\@@_purify_expand:N, \@@_purify_protect:N}
% As in the other parts of the module, we start off with a standard
-% \enquote{action} loop, with expansion applied up-front. Here, as there
-% will be no text commands left in the output, there is no concern about
-% using \cs{exp_not:n} and \texttt{e}-type expansion.
+% \enquote{action} loop, with expansion applied up-front.
% \begin{macrocode}
\cs_new:Npn \text_purify:n #1
{
+ \__kernel_exp_not:w \exp_after:wN
+ {
+ \exp:w
+ \exp_args:Ne \@@_purify:n
+ { \text_expand:n {#1} }
+ }
+ }
+\cs_new:Npn \@@_purify:n #1
+ {
\group_align_safe_begin:
- \exp_args:Ne \@@_purify:n
- { \text_expand:n {#1} }
+ \@@_purify_loop:w #1
+ \q_@@_recursion_tail \q_@@_recursion_stop
+ \@@_purify_result:n { }
+ }
+% \end{macrocode}
+% As for expansion, collect up the tokens for future use.
+% \begin{macrocode}
+\cs_new:Npn \@@_purify_store:n #1
+ { \@@_purify_store:nw {#1} }
+\cs_new:Npn \@@_purify_store:nw #1#2 \@@_purify_result:n #3
+ { #2 \@@_purify_result:n { #3 #1 } }
+\cs_new:Npn \@@_purify_end:w #1 \@@_purify_result:n #2
+ {
\group_align_safe_end:
+ \exp_end:
+ #2
}
-\cs_new:Npn \@@_purify:n #1
- { \@@_purify_loop:w #1 \q_@@_recursion_tail \q_@@_recursion_stop }
% \end{macrocode}
% The main loop is a standard \enquote{tl action}. Unlike the expansion
% or case changing, here any groups have to be run inline. Most of the
@@ -125,7 +146,7 @@
\cs_new:Npn \@@_purify_group:n #1 { \@@_purify_loop:w #1 }
\exp_last_unbraced:NNo \cs_new:Npn \@@_purify_space:w \c_space_tl
{
- \c_space_tl
+ \@@_purify_store:n { ~ }
\@@_purify_loop:w
}
% \end{macrocode}
@@ -135,7 +156,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_purify_N_type:N #1
{
- \@@_if_recursion_tail_stop:N #1
+ \@@_if_recursion_tail_stop_do:Nn #1 { \@@_purify_end:w }
\@@_purify_N_type_aux:N #1
}
\cs_new:Npn \@@_purify_N_type_aux:N #1
@@ -167,11 +188,14 @@
{ #2 \@@_purify_math_result:n { #3 #1 } }
\cs_new:Npn \@@_purify_math_end:w #1 \@@_purify_math_result:n #2
{
- \exp_not:n { $ #2 $ }
+ \@@_purify_store:n { $ #2 $ }
\@@_purify_loop:w #1
}
\cs_new:Npn \@@_purify_math_stop:Nw #1 \@@_purify_math_result:n #2
- { \exp_not:n {#1#2} }
+ {
+ \@@_purify_store:n {#1#2}
+ \@@_purify_end:w
+ }
\cs_new:Npn \@@_purify_math_loop:NNw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
@@ -253,7 +277,8 @@
\token_if_cs:NTF #1
{ \@@_purify_expand:N #1 }
{
- \@@_token_to_explicit:N #1
+ \exp_args:Ne \@@_purify_store:n
+ { \@@_token_to_explicit:N #1 }
\@@_purify_loop:w
}
}
@@ -271,7 +296,7 @@
}
\cs_new:Npn \@@_purify_protect:N #1
{
- \@@_if_recursion_tail_stop:N #1
+ \@@_if_recursion_tail_stop_do:Nn #1 { \@@_purify_end:w }
\@@_purify_loop:w
}
% \end{macrocode}
@@ -295,6 +320,9 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {
diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx
index 0f8f24cafd..35f1cbb981 100644
--- a/macros/latex/contrib/l3kernel/l3text.dtx
+++ b/macros/latex/contrib/l3kernel/l3text.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
@@ -197,7 +197,7 @@
%
% \subsection{Removing formatting from text}
%
-% \begin{function}[rEXP, added = 2020-03-05]{\text_purify:n}
+% \begin{function}[EXP, added = 2020-03-05, updated = 2020-05-14]{\text_purify:n}
% \begin{syntax}
% \cs{text_purify:n} \Arg{text}
% \end{syntax}
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
index 2a6b31f537..297bceb682 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx
index b3d6c3ddac..3aa0688705 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx
index 0ed1350b03..fbdbd04bd9 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/contrib/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx
index 6f2d533f58..03cdf2f0f1 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/contrib/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf
index af4dac1c7d..401a597eec 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 4209a7e724..7e945e45c8 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 2020-05-14}
+\date{Released 2020-05-15}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3packages/CHANGELOG.md b/macros/latex/contrib/l3packages/CHANGELOG.md
index ee88f4780f..d68f55467b 100644
--- a/macros/latex/contrib/l3packages/CHANGELOG.md
+++ b/macros/latex/contrib/l3packages/CHANGELOG.md
@@ -7,6 +7,8 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2020-05-15]
+
## [2020-05-14]
### Changed
@@ -97,7 +99,8 @@ this project uses date-based 'snapshot' version identifiers.
- Switch to ISO date format
- Improve cross-module use of internal functions
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-05-14...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-05-15...HEAD
+[2020-05-15]: https://github.com/latex3/latex3/compare/2020-05-14...2020-05-15
[2020-05-14]: https://github.com/latex3/latex3/compare/2020-03-06...2020-05-14
[2020-03-06]: https://github.com/latex3/latex3/compare/2020-03-03...2020-03-06
[2020-03-03]: https://github.com/latex3/latex3/compare/2020-02-25...2020-03-03
diff --git a/macros/latex/contrib/l3packages/README.md b/macros/latex/contrib/l3packages/README.md
index 8f505b0141..3861dad168 100644
--- a/macros/latex/contrib/l3packages/README.md
+++ b/macros/latex/contrib/l3packages/README.md
@@ -1,7 +1,7 @@
LaTeX3 High-Level Concepts
==========================
-Release 2020-05-14
+Release 2020-05-15
Overview
--------
diff --git a/macros/latex/contrib/l3packages/l3keys2e.dtx b/macros/latex/contrib/l3packages/l3keys2e.dtx
index 6a09bb18bd..16aefcf57c 100644
--- a/macros/latex/contrib/l3packages/l3keys2e.dtx
+++ b/macros/latex/contrib/l3packages/l3keys2e.dtx
@@ -62,7 +62,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
@@ -139,7 +139,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2020-05-14}{}
+\ProvidesExplPackage{l3keys2e}{2020-05-15}{}
{LaTeX2e option processing using LaTeX3 keys}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/l3keys2e.pdf b/macros/latex/contrib/l3packages/l3keys2e.pdf
index 0611a9b979..6d04dfcbc5 100644
--- a/macros/latex/contrib/l3packages/l3keys2e.pdf
+++ b/macros/latex/contrib/l3packages/l3keys2e.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xfp.dtx b/macros/latex/contrib/l3packages/xfp.dtx
index e0ebede0f9..05ab4415dd 100644
--- a/macros/latex/contrib/l3packages/xfp.dtx
+++ b/macros/latex/contrib/l3packages/xfp.dtx
@@ -64,7 +64,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
@@ -167,7 +167,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xfp}{2020-05-14}{}
+\ProvidesExplPackage{xfp}{2020-05-15}{}
{L3 Floating point unit}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/xfp.pdf b/macros/latex/contrib/l3packages/xfp.pdf
index 96c91d897d..dea76ec62c 100644
--- a/macros/latex/contrib/l3packages/xfp.pdf
+++ b/macros/latex/contrib/l3packages/xfp.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xfrac.dtx b/macros/latex/contrib/l3packages/xfrac.dtx
index 275aa6859a..5ff7e2b98f 100644
--- a/macros/latex/contrib/l3packages/xfrac.dtx
+++ b/macros/latex/contrib/l3packages/xfrac.dtx
@@ -65,7 +65,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
@@ -535,7 +535,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2020-05-14}{}
+\ProvidesExplPackage{xfrac}{2020-05-15}{}
{L3 Experimental split-level fractions}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/xfrac.pdf b/macros/latex/contrib/l3packages/xfrac.pdf
index 9454c240a2..17dbaeaee1 100644
--- a/macros/latex/contrib/l3packages/xfrac.pdf
+++ b/macros/latex/contrib/l3packages/xfrac.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xparse.dtx b/macros/latex/contrib/l3packages/xparse.dtx
index c700434903..fe2df64f5f 100644
--- a/macros/latex/contrib/l3packages/xparse.dtx
+++ b/macros/latex/contrib/l3packages/xparse.dtx
@@ -67,7 +67,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
@@ -975,25 +975,16 @@
%
% \begin{macrocode}
%<*2ekernel>
-% \end{macrocode}
-%
-% \begin{macrocode}
\everyjob\expandafter{\the\everyjob
\message{xparse <2020-03-03>}%
}
\ExplSyntaxOn
-% \end{macrocode}
-%
-% \begin{macrocode}
%</2ekernel>
% \end{macrocode}
%
% \begin{macrocode}
%<*package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ProvidesExplPackage{xparse}{2020-05-14}{}
+\ProvidesExplPackage{xparse}{2020-05-15}{}
{L3 Experimental document command parser}
% \end{macrocode}
%
@@ -1015,12 +1006,22 @@
\keys_set:nV { xparse } \l_@@_options_clist
\bool_if:NF \l_@@_log_bool
{ \msg_redirect_module:nnn { LaTeX / xparse } { info } { none } }
+%</package>
% \end{macrocode}
% \end{variable}
% \end{variable}
%
+% \subsection{Catcode regime check}
+%
% \begin{macrocode}
-%</package>
+%<*core>
+\if_charcode:w xx
+ \cs_gset:Npn \@@_file_end_hook: { }
+\else
+ \ExplSyntaxOn
+ \cs_gset:Npn \@@_file_end_hook: { \ExplSyntaxOff }
+\fi:
+%</core>
% \end{macrocode}
%
% \subsection{Reload check}
@@ -1043,7 +1044,7 @@
% \subsection{Variables and constants}
%
% \begin{macrocode}
-%<*!package>
+%<*core|initex>
% \end{macrocode}
%
% \begin{variable}{\c_@@_special_chars_seq}
@@ -1058,17 +1059,6 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macrocode}
-%<*core>
-\if_charcode:w xx
- \cs_new:Npn \@@_file_end_hook: { }
-\else
- \ExplSyntaxOn
- \cs_new:Npn \@@_file_end_hook: { \ExplSyntaxOff }
-\fi:
-%</core>
-% \end{macrocode}
-%
% \begin{variable}{\l_@@_arg_spec_tl}
% Holds the argument specification after normalization of shorthands.
% \begin{macrocode}
@@ -1923,7 +1913,7 @@
\@@_bad_def:wn
}
}
-%</!package>
+%</core|initex>
%<*package>
\cs_gset_protected:Npn \@@_normalize_arg_spec_loop:n #1
{
@@ -1937,7 +1927,7 @@
}
}
%</package>
-%<*!package>
+%<*core|initex>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1984,12 +1974,12 @@
{ \@@_normalize_type_t:w * }
}
\exp_args:No \@@_tmp:w { \c_novalue_tl }
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npx \@@_normalize_type_g:w
{ \exp_not:N \@@_normalize_type_G:w { \exp_not:V \c_novalue_tl } }
%</package>
-%<*!package>
+%<*core|initex>
% \end{macrocode}
% \end{macro}
%
@@ -2103,7 +2093,7 @@
\@@_normalize_E_unique_check:w #2 \q_stop
}
}
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npn \@@_normalize_type_G:w #1
{
@@ -2114,7 +2104,7 @@
\@@_normalize_arg_spec_loop:n
}
%</package>
-%<*!package>
+%<*core|initex>
\cs_new_protected:Npn \@@_normalize_type_t:w #1
{
\quark_if_recursion_tail_stop_do:Nn #1 { \@@_bad_arg_spec:wn }
@@ -2151,7 +2141,7 @@
% \cs{l_@@_arg_spec_tl}, count the mandatory argument, and empty the
% list of last delimiters.
% \begin{macrocode}
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npn \@@_normalize_type_l:w
{
@@ -2160,7 +2150,7 @@
\@@_normalize_arg_spec_loop:n
}
%</package>
-%<*!package>
+%<*core|initex>
\cs_new_protected:Npn \@@_normalize_type_m:w
{
\@@_delimiter_check:nnn { } { m } { \iow_char:N \{ }
@@ -2177,7 +2167,7 @@
\@@_add_arg_spec_mandatory:n { R #1 #2 {#3} }
\@@_normalize_arg_spec_loop:n
}
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npn \@@_normalize_type_u:w #1
{
@@ -2187,7 +2177,7 @@
\@@_normalize_arg_spec_loop:n
}
%</package>
-%<*!package>
+%<*core|initex>
\cs_new_protected:Npn \@@_normalize_type_v:w
{
\@@_normalize_check_gv:N v
@@ -2546,7 +2536,7 @@
% For the \texttt{G} type, the grabber and the default are added to the
% signature.
% \begin{macrocode}
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npn \@@_add_type_G:w #1
{
@@ -2570,7 +2560,7 @@
\@@_prepare_signature:N
}
%</package>
-%<*!package>
+%<*core|initex>
% \end{macrocode}
% \end{macro}
%
@@ -2626,7 +2616,7 @@
% At the set up stage, the \texttt{u} type argument is identical to the
% \texttt{G} type except for the name of the grabber function.
% \begin{macrocode}
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npn \@@_add_type_u:w #1
{
@@ -2637,7 +2627,7 @@
\@@_prepare_signature:N
}
%</package>
-%<*!package>
+%<*core|initex>
% \end{macrocode}
% \end{macro}
%
@@ -2856,12 +2846,12 @@
% parameter text ends with |#| in fact end up being delimited by an
% open brace.
% \begin{macrocode}
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npn \@@_add_expandable_type_l:w
{ \@@_add_expandable_type_u:w ## }
%</package>
-%<*!package>
+%<*core|initex>
% \end{macrocode}
% \end{macro}
%
@@ -2910,7 +2900,7 @@
% Define an auxiliary that will be used directly in the signature. It
% grabs one argument delimited by |#1| and places it before \cs{q_@@}.
% \begin{macrocode}
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npn \@@_add_expandable_type_u:w #1
{
@@ -2925,7 +2915,7 @@
\@@_prepare_signature:N
}
%</package>
-%<*!package>
+%<*core|initex>
% \end{macrocode}
% \end{macro}
%
@@ -3329,7 +3319,7 @@
% Optional groups are checked by meaning, so that the same code will
% work with, for example, \ConTeXt{}-like input.
% \begin{macrocode}
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npn \@@_grab_G:w #1 \@@_run_code:
{
@@ -3361,7 +3351,7 @@
{ \@@_add_arg:o \c_novalue_tl }
}
%</package>
-%<*!package>
+%<*core|initex>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3374,7 +3364,7 @@
% \begin{macro}{\@@_grab_l_aux:nN}
% Argument grabbers for mandatory \TeX{} arguments are pretty simple.
% \begin{macrocode}
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npn \@@_grab_l:w #1 \@@_run_code:
{ \@@_grab_l_aux:nN {#1} \cs_set_protected_nopar:Npn }
@@ -3388,7 +3378,7 @@
\l_@@_fn_tl
}
%</package>
-%<*!package>
+%<*core|initex>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3560,7 +3550,7 @@
% Grabbing up to a list of tokens is quite easy: define the grabber,
% and then collect.
% \begin{macrocode}
-%</!package>
+%</core|initex>
%<*package>
\cs_new_protected:Npn \@@_grab_u:w #1#2 \@@_run_code:
{ \@@_grab_u_aux:nnN {#1} {#2} \cs_set_protected_nopar:Npn }
@@ -3574,7 +3564,7 @@
\l_@@_fn_tl
}
%</package>
-%<*!package>
+%<*core|initex>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -5210,16 +5200,16 @@
% \end{macro}
%
% \begin{macrocode}
-%<*2ekernel>
-\ExplSyntaxOff
-%</2ekernel>
-% \end{macrocode}
-%
-% \begin{macrocode}
%<*core>
\@@_file_end_hook:
%</core>
-%</!package>
+%</core|initex>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*2ekernel>
+\ExplSyntaxOff
+%</2ekernel>
% \end{macrocode}
%
% \end{implementation}
diff --git a/macros/latex/contrib/l3packages/xparse.pdf b/macros/latex/contrib/l3packages/xparse.pdf
index 7813fa3526..caae1c8ac6 100644
--- a/macros/latex/contrib/l3packages/xparse.pdf
+++ b/macros/latex/contrib/l3packages/xparse.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3packages/xtemplate.dtx b/macros/latex/contrib/l3packages/xtemplate.dtx
index 897d1d3f84..194b9dbba7 100644
--- a/macros/latex/contrib/l3packages/xtemplate.dtx
+++ b/macros/latex/contrib/l3packages/xtemplate.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2020-05-14}
+% \date{Released 2020-05-15}
%
% \maketitle
%
@@ -682,7 +682,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2020-05-14}{}
+\ProvidesExplPackage{xtemplate}{2020-05-15}{}
{L3 Experimental prototype document functions}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3packages/xtemplate.pdf b/macros/latex/contrib/l3packages/xtemplate.pdf
index e69b3a4142..f5241e3fff 100644
--- a/macros/latex/contrib/l3packages/xtemplate.pdf
+++ b/macros/latex/contrib/l3packages/xtemplate.pdf
Binary files differ
diff --git a/macros/luatex/generic/lua-uni-algos/README.md b/macros/luatex/generic/lua-uni-algos/README.md
new file mode 100644
index 0000000000..c964c8e883
--- /dev/null
+++ b/macros/luatex/generic/lua-uni-algos/README.md
@@ -0,0 +1,30 @@
+# The lua-uni-algos Package
+
+Version: v0.1
+
+Date: 2020-05-14
+
+Author: Marcel Krüger
+
+License: LPPL v1.3c
+
+A collection of small Lua modules implementing some if the most generic Unicode algorithms for use with LuaTeX.
+This package tries to reduce duplicated work by collecting a set of small utilities which can be used be useful for many LuaTeX packages dealing with Unicode strings.
+There is no user-level functionality provided.
+
+Additional Unicode algorithms will be added in the future, if you need a specific algorithm feel free to open an issue on GitHub or send me an e-mail.
+
+
+## Requirements
+
+Given that this package provides Lua modules, it is only useful in Lua(HB)TeX.
+Additionally, it expects an up-to-date version of the `unicode-data` package to be present.
+
+
+## Support
+If you found a bug, please open an [issue on GitHub](https://github.com/zauguin/lua-uni-algos/issues) or contact me by mail at <tex@2krueger.de>.
+
+## Installation
+
+In most cases it is best to use an official release provided by your TeX distribution.
+If you want to install an experimental build directly from the repository, use `l3build install`.
diff --git a/macros/luatex/generic/lua-uni-algos/lua-uni-algos.lua b/macros/luatex/generic/lua-uni-algos/lua-uni-algos.lua
new file mode 100644
index 0000000000..34581f1a74
--- /dev/null
+++ b/macros/luatex/generic/lua-uni-algos/lua-uni-algos.lua
@@ -0,0 +1,20 @@
+-- lua-uni-algos.lua
+-- Copyright 2020 Marcel Krüger
+--
+-- 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 later version.
+-- The latest version of this license is in
+-- http://www.latex-project.org/lppl.txt
+-- and version 1.3 or later is part of all distributions of LaTeX
+-- version 2005/12/01 or later.
+--
+-- This work has the LPPL maintenance status `maintained'.
+--
+-- The Current Maintainer of this work is Marcel Krüger
+
+return {
+ case = require'lua-uni-case',
+ graphemes = require'lua-uni-graphemes',
+ normalize = require'lua-uni-normalize',
+}
diff --git a/macros/luatex/generic/lua-uni-algos/lua-uni-algos.pdf b/macros/luatex/generic/lua-uni-algos/lua-uni-algos.pdf
new file mode 100644
index 0000000000..d1100c84c5
--- /dev/null
+++ b/macros/luatex/generic/lua-uni-algos/lua-uni-algos.pdf
Binary files differ
diff --git a/macros/luatex/generic/lua-uni-algos/lua-uni-algos.tex b/macros/luatex/generic/lua-uni-algos/lua-uni-algos.tex
new file mode 100644
index 0000000000..8f7627c04c
--- /dev/null
+++ b/macros/luatex/generic/lua-uni-algos/lua-uni-algos.tex
@@ -0,0 +1,171 @@
+\documentclass{article}
+\usepackage{doc, shortvrb, metalogo, hyperref, fontspec}
+% \setmainfont{Noto Serif}
+% \setmonofont{FreeMono}
+\title{Unicode algorithms for Lua\TeX}
+\author{Marcel Krüger\thanks{E-Mail: \href{mailto:tex@2krueger.de}{\nolinkurl{tex@2krueger.de}}}}
+\MakeShortVerb\|
+\newcommand\pkg{\texttt}
+\begin{document}
+\maketitle
+Dealing with general Unicode encoded data comes with many challenges because it has to respect individual concerns of many different scripts and languages. The Unicode consortium maintains multiple useful algorithms which can sometimes make this task much easier.
+
+\pkg{lua-uni-algos} tries to make the most fundamental algorithms available for authors of Lua-based packages to aid in handling Unicode data.
+
+Currently this package implements:
+\begin{description}
+ \item[Unicode normalization] Normalize a given Lua string into any of the normalization forms NFC, NFD, NFKC, or NFKD as specified in the Unicode standard, section 2.12.
+ \item[Case folding] Fold Unicode codepoints into a form which eliminates all case distinctions. This can be used for case-independent matching of strings. Not to be confused with case mapping which maps all characters to lower/upper/titlecase: In contrast to case mapping, case folding is mostly locale independent but does not give results which should be shown to users.
+ \item[Grapheme cluster segmentation] Identify a grapheme cluster, a unit of text which is perceived as a single character by typical users, according to the rules in UAX \#29, section 3.
+\end{description}
+\section{Normalization}
+Unicode normalization is handled by the Lua module |lua-uni-normalize|.
+You can either load it directly with
+\begin{verbatim}
+local normalize = require'lua-uni-normalize'
+\end{verbatim}
+or if you need access to all implemented algorithms you can use
+\begin{verbatim}
+local uni_algos = require'lua-uni-algos'
+local normalize = uni_algos.normalize
+\end{verbatim}
+
+Then, four functions are available: |normalize.NFC|, |normalize.NFD|, |normalize.NFKC|, and |normalize.NFKD|.
+If you do not know which of these you need, then you should probably |normalize.NFC|. All functions are used in the same way:
+\begin{verbatim}
+local str = "Äpfel…"
+print("Original:", str)
+print("NFC:", normalize.NFC(str))
+print("NFD:", normalize.NFD(str))
+print("NFKC:", normalize.NFKC(str))
+print("NFKD:", normalize.NFKD(str))
+\end{verbatim}
+This results in
+\begin{verbatim}
+Original: Äpfel…
+NFC: Äpfel…
+NFD: Äpfel…
+NFKC: Äpfel...
+NFKD: Äpfel...
+\end{verbatim}
+(This example is shown in Latin Modern Mono which has the (for this purpose) very useful property of not handling combining character very well.
+In a well-behaving font, the `...C` and `...D` lines should look the same.)
+
+\section{Case folding}
+For case folding load the Lua module |lua-uni-case|.
+You can either load it directly with
+\begin{verbatim}
+local uni_case = require'lua-uni-case'
+\end{verbatim}
+or if you need access to all implemented algorithms you can use
+\begin{verbatim}
+local uni_algos = require'lua-uni-algos'
+local uni_case = uni_algos.case
+\end{verbatim}
+
+The main function is |uni_case.casefold(str, full, special)|. It accepts three parameters: A Lua string |str| to be case folded, a boolean |full| to specify if the number of codepoints is allowed to change in the progress (This should normally be set to |true|.) and a boolean |special| which enables special handling for Turkish languages (In most cases, this should be set to |false|.)
+The function returns the case-folded string:
+\begin{verbatim}
+local str = "Straße…"
+print("Original:", str)
+print("Case folded (full=false):", uni_case.casefold(str, false, false))
+print("Case folded (full=true):", uni_case.casefold(str, true, false))
+\end{verbatim}
+This results in
+
+\noindent\begingroup
+ \ttfamily
+ \directlua{
+ local uni_case = require'lua-uni-case'
+ local str = "Straße…"
+ tex.sprint("Original:", str, '\\\\')
+ tex.sprint("Case folded (full=false):", uni_case.casefold(str, false, false), '\\\\')
+ tex.sprint("Case folded (full=true):", uni_case.casefold(str, true, false), '\\\\')
+ }\par
+\endgroup
+
+In most cases, you will want to normalize the string after casefolding.
+
+For cases where you want to casefold something which is not given as a Lua string, you can use the function |uni_case.casefold_lookup(cp, full, special)|. Instead of a string, it accepts a codepoint as first parameter and returns a table of codepoints. A string can be casefolded by replacing every codepoints with the sequence of codepoints returned by |uni_case.casefold_lookup|. If |casefold_lookup| returns |false| or |nil|, the codepoint should not be changed.
+
+\section{Grapheme clusters}
+Grapheme cluster handling is handled by the Lua module |lua-uni-graphemes|.
+You can either load it directly with
+\begin{verbatim}
+local graphemes = require'lua-uni-graphemes'
+\end{verbatim}
+or if you need access to all implemented algorithms you can use
+\begin{verbatim}
+local uni_algos = require'lua-uni-algos'
+local graphemes = uni_algos.graphemes
+\end{verbatim}
+
+Sometimes we want to look at a single character of a string, but identifying what a character is is not that easy in Unicode. A simple example is the character from the previous section: ``Ä''
+The NFD form is certainly a single character, but is encoded using two codepoints: U+0041 (LATIN CAPITAL LETTER A) and U+0308 (COMBINING DIAERESIS). Or the Tamil letter Ni which is encoded as U+0BA8 (TAMIL LETTER NA) followed by U+0BBF (TAMIL VOWEL SIGN I). But sometimes it can be useful to identify characters, e.g.\ for letterspacing or letterines.
+
+There are two main interfaces for this: One iterator for iterating over grapheme clusters and one direct interface to the underlying state machine:
+
+\begin{verbatim}
+for final, first, grapheme in graphemes.graphemes'Äpfel' do
+ print(grapheme)
+end
+\end{verbatim}
+% \begin{verbatim}
+% for final, first, grapheme in graphemes.graphemes'Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞' do
+% print(grapheme)
+% end
+% \end{verbatim}
+
+\noindent\begingroup
+ \ttfamily
+ \directlua{
+ local graphemes = require'./lua-uni-graphemes'
+ for final, first, grapheme in graphemes.graphemes'Äpfel' do
+ tex.sprint(grapheme, '\string\\\string\\')
+ end
+ }\par
+\endgroup
+
+The more powerful state machine interface |graphemes.read_codepoint| takes two parameters: A new codepoint and a state.
+At the beginning, the state can be omitted.
+For every codepoint in your input, call the function with the new codepoint and the last state. Then there are two return values: The first one is a boolean telling you if the current codepoint is the beginning of a new cluster, the second is a new state you have to pass with the next codepoint.
+
+So e.g.\ to find cluster boundaries in the Unicode codepoint sequence U+0041 U+0308 U+0BA8 U+0BBF you could use
+
+\begin{verbatim}
+local graphemes = require'lua-uni-graphemes'
+local new_cluster, state
+new_cluster, state = graphemes.read_codepoint(0x0041, state)
+print(new_cluster)
+new_cluster, state = graphemes.read_codepoint(0x0308, state)
+print(new_cluster)
+new_cluster, state = graphemes.read_codepoint(0x0BA8, state)
+print(new_cluster)
+new_cluster, state = graphemes.read_codepoint(0x0BBF, state)
+print(new_cluster)
+\end{verbatim}
+
+\noindent resulting in
+
+\noindent\begingroup
+ \ttfamily
+ \directlua{
+ local graphemes = require'lua-uni-graphemes'
+ local new_cluster, state
+ new_cluster, state = graphemes.read_codepoint(0x0041, state)
+ tex.sprint(tostring(new_cluster), '\string\\\string\\')
+ new_cluster, state = graphemes.read_codepoint(0x0308, state)
+ tex.sprint(tostring(new_cluster), '\string\\\string\\')
+ new_cluster, state = graphemes.read_codepoint(0x0BA8, state)
+ tex.sprint(tostring(new_cluster), '\string\\\string\\')
+ new_cluster, state = graphemes.read_codepoint(0x0BBF, state)
+ tex.sprint(tostring(new_cluster), '\string\\\string\\')
+ }\par
+\endgroup
+
+\vskip-\baselineskip
+\noindent meaning the first and third codepoint start a new cluster.
+
+Do not try to interpret the |state|, it has no defined values and might change at any point.
+
+\end{document}
diff --git a/macros/luatex/generic/lua-uni-algos/lua-uni-case.lua b/macros/luatex/generic/lua-uni-algos/lua-uni-case.lua
new file mode 100644
index 0000000000..9014258696
--- /dev/null
+++ b/macros/luatex/generic/lua-uni-algos/lua-uni-case.lua
@@ -0,0 +1,67 @@
+-- lua-uni-graphemes.lua
+-- Copyright 2020 Marcel Krüger
+--
+-- 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 later version.
+-- The latest version of this license is in
+-- http://www.latex-project.org/lppl.txt
+-- and version 1.3 or later is part of all distributions of LaTeX
+-- version 2005/12/01 or later.
+--
+-- This work has the LPPL maintenance status `maintained'.
+--
+-- The Current Maintainer of this work is Marcel Krüger
+
+local unpack = table.unpack
+local move = table.move
+local codes = utf8.codes
+local utf8char = utf8.char
+
+local empty = {}
+local result = {}
+
+local casefold, casefold_lookup do
+ local p = require'lua-uni-parse'
+ local l = lpeg or require'lpeg'
+
+ local data = p.parse_file('CaseFolding', l.Cf(
+ l.Ct(l.Cg(l.Ct'', 'C') * l.Cg(l.Ct'', 'F') * l.Cg(l.Ct'', 'S') * l.Cg(l.Ct'', 'T'))
+ * (l.Cg(p.fields(p.codepoint, l.C(1), l.Ct(p.codepoint * (' ' * p.codepoint)^0), true)) + p.eol)^0
+ * -1
+ , function(t, base, class, mapping)
+ t[class][base] = mapping
+ return t
+ end))
+ local C, F, S, T = data.C, data.F, data.S, data.T
+ data = nil
+
+ function casefold_lookup(c, full, special)
+ return (special and T[c]) or C[c] or (full and F or S)[c]
+ end
+ function casefold(s, full, special)
+ local first = special and T or empty
+ local second = C
+ local third = full and F or S
+ local result = result
+ for i = #result, 1, -1 do result[i] = nil end
+ local i = 1
+ for _, c in codes(s) do
+ local datum = first[c] or second[c] or third[c]
+ if datum then
+ local l = #datum
+ move(datum, 1, l, i, result)
+ i = i + l
+ else
+ result[i] = c
+ i = i + 1
+ end
+ end
+ return utf8char(unpack(result))
+ end
+end
+
+return {
+ casefold = casefold,
+ casefold_lookup = casefold_lookup,
+}
diff --git a/macros/luatex/generic/lua-uni-algos/lua-uni-graphemes.lua b/macros/luatex/generic/lua-uni-algos/lua-uni-graphemes.lua
new file mode 100644
index 0000000000..5c7efc28c1
--- /dev/null
+++ b/macros/luatex/generic/lua-uni-algos/lua-uni-graphemes.lua
@@ -0,0 +1,168 @@
+-- lua-uni-graphemes.lua
+-- Copyright 2020 Marcel Krüger
+--
+-- 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 later version.
+-- The latest version of this license is in
+-- http://www.latex-project.org/lppl.txt
+-- and version 1.3 or later is part of all distributions of LaTeX
+-- version 2005/12/01 or later.
+--
+-- This work has the LPPL maintenance status `maintained'.
+--
+-- The Current Maintainer of this work is Marcel Krüger
+
+local property do
+ local p = require'lua-uni-parse'
+ local l = lpeg or require'lpeg'
+
+ property = p.parse_file('emoji-data',
+ l.Cg(p.fields(p.codepoint_range, l.C'Extended_Pictographic')) + p.ignore_line,
+ p.multiset)
+
+ property = p.parse_file('GraphemeBreakProperty', l.Cf(
+ l.Carg(1)
+ * (l.Cg(p.fields(p.codepoint_range, l.C(l.R('az', 'AZ', '__')^1))) + p.ignore_line)^0
+ * -1, p.multiset),
+ nil,
+ property)
+ if not property then
+ error[[Break Property matching failed]]
+ end
+end
+
+local controls = { CR = true, LF = true, Control = true, }
+local precore_lookup = {
+ Prepend = "PRECORE",
+ L = "L",
+ V = "V",
+ LV = "V",
+ LVT = "T",
+ T = "T",
+ Regional_Indicator = "RI",
+ Extended_Pictographic = "POST_PICTO",
+}
+local l_lookup = {
+ L = "L",
+ V = "V",
+ LV = "V",
+ LVT = "T",
+}
+local postcore_map = { Extend = true, ZWJ = true, SpacingMark = true, }
+local state_map state_map = {
+ START = function(prop)
+ if prop == 'CR' then
+ return 'CR', true
+ end
+ if prop == 'LF' or prop == 'Control' then
+ return 'START', true
+ end
+ return state_map.PRECORE(prop), true
+ end,
+ PRECORE = function(prop)
+ if controls[prop] then
+ return state_map.START(prop)
+ end
+ return precore_lookup[prop] or 'POSTCORE'
+ end,
+ POSTCORE = function(prop)
+ if postcore_map[prop] then
+ return 'POSTCORE'
+ end
+ return state_map.START(prop)
+ end,
+ RI = function(prop)
+ if prop == 'Regional_Indicator' then
+ return 'POSTCORE'
+ end
+ return state_map.POSTCORE(prop)
+ end,
+ PRE_PICTO = function(prop)
+ if prop == "Extended_Pictographic" then
+ return "POST_PICTO"
+ end
+ return state_map.POSTCORE(prop)
+ end,
+ POST_PICTO = function(prop)
+ if prop == "Extend" then
+ return "POST_PICTO"
+ end
+ if prop == "ZWJ" then
+ return "PRE_PICTO"
+ end
+ return state_map.POSTCORE(prop)
+ end,
+ L = function(prop)
+ local nextstate = l_lookup[prop]
+ if nextstate then
+ return nextstate
+ end
+ return state_map.POSTCORE(prop)
+ end,
+ V = function(prop)
+ if prop == 'V' then
+ return 'V'
+ end
+ return state_map.T(prop)
+ end,
+ T = function(prop)
+ if prop == 'T' then
+ return 'T'
+ end
+ return state_map.POSTCORE(prop)
+ end,
+ CR = function(prop)
+ if prop == 'LF' then
+ return 'START'
+ else
+ return state_map.START(prop)
+ end
+ end,
+}
+
+-- The value of "state" is considered internal and should not be relied upon.
+-- Just pass it to the function as is or pass nil. `nil` should only be passed when the passed codepoint starts a new cluster
+function read_codepoint(cp, state)
+ local new_cluster
+ state, new_cluster = state_map[state or 'START'](property[cp])
+ return new_cluster, state
+end
+
+-- A Lua iterator for strings -- Only reporting the beginning of every grapheme cluster
+local function graphemes_start(str)
+ local nextcode, str, i = utf8.codes(str)
+ local state = "START"
+ return function()
+ local new_cluster, code
+ repeat
+ i, code = nextcode(str, i)
+ if not i then return end
+ new_cluster, state = read_codepoint(code, state)
+ until new_cluster
+ return i, code
+ end
+end
+-- A more useful iterator: returns the byterange of the graphemecluster in reverse order followed by a string with te cluster
+local function graphemes(str)
+ local iter = graphemes_start(str)
+ return function(_, cur)
+ if cur == #str then return end
+ local new = iter()
+ if not new then return #str, cur + 1, str:sub(cur + 1) end
+ return new - 1, cur + 1, str:sub(cur + 1, new - 1)
+ end, nil, iter() - 1
+end
+return {
+ read_codepoint = read_codepoint,
+ graphemes_start = graphemes_start,
+ graphemes = graphemes,
+}
+--[[
+for i, c in graphemes_start'äbcdef' do
+ print(i, utf8.char(c))
+end
+for i, j, s in graphemes'Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞' do
+ print(j, i, s)
+end
+]]
diff --git a/macros/luatex/generic/lua-uni-algos/lua-uni-normalize.lua b/macros/luatex/generic/lua-uni-algos/lua-uni-normalize.lua
new file mode 100644
index 0000000000..dc1356568c
--- /dev/null
+++ b/macros/luatex/generic/lua-uni-algos/lua-uni-normalize.lua
@@ -0,0 +1,269 @@
+-- lua-uni-normalize.lua
+-- Copyright 2020 Marcel Krüger
+--
+-- 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 later version.
+-- The latest version of this license is in
+-- http://www.latex-project.org/lppl.txt
+-- and version 1.3 or later is part of all distributions of LaTeX
+-- version 2005/12/01 or later.
+--
+-- This work has the LPPL maintenance status `maintained'.
+--
+-- The Current Maintainer of this work is Marcel Krüger
+
+-- Provide all four kinds of Unicode normalization
+
+local newtable = lua.newtable
+local move = table.move
+local char = utf8.char
+local codes = utf8.codes
+local unpack = table.unpack
+
+kpse.set_program_name'kpsewhich'
+local ccc, composition_mapping, decomposition_mapping, compatibility_mapping do
+ local function doubleset(ts, key, v1, kind, v2)
+ ts[1][key] = v1
+ ts[3][key] = v2
+ if not kind then
+ ts[2][key] = v2
+ end
+ return ts
+ end
+ local p = require'lua-uni-parse'
+ local l = lpeg
+ local Cnil = l.Cc(nil)
+ local letter = lpeg.R('AZ', 'az')
+ ccc, decomposition_mapping, compatibility_mapping
+ = unpack(p.parse_file('UnicodeData', l.Cf(
+ l.Ct(l.Ct'' * l.Ct'' * l.Ct'') * (
+ l.Cg(p.fields(p.codepoint,
+ p.ignore_field,
+ p.ignore_field,
+ '0' * Cnil + p.number,
+ p.ignore_field,
+ ('<' * l.C(letter^1) * '> ' + Cnil)
+ * l.Ct(p.codepoint * (' ' * p.codepoint)^0)^-1,
+ p.ignore_line)) + p.eol
+ )^0 * -1, doubleset)))
+
+ composition_mapping = {}
+ local composition_exclusions = { [0x00958] = true, [0x00959] = true,
+ [0x0095A] = true, [0x0095B] = true, [0x0095C] = true, [0x0095D] = true,
+ [0x0095E] = true, [0x0095F] = true, [0x009DC] = true, [0x009DD] = true,
+ [0x009DF] = true, [0x00A33] = true, [0x00A36] = true, [0x00A59] = true,
+ [0x00A5A] = true, [0x00A5B] = true, [0x00A5E] = true, [0x00B5C] = true,
+ [0x00B5D] = true, [0x00F43] = true, [0x00F4D] = true, [0x00F52] = true,
+ [0x00F57] = true, [0x00F5C] = true, [0x00F69] = true, [0x00F76] = true,
+ [0x00F78] = true, [0x00F93] = true, [0x00F9D] = true, [0x00FA2] = true,
+ [0x00FA7] = true, [0x00FAC] = true, [0x00FB9] = true, [0x0FB1D] = true,
+ [0x0FB1F] = true, [0x0FB2A] = true, [0x0FB2B] = true, [0x0FB2C] = true,
+ [0x0FB2D] = true, [0x0FB2E] = true, [0x0FB2F] = true, [0x0FB30] = true,
+ [0x0FB31] = true, [0x0FB32] = true, [0x0FB33] = true, [0x0FB34] = true,
+ [0x0FB35] = true, [0x0FB36] = true, [0x0FB38] = true, [0x0FB39] = true,
+ [0x0FB3A] = true, [0x0FB3B] = true, [0x0FB3C] = true, [0x0FB3E] = true,
+ [0x0FB40] = true, [0x0FB41] = true, [0x0FB43] = true, [0x0FB44] = true,
+ [0x0FB46] = true, [0x0FB47] = true, [0x0FB48] = true, [0x0FB49] = true,
+ [0x0FB4A] = true, [0x0FB4B] = true, [0x0FB4C] = true, [0x0FB4D] = true,
+ [0x0FB4E] = true,
+ [0x02ADC] = true, [0x1D15E] = true, [0x1D15F] = true, [0x1D160] = true,
+ [0x1D161] = true, [0x1D162] = true, [0x1D163] = true, [0x1D164] = true,
+ [0x1D1BB] = true, [0x1D1BC] = true, [0x1D1BD] = true, [0x1D1BE] = true,
+ [0x1D1BF] = true, [0x1D1C0] = true,
+ }
+
+ for cp, decomp in next, decomposition_mapping do
+ if #decomp > 1 and not (composition_exclusions[cp] or ccc[decomp[1]]) then
+ local mapping = composition_mapping[decomp[1]]
+ if not mapping then
+ mapping = {}
+ composition_mapping[decomp[1]] = mapping
+ end
+ mapping[decomp[2]] = cp
+ end
+ end
+
+ local function fixup_decomp(decomp)
+ local first = decomp[1]
+ local first_decomp = decomposition_mapping[first]
+ if not first_decomp then return false end
+ if fixup_decomp(first_decomp) then
+ print('nested', first)
+ end
+ move(decomp, 2, #decomp, #first_decomp + 1)
+ move(first_decomp, 1, #first_decomp, 1, decomp)
+ return true
+ end
+ -- Fixup stage
+ for cp, decomp in next, decomposition_mapping do
+ if fixup_decomp(decomp) then
+ -- print(':(', cp)
+ end
+ end
+
+ -- NFKD edition
+ local DEBUG = false
+ local function fixup_decomp(orig, decomp)
+ local work
+ local shared = decomposition_mapping[orig] == decomp
+ local j = 0
+ for i = 1, #decomp do
+ local cp = decomp[i]
+ local cp_decomp = compatibility_mapping[cp]
+ if cp_decomp then
+ if shared then
+ local old = decomp
+ decomp = {}
+ compatibility_mapping[orig] = decomp
+ move(old, 1, #old, 1, decomp)
+ end
+ decomp[i] = cp_decomp
+ j = j + #cp_decomp
+ work = true
+ else
+ j = j + 1
+ end
+ end
+ if not work then return decomp end
+ for i = #decomp, 1, -1 do
+ local v = decomp[i]
+ if type(v) == 'number' then
+ decomp[j] = v
+ j = j - 1
+ else
+ local count = #v
+ move(v, 1, count, j - count + 1, decomp)
+ j = j - count
+ end
+ end
+ assert(j == 0)
+ return decomp
+ end
+ -- Fixup stage
+ for cp, decomp in next, compatibility_mapping do
+ fixup_decomp(cp, decomp)
+ end
+end
+
+local function ccc_reorder(codepoints, i, j, k)
+ if k >= j then return end
+ local first = codepoints[k]
+ local first_ccc = ccc[first]
+ if not first_ccc then
+ return ccc_reorder(codepoints, k+1, j, k+1)
+ end
+ local new_pos = k
+ local cur_ccc
+ repeat
+ new_pos = new_pos + 1
+ if new_pos > j then break end
+ local cur = codepoints[new_pos]
+ cur_ccc = ccc[cur]
+ until (not cur_ccc) or (cur_ccc >= first_ccc)
+ new_pos = new_pos - 1
+ if new_pos == k then
+ return ccc_reorder(codepoints, i, j, k+1)
+ end
+ move(codepoints, k+1, new_pos, k)
+ codepoints[new_pos] = first
+ return ccc_reorder(codepoints, i, j, k == i and i or k-1)
+end
+function to_nfd_table(s, decomposition_mapping)
+ local new_codepoints = newtable(#s, 0)
+ local j = 1
+ for _, c in codes(s) do
+ local decomposed = decomposition_mapping[c]
+ if decomposed then
+ move(decomposed, 1, #decomposed, j, new_codepoints)
+ j = j + #decomposed
+ elseif c >= 0xAC00 and c <= 0xD7A3 then
+ c = c - 0xAC00
+ local tIndex = c % 28
+ c = c // 28
+ local vIndex = c % 21
+ local lIndex = c // 21
+ new_codepoints[j] = 0x1100 + lIndex
+ new_codepoints[j+1] = 0x1161 + vIndex
+ if tIndex == 0 then
+ j = j + 2
+ else
+ new_codepoints[j+2] = 0x11A7 + tIndex
+ j = j + 3
+ end
+ else
+ new_codepoints[j] = c
+ j = j + 1
+ end
+ end
+ ccc_reorder(new_codepoints, 1, #new_codepoints, 1)
+ return new_codepoints
+end
+local function to_nfd(s)
+ return char(unpack(to_nfd_table(s, decomposition_mapping)))
+end
+local function to_nfkd(s)
+ return char(unpack(to_nfd_table(s, compatibility_mapping)))
+end
+local function to_nfc_generic(s, decomposition_mapping)
+ local codepoints = to_nfd_table(s, decomposition_mapping)
+ local starter, lookup, last_ccc, lvt
+ local j = 1
+ for i, c in ipairs(codepoints) do
+ local cur_ccc = ccc[c]
+ if lookup then
+ if (cur_ccc == nil) == (cur_ccc == last_ccc) then -- unblocked
+ local composed = lookup[c]
+ if composed then
+ codepoints[starter] = composed
+ lookup = composition_mapping[composed]
+ goto CONTINUE
+ end
+ end
+ elseif lvt then
+ if lvt == 1 then
+ if c >= 0x1161 and c <= 0x11A7 then
+ lvt = 2
+ codepoints[starter] = ((codepoints[starter] - 0x1100) * 21 + c - 0x1161) * 28 + 0xAC00
+ goto CONTINUE
+ end
+ else -- if lvt == 2 then
+ if c >= 0x11A8 and c <= 0x11C2 then
+ lvt = nil
+ codepoints[starter] = codepoints[starter] + c - 0x11A7
+ goto CONTINUE
+ end
+ end
+ end
+ codepoints[j] = c
+ lvt = nil
+ if not cur_ccc then
+ starter = j
+ lookup = composition_mapping[c]
+ if not lookup and c >= 0x1100 and c <= 0x1112 then
+ lvt = 1
+ end
+ end
+ j = j + 1
+ last_ccc = cur_ccc
+ ::CONTINUE::
+ end
+ for i = j,#codepoints do codepoints[i] = nil end
+ return char(unpack(codepoints))
+end
+local function to_nfc(s)
+ return to_nfc_generic(s, decomposition_mapping)
+end
+local function to_nfkc(s)
+ return to_nfc_generic(s, compatibility_mapping)
+end
+
+return {
+ NFD = to_nfd,
+ NFC = to_nfc,
+ NFKD = to_nfkd,
+ NFKC = to_nfkc,
+}
+-- print(require'inspect'{to_nfd{0x1E0A}, to_nfc{0x1E0A}})
+
+-- print(require'inspect'{to_nfd{0x1100, 0x1100, 0x1161, 0x11A8}, to_nfc{0x1100, 0x1100, 0x1161, 0x11A8}})
diff --git a/macros/luatex/generic/lua-uni-algos/lua-uni-parse.lua b/macros/luatex/generic/lua-uni-algos/lua-uni-parse.lua
new file mode 100644
index 0000000000..a264a2573e
--- /dev/null
+++ b/macros/luatex/generic/lua-uni-algos/lua-uni-parse.lua
@@ -0,0 +1,71 @@
+-- lua-uni-parse.lua
+-- Copyright 2020 Marcel Krüger
+--
+-- 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 later version.
+-- The latest version of this license is in
+-- http://www.latex-project.org/lppl.txt
+-- and version 1.3 or later is part of all distributions of LaTeX
+-- version 2005/12/01 or later.
+--
+-- This work has the LPPL maintenance status `maintained'.
+--
+-- The Current Maintainer of this work is Marcel Krüger
+
+-- Just a simple helper module to make UCD parsing more readable
+
+local lpeg = lpeg or require'lpeg'
+local R = lpeg.R
+local tonumber = tonumber
+
+local codepoint = lpeg.R('09', 'AF')^4 / function(c) return tonumber(c, 16) end
+local sep = lpeg.P' '^0 * ';' * lpeg.P' '^0
+local codepoint_range = codepoint * ('..' * codepoint + lpeg.Cc(false))
+local ignore_line = (1-lpeg.P'\n')^0 * '\n'
+local eol = lpeg.S' \t'^0 * ('#' * ignore_line + '\n')
+local ignored = (1-lpeg.S';#\n')^0
+local number = lpeg.R'09'^1 / tonumber
+
+local function fields(first, ...)
+ if first == ignore_line then
+ assert(select('#', ...) == 0)
+ return ignore_line
+ end
+ local tail = select('#', ...) == 0 and eol or sep * fields(...)
+ return first * tail
+end
+
+local function multiset(table, key1, key2, value)
+ for key = key1,(key2 or key1) do
+ table[key] = value
+ end
+ return table
+end
+
+local function parse_uni_file(filename, patt, func, ...)
+ if func then
+ return parse_uni_file(filename, lpeg.Cf(lpeg.Ct'' * patt^0 * -1, func), nil, ...)
+ end
+ local resolved = kpse.find_file(filename .. '.txt')
+ if not resolved then
+ error(string.format("Unable to find Unicode datafile %q", filename))
+ end
+ local f = assert(io.open(resolved))
+ local data = f:read'*a'
+ f:close()
+ return lpeg.match(patt, data, 1, ...)
+end
+
+return {
+ codepoint = codepoint,
+ codepoint_range = codepoint_range,
+ ignore_line = ignore_line,
+ ignore_field = ignored,
+ eol = eol,
+ sep = sep,
+ number = number,
+ fields = fields,
+ multiset = multiset,
+ parse_file = parse_uni_file,
+}
diff --git a/macros/xetex/latex/bidi/README b/macros/xetex/latex/bidi/README
index d75d1eec74..57a0701cac 100644
--- a/macros/xetex/latex/bidi/README
+++ b/macros/xetex/latex/bidi/README
@@ -1,6 +1,6 @@
___________________
The bidi package
-v36.1
+v36.2
This package provides a convenient interface for typesetting
bidirectional texts in Plain TeX and LaTeX, using XeTeX engine.
@@ -16,7 +16,7 @@ In doing so, please always explain your issue well enough,
and always include a minimal working example showing the
issue.
-Current version release date: 2020/05/14
+Current version release date: 2020/05/15
___________________________________________
Copyright (c) Vafa Khalighi 2007--2020
diff --git a/macros/xetex/latex/bidi/bibitem.pdf b/macros/xetex/latex/bidi/bidi-bibitem.pdf
index 4919174302..4919174302 100644
--- a/macros/xetex/latex/bidi/bibitem.pdf
+++ b/macros/xetex/latex/bidi/bidi-bibitem.pdf
Binary files differ
diff --git a/macros/xetex/latex/bidi/bidi-doc-intro.ltx b/macros/xetex/latex/bidi/bidi-doc-intro.ltx
index 80b89d9d10..c48e399593 100644
--- a/macros/xetex/latex/bidi/bidi-doc-intro.ltx
+++ b/macros/xetex/latex/bidi/bidi-doc-intro.ltx
@@ -20,7 +20,7 @@ If you use \textsf{bidi} package to write any input \TeX\ document, and then run
* Copyright (c) 2007--2020 Vafa Khalighi
* Copyright (c) 2018--2020 bidi-tex GitHub Organization
*
-* v36.1, 2020/05/14
+* v36.2, 2020/05/15
*
* License: LaTeX Project Public License, version
* 1.3c or higher (your choice)
diff --git a/macros/xetex/latex/bidi/bidi-doc-title.ltx b/macros/xetex/latex/bidi/bidi-doc-title.ltx
index 4de0ff59b5..940366fbd1 100644
--- a/macros/xetex/latex/bidi/bidi-doc-title.ltx
+++ b/macros/xetex/latex/bidi/bidi-doc-title.ltx
@@ -3,7 +3,7 @@
\begin{document}
\title{\textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}}\\
\LARGE Bidirectional typesetting in plain \TeX{} and \LaTeX, using \XeTeX{} engine\\[5pt]
-\large User documentation for \textcolor{blue!65!black}{version 36.1}}
+\large User documentation for \textcolor{blue!65!black}{version 36.2}}
\author{Vafa Khalighi\thanks{Thanks to the bidi-tex GitHub organization consisted of David Carlisle and other members of the {\LaTeX} team to maintain the package in the period 2018--2020.}}
\setcounter{page}{0}
\thispagestyle{empty}
@@ -13,7 +13,7 @@
\textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}}
\Large
-User documentation for \textcolor{blue!65!black}{version 36.1}}
+User documentation for \textcolor{blue!65!black}{version 36.2}}
\vskip 0pt plus 3fill
\textit{\large to my Master, \textbf{Ferdowsi The Great}}
diff --git a/macros/xetex/latex/bidi/bidi-doc.ltx b/macros/xetex/latex/bidi/bidi-doc.ltx
index 43d7771b13..275c975574 100644
--- a/macros/xetex/latex/bidi/bidi-doc.ltx
+++ b/macros/xetex/latex/bidi/bidi-doc.ltx
@@ -1,7 +1,7 @@
\documentclass{ltxdoc}
\input{bidi-doc-preamble.ltx}
\hypersetup{%
- pdftitle={User documentation for version 36.1 of the bidi
+ pdftitle={User documentation for version 36.2 of the bidi
package}%
}
\begin{document}
diff --git a/macros/xetex/latex/bidi/bidi-doc.pdf b/macros/xetex/latex/bidi/bidi-doc.pdf
index f414b16e9f..db4013eea1 100644
--- a/macros/xetex/latex/bidi/bidi-doc.pdf
+++ b/macros/xetex/latex/bidi/bidi-doc.pdf
Binary files differ
diff --git a/macros/xetex/latex/bidi/bidi.dtx b/macros/xetex/latex/bidi/bidi.dtx
index 7521caa913..43df0adaac 100644
--- a/macros/xetex/latex/bidi/bidi.dtx
+++ b/macros/xetex/latex/bidi/bidi.dtx
@@ -5,7 +5,7 @@
%<*readme>
___________________
The bidi package
-v36.1
+v36.2
This package provides a convenient interface for typesetting
bidirectional texts in Plain TeX and LaTeX, using XeTeX engine.
@@ -21,7 +21,7 @@ In doing so, please always explain your issue well enough,
and always include a minimal working example showing the
issue.
-Current version release date: 2020/05/14
+Current version release date: 2020/05/15
___________________________________________
Copyright (c) Vafa Khalighi 2007--2020
@@ -219,7 +219,7 @@ by Vafa Khalighi.
\documentclass{ltxdoc}
\input{bidi-doc-preamble.ltx}
\hypersetup{%
- pdftitle={Source documentation for version 36.1 of the bidi
+ pdftitle={Source documentation for version 36.2 of the bidi
package}%
}
\EnableCrossrefs
@@ -238,7 +238,7 @@ by Vafa Khalighi.
% \GetFileInfo{\jobname.dtx}
% \title{\textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}}\\
%\LARGE Bidirectional typesetting in plain \TeX{} and \LaTeX, using \XeTeX{} engine\\[5pt]
-%\large Source documentation for \textcolor{blue!65!black}{version 36.1}}
+%\large Source documentation for \textcolor{blue!65!black}{version 36.2}}
% \author{Vafa Khalighi\thanks{Thanks to the bidi-tex GitHub organization consisted of David Carlisle and other members of the {\LaTeX} team to maintain the package in the period 2018--2020.}}
%\setcounter{page}{0}
%\thispagestyle{empty}
@@ -248,7 +248,7 @@ by Vafa Khalighi.
%\textcolor{blue!65!black}{\Huge The \textsf{bidi} \textit{Package}}
%
%\Large
-%Source documentation for \textcolor{blue!65!black}{version 36.1}}
+%Source documentation for \textcolor{blue!65!black}{version 36.2}}
%
%\vskip 0pt plus 3fill
%\textit{\large to my Master, \textbf{Ferdowsi The Great}}
@@ -1898,8 +1898,8 @@ by Vafa Khalighi.
% \section{File \texttt{bidi.sty}}
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\def\bididate{2020/05/14}
-\def\bidi@version{36.1}
+\def\bididate{2020/05/15}
+\def\bidi@version{36.2}
\ProvidesPackage{bidi}[\bididate\space v\bidi@version\space
Bidirectional typesetting in plain TeX and LaTeX]
\edef\@bidi@info{****************************************************^^J%
@@ -1983,7 +1983,7 @@ Bidirectional typesetting in plain TeX and LaTeX]
}
\newcommand*{\@bidi@pdfcustomproperties}{%
This is the bidi package, Version \bidi@version,
- Released May 13, 2020.
+ Released May 15, 2020.
}
\@RTLmainfalse
\AtBeginDocument{%
@@ -2225,9 +2225,9 @@ Bidirectional typesetting in plain TeX and LaTeX]
%\fi
% \section{File \texttt{bidi.tex}}
% \begin{macrocode}
-\def\bididate{2020/05/14}
+\def\bididate{2020/05/15}
\catcode`@=11
-\def\bidi@version{36.1}
+\def\bidi@version{36.2}
\let \protect \relax
\newlinechar`\^^J
\edef\@bidi@info{****************************************************^^J%
@@ -2325,7 +2325,7 @@ Bidirectional typesetting in plain TeX and LaTeX]
}
\def\@bidi@pdfcustomproperties{%
This is the bidi package, Version \bidi@version,
- Released May 13, 2020.
+ Released May 15, 2020.
}
\def\bidi@pdfm@mark{%
\special{pdf:%
@@ -2977,7 +2977,7 @@ Bidirectional typesetting in plain TeX and LaTeX]
\fi}
\newlength{\bibindent}
\setlength{\bibindent}{1.5em}
-\newcommand*{\bibliographyitemlabel}{\includegraphics{bibitem.pdf}}
+\newcommand*{\bibliographyitemlabel}{\includegraphics{bidi-bibitem.pdf}}
\newenvironment{thebibliography}[1]%
{%
\section{\refname}%
@@ -25823,7 +25823,7 @@ Lion & Yellow & Elephants & Tartare \\\cline{4-4}
% \typeout{*}
% \typeout{* \space\space\space all *.cls, *.sty and *.def files}
% \typeout{*}
-% \typeout{* \space\space\space and bibitem.pdf file}
+% \typeout{* \space\space\space and bidi-bibitem.pdf file}
% \typeout{*************************************************************}
%
\endinput
diff --git a/macros/xetex/latex/bidi/bidi.pdf b/macros/xetex/latex/bidi/bidi.pdf
index 788e06188f..af13f637eb 100644
--- a/macros/xetex/latex/bidi/bidi.pdf
+++ b/macros/xetex/latex/bidi/bidi.pdf
Binary files differ