summaryrefslogtreecommitdiff
path: root/indexing/xindex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /indexing/xindex
Initial commit
Diffstat (limited to 'indexing/xindex')
-rw-r--r--indexing/xindex/CHANGELOG15
-rw-r--r--indexing/xindex/README.md46
-rw-r--r--indexing/xindex/doc/Makefile52
-rw-r--r--indexing/xindex/doc/tests/HADW.idx27
-rw-r--r--indexing/xindex/doc/tests/HADW.ind38
-rw-r--r--indexing/xindex/doc/tests/HADW.pdfbin0 -> 20275 bytes
-rw-r--r--indexing/xindex/doc/tests/HADW.tex19
-rw-r--r--indexing/xindex/doc/tests/HADW2.idx47
-rw-r--r--indexing/xindex/doc/tests/HADW2.ind68
-rw-r--r--indexing/xindex/doc/tests/Umlaute.idx24
-rw-r--r--indexing/xindex/doc/tests/Umlaute.ind34
-rw-r--r--indexing/xindex/doc/tests/Umlaute.pdfbin0 -> 17462 bytes
-rw-r--r--indexing/xindex/doc/tests/Umlaute.tex23
-rw-r--r--indexing/xindex/doc/tests/Umlaute2.idx24
-rw-r--r--indexing/xindex/doc/tests/Umlaute2.ind34
-rw-r--r--indexing/xindex/doc/tests/Umlaute2.pdfbin0 -> 21640 bytes
-rw-r--r--indexing/xindex/doc/tests/Umlaute2.tex25
-rw-r--r--indexing/xindex/doc/tests/buch.idx929
-rw-r--r--indexing/xindex/doc/tests/buch.pdfbin0 -> 49722 bytes
-rw-r--r--indexing/xindex/doc/tests/buch.tex19
-rw-r--r--indexing/xindex/doc/tests/demo-hyperref.idx187
-rw-r--r--indexing/xindex/doc/tests/demo-hyperref.ind233
-rw-r--r--indexing/xindex/doc/tests/demo-hyperref.pdfbin0 -> 32794 bytes
-rw-r--r--indexing/xindex/doc/tests/demo-hyperref.tex13
-rw-r--r--indexing/xindex/doc/tests/demo.idx206
-rw-r--r--indexing/xindex/doc/tests/demo.ind254
-rw-r--r--indexing/xindex/doc/tests/demo.pdfbin0 -> 39233 bytes
-rw-r--r--indexing/xindex/doc/tests/demo.tex56
-rw-r--r--indexing/xindex/doc/tests/demo2.idx5
-rw-r--r--indexing/xindex/doc/tests/demo2.ind8
-rw-r--r--indexing/xindex/doc/tests/demo3.idx5
-rw-r--r--indexing/xindex/doc/tests/demo3.ind8
-rw-r--r--indexing/xindex/doc/tests/demo3.pdfbin0 -> 10054 bytes
-rw-r--r--indexing/xindex/doc/tests/demo3.tex26
-rwxr-xr-xindexing/xindex/doc/tests/runTests.sh35
-rw-r--r--indexing/xindex/doc/xindex-doc.pdfbin0 -> 359030 bytes
-rw-r--r--indexing/xindex/doc/xindex-doc.tex1430
-rw-r--r--indexing/xindex/latex/xindex.sty76
-rw-r--r--indexing/xindex/lualatex/xindex-DIN2.lua103
-rw-r--r--indexing/xindex/lualatex/xindex-HAdW-eKO.lua317
-rw-r--r--indexing/xindex/lualatex/xindex-base.lua243
-rw-r--r--indexing/xindex/lualatex/xindex-cfg-common.lua117
-rw-r--r--indexing/xindex/lualatex/xindex-cfg.lua90
-rw-r--r--indexing/xindex/lualatex/xindex-dtk.lua158
-rw-r--r--indexing/xindex/lualatex/xindex-lapp.lua325
-rw-r--r--indexing/xindex/lualatex/xindex-lib.lua980
-rw-r--r--indexing/xindex/lualatex/xindex-pretty.lua254
-rw-r--r--indexing/xindex/lualatex/xindex-unicode.lua3118
-rwxr-xr-xindexing/xindex/scripts/xindex.lua200
49 files changed, 9871 insertions, 0 deletions
diff --git a/indexing/xindex/CHANGELOG b/indexing/xindex/CHANGELOG
new file mode 100644
index 0000000000..ca08cd5a9b
--- /dev/null
+++ b/indexing/xindex/CHANGELOG
@@ -0,0 +1,15 @@
+0.13 2019-06-07 - fix for minCompress < 2
+0.12 2019-06-05 - fix for fCompress=false
+ - added rangeSymbol to the config files
+0.11 2019-04-10 - config script for Yannis
+0.10 2019-04-07 - fix for case sensitive sorting
+0.09 2019-03-25 - fix for HAdW config file
+0.08 2019-03-06 - fix for config file HAdW
+0.07 2019-02-05 - fix for wrong version number
+0.06b 2019-01-30 - use another monospace font to allow copy and paste
+0.06a 2018-12-06 - fixes to documentationO
+0.06 2018-12-06 - renamed files, more changes to HAdW-eKO
+0.05 2018-12-01 - modified HAdW config
+0.04 2018-10-29 - added an own pretty printer function for tables
+0.03 2018-10-27 -fix for same pagenumber but different special
+0.02 2018-10-27 -Updated documention
diff --git a/indexing/xindex/README.md b/indexing/xindex/README.md
new file mode 100644
index 0000000000..e47187276a
--- /dev/null
+++ b/indexing/xindex/README.md
@@ -0,0 +1,46 @@
+# xindex
+
+Unicode compatible index programm for LaTeX. It needs Lua 5.3 which
+will be included in at least LuaTeX 1.09 (TeXLive 2019)
+
+
+* xindex.lua -- main file
+* xindex-cfg.lua -- config module
+* xindex-cfg-common.lua -- main config module
+* xindex-base.lua -- base file
+* xindex-lib.lua -- functions module
+* xindex-lapp.lua -- read parameter
+* xindex-unicode.lua -- list of Unicode categories
+
+The syntax of `xindex`
+
+ xindex [options] <inputfile>[.idx]
+
+possible options are (short,long):
+ -q,--quiet
+ -h,--help
+ -v... Verbosity level; can be -v, -vv, -vvv
+ -c,--config (default cfg)
+ -e,--escapechar (default ")
+ -n,--noheadings
+ -a,--no_casesensitive
+ -o,--output (default "")
+ -l,--language (default en)
+ -p,--prefix (default L)
+ <input> (string)
+
+Testfiles:
+
+demo.tex: run
+
+ lualatex demo
+ ./xindex.lua demo.idx
+ lualatex demo
+
+
+buch.tex: run
+
+ ./xindex.lua buch.idx
+ lualatex buch
+
+
diff --git a/indexing/xindex/doc/Makefile b/indexing/xindex/doc/Makefile
new file mode 100644
index 0000000000..a4fb2b95df
--- /dev/null
+++ b/indexing/xindex/doc/Makefile
@@ -0,0 +1,52 @@
+# `Makefile' for `pst-grad.pdf', hv, 2008/08/11
+
+.SUFFIXES : .tex .ltx .dvi .ps .pdf .eps
+
+PACKAGE = xhfill
+
+MAIN = xindex-doc
+
+LATEX = lualatex
+
+ARCHNAME = $(MAIN)-$(shell date +%y%m%d)
+
+ARCHFILES = $(PACKAGE).sty $(PACKAGE).tex $(PACKAGE).pro $(MAIN).tex README Changes Makefile
+
+#TDS = ~/PSTricks/PSTricks-TDS
+
+all : doc clean
+# clean
+doc:
+ $(LATEX) --shell-escape $(MAIN)
+# if ! test -f $(MAIN).glo ; then touch $(MAIN).glo; fi
+ if ! test -f $(MAIN).idx ; then touch $(MAIN).idx; fi
+# makeindex -s gglo.ist -t $(MAIN).glg -o $(MAIN).gls $(MAIN).glo
+ xindex -a $(MAIN).idx
+# bibtex $(MAIN)
+ $(LATEX) --shell-escape $(MAIN)
+# $(LATEX) --shell-escape $(MAIN)
+
+clean :
+ $(RM) *.dvi *.aux *.log *.xml xindex-?.tex xindex-??.tex *.ind *.idx *.toc *.out *.ilg
+
+veryclean : clean
+ $(RM) *.pdf
+
+arch :
+ zip $(ARCHNAME).zip $(ARCHFILES)
+
+tds:
+ cp -u Changes $(TDS)/doc/latex/$(PACKAGE)/
+ cp -u README $(TDS)/doc/latex/$(PACKAGE)/
+ cp -u $(MAIN).pdf $(TDS)/doc/latex/$(PACKAGE)/
+#
+ cp -u Changes $(TDS)/tex/latex/$(PACKAGE)/
+ cp -u $(PACKAGE).sty $(TDS)/tex/latex/$(PACKAGE)/
+#
+ cp -u Changes $(TDS)/source/$(PACKAGE)/
+ cp -u $(MAIN).tex $(TDS)/source/$(PACKAGE)/
+ cp -u $(MAIN).bib $(TDS)/source/$(PACKAGE)/
+ cp -u Makefile $(TDS)/source/$(PACKAGE)/
+
+
+# EOF
diff --git a/indexing/xindex/doc/tests/HADW.idx b/indexing/xindex/doc/tests/HADW.idx
new file mode 100644
index 0000000000..bc1e2f4ed4
--- /dev/null
+++ b/indexing/xindex/doc/tests/HADW.idx
@@ -0,0 +1,27 @@
+\indexentry{Aachen, Johannes von}{VII/1-215}
+\indexentry{Aarones}{VII/2/1-1003}
+\indexentry{Aarones}{VII/2/1-1012}
+\indexentry{Abrahamson}{VII/2/1-864}
+\indexentry{Abrahamson}{VII/2/1-991}
+\indexentry{Abrahamson}{VII/2/1-1048}
+\indexentry{Abrahamson}{VII/2/1-1067}
+\indexentry{Abrahamson}{VII/2/1-1156}
+\indexentry{Adamson}{VII/2/1-1223}
+\indexentry{Adamson}{IX/1-1228}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-758}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-759}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-760}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-761}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-765}
+\indexentry{Adrian!Hauster}{VII/1-514}
+\indexentry{Adrian!Hauster}{XI/1-515}
+\indexentry{Alting!Mensa}{VII/1-426}
+\indexentry{Alting!Mensa}{VII/1-434}
+\indexentry{Alting!Mensa}{VII/1-453}
+\indexentry{Alting!Mensa}{VII/1-455}
+\indexentry{Alting!Mensa}{VII/1-466}
+\indexentry{Alting!Mensa}{VII/1-467}
+\indexentry{Bremen!Heinz von, Erzbischof|see{Sachsen-Lauenburg}}{}
+\indexentry{Osnabrück!Heinz von, Bischof|see{Sachsen-Lauenburg}}{}
+\indexentry{Zwingl, Haldrich}{IX-479}
+\indexentry{Zwingl, Haldrich}{IX-692} \ No newline at end of file
diff --git a/indexing/xindex/doc/tests/HADW.ind b/indexing/xindex/doc/tests/HADW.ind
new file mode 100644
index 0000000000..06c3c2515a
--- /dev/null
+++ b/indexing/xindex/doc/tests/HADW.ind
@@ -0,0 +1,38 @@
+
+\begin{theindex}
+
+\indexspace
+\textbf{A}
+\nopagebreak[4]
+ \item Aachen, Johannes von, {VII/1 215}
+ \item Aarones, {VII/2/1 1003}, {1012}
+ \item Abrahamson, {VII/2/1 864}, {991}, {1048}, {1067}, {1156}
+ \item Adamson, {VII/2/1 1223}, {IX/1 1228}
+ \item Adrian
+ \subitem -\,Hauster, {VII/1 514}, {XI/1 515}
+ \item Alting
+ \subitem -\,Mensa, {VII/1 426}, {434}, {453}, {455}, {466f}
+
+\indexspace
+\textbf{B}
+\nopagebreak[4]
+ \item Bremen
+ \subitem -\,Heinz von, Erzbischof, \see{Sachsen-Lauenburg}{}
+
+\indexspace
+\textbf{O}
+\nopagebreak[4]
+ \item Osnabrück
+ \subitem -\,Heinz von, Bischof, \see{Sachsen-Lauenburg}{}
+
+\indexspace
+\textbf{S}
+\nopagebreak[4]
+ \item Schleswig-Holstein
+ \subitem -\,Rudolf von, Herzog, {VII/2/1 758--761}, {765}
+
+\indexspace
+\textbf{Z}
+\nopagebreak[4]
+ \item Zwingl, Haldrich, {IX 479}, {692}
+\end{theindex}
diff --git a/indexing/xindex/doc/tests/HADW.pdf b/indexing/xindex/doc/tests/HADW.pdf
new file mode 100644
index 0000000000..c569984fda
--- /dev/null
+++ b/indexing/xindex/doc/tests/HADW.pdf
Binary files differ
diff --git a/indexing/xindex/doc/tests/HADW.tex b/indexing/xindex/doc/tests/HADW.tex
new file mode 100644
index 0000000000..2c26732da2
--- /dev/null
+++ b/indexing/xindex/doc/tests/HADW.tex
@@ -0,0 +1,19 @@
+\documentclass[paper=a4,parskip=half-,ngerman,DIV=13]{scrartcl}
+\usepackage{eurosym}
+\usepackage[silent]{fontspec}
+\usepackage{libertinus-otf}
+\usepackage{babel}
+\usepackage{makeidx}
+\usepackage{dtk-logos}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+
+\begin{document}
+Run with \verb|xindex --config HAdW|
+
+\printindex
+\end{document}
diff --git a/indexing/xindex/doc/tests/HADW2.idx b/indexing/xindex/doc/tests/HADW2.idx
new file mode 100644
index 0000000000..82bd8e365c
--- /dev/null
+++ b/indexing/xindex/doc/tests/HADW2.idx
@@ -0,0 +1,47 @@
+\indexentry{Aachen, Johannes von}{VII/1-215}
+\indexentry{Aarones}{VII/2/1-1003}
+\indexentry{Aarones}{VII/2/1-1012}
+\indexentry{Abrahamson}{VII/2/1-864}
+\indexentry{Abrahamson}{VII/2/1-991}
+\indexentry{Abrahamson}{VII/2/1-1048}
+\indexentry{Abrahamson}{VII/2/1-1067}
+\indexentry{Abrahamson}{VII/2/1-1156}
+\indexentry{Adamson}{VII/2/1-1223}
+\indexentry{Adamson}{IX/1-1228}
+\indexentry{Karl V}{VII/1-34}
+\indexentry{Karl II}{VII/1-147}
+\indexentry{Karl III}{VII/1-149}
+\indexentry{Karl VI}{VII/1-296}
+\indexentry{Karl IV}{VII/1-34}
+\indexentry{Karl IV}{VII/1-147}
+\indexentry{Karl X}{VII/1-149}
+\indexentry{Karl IX}{VII/1-296}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-758}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-759}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-760}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-761}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-765}
+\indexentry{Adrian!Hauster}{VII/1-514}
+\indexentry{Adrian!Hauster}{XI/1-515}
+\indexentry{Alting!Mensa}{VII/1-426}
+\indexentry{Alting!Mensa}{VII/1-434}
+\indexentry{Alting!Mensa}{VII/1-453}
+\indexentry{Alting!Mensa}{VII/1-455}
+\indexentry{Alting!Mensa}{VII/1-466}
+\indexentry{Alting!Mensa}{VII/1-467}
+\indexentry{Bremen!Heinz von, Erzbischof|see{Sachsen-Lauenburg}}{}
+\indexentry{Osnabrück!Heinz von, Bischof|see{Sachsen-Lauenburg}}{}
+\indexentry{Zwingl, Haldrich}{IX-479}
+\indexentry{Zwingl, Haldrich}{IX-692}
+\indexentry{Julian!Apostata, römischer Kaiser}{VII/2/1-904}
+\indexentry{Justinian I., byzantinischer Kaiser}{VII/1-326}
+\indexentry{Justinian I., byzantinischer Kaiser}{VII/1-734}
+\indexentry{Justinian I., byzantinischer Kaiser}{VII/2/1-1011}
+\indexentry{Karl!V., Kaiser}{VII/1-34}
+\indexentry{Karl!II., Kaiser}{VII/1-147}
+\indexentry{Karl!III., Kaiser}{VII/1-149}
+\indexentry{Karl!VI., Kaiser}{VII/1-296}
+\indexentry{Karl!IV., Kaiser}{VII/1-34}
+\indexentry{Karl!IV., Kaiser}{VII/1-147}
+\indexentry{Karl!X., Kaiser}{VII/1-149}
+\indexentry{Karl!IX., Kaiser}{VII/1-296}
diff --git a/indexing/xindex/doc/tests/HADW2.ind b/indexing/xindex/doc/tests/HADW2.ind
new file mode 100644
index 0000000000..04ba01c38b
--- /dev/null
+++ b/indexing/xindex/doc/tests/HADW2.ind
@@ -0,0 +1,68 @@
+
+\begin{theindex}
+
+\indexspace
+\textbf{K}
+\nopagebreak[4]
+ \item Karl II, {VII/1 147}
+ \item Karl III, {VII/1 149}
+ \item Karl IV, {VII/1 147}, {34}
+ \item Karl V, {VII/1 34}
+ \item Karl VI, {VII/1 296}
+ \item Karl IX, {VII/1 296}
+ \item Karl X, {VII/1 149}
+
+\indexspace
+\textbf{A}
+\nopagebreak[4]
+ \item Aachen, Johannes von, {VII/1 215}
+ \item Aarones, {VII/2/1 1003}, {1012}
+ \item Abrahamson, {VII/2/1 1048}, {1067}, {1156}, {864}, {991}
+ \item Adamson, {VII/2/1 1223}, {IX/1 1228}
+ \item Adrian
+ \subitem -\,Hauster, {VII/1 514}, {XI/1 515}
+ \item Alting
+ \subitem -\,Mensa, {VII/1 426}, {434}, {453}, {455}, {466f}
+
+\indexspace
+\textbf{B}
+\nopagebreak[4]
+ \item Bremen
+ \subitem -\,Heinz von, Erzbischof, \see{Sachsen-Lauenburg}{}
+
+\indexspace
+\textbf{J}
+\nopagebreak[4]
+ \item Julian
+ \subitem -\,Apostata, römischer Kaiser, {VII/2/1 904}
+ \item Justinian I., byzantinischer Kaiser, {VII/1 326}, {734}, {VII/2/1 1011}
+
+\indexspace
+\textbf{K}
+\nopagebreak[4]
+ \item Karl
+ \subitem -\,II., Kaiser, {VII/1 147}
+ \subitem -\,III., Kaiser, {VII/1 149}
+ \subitem -\,IV., Kaiser, {VII/1 147}, {34}
+ \subitem -\,IX., Kaiser, {VII/1 296}
+ \subitem -\,V., Kaiser, {VII/1 34}
+ \subitem -\,VI., Kaiser, {VII/1 296}
+ \subitem -\,X., Kaiser, {VII/1 149}
+
+\indexspace
+\textbf{O}
+\nopagebreak[4]
+ \item Osnabrück
+ \subitem -\,Heinz von, Bischof, \see{Sachsen-Lauenburg}{}
+
+\indexspace
+\textbf{S}
+\nopagebreak[4]
+ \item Schleswig-Holstein
+ \subitem -\,Rudolf von, Herzog, {VII/2/1 758--761}, {765}
+
+\indexspace
+\textbf{Z}
+\nopagebreak[4]
+ \item Zwingl, Haldrich, {IX 479}, {692}
+\end{theindex}
diff --git a/indexing/xindex/doc/tests/Umlaute.idx b/indexing/xindex/doc/tests/Umlaute.idx
new file mode 100644
index 0000000000..5c9f3c1427
--- /dev/null
+++ b/indexing/xindex/doc/tests/Umlaute.idx
@@ -0,0 +1,24 @@
+\indexentry{Österreich}{1}
+\indexentry{Öresund}{2}
+\indexentry{Ostern}{3}
+\indexentry{Ober}{4}
+\indexentry{Oberin}{5}
+\indexentry{Österreich}{2}
+\indexentry{Öresund}{4}
+\indexentry{Ostern}{4}
+\indexentry{Ober}{6}
+\indexentry{Oberin}{6}
+\indexentry{Obstler}{7}
+\indexentry{Öl}{8}
+\indexentry{ölen}{9}
+\indexentry{Ödem}{4}
+\indexentry{Oligarch}{28}
+\indexentry{Oder}{58}
+\indexentry{oder}{8}
+\indexentry{Fluss!Oder}{479}
+\indexentry{Oder|seealso{Fluss}}{33}
+\indexentry{Göbel}{58}
+\indexentry{Goethe}{58}
+\indexentry{Göthe}{58}
+\indexentry{Götz}{58}
+\indexentry{Goldmann}{58}
diff --git a/indexing/xindex/doc/tests/Umlaute.ind b/indexing/xindex/doc/tests/Umlaute.ind
new file mode 100644
index 0000000000..fe7d43950e
--- /dev/null
+++ b/indexing/xindex/doc/tests/Umlaute.ind
@@ -0,0 +1,34 @@
+
+\begin{theindex}
+
+\indexspace
+\textbf{F}
+\nopagebreak[4]
+ \item Fluss
+ \subitem -\,Oder, {479}
+
+\indexspace
+\textbf{G}
+\nopagebreak[4]
+ \item Göbel, {58}
+ \item Goethe, {58}
+ \item Goldmann, {58}
+ \item Göthe, {58}
+ \item Götz, {58}
+
+\indexspace
+\textbf{O}
+\nopagebreak[4]
+ \item Ober, {4}, {6}
+ \item Oberin, {5f}
+ \item Obstler, {7}
+ \item Ödem, {4}
+ \item oder, {8}
+ \item Oder, \seealso{Fluss}{33}, {58}
+ \item Öl, {8}
+ \item ölen, {9}
+ \item Oligarch, {28}
+ \item Öresund, {2}, {4}
+ \item Ostern, {3f}
+ \item Österreich, {1f}
+\end{theindex}
diff --git a/indexing/xindex/doc/tests/Umlaute.pdf b/indexing/xindex/doc/tests/Umlaute.pdf
new file mode 100644
index 0000000000..8e5e63500d
--- /dev/null
+++ b/indexing/xindex/doc/tests/Umlaute.pdf
Binary files differ
diff --git a/indexing/xindex/doc/tests/Umlaute.tex b/indexing/xindex/doc/tests/Umlaute.tex
new file mode 100644
index 0000000000..7c0d4e9831
--- /dev/null
+++ b/indexing/xindex/doc/tests/Umlaute.tex
@@ -0,0 +1,23 @@
+\documentclass[paper=a4,parskip=half-,ngerman]{scrartcl}
+\usepackage{eurosym}
+\usepackage[silent]{fontspec}
+\usepackage{libertinus-otf}
+\usepackage{babel}
+\usepackage{hvindex}
+\usepackage{makeidx}
+
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+
+%\makeindex
+\begin{document}
+\def\indexname{Sortierung nach DIN Variante 1: Ö$\rightarrow$O}
+
+\printindex
+
+
+\end{document}
diff --git a/indexing/xindex/doc/tests/Umlaute2.idx b/indexing/xindex/doc/tests/Umlaute2.idx
new file mode 100644
index 0000000000..5c9f3c1427
--- /dev/null
+++ b/indexing/xindex/doc/tests/Umlaute2.idx
@@ -0,0 +1,24 @@
+\indexentry{Österreich}{1}
+\indexentry{Öresund}{2}
+\indexentry{Ostern}{3}
+\indexentry{Ober}{4}
+\indexentry{Oberin}{5}
+\indexentry{Österreich}{2}
+\indexentry{Öresund}{4}
+\indexentry{Ostern}{4}
+\indexentry{Ober}{6}
+\indexentry{Oberin}{6}
+\indexentry{Obstler}{7}
+\indexentry{Öl}{8}
+\indexentry{ölen}{9}
+\indexentry{Ödem}{4}
+\indexentry{Oligarch}{28}
+\indexentry{Oder}{58}
+\indexentry{oder}{8}
+\indexentry{Fluss!Oder}{479}
+\indexentry{Oder|seealso{Fluss}}{33}
+\indexentry{Göbel}{58}
+\indexentry{Goethe}{58}
+\indexentry{Göthe}{58}
+\indexentry{Götz}{58}
+\indexentry{Goldmann}{58}
diff --git a/indexing/xindex/doc/tests/Umlaute2.ind b/indexing/xindex/doc/tests/Umlaute2.ind
new file mode 100644
index 0000000000..d128238f69
--- /dev/null
+++ b/indexing/xindex/doc/tests/Umlaute2.ind
@@ -0,0 +1,34 @@
+
+\begin{theindex}
+
+\indexspace
+\textbf{F}
+\nopagebreak[4]
+ \item Fluss
+ \subitem -\,Oder, {479}
+
+\indexspace
+\textbf{G}
+\nopagebreak[4]
+ \item Göbel, {58}
+ \item Goethe, {58}
+ \item Göthe, {58}
+ \item Götz, {58}
+ \item Goldmann, {58}
+
+\indexspace
+\textbf{O}
+\nopagebreak[4]
+ \item Ober, {4}, {6}
+ \item Oberin, {5f}
+ \item Obstler, {7}
+ \item oder, {8}
+ \item Oder, \seealso{Fluss}{33}, {58}
+ \item Ödem, {4}
+ \item Öl, {8}
+ \item ölen, {9}
+ \item Öresund, {2}, {4}
+ \item Österreich, {1f}
+ \item Oligarch, {28}
+ \item Ostern, {3f}
+\end{theindex}
diff --git a/indexing/xindex/doc/tests/Umlaute2.pdf b/indexing/xindex/doc/tests/Umlaute2.pdf
new file mode 100644
index 0000000000..b2d94bde3f
--- /dev/null
+++ b/indexing/xindex/doc/tests/Umlaute2.pdf
Binary files differ
diff --git a/indexing/xindex/doc/tests/Umlaute2.tex b/indexing/xindex/doc/tests/Umlaute2.tex
new file mode 100644
index 0000000000..a14b945de2
--- /dev/null
+++ b/indexing/xindex/doc/tests/Umlaute2.tex
@@ -0,0 +1,25 @@
+\documentclass[paper=a4,parskip=half-,ngerman]{scrartcl}
+\usepackage{eurosym}
+\usepackage[silent]{fontspec}
+\usepackage{libertinus-otf}
+\usepackage{babel}
+\usepackage{hvindex}
+\usepackage{makeidx}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+
+
+%\makeindex
+\begin{document}
+
+\def\indexname{Sortierung nach DIN Variante 2: Ö$\rightarrow$Oe}%
+\verb|xindex -l de -c DIN2 Umlaute2 |
+
+\printindex
+
+
+\end{document}
diff --git a/indexing/xindex/doc/tests/buch.idx b/indexing/xindex/doc/tests/buch.idx
new file mode 100644
index 0000000000..aab5e9be1b
--- /dev/null
+++ b/indexing/xindex/doc/tests/buch.idx
@@ -0,0 +1,929 @@
+\indexentry {TeXLive@\TeXLive}{3}
+\indexentry {Textverarbeitung}{6}
+\indexentry {programmiert}{6}
+\indexentry {Befehlssyntax}{6}
+\indexentry {Satzprogramm}{6}
+\indexentry {Textverarbeitungsprogramm}{7}
+\indexentry {Absatz}{7}
+\indexentry {Umbruch}{7}
+\indexentry {Mikrotypografie}{7}
+\indexentry {Dehnungspunkte}{9}
+\indexentry {Dokumentenklasse}{9}
+\indexentry {Sprachauswahl}{9}
+\indexentry {Eingabekodierung}{9}
+\indexentry {Schriftkodierung}{9}
+\indexentry {Layout}{9}
+\indexentry {Makefile}{9}
+\indexentry {GUI}{9}
+\indexentry {Schrifteinbindung}{9}
+\indexentry {etex@e\TeX }{11}
+\indexentry {pdf\TeX }{11}
+\indexentry {pdfe\TeX }{11}
+\indexentry {Unicode}{11}
+\indexentry {OpenType}{12}
+\indexentry {TrueType}{12}
+\indexentry {Type"~1}{12}
+\indexentry {Skriptsprache}{13}
+\indexentry {Format}{13}
+\indexentry {pdf\TeX }{13}
+\indexentry {TeXLive@\TeXLive}{13}
+\indexentry {Distribution}{13}
+\indexentry {TeXLive@\TeXLive}{13}
+\indexentry {Linux}{13}
+\indexentry {Mac OS~X}{13}
+\indexentry {Windows}{13}
+\indexentry {Solaris}{13}
+\indexentry {TeXLive@\TeXLive}{13}
+\indexentry {Mac\TeX }{13}
+\indexentry {TeXLive@\TeXLive}{13}
+\indexentry {MiK\TeX }{13}
+\indexentry {fp\TeX }{13}
+\indexentry {Xem\TeX }{13}
+\indexentry {TeXLive@\TeXLive}{13}
+\indexentry {TeXLive@\TeXLive}{13}
+\indexentry {TeX-Collection@\TeX -Collection}{13}
+\indexentry {ISO-Image}{14}
+\indexentry {TeXLive@\TeXLive}{14}
+\indexentry {Umgebungsvariable}{14}
+\indexentry {Systemadministrator}{14}
+\indexentry {root}{14}
+\indexentry {TeXLive@\TeXLive}{15}
+\indexentry {TeXLive@\TeXLive}{16}
+\indexentry {TeXLive@\TeXLive}{17}
+\indexentry {TeXLive@\TeXLive}{18}
+\indexentry {TeXLive@\TeXLive}{18}
+\indexentry {TeXLive@\TeXLive}{18}
+\indexentry {TeXLive@\TeXLive}{18}
+\indexentry {TeXLive@\TeXLive}{18}
+\indexentry {Updatemanager}{18}
+\indexentry {TeXLive@\TeXLive}{18}
+\indexentry {TeXLive@\TeXLive}{19}
+\indexentry {TeXLive@\TeXLive}{19}
+\indexentry {TeXLive@\TeXLive}{19}
+\indexentry {TeXLive@\TeXLive}{20}
+\indexentry {TeXLive@\TeXLive}{20}
+\indexentry {TeXLive@\TeXLive}{20}
+\indexentry {TeXLive@\TeXLive}{21}
+\indexentry {TeXLive@\TeXLive}{21}
+\indexentry {TeXLive@\TeXLive}{21}
+\indexentry {TeXLive@\TeXLive}{21}
+\indexentry {TeXLive@\TeXLive}{21}
+\indexentry {TeXLive@\TeXLive}{21}
+\indexentry {TeXLive@\TeXLive}{21}
+\indexentry {MiK\TeX }{21}
+\indexentry {TeXLive@\TeXLive}{21}
+\indexentry {Windows}{21}
+\indexentry {MiK\TeX !Paketmanager}{21}
+\indexentry {Adobe Reader}{22}
+\indexentry {pro\TeX t}{22}
+\indexentry {pro\TeX t}{22}
+\indexentry {Adobe Reader}{22}
+\indexentry {MiK\TeX }{23}
+\indexentry {Sumatra-PDF}{23}
+\indexentry {TeXStudio@\TeX Studio}{23}
+\indexentry {TeXLive@\TeXLive}{23}
+\indexentry {TeXLive@\TeXLive}{23}
+\indexentry {TeXShop@\TeX Shop}{23}
+\indexentry {TeXworks@\TeX works}{23}
+\indexentry {TeXLive@\TeXLive}{23}
+\indexentry {TeXLive@\TeXLive}{25}
+\indexentry {TeXLive@\TeXLive}{25}
+\indexentry {TeXLive@\TeXLive}{25}
+\indexentry {TeXLive@\TeXLive}{26}
+\indexentry {TeXLive@\TeXLive}{26}
+\indexentry {TeXLive@\TeXLive}{26}
+\indexentry {GUI}{29}
+\indexentry {IDE}{29}
+\indexentry {TeXmaker@\TeX maker}{29}
+\indexentry {Emacs}{29}
+\indexentry {AUC\TeX }{29}
+\indexentry {LaTeX-Editor@\LaTeX -Editor}{29}
+\indexentry {Fehlersuche}{29}
+\indexentry {TeXmaker@\TeX maker}{29}
+\indexentry {TeXnicCenter@\TeX nicCenter}{31}
+\indexentry {TeXnicCenter@\TeX nicCenter}{31}
+\indexentry {TeXLive@\TeXLive}{31}
+\indexentry {Viewer}{31}
+\indexentry {Bildschirmausgabe}{31}
+\indexentry {Pfade}{31}
+\indexentry {Inhaltsverzeichnis}{32}
+\indexentry {Bibliografie}{32}
+\indexentry {Index}{32}
+\indexentry {Glossar}{32}
+\indexentry {Projekt}{32}
+\indexentry {Viewer}{32}
+\indexentry {Endlosschleife}{32}
+\indexentry {Navigator}{33}
+\indexentry {Navigationsleiste}{33}
+\indexentry {Fehlersuche}{33}
+\indexentry {Batchmodus}{34}
+\indexentry {TeXnicCenter@\TeX nicCenter}{35}
+\indexentry {Rechtschreibprüfung}{35}
+\indexentry {OpenOffice}{35}
+\indexentry {Benutzerwörterbuch}{35}
+\indexentry {Gnome}{36}
+\indexentry {Kile}{36}
+\indexentry {Kodierung}{38}
+\indexentry {UTF-8}{38}
+\indexentry {Umkodierung}{38}
+\indexentry {TeXnicCenter@\TeX nicCenter}{38}
+\indexentry {Projekt}{38}
+\indexentry {Fehlersuche}{39}
+\indexentry {Batchmode}{39}
+\indexentry {Rechtschreibprüfung}{40}
+\indexentry {Rechtschreibprüfung}{40}
+\indexentry {Wörterbuch}{40}
+\indexentry {Rechtschreibprüfung}{47}
+\indexentry {Präambel}{51}
+\indexentry {Textkörper}{51}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{52}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{52}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{53}
+\indexentry {Präambel}{53}
+\indexentry {Dokumentenkörper}{53}
+\indexentry {Präambel}{53}
+\indexentry {Textkörper}{53}
+\indexentry {Präambel}{54}
+\indexentry {Schriftkodierung}{54}
+\indexentry {Schriftkodierung}{54}
+\indexentry {Vektorschrift}{54}
+\indexentry {Eingabekodierung}{54}
+\indexentry {Titel}{54}
+\indexentry {Autor}{54}
+\indexentry {Datum}{54}
+\indexentry {Adobe Reader}{55}
+\indexentry {Zeilenabstand}{56}
+\indexentry {Durchschuss}{56}
+\indexentry {skip}{58}
+\indexentry {Dokumentenklasse}{59}
+\indexentry {Logdatei}{59}
+\indexentry {Dokumentenklasse}{59}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{59}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{59}
+\indexentry {Document@\idxtextClasses !report@{\sffamily report}}{59}
+\indexentry {Document@\idxtextClasses !letter@{\sffamily letter}}{59}
+\indexentry {Document@\idxtextClasses !memoir@{\sffamily memoir}}{59}
+\indexentry {KOMAScript@\KOMAScript }{59}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{59}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{59}
+\indexentry {Document@\idxtextClasses !report@{\sffamily report}}{59}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{59}
+\indexentry {Document@\idxtextClasses !letter@{\sffamily letter}}{59}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{60}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{60}
+\indexentry {Document@\idxtextClasses !report@{\sffamily report}}{60}
+\indexentry {Document@\idxtextClasses !letter@{\sffamily letter}}{60}
+\indexentry {Document@\idxtextClasses !memoir@{\sffamily memoir}}{60}
+\indexentry {KOMAScript@\KOMAScript }{60}
+\indexentry {Document@\idxtextClasses !memoir@{\sffamily memoir}}{60}
+\indexentry {Schneidemarken}{60}
+\indexentry {KOMAScript@\KOMAScript }{61}
+\indexentry {Document@\idxtextClasses !scrbook@{\sffamily scrbook}}{61}
+\indexentry {Document@\idxtextClasses !scrartcl@{\sffamily scrartcl}}{61}
+\indexentry {Document@\idxtextClasses !scrreprt@{\sffamily scrreprt}}{61}
+\indexentry {Document@\idxtextClasses !scrlettr2@{\sffamily scrlettr2}}{61}
+\indexentry {Briefklasse}{61}
+\indexentry {Document@\idxtextClasses !letter@{\sffamily letter}}{61}
+\indexentry {Bindekorrektur}{61}
+\indexentry {Document@\idxtextClasses !scrlettr2@{\sffamily scrlettr2}}{61}
+\indexentry {Document@\idxtextClasses !scrartcl@{\sffamily scrartcl}}{61}
+\indexentry {Document@\idxtextClasses !scrreprt@{\sffamily scrreprt}}{61}
+\indexentry {Document@\idxtextClasses !scrbook@{\sffamily scrbook}}{61}
+\indexentry {Document@\idxtextClasses !scrlettr2@{\sffamily scrlettr2}}{61}
+\indexentry {Papierformat}{62}
+\indexentry {Bindekorrektur}{62}
+\indexentry {Teilungsverhältnis}{62}
+\indexentry {Kopfzeile}{62}
+\indexentry {Druckseiten}{62}
+\indexentry {Druckseiten}{62}
+\indexentry {Spalten}{62}
+\indexentry {Spalten}{62}
+\indexentry {Kapitelanfang}{62}
+\indexentry {Seitenvorschub}{62}
+\indexentry {Absatzabstand}{62}
+\indexentry {Absatzeinzug}{62}
+\indexentry {Kopf\/linie}{62}
+\indexentry {Fußlinie}{62}
+\indexentry {Kapitel}{62}
+\indexentry {Anhang}{62}
+\indexentry {Bildunterschrift}{62}
+\indexentry {Tabellenbeschriftung}{62}
+\indexentry {Schriftgröße}{63}
+\indexentry {Verzeichnisse}{63}
+\indexentry {Inhaltsverzeichnis}{63}
+\indexentry {Zusammenfassung}{63}
+\indexentry {Nummerierung}{63}
+\indexentry {Schrift!Höhe}{64}
+\indexentry {Schrift!Breite}{64}
+\indexentry {Schrift!Tiefe}{64}
+\indexentry {Schreibmaschinenschrift}{64}
+\indexentry {Typewriterschrift}{64}
+\indexentry {Monospaceschrift}{64}
+\indexentry {Backslash}{65}
+\indexentry {Eingabekodierung}{67}
+\indexentry {Kodierung}{67}
+\indexentry {Kodierung!ascii}{67}
+\indexentry {ISO 8859-1}{67}
+\indexentry {Albanisch}{67}
+\indexentry {Dänisch}{67}
+\indexentry {Deutsch}{67}
+\indexentry {Englisch}{67}
+\indexentry {Faröisch}{67}
+\indexentry {Finnisch}{67}
+\indexentry {Französisch}{67}
+\indexentry {Galizisch}{67}
+\indexentry {Irisch}{67}
+\indexentry {Isländisch}{67}
+\indexentry {Katalanisch}{67}
+\indexentry {Niederländisch}{67}
+\indexentry {Norwegisch}{67}
+\indexentry {Portugiesisch}{67}
+\indexentry {Schwedisch}{67}
+\indexentry {Spanisch}{67}
+\indexentry {ISO 8859-2}{67}
+\indexentry {Kroatisch}{67}
+\indexentry {Polnisch}{67}
+\indexentry {Rumänisch}{67}
+\indexentry {Slowakisch}{67}
+\indexentry {Slowenisch}{67}
+\indexentry {Tschechisch}{67}
+\indexentry {Ungarisch}{67}
+\indexentry {ISO 8859-3}{67}
+\indexentry {Esperanto}{67}
+\indexentry {Maltesisch}{67}
+\indexentry {Türkisch}{67}
+\indexentry {ISO 8859-4}{67}
+\indexentry {Estnisch}{67}
+\indexentry {Lettisch}{67}
+\indexentry {Litauisch}{67}
+\indexentry {ISO 8859-15}{67}
+\indexentry {Französisch}{67}
+\indexentry {Finnisch}{67}
+\indexentry {Windows 1250}{67}
+\indexentry {Windows 1252}{67}
+\indexentry {Windows 1257}{67}
+\indexentry {ANSI}{67}
+\indexentry {Mac OS~X}{67}
+\indexentry {UTF-8}{67}
+\indexentry {Eurozeichen}{67}
+\indexentry {\euro {}}{67}
+\indexentry {Eurozeichen}{68}
+\indexentry {Latin-1}{68}
+\indexentry {Glyph}{70}
+\indexentry {Encodingtabelle}{70}
+\indexentry {Schriftkodierung}{70}
+\indexentry {Bitmap}{70}
+\indexentry {Type-3}{70}
+\indexentry {Vektorschrift}{71}
+\indexentry {Bitmapschrift}{71}
+\indexentry {Cork-Kodierung}{72}
+\indexentry {IPA}{72}
+\indexentry {Cork-Kodierung}{72}
+\indexentry {IPA}{72}
+\indexentry {TrueType}{72}
+\indexentry {OpenType}{72}
+\indexentry {Akzent}{73}
+\indexentry {Trennalgorithmus}{75}
+\indexentry {Standardsprache}{76}
+\indexentry {Kapitel}{76}
+\indexentry {Inhaltsverzeichnis}{76}
+\indexentry {Kroatisch}{76}
+\indexentry {Tschechisch}{76}
+\indexentry {Dänisch}{76}
+\indexentry {Niederländisch}{76}
+\indexentry {Englisch}{76}
+\indexentry {Estländisch}{76}
+\indexentry {Finnisch}{76}
+\indexentry {Französisch}{76}
+\indexentry {Deutsch}{76}
+\indexentry {Griechisch}{76}
+\indexentry {Hebräisch}{76}
+\indexentry {Ungarisch}{76}
+\indexentry {Isländisch}{76}
+\indexentry {Italienisch}{76}
+\indexentry {Niedersorbisch}{76}
+\indexentry {Devnagari}{76}
+\indexentry {Norwegisch}{76}
+\indexentry {Polnisch}{76}
+\indexentry {Portugiesisch}{76}
+\indexentry {Rumänisch}{76}
+\indexentry {Russisch}{76}
+\indexentry {Spanisch}{76}
+\indexentry {Schwedisch}{76}
+\indexentry {Serbisch}{76}
+\indexentry {Türkisch}{76}
+\indexentry {Ukrainisch}{76}
+\indexentry {Datumsformat}{77}
+\indexentry {Uberschrift@Überschriftenformat}{77}
+\indexentry {Trennregeln}{77}
+\indexentry {shorthand}{78}
+\indexentry {\textacutedbl }{78}
+\indexentry {""~@\texttt{""\textasciitilde}}{79}
+\indexentry {""=@\texttt{""=}}{79}
+\indexentry {""""@\texttt{""""}}{79}
+\indexentry {""=@\texttt{""=}}{79}
+\indexentry {""~@\texttt{""\textasciitilde}}{79}
+\indexentry {""""@\texttt{""""}}{79}
+\indexentry {Kroatisch}{80}
+\indexentry {Tcheschisch}{80}
+\indexentry {Niederländisch}{80}
+\indexentry {Englisch}{80}
+\indexentry {Finnisch}{80}
+\indexentry {Französisch}{80}
+\indexentry {Deutsch}{80}
+\indexentry {Griechisch}{80}
+\indexentry {Ungarisch}{80}
+\indexentry {Italienisch}{80}
+\indexentry {Polnisch}{80}
+\indexentry {Portugiesisch}{80}
+\indexentry {Russisch}{80}
+\indexentry {Spanisch}{80}
+\indexentry {Slowakisch}{80}
+\indexentry {Slowenisch}{80}
+\indexentry {Schwedisch}{80}
+\indexentry {Serbisch}{80}
+\indexentry {Türkisch}{80}
+\indexentry {Ukrainisch}{80}
+\indexentry {Anführungszeichen}{81}
+\indexentry {Guillemets}{82}
+\indexentry {Internetadresse}{84}
+\indexentry {URL}{84}
+\indexentry {Serifenschrift}{85}
+\indexentry {Schrift!Serifen}{85}
+\indexentry {Mathematiksatz}{85}
+\indexentry {Vektorschrift}{85}
+\indexentry {Schriftfamilie}{85}
+\indexentry {shape}{86}
+\indexentry {italic}{86}
+\indexentry {slanted}{86}
+\indexentry {Glyph}{87}
+\indexentry {Schrift!Gewicht}{87}
+\indexentry {Schrift!Laufweite}{87}
+\indexentry {Schriftstärke}{87}
+\indexentry {Schriftgröße}{87}
+\indexentry {Zeichensatzbefehle}{87}
+\indexentry {Kursivkorrektur}{88}
+\indexentry {Italic-Korrektur}{88}
+\indexentry {Ligaturen}{89}
+\indexentry {Satzspiegel}{91}
+\indexentry {Papierformat}{91}
+\indexentry {DIN~476}{91}
+\indexentry {ISO~216}{91}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{93}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{93}
+\indexentry {Document@\idxtextClasses !report@{\sffamily report}}{93}
+\indexentry {KOMAScript@\KOMAScript }{93}
+\indexentry {Satzspiegel}{94}
+\indexentry {Papierformat}{96}
+\indexentry {Querformat}{96}
+\indexentry {Hochformat}{96}
+\indexentry {Papierhöhe}{96}
+\indexentry {Papierbreite}{96}
+\indexentry {Papiergröße}{96}
+\indexentry {Hurenkind}{102}
+\indexentry {Witwe}{102}
+\indexentry {Schusterjunge}{103}
+\indexentry {Waisenkind}{103}
+\indexentry {Satzspiegelberechnung}{103}
+\indexentry {Satzspiegel}{103}
+\indexentry {Doppelseite}{103}
+\indexentry {Bindekorrektur}{103}
+\indexentry {Neunerteilung}{103}
+\indexentry {Schnittmarken}{110}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{113}
+\indexentry {Schmutztitel}{115}
+\indexentry {Paginierung}{115}
+\indexentry {Seitenstil}{117}
+\indexentry {Fußzeile}{119}
+\indexentry {Kopfzeile}{119}
+\indexentry {Kolumnentitel}{121}
+\indexentry {Seitenstil}{122}
+\indexentry {Kolumnentitel}{126}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{128}
+\indexentry {Document@\idxtextClasses !scrbook@{\sffamily scrbook}}{128}
+\indexentry {Document@\idxtextClasses !report@{\sffamily report}}{128}
+\indexentry {Document@\idxtextClasses !scrreprt@{\sffamily scrreprt}}{128}
+\indexentry {TOC}{128}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{128}
+\indexentry {Document@\idxtextClasses !scrartcl@{\sffamily scrartcl}}{128}
+\indexentry {Inhaltsverzeichnis}{128}
+\indexentry {Gliederungsebene}{128}
+\indexentry {Document@\idxtextClasses !scrbook@{\sffamily scrbook}}{129}
+\indexentry {Document@\idxtextClasses !scrartcl@{\sffamily scrartcl}}{129}
+\indexentry {Zentrieren}{141}
+\indexentry {Flattersatz}{142}
+\indexentry {Flattersatz}{143}
+\indexentry {Worttrennung}{143}
+\indexentry {Liedtexte}{145}
+\indexentry {Silbentrennung}{149}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{150}
+\indexentry {Document@\idxtextClasses !report@{\sffamily report}}{150}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{150}
+\indexentry {Randbemerkung}{157}
+\indexentry {Marginalie}{157}
+\indexentry {optischer Randausgleich}{163}
+\indexentry {Wortzwischenraum}{165}
+\indexentry {Bounding Box}{165}
+\indexentry {Bounding Box}{166}
+\indexentry {TDS}{172}
+\indexentry {LR-Box}{173}
+\indexentry {Absatzbox}{174}
+\indexentry {Label}{181}
+\indexentry {Document@\idxtextClasses !IEEEtran@{\sffamily IEEEtran}}{185}
+\indexentry {Dateilinks}{188}
+\indexentry {PDF/A}{189}
+\indexentry {Bookmark}{189}
+\indexentry {UTF-16}{189}
+\indexentry {URL}{190}
+\indexentry {Gleitumgebung}{200}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{202}
+\indexentry {Übersetzung}{207}
+\indexentry {kritische Edition}{208}
+\indexentry {Projekt}{210}
+\indexentry {Präambel}{210}
+\indexentry {Querverweis}{212}
+\indexentry {Typografie}{213}
+\indexentry {Konventionen}{213}
+\indexentry {Fußnotenzähler}{213}
+\indexentry {tabular@{\ttfamily tabular} Env.|(idxbf}{214}
+\indexentry {Syntax}{214}
+\indexentry {Spaltendefinition}{214}
+\indexentry {Spaltendefinition}{214}
+\indexentry {Tabelle!Breite}{214}
+\indexentry {Wiederholungsfaktor}{215}
+\indexentry {Spaltenabstand}{215}
+\indexentry {Sternversion}{215}
+\indexentry {Tabellenbreite}{215}
+\indexentry {Spaltenabstand}{215}
+\indexentry {Linie!vertikal}{216}
+\indexentry {Linie!horizontal}{216}
+\indexentry {Linie!farbig}{217}
+\indexentry {Spaltendefinition}{217}
+\indexentry {tabular@{\ttfamily tabular} Env.|)idxbf}{218}
+\indexentry {Linie}{219}
+\indexentry {Zeile!Höhe}{219}
+\indexentry {Zeile!Tiefe}{220}
+\indexentry {Fettschrift}{220}
+\indexentry {Inlinemodus}{221}
+\indexentry {Trennlinie}{221}
+\indexentry {Spaltentyp}{222}
+\indexentry {Spaltendefinition}{222}
+\indexentry {Tabelle!Kopf}{222}
+\indexentry {Kopfzeile}{222}
+\indexentry {Trennung}{222}
+\indexentry {Worttrennung}{223}
+\indexentry {Flattersatz}{223}
+\indexentry {Linksbündig}{223}
+\indexentry {Rechtsbündig}{223}
+\indexentry {vertikale Linien}{223}
+\indexentry {Linie!vertikal}{223}
+\indexentry {Spaltendeklaration}{224}
+\indexentry {Tabelle!gerahmt}{224}
+\indexentry {Grundlinie}{224}
+\indexentry {Baseline}{224}
+\indexentry {Basislinie}{224}
+\indexentry {Matrix}{227}
+\indexentry {Spaltendefinition}{228}
+\indexentry {Dokumentenpräambel}{228}
+\indexentry {Spaltentyp}{229}
+\indexentry {delimiter}{229}
+\indexentry {Zeile!Zähler}{230}
+\indexentry {Fußnote}{230}
+\indexentry {Linie}{230}
+\indexentry {Linie!vertikal}{230}
+\indexentry {Linie!horizontal}{230}
+\indexentry {Zeile!Abstand}{234}
+\indexentry {Farbe}{236}
+\indexentry {Spaltenfarbe}{236}
+\indexentry {Zeile!Farbe}{236}
+\indexentry {Zellenfarbe}{236}
+\indexentry {Farbmodell}{236}
+\indexentry {Gleitumgebung}{240}
+\indexentry {Tortendiagramm}{244}
+\indexentry {Funktionsgraph}{244}
+\indexentry {Referenzieren}{245}
+\indexentry {Label}{245}
+\indexentry {Sortierung}{247}
+\indexentry {Null}{247}
+\indexentry {SQL-Datenbank}{247}
+\indexentry {Clipping}{247}
+\indexentry {Zahlenkolonnen}{247}
+\indexentry {Dezimalpunkt}{247}
+\indexentry {Dezimalkomma}{247}
+\indexentry {Punkt}{248}
+\indexentry {Komma}{248}
+\indexentry {Cluster}{248}
+\indexentry {Dezimalstellen}{248}
+\indexentry {Seitenumbruch}{252}
+\indexentry {Umbruchmöglichkeit}{252}
+\indexentry {Gruppe}{252}
+\indexentry {list of tables}{256}
+\indexentry {lot}{256}
+\indexentry {list of tables}{256}
+\indexentry {lot}{256}
+\indexentry {Clown}{256}
+\indexentry {lot}{256}
+\indexentry {multiply defined labels}{258}
+\indexentry {longtable@\nxLPack {longtable}!Tabellenüberschrift}{259}
+\indexentry {longtable@\nxLPack {longtable}!Tabellenunterschrift}{259}
+\indexentry {Tabellenüberschrift!longtable@\nxLPack {longtable}}{259}
+\indexentry {Tabellenunterschrift!longtable@\nxLPack {longtable}}{259}
+\indexentry {Fußnotenzählung}{260}
+\indexentry {Fußnote}{260}
+\indexentry {Grundlinie}{264}
+\indexentry {Baseline}{264}
+\indexentry {Zählung}{267}
+\indexentry {Tabelle!geschachtelt}{268}
+\indexentry {multirow-Zelle@\nxLenv {multirow}-Zelle}{268}
+\indexentry {Spaltentyp}{268}
+\indexentry {p-Spalte}{268}
+\indexentry {Zeile!Vorschub}{269}
+\indexentry {Feinjustierung}{270}
+\indexentry {p-Spalte@\protect \nxLnotation {p}-Spalte}{271}
+\indexentry {Blocksatz}{271}
+\indexentry {r-Spalte@\protect \nxLnotation {r}-Spalte}{271}
+\indexentry {Tabelle!Farbe}{273}
+\indexentry {Spaltentyp}{274}
+\indexentry {Spaltenabstand}{274}
+\indexentry {Tabellenkalkulation}{282}
+\indexentry {Tabelle!Breite}{289}
+\indexentry {Zeile!Breite}{289}
+\indexentry {Spaltentyp}{290}
+\indexentry {Spaltenbreite}{290}
+\indexentry {Spaltenzwischenraum}{290}
+\indexentry {X-Spalte}{290}
+\indexentry {X-Spalte}{290}
+\indexentry {Abbildung}{309}
+\indexentry {Tabelle}{309}
+\indexentry {Textanteil}{309}
+\indexentry {Gleitumgebung}{309}
+\indexentry {Float}{309}
+\indexentry {Tabelle}{310}
+\indexentry {Abbildungsverzeichnis}{310}
+\indexentry {Tabellenverzeichnis}{310}
+\indexentry {moving argument}{321}
+\indexentry {Beschriftung}{324}
+\indexentry {Bezeichner}{324}
+\indexentry {float box}{337}
+\indexentry {Legende}{350}
+\indexentry {Flattersatz}{358}
+\indexentry {Flattersatz}{358}
+\indexentry {AMS}{376}
+\indexentry {Zeilenmodus}{376}
+\indexentry {Zeilenmodus}{377}
+\indexentry {Layout}{377}
+\indexentry {robust}{377}
+\indexentry {Zeilenhöhe}{378}
+\indexentry {Zeilenmodus}{378}
+\indexentry {Superscript}{378}
+\indexentry {Subscript}{378}
+\indexentry {Bruch}{378}
+\indexentry {Schrift!Stil}{378}
+\indexentry {Operator}{378}
+\indexentry {robust}{378}
+\indexentry {Zeilenmodus}{379}
+\indexentry {Adobe Reader}{380}
+\indexentry {Zeilenumbruch}{380}
+\indexentry {Relationssymbol}{380}
+\indexentry {Zeilenmodus}{380}
+\indexentry {displaymath mode}{381}
+\indexentry {Absatz}{381}
+\indexentry {Matrix}{383}
+\indexentry {Gleichungsnummer}{383}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{383}
+\indexentry {Zähler}{383}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{383}
+\indexentry {Gleichungsnummerierung}{384}
+\indexentry {Zähler}{384}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{384}
+\indexentry {Rücksetzschalter}{385}
+\indexentry {Rücksetzbefehl}{385}
+\indexentry {Dokumentenklasse}{386}
+\indexentry {class option}{386}
+\indexentry {Marke}{387}
+\indexentry {Label}{387}
+\indexentry {Zähler}{387}
+\indexentry {Referenz}{387}
+\indexentry {Gleichungsnummer}{389}
+\indexentry {Phantom}{389}
+\indexentry {Rahmenfarbe}{389}
+\indexentry {Hintergrundfarbe}{389}
+\indexentry {Zeilenmodus}{391}
+\indexentry {Fallunterscheidung}{392}
+\indexentry {Subscript}{393}
+\indexentry {Summe}{393}
+\indexentry {Produkt}{393}
+\indexentry {Quadratwurzel}{393}
+\indexentry {Klammer}{394}
+\indexentry {Backslash}{394}
+\indexentry {Delimiter}{394}
+\indexentry {Klammersymbole}{394}
+\indexentry {Mathopen-Symbol}{396}
+\indexentry {largesymbols}{396}
+\indexentry {Basislinie}{397}
+\indexentry {Text}{398}
+\indexentry {Roman-Zeichensatz}{399}
+\indexentry {mu (Einheit)@\texttt {mu}}{399}
+\indexentry {dynamische Länge}{400}
+\indexentry {glue}{400}
+\indexentry {Symbol}{400}
+\indexentry {Operator}{400}
+\indexentry {Atom}{400}
+\indexentry {Atom}{401}
+\indexentry {Schriftstil}{404}
+\indexentry {Zeilenmodus}{404}
+\indexentry {inline mode}{404}
+\indexentry {Schriftgröße}{404}
+\indexentry {Bruch}{404}
+\indexentry {Index}{405}
+\indexentry {Exponent}{405}
+\indexentry {Dokumentenklasse}{405}
+\indexentry {interline spacing}{405}
+\indexentry {Matrix}{405}
+\indexentry {Punkte}{405}
+\indexentry {Dots}{405}
+\indexentry {Determinante}{406}
+\indexentry {Matrix}{406}
+\indexentry {Akzent}{406}
+\indexentry {Vektor}{407}
+\indexentry {Zeichen (aktives)}{408}
+\indexentry {Exponent}{408}
+\indexentry {Index}{408}
+\indexentry {Operator}{408}
+\indexentry {Operator-Symbol}{408}
+\indexentry {Operatorname}{408}
+\indexentry {Index}{409}
+\indexentry {Exponent}{409}
+\indexentry {Subscript}{409}
+\indexentry {Superscript}{409}
+\indexentry {Symbol!gestockt}{411}
+\indexentry {Textmodus}{411}
+\indexentry {Mathematikmodus}{411}
+\indexentry {Schrift!fett}{411}
+\indexentry {Textschrift}{411}
+\indexentry {Schrift!Größe}{412}
+\indexentry {Titel}{413}
+\indexentry {Items}{413}
+\indexentry {Differentialquotient}{414}
+\indexentry {Operator}{414}
+\indexentry {Variable}{414}
+\indexentry {Integrationsvariable}{414}
+\indexentry {Abstand}{414}
+\indexentry {Makronamen}{414}
+\indexentry {American Mathematical Society (AMS)}{415}
+\indexentry {Document@\idxtextClasses !amsbook@{\sffamily amsbook}}{415}
+\indexentry {Document@\idxtextClasses !amsart@{\sffamily amsart}}{415}
+\indexentry {Fallunterscheidung}{425}
+\indexentry {Matrix}{426}
+\indexentry {Klammerpaar}{427}
+\indexentry {Spalten}{428}
+\indexentry {Spaltenanzahl}{428}
+\indexentry {Punkte}{428}
+\indexentry {Schrittweite}{428}
+\indexentry {Tridiagonalmatrix}{428}
+\indexentry {Bruch}{429}
+\indexentry {Binom}{429}
+\indexentry {Bruch}{429}
+\indexentry {Binom}{429}
+\indexentry {Begrenzer}{430}
+\indexentry {Bruch}{430}
+\indexentry {Kettenbruch}{430}
+\indexentry {continued fraction}{430}
+\indexentry {Divisior}{431}
+\indexentry {Binom}{431}
+\indexentry {Binom}{431}
+\indexentry {Wurzel}{431}
+\indexentry {mu}{432}
+\indexentry {Index}{432}
+\indexentry {Radikand}{432}
+\indexentry {Wurzelexponent}{432}
+\indexentry {Akzent}{433}
+\indexentry {Modulo}{433}
+\indexentry {Gleichungsnummer}{433}
+\indexentry {Abschnittsnummer}{433}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{434}
+\indexentry {Gleichungsnummer}{434}
+\indexentry {Gleichungsnummerierung}{435}
+\indexentry {Untergleichung}{437}
+\indexentry {Referenz}{437}
+\indexentry {Untergleichung}{437}
+\indexentry {Grenzen}{438}
+\indexentry {Summe}{438}
+\indexentry {Produkt}{438}
+\indexentry {Integral}{438}
+\indexentry {Achse}{439}
+\indexentry {Schriftfamilie}{442}
+\indexentry {Pfeil}{443}
+\indexentry {Doppelpfeil}{444}
+\indexentry {mu}{444}
+\indexentry {Akzent}{447}
+\indexentry {Kommutative Diagramme}{448}
+\indexentry {Integralsymbol}{448}
+\indexentry {Vektor}{448}
+\indexentry {Gaußscher Algorithmus}{448}
+\indexentry {Zufallszahlen}{448}
+\indexentry {Unterstrich}{449}
+\indexentry {Operator}{449}
+\indexentry {Matrix}{449}
+\indexentry {Begrenzer}{450}
+\indexentry {Textmodus}{450}
+\indexentry {Schrift!fett}{451}
+\indexentry {Klammerhöhe}{452}
+\indexentry {Durchstreichen}{453}
+\indexentry {Untergleichung}{454}
+\indexentry {Begrenzer}{455}
+\indexentry {scriptwriting}{459}
+\indexentry {Document@\idxtextClasses !article@{\sffamily article}}{474}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{474}
+\indexentry {Tabellenverzeichnis}{475}
+\indexentry {Abbildungsverzeichnis}{475}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{475}
+\indexentry {Document@\idxtextClasses !book@{\sffamily book}}{475}
+\indexentry {indent}{476}
+\indexentry {numwidth}{476}
+\indexentry {Sortierung}{489}
+\indexentry {DIN\,5007}{512}
+\indexentry {TeXLive@\TeXLive}{512}
+\indexentry {Glossar}{523}
+\indexentry {Homograph}{529}
+\indexentry {Bibliografie|(}{537}
+\indexentry {Flattersatz}{538}
+\indexentry {Flattersatz}{539}
+\indexentry {TeXLive@\TeXLive}{542}
+\indexentry {Autor"=Jahr"=Schema}{544}
+\indexentry {bookauthor}{557}
+\indexentry {Onlinequelle}{561}
+\indexentry {Tagebuchnotation}{561}
+\indexentry {Sigel}{561}
+\indexentry {Patronyme}{564}
+\indexentry {Metronyme}{564}
+\indexentry {Betriebswirtschaftslehre}{571}
+\indexentry {Document@\idxtextClasses !ctexart@{\sffamily ctexart}}{572}
+\indexentry {Leibniz Universität Hannover}{583}
+\indexentry {NEJM}{585}
+\indexentry {MLA}{586}
+\indexentry {Autor-Stil}{586}
+\indexentry {TeXLive@\TeXLive}{590}
+\indexentry {Bibliografie|)}{592}
+\indexentry {Schriftfamilie}{595}
+\indexentry {Mediävalziffern}{595}
+\indexentry {Minuskelziffern}{595}
+\indexentry {Serienattribut}{596}
+\indexentry {Laufweite}{596}
+\indexentry {OpenType}{601}
+\indexentry {TrueType}{601}
+\indexentry {TeXLive@\TeXLive}{610}
+\indexentry {Document@\idxtextClasses !beamer@{\sffamily beamer}}{615}
+\indexentry {Document@\idxtextClasses !powerdot@{\sffamily powerdot}}{615}
+\indexentry {Document@\idxtextClasses !beamer@{\sffamily beamer}}{615}
+\indexentry {Navigationsleiste}{616}
+\indexentry {Document@\idxtextClasses !beamer@{\sffamily beamer}}{617}
+\indexentry {Document@\idxtextClasses !beamer@{\sffamily beamer}}{617}
+\indexentry {Document@\idxtextClasses !beamer@{\sffamily beamer}}{618}
+\indexentry {Layout}{618}
+\indexentry {Bildschirm}{619}
+\indexentry {Navigationsleiste}{619}
+\indexentry {sidebar}{619}
+\indexentry {Folie}{621}
+\indexentry {Overlay}{621}
+\indexentry {Seitenverhältnis}{621}
+\indexentry {4:3}{621}
+\indexentry {Document@\idxtextClasses !beamer@{\sffamily beamer}}{622}
+\indexentry {Label}{626}
+\indexentry {Overlayspezifikation}{627}
+\indexentry {Unsichtbarkeit}{631}
+\indexentry {Overlays}{631}
+\indexentry {Transparenz}{631}
+\indexentry {Transparenz}{631}
+\indexentry {Gleitumgebung}{634}
+\indexentry {Folienübergänge}{639}
+\indexentry {Vollbildmodus}{639}
+\indexentry {Adobe Reader}{639}
+\indexentry {Flattersatz}{640}
+\indexentry {Corporate Design}{642}
+\indexentry {Verbatim-Modus}{654}
+\indexentry {Template}{657}
+\indexentry {Template}{657}
+\indexentry {Titelkopf}{658}
+\indexentry {Vordergrundfarbe}{658}
+\indexentry {Hintergrundfarbe}{658}
+\indexentry {Beamer-Template!logo@\texttt {logo}}{659}
+\indexentry {Beamer-Template!navigation symbols@\texttt {navigation symbols}}{659}
+\indexentry {Schriftattribut}{660}
+\indexentry {Document@\idxtextClasses !beamer@{\sffamily beamer}}{660}
+\indexentry {Document@\idxtextClasses !beamer@{\sffamily beamer}}{660}
+\indexentry {Fontshape}{661}
+\indexentry {Fontserie}{661}
+\indexentry {Fontfamilie}{661}
+\indexentry {Farbe}{669}
+\indexentry {Farbmodell}{669}
+\indexentry {CMYK}{671}
+\indexentry {Farbserie}{672}
+\indexentry {Farbmodell!CMYK}{673}
+\indexentry {Farbmodell!RGB}{673}
+\indexentry {Farbmodell!HSB}{673}
+\indexentry {RGB}{674}
+\indexentry {Hintergrundfarbe}{679}
+\indexentry {Farbwert}{680}
+\indexentry {Farbserie}{680}
+\indexentry {Farbe!Modell}{680}
+\indexentry {Farbe!konvertieren}{680}
+\indexentry {Index}{699}
+\indexentry {Maßeinheit}{711}
+\indexentry {Bezierkurve@Bézierkurve}{715}
+\indexentry {Bezierkurve@Bézierkurve}{721}
+\indexentry {Schnittpunkt}{722}
+\indexentry {Bounding Box}{730}
+\indexentry {Tortendiagramm}{746}
+\indexentry {PostScript}{750}
+\indexentry {Seitenbeschreibungssprache}{750}
+\indexentry {Page Coded Language}{750}
+\indexentry {3D}{752}
+\indexentry {TeXLive@\TeXLive}{766}
+\indexentry {Ellipse}{770}
+\indexentry {Parabel}{770}
+\indexentry {Clippingpfad}{771}
+\indexentry {Knoten}{775}
+\indexentry {Kochsche Schneeflocke}{778}
+\indexentry {Entity-Relationship}{798}
+\indexentry {IUPAC}{814}
+\indexentry {Bounding Box}{825}
+\indexentry {Document@\idxtextClasses !europecv@{\sffamily europecv}}{827}
+\indexentry {Document@\idxtextClasses !europecv@{\sffamily europecv}}{827}
+\indexentry {Document@\idxtextClasses !europecv@{\sffamily europecv}}{828}
+\indexentry {Document@\idxtextClasses !europecv@{\sffamily europecv}}{830}
+\indexentry {Wickelfalz}{832}
+\indexentry {Zickzackfalz}{832}
+\indexentry {Document@\idxtextClasses !scrartcl@{\sffamily scrartcl}}{834}
+\indexentry {Document@\idxtextClasses !scrlttr2@{\sffamily scrlttr2}}{837}
+\indexentry {Makro}{848}
+\indexentry {Umgebung}{848}
+\indexentry {TeXLive@\TeXLive}{855}
+\indexentry {Maßzahl}{859}
+\indexentry {Maßeinheit}{859}
+\indexentry {bp}{859}
+\indexentry {cc}{859}
+\indexentry {cm}{859}
+\indexentry {dd}{859}
+\indexentry {in}{859}
+\indexentry {mm}{859}
+\indexentry {mu}{860}
+\indexentry {pc}{860}
+\indexentry {pt}{860}
+\indexentry {px}{860}
+\indexentry {sp}{860}
+\indexentry {em}{860}
+\indexentry {ex}{860}
+\indexentry {dimen register}{860}
+\indexentry {skip register}{860}
+\indexentry {rubber length}{860}
+\indexentry {Maßeinheit}{860}
+\indexentry {skip}{860}
+\indexentry {skip register}{861}
+\indexentry {Zähler}{862}
+\indexentry {Counter}{862}
+\indexentry {Gruppe}{864}
+\indexentry {global}{864}
+\indexentry {lokal}{864}
+\indexentry {Rekursion}{865}
+\indexentry {Leerzeichen}{866}
+\indexentry {Expansion}{868}
+\indexentry {Bad math}{869}
+\indexentry {GenericError}{869}
+\indexentry {math shift}{869}
+\indexentry {TeXLive@\TeXLive}{870}
+\indexentry {Präambel}{871}
+\indexentry {Textkörper}{871}
+\indexentry {option clash}{871}
+\indexentry {TDS}{872}
+\indexentry {TeXLive@\TeXLive}{872}
+\indexentry {FNDB}{872}
+\indexentry {TeXLive@\TeXLive}{872}
+\indexentry {TeXLive@\TeXLive}{872}
+\indexentry {TeXLive@\TeXLive}{872}
+\indexentry {TeXLive@\TeXLive}{872}
+\indexentry {TeXLive@\TeXLive}{873}
+\indexentry {TeXLive@\TeXLive}{873}
+\indexentry {TeXLive@\TeXLive}{873}
+\indexentry {TeXLive@\TeXLive}{874}
+\indexentry {TeXLive@\TeXLive}{874}
+\indexentry {TeXLive@\TeXLive}{874}
+\indexentry {TeXLive@\TeXLive}{874}
+\indexentry {TeXLive@\TeXLive}{877}
+\indexentry {TeXLive@\TeXLive}{878}
+\indexentry {TeXLive@\TeXLive}{879}
+\indexentry {USB-Stick}{879}
+\indexentry {TeXLive@\TeXLive}{879}
+\indexentry {TeXLive@\TeXLive}{879}
+\indexentry {Con\TeX t}{879}
+\indexentry {Logdatei}{880}
+\indexentry {Batchmode}{883}
+\indexentry {Logfile}{883}
+\indexentry {Systemmeldung}{883}
+\indexentry {Warnung}{883}
+\indexentry {Schrift!Warnung}{883}
+\indexentry {Overfull box}{883}
+\indexentry {Gleitumgebung}{885}
+\indexentry {Minimalbeispiel}{888}
+\indexentry {TeXLive@\TeXLive}{890}
+\indexentry {TeXLive@\TeXLive}{890}
diff --git a/indexing/xindex/doc/tests/buch.pdf b/indexing/xindex/doc/tests/buch.pdf
new file mode 100644
index 0000000000..67bfb3d191
--- /dev/null
+++ b/indexing/xindex/doc/tests/buch.pdf
Binary files differ
diff --git a/indexing/xindex/doc/tests/buch.tex b/indexing/xindex/doc/tests/buch.tex
new file mode 100644
index 0000000000..8369a1fc63
--- /dev/null
+++ b/indexing/xindex/doc/tests/buch.tex
@@ -0,0 +1,19 @@
+\documentclass[paper=a4,parskip=half-,ngerman]{scrartcl}
+\usepackage{eurosym}
+\usepackage[silent]{fontspec}
+\usepackage{libertinus-otf}
+\usepackage{babel}
+\usepackage{makeidx}
+\usepackage{dtk-logos}
+
+%\newcommand\doublequote{"{}}
+\let\nxLnotation\texttt
+\let\nxLPack\texttt
+\let\nxLenv\texttt
+\let\nxLkeyword\texttt
+\let\idxbf\textbf
+\def\idxtextClasses{Dokumentenklasse}
+\begin{document}
+
+\printindex
+\end{document}
diff --git a/indexing/xindex/doc/tests/demo-hyperref.idx b/indexing/xindex/doc/tests/demo-hyperref.idx
new file mode 100644
index 0000000000..128eb26d69
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo-hyperref.idx
@@ -0,0 +1,187 @@
+\indexentry{Märtyrer|hyperpage}{1}
+\indexentry{erzählt|hyperpage}{1}
+\indexentry{Östereich|hyperpage}{1}
+\indexentry{Auto|hyperindexformat{\textbf}}{1}
+\indexentry{seiner|hyperpage}{1}
+\indexentry{Ansprache|hyperpage}{2}
+\indexentry{mahnte|hyperpage}{2}
+\indexentry{er|hyperpage}{2}
+\indexentry{zu|hyperpage}{3}
+\indexentry{mehr|hyperpage}{3}
+\indexentry{Gelassenheit|hyperpage}{4}
+\indexentry{Gleichzeitig|hyperpage}{4}
+\indexentry{warnte|hyperpage}{4}
+\indexentry{er|hyperindexformat{\seealso{foo}}}{4}
+\indexentry{Minderheiten|hyperpage}{5}
+\indexentry{und|hyperpage}{5}
+\indexentry{Volksvertreter|hyperpage}{6}
+\indexentry{zum|hyperpage}{7}
+\indexentry{Feindbild|hyperpage}{7}
+\indexentry{zu|hyperpage}{8}
+\indexentry{machen.|hyperpage}{8}
+\indexentry{Obwohl|hyperpage}{8}
+\indexentry{es|hyperpage}{8}
+\indexentry{Deutschland|hyperpage}{8}
+\indexentry{gut|hyperpage}{9}
+\indexentry{gehe|hyperpage}{9}
+\indexentry{dominiere|hyperpage}{9}
+\indexentry{der|(hyperpage}{9}
+\indexentry{Pessimismus.|hyperpage}{10}
+\indexentry{Hilfe|hyperpage}{10}
+\indexentry{für|hyperpage}{10}
+\indexentry{Flüchtlinge|hyperpage}{11}
+\indexentry{und|hyperpage}{11}
+\indexentry{andere|hyperpage}{12}
+\indexentry{Migranten|hyperpage}{12}
+\indexentry{sei|hyperpage}{12}
+\indexentry{wichtig|hyperpage}{12}
+\indexentry{und|hyperpage}{12}
+\indexentry{richtig|hyperpage}{13}
+\indexentry{aber|hyperpage}{13}
+\indexentry{nicht|hyperpage}{14}
+\indexentry{unbegrenzt|hyperpage}{14}
+\indexentry{möglich.|hyperpage}{14}
+\indexentry{Deshalb|hyperpage}{14}
+\indexentry{müsse|hyperpage}{14}
+\indexentry{man|hyperpage}{14}
+\indexentry{lernen|hyperpage}{14}
+\indexentry{mit|hyperpage}{14}
+\indexentry{dem|hyperpage}{14}
+\indexentry{Nicht-Perfekten|hyperpage}{14}
+\indexentry{zu|hyperpage}{14}
+\indexentry{leben.|hyperpage}{14}
+\indexentry{Wer|hyperpage}{14}
+\indexentry{das|hyperpage}{15}
+\indexentry{Perfekte|hyperpage}{15}
+\indexentry{anstrebt|hyperpage}{15}
+\indexentry{endet|hyperpage}{15}
+\indexentry{in|hyperpage}{15}
+\indexentry{der|hyperpage}{15}
+\indexentry{Diktatur|hyperpage}{16}
+\indexentry{Ägäis|hyperpage}{17}
+\indexentry{Überholmanöver|hyperpage}{17}
+\indexentry{Während|hyperpage}{17}
+\indexentry{Ägäis|hyperpage}{18}
+\indexentry{der|hyperpage}{18}
+\indexentry{Ägäis|hyperpage}{19}
+\indexentry{Festakt|hyperpage}{19}
+\indexentry{sich|hyperpage}{19}
+\indexentry{nach|hyperpage}{19}
+\indexentry{etwa|hyperpage}{19}
+\indexentry{anderthalb|hyperpage}{19}
+\indexentry{Stunden|hyperpage}{19}
+\indexentry{in|hyperpage}{19}
+\indexentry{der|hyperpage}{19}
+\indexentry{Ägäis|hyperpage}{20}
+\indexentry{Staatsoper|hyperpage}{20}
+\indexentry{dem|hyperpage}{21}
+\indexentry{Ende|hyperpage}{21}
+\indexentry{neigte|hyperpage}{21}
+\indexentry{versammelten|hyperpage}{21}
+\indexentry{sich|hyperpage}{21}
+\indexentry{etwa|hyperpage}{21}
+\indexentry{zeitgleich|hyperpage}{21}
+\indexentry{die|hyperpage}{21}
+\indexentry{ersten|hyperpage}{21}
+\indexentry{Teilnehmer|hyperpage}{21}
+\indexentry{einer|hyperpage}{22}
+\indexentry{rechten|hyperpage}{23}
+\indexentry{Kundgebung|hyperpage}{23}
+\indexentry{wenige|hyperpage}{23}
+\indexentry{Kilometer|hyperpage}{23}
+\indexentry{weiter|hyperpage}{24}
+\indexentry{am|hyperpage}{25}
+\indexentry{Europaplatz.|hyperpage}{25}
+\indexentry{Aufgerufen|hyperpage}{25}
+\indexentry{hatte|hyperpage}{25}
+\indexentry{das|hyperpage}{25}
+\indexentry{Bündnis|hyperpage}{25}
+\indexentry{Wir|hyperpage}{25}
+\indexentry{für|hyperpage}{26}
+\indexentry{Deutschland|hyperpage}{27}
+\indexentry{zu|hyperpage}{28}
+\indexentry{der|hyperpage}{28}
+\indexentry{Demonstration|hyperpage}{29}
+\indexentry{mit|hyperpage}{29}
+\indexentry{dem|hyperpage}{29}
+\indexentry{Motto|hyperpage}{29}
+\indexentry{Tag|hyperpage}{29}
+\indexentry{der|hyperpage}{29}
+\indexentry{Nation.|hyperpage}{30}
+\indexentry{Beobachtern|hyperpage}{30}
+\indexentry{zufolge|hyperpage}{30}
+\indexentry{gaben|hyperpage}{30}
+\indexentry{sich|hyperpage}{30}
+\indexentry{zahlreiche|hyperpage}{30}
+\indexentry{Teilnehmer|hyperpage}{30}
+\indexentry{durch|hyperpage}{31}
+\indexentry{einschlägige|hyperpage}{31}
+\indexentry{Szenecodes|hyperpage}{31}
+\indexentry{als|hyperpage}{31}
+\indexentry{Neonazis|hyperpage}{31}
+\indexentry{zu|hyperpage}{31}
+\indexentry{erkennen|hyperpage}{31}
+\indexentry{N|hyperpage}{31}
+\indexentry{Angaben|hyperpage}{31}
+\indexentry{der|)hyperpage}{31}
+\indexentry{Polizei|hyperpage}{32}
+\indexentry{haben|hyperpage}{32}
+\indexentry{sich|hyperpage}{32}
+\indexentry{mehr|hyperpage}{32}
+\indexentry{als|hyperpage}{33}
+\indexentry{tausend|hyperpage}{33}
+\indexentry{Menschen|hyperpage}{34}
+\indexentry{der|hyperpage}{34}
+\indexentry{Demonstration|hyperpage}{35}
+\indexentry{angeschlossen|hyperpage}{35}
+\indexentry{haben.|hyperpage}{35}
+\indexentry{Sie|hyperpage}{35}
+\indexentry{haben|hyperpage}{35}
+\indexentry{demnach|hyperpage}{35}
+\indexentry{Plakate|hyperpage}{35}
+\indexentry{und|hyperpage}{35}
+\indexentry{Flaggen|hyperpage}{36}
+\indexentry{dabei|hyperpage}{36}
+\indexentry{gehabt|hyperpage}{36}
+\indexentry{jedoch|hyperpage}{36}
+\indexentry{keine|hyperpage}{36}
+\indexentry{illegalen|hyperpage}{36}
+\indexentry{Symbole|hyperpage}{36}
+\indexentry{verwendet|hyperpage}{36}
+\indexentry{sagte|hyperpage}{36}
+\indexentry{ein|hyperpage}{36}
+\indexentry{Sprecher|hyperpage}{36}
+\indexentry{der|hyperpage}{37}
+\indexentry{Polizei|hyperpage}{38}
+\indexentry{Zwischenfällen|hyperpage}{38}
+\indexentry{sei|hyperpage}{38}
+\indexentry{es|hyperpage}{38}
+\indexentry{demnach|hyperpage}{38}
+\indexentry{zunächst|hyperpage}{38}
+\indexentry{nicht|hyperpage}{38}
+\indexentry{gekommen.|hyperpage}{38}
+\indexentry{Woher|hyperpage}{38}
+\indexentry{die|hyperpage}{39}
+\indexentry{überwiegend|hyperpage}{39}
+\indexentry{jungen|hyperpage}{40}
+\indexentry{Männer|hyperpage}{40}
+\indexentry{die|hyperpage}{41}
+\indexentry{an|hyperpage}{41}
+\indexentry{der|hyperpage}{41}
+\indexentry{Kundgebung|hyperpage}{42}
+\indexentry{teilgenommen|hyperpage}{42}
+\indexentry{haben|hyperpage}{42}
+\indexentry{angereist|hyperpage}{42}
+\indexentry{sind|hyperpage}{42}
+\indexentry{ist|hyperpage}{43}
+\indexentry{unklar.|hyperpage}{43}
+\indexentry{Im|hyperpage}{43}
+\indexentry{Netz|hyperpage}{43}
+\indexentry{wird|hyperpage}{43}
+\indexentry{allerdings|hyperpage}{44}
+\indexentry{wieder|hyperpage}{44}
+\indexentry{über|hyperpage}{45}
+\indexentry{den|hyperpage}{46}
+\indexentry{braunen|hyperpage}{46}
+\indexentry{Osten|hyperpage}{46}
+\indexentry{gelästert|hyperpage}{46}
diff --git a/indexing/xindex/doc/tests/demo-hyperref.ind b/indexing/xindex/doc/tests/demo-hyperref.ind
new file mode 100644
index 0000000000..6916f4d087
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo-hyperref.ind
@@ -0,0 +1,233 @@
+
+\begin{theindex}
+
+\indexspace
+\textbf{A}
+\nopagebreak[4]
+ \item aber, \hyperpage{13}
+ \item Ägäis, \hyperpage{17--20}
+ \item allerdings, \hyperpage{44}
+ \item als, \hyperpage{31}, \hyperpage{33}
+ \item am, \hyperpage{25}
+ \item an, \hyperpage{41}
+ \item andere, \hyperpage{12}
+ \item anderthalb, \hyperpage{19}
+ \item Angaben, \hyperpage{31}
+ \item angereist, \hyperpage{42}
+ \item angeschlossen, \hyperpage{35}
+ \item Ansprache, \hyperpage{2}
+ \item anstrebt, \hyperpage{15}
+ \item Aufgerufen, \hyperpage{25}
+ \item Auto, \hyperindexformat{\textbf}{1}
+
+\indexspace
+\textbf{B}
+\nopagebreak[4]
+ \item Beobachtern, \hyperpage{30}
+ \item braunen, \hyperpage{46}
+ \item Bündnis, \hyperpage{25}
+
+\indexspace
+\textbf{D}
+\nopagebreak[4]
+ \item dabei, \hyperpage{36}
+ \item das, \hyperpage{15}, \hyperpage{25}
+ \item dem, \hyperpage{14}, \hyperpage{21}, \hyperpage{29}
+ \item demnach, \hyperpage{35}, \hyperpage{38}
+ \item Demonstration, \hyperpage{29}, \hyperpage{35}
+ \item den, \hyperpage{46}
+ \item der, \hyperpage{9--31}, \hyperpage{15}, \hyperpage{18\nohyperpage{f}}, \hyperpage{28\nohyperpage{f}}, \hyperpage{34}, \hyperpage{37}, \hyperpage{41}
+ \item Deshalb, \hyperpage{14}
+ \item Deutschland, \hyperpage{8}, \hyperpage{27}
+ \item die, \hyperpage{21}, \hyperpage{39}, \hyperpage{41}
+ \item Diktatur, \hyperpage{16}
+ \item dominiere, \hyperpage{9}
+ \item durch, \hyperpage{31}
+
+\indexspace
+\textbf{E}
+\nopagebreak[4]
+ \item ein, \hyperpage{36}
+ \item einer, \hyperpage{22}
+ \item einschlägige, \hyperpage{31}
+ \item Ende, \hyperpage{21}
+ \item endet, \hyperpage{15}
+ \item er, \hyperpage{2}, \hyperindexformat{\seealso{foo}}{4}
+ \item erkennen, \hyperpage{31}
+ \item ersten, \hyperpage{21}
+ \item erzählt, \hyperpage{1}
+ \item es, \hyperpage{8}, \hyperpage{38}
+ \item etwa, \hyperpage{19}, \hyperpage{21}
+ \item Europaplatz., \hyperpage{25}
+
+\indexspace
+\textbf{F}
+\nopagebreak[4]
+ \item Feindbild, \hyperpage{7}
+ \item Festakt, \hyperpage{19}
+ \item Flaggen, \hyperpage{36}
+ \item Flüchtlinge, \hyperpage{11}
+ \item für, \hyperpage{10}, \hyperpage{26}
+
+\indexspace
+\textbf{G}
+\nopagebreak[4]
+ \item gaben, \hyperpage{30}
+ \item gehabt, \hyperpage{36}
+ \item gehe, \hyperpage{9}
+ \item gekommen., \hyperpage{38}
+ \item Gelassenheit, \hyperpage{4}
+ \item gelästert, \hyperpage{46}
+ \item Gleichzeitig, \hyperpage{4}
+ \item gut, \hyperpage{9}
+
+\indexspace
+\textbf{H}
+\nopagebreak[4]
+ \item haben, \hyperpage{32}, \hyperpage{35}, \hyperpage{42}
+ \item haben., \hyperpage{35}
+ \item hatte, \hyperpage{25}
+ \item Hilfe, \hyperpage{10}
+
+\indexspace
+\textbf{I}
+\nopagebreak[4]
+ \item illegalen, \hyperpage{36}
+ \item Im, \hyperpage{43}
+ \item in, \hyperpage{15}, \hyperpage{19}
+ \item ist, \hyperpage{43}
+
+\indexspace
+\textbf{J}
+\nopagebreak[4]
+ \item jedoch, \hyperpage{36}
+ \item jungen, \hyperpage{40}
+
+\indexspace
+\textbf{K}
+\nopagebreak[4]
+ \item keine, \hyperpage{36}
+ \item Kilometer, \hyperpage{23}
+ \item Kundgebung, \hyperpage{23}, \hyperpage{42}
+
+\indexspace
+\textbf{L}
+\nopagebreak[4]
+ \item leben., \hyperpage{14}
+ \item lernen, \hyperpage{14}
+
+\indexspace
+\textbf{M}
+\nopagebreak[4]
+ \item machen., \hyperpage{8}
+ \item mahnte, \hyperpage{2}
+ \item man, \hyperpage{14}
+ \item Männer, \hyperpage{40}
+ \item Märtyrer, \hyperpage{1}
+ \item mehr, \hyperpage{3}, \hyperpage{32}
+ \item Menschen, \hyperpage{34}
+ \item Migranten, \hyperpage{12}
+ \item Minderheiten, \hyperpage{5}
+ \item mit, \hyperpage{14}, \hyperpage{29}
+ \item möglich., \hyperpage{14}
+ \item Motto, \hyperpage{29}
+ \item müsse, \hyperpage{14}
+
+\indexspace
+\textbf{N}
+\nopagebreak[4]
+ \item N, \hyperpage{31}
+ \item nach, \hyperpage{19}
+ \item Nation., \hyperpage{30}
+ \item neigte, \hyperpage{21}
+ \item Neonazis, \hyperpage{31}
+ \item Netz, \hyperpage{43}
+ \item nicht, \hyperpage{14}, \hyperpage{38}
+ \item Nicht-Perfekten, \hyperpage{14}
+
+\indexspace
+\textbf{O}
+\nopagebreak[4]
+ \item Obwohl, \hyperpage{8}
+ \item Osten, \hyperpage{46}
+ \item Östereich, \hyperpage{1}
+
+\indexspace
+\textbf{P}
+\nopagebreak[4]
+ \item Perfekte, \hyperpage{15}
+ \item Pessimismus., \hyperpage{10}
+ \item Plakate, \hyperpage{35}
+ \item Polizei, \hyperpage{32}, \hyperpage{38}
+
+\indexspace
+\textbf{R}
+\nopagebreak[4]
+ \item rechten, \hyperpage{23}
+ \item richtig, \hyperpage{13}
+
+\indexspace
+\textbf{S}
+\nopagebreak[4]
+ \item sagte, \hyperpage{36}
+ \item sei, \hyperpage{12}, \hyperpage{38}
+ \item seiner, \hyperpage{1}
+ \item sich, \hyperpage{19}, \hyperpage{21}, \hyperpage{30}, \hyperpage{32}
+ \item Sie, \hyperpage{35}
+ \item sind, \hyperpage{42}
+ \item Sprecher, \hyperpage{36}
+ \item Staatsoper, \hyperpage{20}
+ \item Stunden, \hyperpage{19}
+ \item Symbole, \hyperpage{36}
+ \item Szenecodes, \hyperpage{31}
+
+\indexspace
+\textbf{T}
+\nopagebreak[4]
+ \item Tag, \hyperpage{29}
+ \item tausend, \hyperpage{33}
+ \item teilgenommen, \hyperpage{42}
+ \item Teilnehmer, \hyperpage{21}, \hyperpage{30}
+
+\indexspace
+\textbf{U}
+\nopagebreak[4]
+ \item über, \hyperpage{45}
+ \item Überholmanöver, \hyperpage{17}
+ \item überwiegend, \hyperpage{39}
+ \item unbegrenzt, \hyperpage{14}
+ \item und, \hyperpage{5}, \hyperpage{11\nohyperpage{f}}, \hyperpage{35}
+ \item unklar., \hyperpage{43}
+
+\indexspace
+\textbf{V}
+\nopagebreak[4]
+ \item versammelten, \hyperpage{21}
+ \item verwendet, \hyperpage{36}
+ \item Volksvertreter, \hyperpage{6}
+
+\indexspace
+\textbf{W}
+\nopagebreak[4]
+ \item Während, \hyperpage{17}
+ \item warnte, \hyperpage{4}
+ \item weiter, \hyperpage{24}
+ \item wenige, \hyperpage{23}
+ \item Wer, \hyperpage{14}
+ \item wichtig, \hyperpage{12}
+ \item wieder, \hyperpage{44}
+ \item Wir, \hyperpage{25}
+ \item wird, \hyperpage{43}
+ \item Woher, \hyperpage{38}
+
+\indexspace
+\textbf{Z}
+\nopagebreak[4]
+ \item zahlreiche, \hyperpage{30}
+ \item zeitgleich, \hyperpage{21}
+ \item zu, \hyperpage{3}, \hyperpage{8}, \hyperpage{14}, \hyperpage{28}, \hyperpage{31}
+ \item zufolge, \hyperpage{30}
+ \item zum, \hyperpage{7}
+ \item zunächst, \hyperpage{38}
+ \item Zwischenfällen, \hyperpage{38}
+\end{theindex}
diff --git a/indexing/xindex/doc/tests/demo-hyperref.pdf b/indexing/xindex/doc/tests/demo-hyperref.pdf
new file mode 100644
index 0000000000..4feaf3b3fa
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo-hyperref.pdf
Binary files differ
diff --git a/indexing/xindex/doc/tests/demo-hyperref.tex b/indexing/xindex/doc/tests/demo-hyperref.tex
new file mode 100644
index 0000000000..757dcbcfe0
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo-hyperref.tex
@@ -0,0 +1,13 @@
+\documentclass[paper=a4,parskip=half-,ngerman]{scrartcl}
+\usepackage{eurosym}
+\usepackage[silent]{fontspec}
+\usepackage{libertinus-otf}
+\usepackage{babel}
+\usepackage[colorlinks]{hyperref}
+\usepackage{makeidx}
+
+\begin{document}
+
+\printindex
+
+\end{document}
diff --git a/indexing/xindex/doc/tests/demo.idx b/indexing/xindex/doc/tests/demo.idx
new file mode 100644
index 0000000000..6353966364
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo.idx
@@ -0,0 +1,206 @@
+\indexentry{Märtyrer}{1}
+\indexentry{erzählt}{1}
+\indexentry{Österreich|(}{1}
+\indexentry{Auto|textbf}{1}
+\indexentry{Ärger}{1}
+\indexentry{Automobil|fbox}{1}
+\indexentry{4711}{1}
+\indexentry{\textbackslash }{1}
+\indexentry{seiner}{1}
+\indexentry{Ansprache}{2}
+\indexentry{mahnte}{2}
+\indexentry{er}{2}
+\indexentry{zu}{3}
+\indexentry{mehr}{3}
+\indexentry{Gelassenheit}{4}
+\indexentry{Gleichzeitig}{4}
+\indexentry{warnte}{4}
+\indexentry{er}{4}
+\indexentry{Minderheiten}{5}
+\indexentry{und}{5}
+\indexentry{Volksvertreter}{6}
+\indexentry{zum}{7}
+\indexentry{Feindbild}{7}
+\indexentry{zu}{8}
+\indexentry{machen.}{8}
+\indexentry{Obwohl}{8}
+\indexentry{es}{8}
+\indexentry{Deutschland}{8}
+\indexentry{gut}{9}
+\indexentry{gehe}{9}
+\indexentry{dominiere}{9}
+\indexentry{der|(}{9}
+\indexentry{Pessimismus.}{10}
+\indexentry{Hilfe}{10}
+\indexentry{für}{10}
+\indexentry{Flüchtlinge}{11}
+\indexentry{und}{11}
+\indexentry{andere}{12}
+\indexentry{Migranten}{12}
+\indexentry{sei}{12}
+\indexentry{wichtig}{12}
+\indexentry{und}{12}
+\indexentry{richtig}{13}
+\indexentry{aber}{13}
+\indexentry{nicht}{14}
+\indexentry{unbegrenzt}{14}
+\indexentry{möglich.}{14}
+\indexentry{Deshalb}{14}
+\indexentry{müsse}{14}
+\indexentry{man}{14}
+\indexentry{lernen}{14}
+\indexentry{mit}{14}
+\indexentry{dem}{14}
+\indexentry{Nicht-Perfekten}{14}
+\indexentry{zu}{14}
+\indexentry{leben.}{14}
+\indexentry{Wer}{14}
+\indexentry{das}{15}
+\indexentry{Perfekte}{15}
+\indexentry{anstrebt}{15}
+\indexentry{endet}{15}
+\indexentry{in}{15}
+\indexentry{der}{15}
+\indexentry{Diktatur!Afrika!Nigeria}{16}
+\indexentry{Frust}{17}
+\indexentry{Ärgerlich}{17}
+\indexentry{Diktatur!Afrika!Kongo}{17}
+\indexentry{Ägäis}{17}
+\indexentry{sich}{17}
+\indexentry{Überholmanöver}{17}
+\clearpage
+\indexentry{Während|see{Was\_auch\_immmer}}{17}
+\indexentry{sich}{18}
+\indexentry{Ägäis|seealso{Griechenland}}{18}
+\indexentry{der}{18}
+\indexentry{Ägäis}{19}
+\indexentry{Festakt}{19}
+\indexentry{sich}{19}
+\indexentry{nach}{19}
+\indexentry{etwa}{19}
+\indexentry{anderthalb}{19}
+\indexentry{Stunden}{19}
+\indexentry{in}{19}
+\indexentry{der}{19}
+\indexentry{Ägäis}{20}
+\indexentry{Staatsoper}{20}
+\indexentry{dem}{21}
+\indexentry{Ende}{21}
+\indexentry{neigte}{21}
+\indexentry{versammelten}{21}
+\indexentry{sich}{21}
+\indexentry{etwa}{21}
+\indexentry{zeitgleich}{21}
+\indexentry{die}{21}
+\indexentry{ersten}{21}
+\indexentry{Teilnehmer}{21}
+\indexentry{einer}{22}
+\indexentry{rechten}{23}
+\indexentry{Kundgebung}{23}
+\indexentry{wenige}{23}
+\indexentry{Kilometer}{23}
+\indexentry{weiter}{24}
+\indexentry{am}{25}
+\indexentry{Europaplatz.}{25}
+\indexentry{Aufgerufen}{25}
+\indexentry{hatte}{25}
+\indexentry{das}{25}
+\indexentry{Bündnis}{25}
+\indexentry{Wir}{25}
+\indexentry{für}{26}
+\indexentry{Deutschland}{27}
+\indexentry{zu}{28}
+\indexentry{der}{28}
+\indexentry{Demonstration}{29}
+\indexentry{mit}{29}
+\indexentry{dem}{29}
+\indexentry{Diktatur!Regierungsform}{29}
+\indexentry{Motto}{29}
+\indexentry{Tag}{29}
+\indexentry{der}{29}
+\indexentry{Nation.}{30}
+\indexentry{Beobachtern}{30}
+\indexentry{zufolge}{30}
+\indexentry{gaben}{30}
+\indexentry{sich}{30}
+\indexentry{zahlreiche}{30}
+\indexentry{Teilnehmer}{30}
+\indexentry{durch}{31}
+\indexentry{einschlägige}{31}
+\indexentry{Szenecodes}{31}
+\indexentry{als}{31}
+\indexentry{Neonazis}{31}
+\indexentry{zu}{31}
+\indexentry{erkennen}{31}
+\indexentry{wieder}{31}
+\indexentry{Nach}{31}
+\indexentry{Ärger}{31}
+\indexentry{Angaben}{31}
+\indexentry{der|)}{31}
+\indexentry{Polizei}{32}
+\indexentry{haben}{32}
+\indexentry{sich}{32}
+\indexentry{mehr}{32}
+\indexentry{als}{33}
+\indexentry{tausend}{33}
+\indexentry{Menschen}{34}
+\indexentry{der}{34}
+\indexentry{Demonstration}{35}
+\indexentry{angeschlossen}{35}
+\indexentry{haben.}{35}
+\indexentry{Sie}{35}
+\indexentry{haben}{35}
+\indexentry{demnach}{35}
+\indexentry{Plakate}{35}
+\indexentry{und}{35}
+\indexentry{Flaggen}{36}
+\indexentry{dabei}{36}
+\indexentry{gehabt}{36}
+\indexentry{jedoch}{36}
+\indexentry{keine}{36}
+\indexentry{illegalen}{36}
+\indexentry{Symbole}{36}
+\indexentry{verwendet}{36}
+\indexentry{sagte}{36}
+\indexentry{ein}{36}
+\indexentry{Sprecher}{36}
+\indexentry{der}{37}
+\indexentry{Polizei}{38}
+\indexentry{überholt}{38}
+\indexentry{Ärgernis}{38}
+\indexentry{Österreich|)textbf}{38}
+\indexentry{Diktatur!Asien!Nordvietnam}{38}
+\indexentry{Zwischenfällen}{38}
+\indexentry{sei}{38}
+\indexentry{es}{38}
+\indexentry{demnach}{38}
+\indexentry{zunächst}{38}
+\indexentry{nicht}{38}
+\indexentry{gekommen.}{38}
+\indexentry{Woher}{38}
+\indexentry{die}{39}
+\indexentry{überwiegend}{39}
+\indexentry{jungen}{40}
+\indexentry{Männer}{40}
+\indexentry{die}{41}
+\indexentry{an}{41}
+\indexentry{der}{41}
+\indexentry{Kundgebung}{42}
+\indexentry{teilgenommen}{42}
+\indexentry{haben}{42}
+\indexentry{angereist}{42}
+\indexentry{sind}{42}
+\indexentry{ist}{43}
+\indexentry{unklar.}{43}
+\indexentry{Im}{43}
+\indexentry{Netz}{43}
+\indexentry{wird}{43}
+\indexentry{allerdings}{44}
+\indexentry{wieder}{44}
+\indexentry{wieder}{45}
+\indexentry{über}{45}
+\indexentry{wieder}{46}
+\indexentry{den}{46}
+\indexentry{braunen}{46}
+\indexentry{Osten}{46}
+\indexentry{gelästert}{46}
diff --git a/indexing/xindex/doc/tests/demo.ind b/indexing/xindex/doc/tests/demo.ind
new file mode 100644
index 0000000000..9f1484209f
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo.ind
@@ -0,0 +1,254 @@
+
+\begin{theindex}
+\textbf{Symbole}
+\nopagebreak[4]
+ \item \textbackslash , {1}
+
+\indexspace
+\textbf{Zahlen}
+\nopagebreak[4]
+ \item 4711, {1}
+
+\indexspace
+\textbf{A}
+\nopagebreak[4]
+ \item aber, {13}
+ \item Ägäis, {17}, \seealso{Griechenland}{18}, {19f}
+ \item allerdings, {44}
+ \item als, {31}, {33}
+ \item am, {25}
+ \item an, {41}
+ \item andere, {12}
+ \item anderthalb, {19}
+ \item Angaben, {31}
+ \item angereist, {42}
+ \item angeschlossen, {35}
+ \item Ansprache, {2}
+ \item anstrebt, {15}
+ \item Ärger, {1}, {31}
+ \item Ärgerlich, {17}
+ \item Ärgernis, {38}
+ \item Aufgerufen, {25}
+ \item Auto, \textbf{1}
+ \item Automobil, \fbox{1}
+
+\indexspace
+\textbf{B}
+\nopagebreak[4]
+ \item Beobachtern, {30}
+ \item braunen, {46}
+ \item Bündnis, {25}
+
+\indexspace
+\textbf{D}
+\nopagebreak[4]
+ \item dabei, {36}
+ \item das, {15}, {25}
+ \item dem, {14}, {21}, {29}
+ \item demnach, {35}, {38}
+ \item Demonstration, {29}, {35}
+ \item den, {46}
+ \item der, {9--31}, {15}, {18f}, {28f}, {34}, {37}, {41}
+ \item Deshalb, {14}
+ \item Deutschland, {8}, {27}
+ \item die, {21}, {39}, {41}
+ \item Diktatur
+ \subitem -\,Afrika, {17}
+ \subsubitem --\,Kongo, {17}
+ \subsubitem --\,Nigeria, {16}
+ \subitem -\,Asien, {38}
+ \subsubitem --\,Nordvietnam, {38}
+ \subitem -\,Regierungsform, {29}
+ \item dominiere, {9}
+ \item durch, {31}
+
+\indexspace
+\textbf{E}
+\nopagebreak[4]
+ \item ein, {36}
+ \item einer, {22}
+ \item einschlägige, {31}
+ \item Ende, {21}
+ \item endet, {15}
+ \item er, {2}, {4}
+ \item erkennen, {31}
+ \item ersten, {21}
+ \item erzählt, {1}
+ \item es, {8}, {38}
+ \item etwa, {19}, {21}
+ \item Europaplatz., {25}
+
+\indexspace
+\textbf{F}
+\nopagebreak[4]
+ \item Feindbild, {7}
+ \item Festakt, {19}
+ \item Flaggen, {36}
+ \item Flüchtlinge, {11}
+ \item Frust, {17}
+ \item für, {10}, {26}
+
+\indexspace
+\textbf{G}
+\nopagebreak[4]
+ \item gaben, {30}
+ \item gehabt, {36}
+ \item gehe, {9}
+ \item gekommen., {38}
+ \item Gelassenheit, {4}
+ \item gelästert, {46}
+ \item Gleichzeitig, {4}
+ \item gut, {9}
+
+\indexspace
+\textbf{H}
+\nopagebreak[4]
+ \item haben, {32}, {35}, {42}
+ \item haben., {35}
+ \item hatte, {25}
+ \item Hilfe, {10}
+
+\indexspace
+\textbf{I}
+\nopagebreak[4]
+ \item illegalen, {36}
+ \item Im, {43}
+ \item in, {15}, {19}
+ \item ist, {43}
+
+\indexspace
+\textbf{J}
+\nopagebreak[4]
+ \item jedoch, {36}
+ \item jungen, {40}
+
+\indexspace
+\textbf{K}
+\nopagebreak[4]
+ \item keine, {36}
+ \item Kilometer, {23}
+ \item Kundgebung, {23}, {42}
+
+\indexspace
+\textbf{L}
+\nopagebreak[4]
+ \item leben., {14}
+ \item lernen, {14}
+
+\indexspace
+\textbf{M}
+\nopagebreak[4]
+ \item machen., {8}
+ \item mahnte, {2}
+ \item man, {14}
+ \item Männer, {40}
+ \item Märtyrer, {1}
+ \item mehr, {3}, {32}
+ \item Menschen, {34}
+ \item Migranten, {12}
+ \item Minderheiten, {5}
+ \item mit, {14}, {29}
+ \item möglich., {14}
+ \item Motto, {29}
+ \item müsse, {14}
+
+\indexspace
+\textbf{N}
+\nopagebreak[4]
+ \item nach, {19}
+ \item Nach, {31}
+ \item Nation., {30}
+ \item neigte, {21}
+ \item Neonazis, {31}
+ \item Netz, {43}
+ \item nicht, {14}, {38}
+ \item Nicht-Perfekten, {14}
+
+\indexspace
+\textbf{O}
+\nopagebreak[4]
+ \item Obwohl, {8}
+ \item Osten, {46}
+ \item Österreich, \textbf{1--38}
+
+\indexspace
+\textbf{P}
+\nopagebreak[4]
+ \item Perfekte, {15}
+ \item Pessimismus., {10}
+ \item Plakate, {35}
+ \item Polizei, {32}, {38}
+
+\indexspace
+\textbf{R}
+\nopagebreak[4]
+ \item rechten, {23}
+ \item richtig, {13}
+
+\indexspace
+\textbf{S}
+\nopagebreak[4]
+ \item sagte, {36}
+ \item sei, {12}, {38}
+ \item seiner, {1}
+ \item sich, {17ff}, {21}, {30}, {32}
+ \item Sie, {35}
+ \item sind, {42}
+ \item Sprecher, {36}
+ \item Staatsoper, {20}
+ \item Stunden, {19}
+ \item Symbole, {36}
+ \item Szenecodes, {31}
+
+\indexspace
+\textbf{T}
+\nopagebreak[4]
+ \item Tag, {29}
+ \item tausend, {33}
+ \item teilgenommen, {42}
+ \item Teilnehmer, {21}, {30}
+
+\indexspace
+\textbf{U}
+\nopagebreak[4]
+ \item über, {45}
+ \item Überholmanöver, {17}
+ \clearpage
+ \item überholt, {38}
+ \item überwiegend, {39}
+ \item unbegrenzt, {14}
+ \item und, {5}, {11f}, {35}
+ \item unklar., {43}
+
+\indexspace
+\textbf{V}
+\nopagebreak[4]
+ \item versammelten, {21}
+ \item verwendet, {36}
+ \item Volksvertreter, {6}
+
+\indexspace
+\textbf{W}
+\nopagebreak[4]
+ \item Während, \see{Was\_auch\_immmer}{17}
+ \item warnte, {4}
+ \item weiter, {24}
+ \item wenige, {23}
+ \item Wer, {14}
+ \item wichtig, {12}
+ \item wieder, {31}, {44ff}
+ \item Wir, {25}
+ \item wird, {43}
+ \item Woher, {38}
+
+\indexspace
+\textbf{Z}
+\nopagebreak[4]
+ \item zahlreiche, {30}
+ \item zeitgleich, {21}
+ \item zu, {3}, {8}, {14}, {28}, {31}
+ \item zufolge, {30}
+ \item zum, {7}
+ \item zunächst, {38}
+ \item Zwischenfällen, {38}
+\end{theindex}
diff --git a/indexing/xindex/doc/tests/demo.pdf b/indexing/xindex/doc/tests/demo.pdf
new file mode 100644
index 0000000000..4b988c7d40
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo.pdf
Binary files differ
diff --git a/indexing/xindex/doc/tests/demo.tex b/indexing/xindex/doc/tests/demo.tex
new file mode 100644
index 0000000000..fcdccab765
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo.tex
@@ -0,0 +1,56 @@
+\documentclass[paper=a4,parskip=half-,ngerman]{scrartcl}
+\usepackage{eurosym}
+\usepackage[silent]{fontspec}
+\usepackage{libertinus-otf}
+\usepackage{babel}
+\usepackage{hvindex}
+\usepackage{makeidx}
+
+\let\idxtextClasses\texttt
+
+\makeindex
+\begin{document}
+Ein \Index{Märtyrer} \Index{erzählt} Österreich\index{Österreich|(}\index{Auto|textbf} \Index{Ärger}
+
+\index{Automobil|fbox}
+\Index{4711} \Index{\textbackslash}
+In \Index{seiner}\newpage \Index{Ansprache} \Index{mahnte} \Index{er}\newpage \Index{zu} \Index{mehr}\newpage \Index{Gelassenheit}.
+\Index{Gleichzeitig} \Index{warnte} \Index{er}\newpage, \Index{Minderheiten} \Index{und}\newpage \Index{Volksvertreter}\newpage \Index{zum}
+\Index{Feindbild}\newpage \Index{zu} \Index{machen.} \Index{Obwohl} \Index{es} \Index{Deutschland}\newpage \Index{gut} \Index{gehe}
+\Index{dominiere} \Index{der|(}\newpage \Index{Pessimismus.} \Index{Hilfe} \Index{für}\newpage \Index{Flüchtlinge} \Index{und}\newpage \Index{andere}
+\Index{Migranten} \Index{sei} \Index{wichtig} \Index{und}\newpage \Index{richtig} \Index{aber}\newpage \Index{nicht} \Index{unbegrenzt}
+\Index{möglich.} \Index{Deshalb} \Index{müsse} \Index{man} \Index{lernen} \Index{mit} \Index{dem} \Index{Nicht-Perfekten}
+\Index{zu} \Index{leben.} \Index{Wer}\newpage \Index{das} \Index{Perfekte} \Index{anstrebt} \Index{endet} \Index{in} \Index{der}\newpage
+\index{Diktatur!Afrika!Nigeria}.\newpage \Index{Ärger!Frust} \Index{Ärgerlich} \index{Diktatur!Afrika!Kongo}
+\Index{Ägäis} \Index{sich} \Index{Überholmanöver}
+\makeatletter
+\write\@indexfile{\string\clearpage}
+\makeatother
+
+\Index{Während|see{Was\_auch\_immmer}}\newpage\Index{sich} \Index{Ägäis|seealso{Griechenland}} \Index{der}\newpage \Index{Ägäis}\Index{Festakt} \Index{sich}
+\Index{nach} \Index{etwa} \Index{anderthalb} \Index{Stunden}
+\Index{in} \Index{der}\newpage \Index{Ägäis}\Index{Staatsoper}\newpage \Index{dem} \Index{Ende} \Index{neigte} \Index{versammelten} \Index{sich}
+\Index{etwa} \Index{zeitgleich} \Index{die} \Index{ersten} \Index{Teilnehmer}\newpage \Index{einer}\newpage \Index{rechten} \Index{Kundgebung}
+\Index{wenige} \Index{Kilometer}\newpage \Index{weiter}\newpage \Index{am} \Index{Europaplatz.} \Index{Aufgerufen} \Index{hatte} \Index{das}
+\Index{Bündnis} \Index{Wir}\newpage \Index{für}\newpage \Index{Deutschland}\newpage \Index{zu} \Index{der}\newpage \Index{Demonstration} \Index{mit}
+\Index{dem}\index{Diktatur!Regierungsform} \Index{Motto} \Index{Tag} \Index{der}\newpage \Index{Nation.} \Index{Beobachtern} \Index{zufolge} \Index{gaben}
+\Index{sich} \Index{zahlreiche} \Index{Teilnehmer}\newpage \Index{durch} \Index{einschlägige} \Index{Szenecodes} \Index{als}
+\Index{Neonazis} \Index{zu} \Index{erkennen}. \Index{wieder}
+\Index{Nach} \Index{Ärger} \Index{Angaben} \Index{der|)}\newpage \Index{Polizei} \Index{haben} \Index{sich} \Index{mehr}\newpage \Index{als} \Index{tausend}\newpage
+\Index{Menschen} \Index{der}\newpage \Index{Demonstration} \Index{angeschlossen} \Index{haben.} \Index{Sie} \Index{haben}
+\Index{demnach} \Index{Plakate} \Index{und}\newpage \Index{Flaggen} \Index{dabei} \Index{gehabt} \Index{jedoch} \Index{keine}
+\Index{illegalen} \Index{Symbole} \Index{verwendet} \Index{sagte} \Index{ein} \Index{Sprecher}\newpage \Index{der}\newpage \Index{Polizei}.
+\Index{überholt}
+\Index{Ärgernis} Österreich\index{Österreich|)textbf}
+\index{Diktatur!Asien!Nordvietnam}Zu \Index{Zwischenfällen} \Index{sei} \Index{es} \Index{demnach} \Index{zunächst} \Index{nicht} \Index{gekommen.} \Index{Woher}\newpage
+\Index{die} \Index{überwiegend}\newpage \Index{jungen} \Index{Männer}\newpage \Index{die} \Index{an} \Index{der}\newpage \Index{Kundgebung}
+\Index{teilgenommen} \Index{haben} \Index{angereist} \Index{sind}\newpage \Index{ist} \Index{unklar.} \Index{Im} \Index{Netz}
+\Index{wird}\newpage
+ \Index{allerdings} \Index{wieder}\newpage\Index{wieder} \Index{über}\newpage\Index{wieder}
+\Index{den} \Index{braunen} \Index{Osten} \Index{gelästert}.
+
+
+\printindex
+
+
+\end{document}
diff --git a/indexing/xindex/doc/tests/demo2.idx b/indexing/xindex/doc/tests/demo2.idx
new file mode 100644
index 0000000000..a1b2354471
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo2.idx
@@ -0,0 +1,5 @@
+\indexentry{foo}{1}
+\indexentry{foo|see{bar}}{2}
+\indexentry{foo|textit}{1}
+\indexentry{foo|textbf}{3}
+\indexentry{foo}{3}
diff --git a/indexing/xindex/doc/tests/demo2.ind b/indexing/xindex/doc/tests/demo2.ind
new file mode 100644
index 0000000000..724acd9654
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo2.ind
@@ -0,0 +1,8 @@
+
+\begin{theindex}
+
+\indexspace
+\textbf{F}
+\nopagebreak[4]
+ \item foo, {1}, \textit{1}, \see{bar}{2}, {3}, \textbf{3}
+\end{theindex}
diff --git a/indexing/xindex/doc/tests/demo3.idx b/indexing/xindex/doc/tests/demo3.idx
new file mode 100644
index 0000000000..b9afc364ed
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo3.idx
@@ -0,0 +1,5 @@
+\indexentry{foo}{1}
+\indexentry{foo}{2}
+\indexentry{foo|textit}{2}
+\indexentry{foo|textbf}{3}
+\indexentry{foo}{4}
diff --git a/indexing/xindex/doc/tests/demo3.ind b/indexing/xindex/doc/tests/demo3.ind
new file mode 100644
index 0000000000..327fe951e9
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo3.ind
@@ -0,0 +1,8 @@
+
+\begin{theindex}
+
+\indexspace
+\textbf{F}
+\nopagebreak[4]
+ \item foo, {1f}, \textit{2}, \textbf{3}, {4}
+\end{theindex}
diff --git a/indexing/xindex/doc/tests/demo3.pdf b/indexing/xindex/doc/tests/demo3.pdf
new file mode 100644
index 0000000000..7c7c67b681
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo3.pdf
Binary files differ
diff --git a/indexing/xindex/doc/tests/demo3.tex b/indexing/xindex/doc/tests/demo3.tex
new file mode 100644
index 0000000000..81dd869e79
--- /dev/null
+++ b/indexing/xindex/doc/tests/demo3.tex
@@ -0,0 +1,26 @@
+\documentclass[paper=a4,parskip=half-,ngerman]{scrartcl}
+\usepackage{eurosym}
+\usepackage[silent]{fontspec}
+\usepackage{libertinus-otf}
+\usepackage{babel}
+\usepackage{hvindex}
+\usepackage{makeidx}
+
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+
+
+\let\idxtextClasses\texttt
+
+\makeindex
+\begin{document}
+Ein foo\index{foo} \newpage und \index{foo} ein foo\index{foo|textit} \newpage und foo\index{foo|textbf} \newpage und foo\index{foo}
+
+\printindex
+
+
+\end{document}
diff --git a/indexing/xindex/doc/tests/runTests.sh b/indexing/xindex/doc/tests/runTests.sh
new file mode 100755
index 0000000000..68f6c7850a
--- /dev/null
+++ b/indexing/xindex/doc/tests/runTests.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+echo "buch"
+xindex buch > /dev/null
+lualatex buch > /dev/null
+
+echo "demo"
+lualatex demo > /dev/null
+xindex -l de demo > /dev/null
+lualatex demo > /dev/null
+
+echo "demo2"
+xindex demo2 > /dev/null
+
+echo "demo3"
+lualatex demo3 > /dev/null
+xindex -l de demo3 > /dev/null
+lualatex demo3 > /dev/null
+
+echo "demo-hyperref"
+xindex demo-hyperref > /dev/null
+lualatex demo-hyperref > /dev/null
+
+echo "HADW"
+xindex -l de -c HAdW HADW > /dev/null
+lualatex HADW > /dev/null
+
+echo "Umlaute"
+xindex -l de Umlaute > /dev/null
+lualatex Umlaute > /dev/null
+
+echo "Umlaute2"
+xindex -l de -c DIN2 Umlaute2 > /dev/null
+lualatex Umlaute2 > /dev/null
+
+rm -fr *.aux *.log *.ilg *.out \ No newline at end of file
diff --git a/indexing/xindex/doc/xindex-doc.pdf b/indexing/xindex/doc/xindex-doc.pdf
new file mode 100644
index 0000000000..84fcec9a5e
--- /dev/null
+++ b/indexing/xindex/doc/xindex-doc.pdf
Binary files differ
diff --git a/indexing/xindex/doc/xindex-doc.tex b/indexing/xindex/doc/xindex-doc.tex
new file mode 100644
index 0000000000..b7870604a7
--- /dev/null
+++ b/indexing/xindex/doc/xindex-doc.tex
@@ -0,0 +1,1430 @@
+%% $Id: xltabular-doc.tex 635 2017-10-24 18:22:59Z herbert $
+%
+\listfiles\setcounter{errorcontextlines}{100}
+\documentclass[paper=a4,fontsize=11pt,DIV=13,parskip=half-,
+ captions=tableabove,twoside=on]{scrartcl}
+\usepackage{fontspec}
+\setmainfont{AccanthisADFStdNo3}[
+ UprightFont =*-Regular,
+ BoldFont =*-Bold,
+ ItalicFont =*-Italic,
+ BoldItalicFont=*-BoldItalic,
+ RawFeature = -rlig,
+]
+\setsansfont{GilliusADF}[
+ UprightFont =*-Regular,
+ BoldFont =*-Bold,
+ ItalicFont =*-Italic,
+ BoldItalicFont=*-BoldItalic,
+ RawFeature = -rlig,
+]
+\setmonofont{DejaVu Sans Mono}[Scale=MatchLowercase,FakeStretch=0.9]
+%\setmonofont{Anonymous Pro}[Scale=MatchLowercase,FakeStretch=0.9]
+
+\newfontfamily\Japanese[Scale=MatchUppercase]{SourceHanSans}
+\newfontfamily\CODE{CODE2000}
+
+\usepackage[english]{babel}
+\usepackage{scrlayer-scrpage}
+\automark[section]{section}
+\automark*[subsection]{}
+\pagestyle{scrheadings}
+
+{\catcode`\%=12
+ \gdef\perCent{%}
+ \gdef\DoubleperCent{%%}
+}
+
+
+\usepackage{xcolor,fancyvrb,varioref}
+\usepackage{xltabular}
+\usepackage{dtk-logos} % for Wikipedia W
+\usepackage{listings}
+\usepackage{dtk-extern} % for Wikipedia W
+\lstset{basicstyle=\ttfamily\small,language=[LaTeX]TeX}
+\usepackage{ragged2e}
+\usepackage{makeidx}\makeindex
+\usepackage{hvindex}
+\def\Lfile#1{\texttt{#1}\index{#1 file@\texttt{#1} file}}
+\def\Lext#1{\texttt{.#1}\index{#1 file extension@\texttt{.#1} file extension}}
+\def\Lcs#1{\texttt{\textbackslash#1}\index{#1@\texttt{\textbackslash#1}}}
+\def\Lenv#1{\texttt{#1}\index{#1 environment@\texttt{#1} environment}}
+\def\Lpack#1{\texttt{#1}\index{#1 package@\texttt{#1} package}}
+\def\Lprog#1{\texttt{#1}\index{#1 program@\texttt{#1} program}}
+\def\Loption#1{\texttt{#1}\index{#1@\texttt{#1} package option}}
+
+%\usepackage[bibstyle=dtk]{biblatex}
+%\addbibresource{\jobname.bib}
+
+\raggedbottom
+\usepackage{url}
+\usepackage[colorlinks,linktocpage]{hyperref}
+
+\makeatletter% from: doc.sty
+\newcommand*\GetFileInfo[1]{%
+ \def\filename{#1}%
+ \def\@tempb##1 ##2 ##3\relax##4\relax{%
+ \def\filedate{##1}%
+ \def\fileversion{##2}%
+ \def\fileinfo{##3}}%
+ \edef\@tempa{\csname ver@#1\endcsname}%
+ \expandafter\@tempb\@tempa\relax? ? \relax\relax}
+\makeatother
+
+%\GetFileInfo{xltabular.sty}
+\usepackage{xspace}
+
+\newcommand\XI{\texttt{xindex}\xspace}
+
+\def\setVersion#1{\setVVersion#1!!}
+\def\setVVersion#1=#2!!{\def\xIndexVersion{#2}}
+
+\setVersion{version = 0.13}% can be autimatically changed by perl
+
+\title{Program and package \texttt{xindex} \\--\\ \normalsize \xIndexVersion\ (\today)}
+\author{Herbert Voß\thanks{hvoss@tug.org}}
+\begin{document}
+\maketitle
+\tableofcontents
+
+
+\clearpage
+
+\section{Introduction}
+The Lua program
+\XI is a \Index{unicode} aware program for creating an index file from an \Lext{idx} source
+file. It is completely compatible to the current \Lprog{makeindex} program, but can handle
+\Index{UTF-8}, 16, 32, and 64. The \LaTeX\ package \Lpack{xindex} is a package which provides
+a \LaTeX\ command which writes additional text into the index file. This text (comments and/or macros)
+will be accepted by the program \XI.
+
+The general structure of a \Index{data element} in the Lua table is:
+
+\begin{verbatim}
+data = { Entry = <text>, -- like the input line without command \indexentry
+ pages = {
+ { number = <roman/arabic number or text>,
+ special = <macro> }, -- the part after | in the input
+ [...]
+ { number = <roman/arabic number or text>,
+ special = <macro> }
+ },
+ sortChar = <unicode codepoint>, -- of the first character of Entry
+ Macro = <TeX macro> -- only useful with LaTeX package \Lpack{xindex}
+ }
+\end{verbatim}
+
+After reading the input file the table \texttt{pages} has only one element for the number\index{page number}
+and the so-called special command. When the pages are compressed the table will collect all pages which
+refer to the same \Index{entry name}.
+
+
+\iffalse
+EntryList[2] = {
+ Entry = "Johann", -- the index item foo@bar
+ pages = { -- the page number(s) and the part after |
+ { number = 111,
+ special = '\\emph' },
+ { number = 11,
+ special = "\\textit"}
+ },
+ sortChar= 80, -- Initial for later output
+ Macro = ""
+}
+
+\fi
+
+
+
+\subsection{Syntax}
+
+The \Index{syntax} is \verb|xindex [...] <file>| where \verb|[...]| are optional \Index{argument}s, either in short or
+long form which, of course, can be mixed:
+
+\begin{verbatim}
+xindex
+ [-q,--quiet ]
+ [-h,--help ]
+ [-v ] verbose
+ [-c,--config ] default is cfg
+ [-e,--escapechar ] default is "
+ [-a, --nocasesensitive ] default is false
+ [-n,--noheadings ] default is false
+ [-o,--output ] default is <input>.ind
+ [-l,--language ] default is en
+ [-p,--prefix] default L
+ <input file>
+\end{verbatim}
+
+
+
+The \Index{language} has to be chosen as an international abbreviation in lower- or uppercase letters, see
+\url{https://en.wikipedia.org/wiki/ISO_3166-2}
+
+
+\subsection{How it works}
+\XI creates by default an \Index{output} file \texttt{<input>.ind} which can be read
+by the \LaTeX\ document with the default command \Lcs{printindex}. One can use another
+output filename, which makes only sense if one doesn't use the \Lcs{printindex} command
+for typesetting the index.
+The default \Index{sorting}
+is given by the configuration file, which defines replacements for \Index{accented characters},
+like \texttt{ö}$\rightarrow$\texttt{o}.
+
+\subsection{The \texttt{.idx} file}
+There are four characters which must be escaped if used in the command \Lcs{index}:
+\verb=!=, \verb=@=, \verb="=, or \verb=|=. These charactzers have a special meaning for
+the index.\index{"!}\index{"@}\index{"|}
+The default \Index{escape character} is the double quote \verb|"|:
+
+\iffalse
+To put a !\index{"!}, @\index{"@}, or |\index{"|} character in an index entry, quote it by preceding the
+character with a quote ". More precisely, any character is said to be quoted if it
+follows an unquoted " that is not part of a \" command. A quoted !, @, or
+| character is treated like an ordinary character rather than having its usual
+meaning. The " preceding a quoted character is deleted before the entries
+are alphabetized.
+\fi
+
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ pages={1,2},
+ frame,
+ compiler=lualatex,
+ crop,
+ xindex,
+ force=true,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{scrartcl}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+
+%StartVisiblePreamble
+\usepackage{makeidx}\makeindex
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+\section{Escaping characters}
+\begin{itemize}
+\item Exclamation mark ! \index{exclaim ("!)}
+\item Vertical bar| \index{Vertical bar ("|)}
+\item Doublequote \verb|"| \index{""}
+\item Double doublequote \verb|""| \index{""""}
+\item At character @ \index{At ("@)}
+\end{itemize}
+run \texttt{xindex <file.idx>}\index{<file.idx>}\index{123}
+\newpage
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+For the german language the double quote is an active character and it makes live easier
+if one chooses another character.
+The escape character can be changed easily by the optional argument \verb|-e "<char>"| or
+\verb|--escapechar "<char">|. The following example shows how
+it works for the \Index{escape character} > (greater). Internally the escape sequences are
+now defined as:
+
+\begin{verbatim}
+escape_chars = { -- by default " is the escape char
+ {esc_char..'"', '//escapedquote//', '\\"{}' },
+ {esc_char..'@', '//escapedat//', '@' },
+ {esc_char..'|', '//escapedvert//', "|" },
+ {esc_char..'!', '//scapedexcl//', '!' }
+}
+\end{verbatim}
+
+which is, of course, not of interest for the user. With the beginning the escaped chars
+are converted into the internal strings and later back to the origin meaning.
+
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ pages={1,2},
+ frame,
+ compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-e ">",
+ force=true,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{scrartcl}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+%StartVisiblePreamble
+\usepackage{makeidx}\makeindex
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+\section{Escaping characters with >}
+\begin{itemize}
+\item Exclamation mark ! \index{exclaim (>!)}
+\item Vertical bar| \index{Vertical bar (>|)}
+\item Doublequote \verb|"| \index{>"}
+\item Double doublequote \verb|""| \index{>">"}
+\item At character @ \index{At (>@)}
+\end{itemize}
+Run \texttt{xindex} with \texttt{xindex -e ">"}\index{<file.idx>}\index{123}
+\newpage
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+\section{Language}\label{language}
+
+The \Index{language} is only important for the first two headers in the output of the index data.
+They are by default \emph{Symbols} followed by \emph{Numbers}. In a new version of \Lprog{xindex}
+it will be customizable.
+The predefined language is »en« and currently the following languages are possible:
+
+
+{\Japanese\small
+indexheader = \{ \\
+\quad de = \{\"{}Symbole\"{}, \"{}Zahlen\"{}\},\\
+\quad en = \{\"{}Symbols\"{}, \"{}Numbers\"{}\},\\
+\quad fr = \{\"{}Symboles\"{},\"{}Chiffre\"{}\},\\
+\quad jp = \{\"{}シンボル\"{},\"{}番号\"{}\},\\
+\}
+%\end{verbatim}
+}
+
+The following example was run with \verb|xindex -l de <file>.idx|:
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ pages={1,2},
+ frame,
+ compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-l de -e ">",
+ force=true,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{scrartcl}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+%StartVisiblePreamble
+\usepackage{makeidx}\makeindex
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+\section{Escaping characters with >}
+\begin{itemize}
+\item Exclamation mark ! \index{exclaim (>!)}
+\item Vertical bar| \index{Vertical bar (>|)}
+\item Doublequote \verb|"| \index{>"}
+\item Double doublequote \verb|""| \index{>">"}
+\item At character @ \index{At (>@)}
+\end{itemize}
+Run \texttt{xindex} with \texttt{xindex -l de -e ">"}\index{123}
+\newpage
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+\section{Sorting}
+
+The default sorting is unicode aware and uses a translation table for accented characters:
+
+\begin{verbatim}
+alphabet_lower = { -- for sorting
+ { ' ' }, -- only for internal tests
+ { 'a', 'á', 'à', 'ä', 'å', 'æ', },
+ { 'b' },
+ { 'c', 'ç' },
+ { 'd' },
+ { 'e', 'é', 'è', 'ë' },
+ { 'f' },
+ { 'g' },
+ { 'h' },
+ { 'i', 'í', 'ì', 'ï' },
+ { 'j' },
+ { 'k' },
+ { 'l' },
+ { 'm' },
+ { 'n', 'ñ' },
+ { 'o', 'ó', 'ò', 'ö', 'ø', 'œ'},
+ { 'p' },
+ { 'q' },
+ { 'r' },
+ { 's', 'š', 'ß' },
+ { 't' },
+ { 'u', 'ú', 'ù', 'ü' },
+ { 'v' },
+ { 'w' },
+ { 'x' },
+ { 'y', 'ý', 'ÿ' },
+ { 'z', 'ž' }
+}
+\end{verbatim}
+
+There is also a table for the uppercase letters. If it should be edited or extended then copy first the
+base configuration file \Lfile{xindex-cfg.lua} and modify that new file. It can be used by \XI
+with the optional argument \texttt{-c newfile} if it is named as \Lfile{xindex-newfile.lua}.
+For german there already exists a configuration
+file \Lfile{xindex-DIN2.lua} which uses the so-called »Telefonbuchsortierung« which converts
+the umlauts like ö$\rightarrow$oe:
+
+\begin{verbatim}
+alphabet_upper = { -- for sorting
+ { ' ' },
+ { 'A', 'Á', 'À', 'Å', 'Æ'},
+ { 'AE', 'Ä'},
+ { 'B' },
+ { 'C', 'Ç' },
+ { 'D' },
+ { 'E', 'È', 'È', 'Ë' },
+ { 'F' },
+ { 'G' },
+ { 'H' },
+ { 'I', 'Í', 'Ì', 'Ï' },
+ { 'J' },
+ { 'K' },
+ { 'L' },
+ { 'M' },
+ { 'N', 'Ñ' },
+ { 'O', 'Ó', 'Ò', 'Ø','Œ' },
+ { 'OE', 'Ö' },
+ { 'P' },
+ { 'Q' },
+ { 'R' },
+ { 'S', 'Š' },
+ { 'T' },
+ { 'U', 'Ú', 'Ù' },
+ { 'UE', 'Ü' },
+ { 'V' },
+ { 'W' },
+ { 'X' },
+ { 'Y', 'Ý', 'Ÿ' },
+ { 'Z', 'Ž' }
+}
+\end{verbatim}
+
+
+
+\begin{externalDocument}[
+ grfOptions={scale=0.9},%width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.4\linewidth,
+ pages={2},
+ frame=false,
+ compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-l de,
+ force=true,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass[paper=a5]{scrartcl}
+\usepackage[ngerman]{babel}
+%StartVisiblePreamble
+\usepackage{makeidx}\makeindex
+\newcommand\Index[1]{\index{#1}#1}
+%StopVisiblePreamble
+\usepackage{multicol}
+\makeatletter
+\def\theindex{% only for demonstration
+ \newpage
+ \section*{\indexname}
+ \begin{multicols}{2}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\def\endtheindex{\end{multicols}}
+\makeatother
+\pagestyle{empty}
+\begin{document}
+Sorted with \verb|-l DE|
+
+\Index{Österreich} \Index{Öresund}
+\Index{Ostern} \Index{Ober}
+\Index{Oberin} \Index{Österreich}
+\Index{Öresund} \Index{Ostern}
+\Index{Ober} \Index{Oberin}
+\Index{Obstler} \Index{Öl}
+\Index{ölen} \Index{Ödem}
+\Index{Oligarch} \Index{Oder}
+\Index{oder} \index{Fluss!Oder}
+\index{Oder|seealso{Fluss}}
+\Index{Göbel} \Index{Goethe}
+\Index{Göthe} \Index{Götz}
+\Index{Goldmann}
+
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+
+The same sorted with the german DIN variant 2 with \verb|--config DIN2|, which
+is part of the \TeX\ distribution. In this case a letter Ö is converted to Oe before sorting
+the word beginninjg with the letter Ö:
+
+\noindent
+\begin{externalDocument}[
+ grfOptions={scale=0.9},%width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.4\linewidth,
+ pages={2},
+ frame=false,compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-c DIN2 -l DE,
+ force=true,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass[paper=a5]{scrartcl}
+\usepackage[ngerman]{babel}
+%StartVisiblePreamble
+\usepackage{makeidx}\makeindex
+\newcommand\Index[1]{\index{#1}#1}
+%StopVisiblePreamble
+\usepackage{multicol}
+\makeatletter
+\def\theindex{% only for demonstration
+ \newpage
+ \section*{\indexname}
+ \begin{multicols}{2}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\def\endtheindex{\end{multicols}}
+\makeatother
+\pagestyle{empty}
+\begin{document}
+Sorted with
+\verb|--config DIN2 -l DE|
+
+\Index{Österreich} \Index{Öresund}
+\Index{Ostern} \Index{Ober}
+\Index{Oberin} \Index{Österreich}
+\Index{Öresund} \Index{Ostern}
+\Index{Ober} \Index{Oberin}
+\Index{Obstler} \Index{Öl}
+\Index{ölen} \Index{Ödem}
+\Index{Oligarch} \Index{Oder}
+\Index{oder} \index{Fluss!Oder}
+\index{Oder|seealso{Fluss}}
+\Index{Göbel} \Index{Goethe}
+\Index{Göthe} \Index{Götz}
+\Index{Goldmann}
+
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+
+The following runs with \verb|xindex -l jp <file>|:
+
+% {begin\string{document\string}}% #2
+% {end\string{document\string}}% #3
+% {\perCent StartVisiblePreamble}% #4
+% {\perCent StopVisiblePreamble}% #5
+
+\noindent
+\begin{minipage}[t]{0.45\linewidth}
+\vspace{0pt}
+\setsansfont{SourceHanSans}\sffamily
+\edef\FancyVerbStartString{\perCent StartVisiblePreamble}
+\edef\FancyVerbStopString{\perCent StopVisiblePreamble}
+\colorbox{black!20}{\parbox{\linewidth}{%
+\VerbatimInput[fontfamily=helvetica]{Examples/xindex-6.tex}
+}}
+
+\edef\FancyVerbStartString{\string\begin\string{document\string}}
+\edef\FancyVerbStopString{\string\end\string{document\string}}
+\colorbox{black!10}{\parbox{\linewidth}{%
+\VerbatimInput[fontfamily=helvetica]{Examples/xindex-6.tex}
+}}
+\end{minipage}\hfill
+\begin{minipage}[t]{0.54\linewidth}
+\vspace{0pt}
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+% mpwidth=0.5\linewidth,
+ pages={2},
+ frame=false,
+ compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-l jp,
+ force=true,
+ runs=2,
+ code=false,
+ docType=latex,
+ showFilename,
+ align=\centering,
+% usefancyvrb,
+ lstOptions={fontfamily=helvetica}]{xindex}
+\documentclass[a5paper]{article}
+%StartVisiblePreamble
+\usepackage{fontspec}
+\setmainfont{SourceHanSans}
+\usepackage[japanese]{babel}
+\addto\captionsjapanese{%
+ \def\indexname{指数}}
+\usepackage{hvindex}% for \Index
+\usepackage{makeidx}\makeindex
+%StopVisiblePreamble
+\usepackage{multicol}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \begin{multicols}{2}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\def\endtheindex{\end{multicols}}
+\makeatother
+\pagestyle{empty}
+\begin{document}
+\Index{車} \Index{車道}
+日本\index{日本|fbox}
+\Index{病院} \Index{コンピュータ}
+\Index{プリンタ} \Index{印刷}
+\Index{スイミングプール} \Index{天王}
+\Index{広島} \Index{ドイツ}
+\Index{日本} \Index{ワープロ}
+\Index{foo} und \Index{bar}
+\Index{//} \Index{4711}
+\newpage\printindex
+\end{document}
+\end{externalDocument}
+\end{minipage}
+
+
+
+%\clearpage
+
+\section{Compressing pagenumbers}\label{Compressing}
+By default page sequences of an entry are compressed to
+\begin{description}
+\item[8f] page 8 and 9
+\item[8ff] page 8, 9, and 10
+\item[8-12] page 8, 9, \ldots, 12
+\end{description}
+
+The so-called folio abbreviation is language dependent and defined in the
+file \Lfile{xindex-cfg-common.cfg}:
+
+{\setsansfont[Scale=MatchUppercase]{SourceHanSans}
+\small
+\begin{Verbatim}[fontfamily=helvetica]
+folium = {
+ de = {"f", "ff"},
+ en = {"f", "ff"},
+ fr = {"\,sq","\,sqq"},
+ jp = {"シンボル","番号"},
+}
+\end{Verbatim}
+}
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.55\linewidth,
+ pages={6},
+ frame=false,
+ compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-l fr,
+ force=true,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{scrartcl}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+%StartVisiblePreamble
+\usepackage{makeidx}\makeindex
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+Sorted with \verb|-l fr|
+
+foobar\index{foobar|(}
+foo\index{foo}\index{bar}\index{baz}\newpage
+foo\index{foo}\index{bar}\index{baz}\newpage
+foo\index{bar}\index{baz}\newpage
+foo\index{baz}\newpage
+foo\index{foo}foobar\index{foobar|)}
+\newpage
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+
+\section{\texttt{hyperref}}
+
+Using the package \Lpack{hyperref} is no problem:
+
+\enlargethispage{2.5\normalbaselineskip}
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.55\linewidth,
+ pages={3},
+ frame=false,
+ compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-l de,
+ force,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass[paper=a6]{scrartcl}
+\usepackage{multicol}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \begin{multicols}{2}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\def\endtheindex{\end{multicols}}
+\makeatother
+%StartVisiblePreamble
+\usepackage{makeidx}\makeindex
+\usepackage{hvindex}% for \Index
+\usepackage[colorlinks]{hyperref}
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+Sorted with \verb|-l DE|
+\Index{Österreich} \Index{Öresund}
+\Index{Ostern} \Index{Ober} \Index{Oberin}
+\Index{Österreich} \index{Öresund|textbf}
+\Index{Ostern} \Index{Ober} \Index{Oberin}
+\Index{Obstler} \Index{Öl} \Index{ölen}
+\Index{Ödem} \Index{Oligarch} \Index{Oder}
+\Index{oder} \index{Fluss!Oder|textit}
+\Index{Oder|seealso{Fluss}} \Index{Göbel}
+\Index{Goethe} \Index{Göthe} \Index{Götz}
+\newpage\Index{Goldmann} \Index{Goethe}
+\newpage \printindex
+\end{document}
+\end{externalDocument}
+
+
+\section{Page argument}
+Every page can be combined with an additional macro, like \verb=\index{foo|fbox}=, the page number
+will be set into a framebox. If we have on the same page the two commands:
+
+\begin{verbatim}
+foo\index{foo} and foo\index{foo|bar}
+\end{verbatim}
+
+then we have two \emph{different} index entries which will not be compressed to one entry.
+In the follwoing example we have four different entries for \emph{foo} which is the reason
+that we do not get an output like \texttt{foo, 1--4}. Only the first two entries are
+of the same type, so we get \texttt{1f} in the output.
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.55\linewidth,
+ pages={5},
+ frame=false,
+ compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-l de,
+ force=true,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{scrartcl}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+%StartVisiblePreamble
+\usepackage{makeidx}\makeindex
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+Ein foo\index{foo} \newpage und \index{foo}
+ein foo\index{foo|textit} \newpage
+und foo\index{foo|textbf} \newpage
+und foo\index{foo|fbox}
+
+\newpage
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+
+
+
+
+\section{The config file}
+
+The main config file is \Lfile{xindex-cfg.lua} is used by default and loading it by the
+optional parameter -c makes no sense. A new config file must have the prefix \texttt{xindex-}
+and the file extension \Lext{lua}, for example: \Lfile{xindex-HAdW-eKO.lua} which can be used
+with \verb|--config HAdW-eKO|. The file must be saved in the documents directory or in
+one which is known to \Lprog{kpsewhich}, for example\footnote{The directory \texttt{xindex} must be created
+before saving the file.} \verb|$TEXMFLOCAL/tex/lualatex/xindex/| %$
+Don not forgot to update the filename database.
+
+A new config file must declare at least the variables which are part of the
+default config file: the translation tables and
+
+\begin{verbatim}
+itemPageDelimiter = "," -- Hello, 14
+compressPages = true
+ -- something like 12--15, instaead of 12,13,14,15. the |( ... |) syntax is still valid
+fCompress = true -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5
+minCompress = 3 -- 14--17 or
+rangeSymbol = "--"
+numericPage = true -- for non numerical pagenumbers, like "VI-17"
+sublabels = {"", "-\\-", "--\\-", "---\\-"}
+ -- for the sub(sub(sub-items, first one is empty
+pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17" -- not used !!!
+indexOpening = "" -- commands/text after \begin{theindex}
+\end{verbatim}
+
+The new config file can define own functions for compressing the pagelist
+for a given entry and for the formatting of the output. They must be called
+\verb|specialCompressPageList| and \verb|specialGetPageList|.
+%needs
+%the unmodified list of pages for one entry.
+
+For example:
+
+\begin{verbatim}
+function specialCompressPageList(pages)
+ if (pages[1]["number"] == "") then pages[1]["number"] = " " end
+ if (#pages <= 1) then
+ pages[1]["number"] = pages[1]["number"]:gsub('-',':~')-- replace "-" with ":~"
+ return pages
+ end -- only one pageno
+ local sortPages = {}
+ local roman
+ local volume
+ local page
+ local i
+ for i=1,#pages do
+ roman = string.gsub(pages[i]["number"],'%U*','') -- only uppercase to catch VII/1-123f and VII/3-123ff (folium pages)
+ if romanToNumber(roman) then
+ roman = string.format("%05d",tonumber(romanToNumber(roman))) -- only roman part VII
+ else
+ roman = ""
+ end
+ volume = string.gsub(pages[i]["number"],'%a*','') -- only the number /2 123 or /2-123
+ if volume then volume = volume:gsub('-%d*','') end -- delete - char to get /2
+ page = string.gsub(pages[i]["number"],'.*-','')
+ page = string.format("%5s",page)
+ sortPages[#sortPages+1] = {
+ origin = pages[i],
+ sort = roman..volume.." "..page } -- no minus between Roman/Volume and first page
+ end
+ table.sort(sortPages, function(a,b) return a["sort"] < b["sort"] end )
+
+[...]
+
+ return pages
+ end
+end
+\end{verbatim}
+
+is a special function which can handle \Index{page number}s like VII-17, VIII/2/1-186.
+Internally exists a function \verb|compressPageList| which is used if no
+\verb|specialCompressPageList| is defined.
+
+\begin{externalDocument}[
+ grfOptions={scale=0.9},% width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+% mpwidth=0.25\linewidth,
+ pages={2},
+ frame=false,
+ compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-c HAdW-eKO,
+ force,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\RequirePackage{filecontents}
+\begin{filecontents*}{\jobname.idx}
+\indexentry{Aachen, Johannes von}{VII/1-215}
+\indexentry{Aarones}{VII/2/1-1003}
+\indexentry{Aarones}{VII/2/1-1012}
+\indexentry{Abrahamson}{VII/2/1-864}
+\indexentry{Abrahamson}{VII/2/1-991}
+\indexentry{Abrahamson}{VII/2/1-1048}
+\indexentry{Abrahamson}{VII/2/1-1067}
+\indexentry{Abrahamson}{VII/2/1-1156}
+\indexentry{Adamson}{VII/2/1-1223}
+\indexentry{Adamson}{IX/1-1228}
+\indexentry{Karl!der Große, Kaiser}{VI/2-987}
+\indexentry{Karl!der Große, Kaiser}{VI/2-989}
+\indexentry{Karl!der Große, Kaiser}{VI/2-1028}
+\indexentry{Karl!IV., Kaiser}{VI/1-12}
+\indexentry{Karl!V., Kaiser}{VI/1-84}
+\indexentry{Karl!V., Kaiser}{VI/1-284}
+\indexentry{Karl!V., Kaiser}{VI/1-654}
+\indexentry{Karl!V., Kaiser}{VI/2-708}
+\indexentry{Karl!V., Kaiser}{VI/2-1014}
+\indexentry{Karl!V., Kaiser}{VI/2-1043}
+\indexentry{Karl!V., Kaiser}{VI/2-1131}
+\indexentry{Karl!V., Kaiser}{VI/2-1210}
+\indexentry{Braunschweig-Wolfenbüttel!Karl Viktor von, Herzog}{VI/1-83}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-758}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-759}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-760}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-761}
+\indexentry{Schleswig-Holstein!Rudolf von, Herzog}{VII/2/1-765}
+\indexentry{Adrian!Hauster}{VII/1-514}
+\indexentry{Adrian!Hauster}{XI/1-515}
+\indexentry{Alting!Mensa}{VII/1-426}
+\indexentry{Alting!Mensa}{VII/1-434}
+\indexentry{Alting!Mensa}{VII/1-453}
+\indexentry{Alting!Mensa}{VII/1-455}
+\indexentry{Alting!Mensa}{VII/1-466}
+\indexentry{Alting!Mensa}{VII/1-467}
+\indexentry{Bremen!Heinz von, Erzbischof|see{Sachsen-Lauenburg}}{}
+\indexentry{Osnabrück!Heinz von, Bischof|see{Sachsen-Lauenburg}}{}
+\indexentry{Zwingl, Haldrich}{IX-479}
+\indexentry{Zwingl, Haldrich}{IX-692}
+\indexentry{Julian!Apostata, römischer Kaiser}{VII/2/1-904}
+\indexentry{Justinian I., byzantinischer Kaiser}{VII/1-326}
+\indexentry{Justinian I., byzantinischer Kaiser}{VII/1-734}
+\indexentry{Justinian I., byzantinischer Kaiser}{VII/2/1-1011}
+\indexentry{Karl!V., Kaiser}{VII/1-34}
+\indexentry{Karl!II., Kaiser}{VII/1-147}
+\indexentry{Karl!III., Kaiser}{VII/1-149}
+\indexentry{Karl!VI., Kaiser}{VII/1-296}
+\indexentry{Karl!IV., Kaiser}{VII/1-34}
+\indexentry{Karl!IV., Kaiser}{VII/1-147}
+\indexentry{Karl!X., Kaiser}{VII/1-149}
+\indexentry{Karl!IX., Kaiser}{VII/1-296}
+\end{filecontents*}
+\documentclass[a4paper]{article}
+\usepackage[margin=1cm]{geometry}
+\usepackage{xcolor}
+\usepackage{url}
+\usepackage{multicol}
+\makeatletter
+\def\theindex{% only for demonstration
+ \newpage
+ \section*{Personenverzeichnis}
+ \begin{multicols}{2}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@ \raggedright
+ \let\item\@idxitem}
+\def\endtheindex{\end{multicols}}
+\makeatother
+%StartVisiblePreamble
+\usepackage{makeidx}
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+\mbox{}\printindex
+\end{document}
+\end{externalDocument}
+
+
+
+
+
+
+The \Index{config file} \Lfile{xindex-dtk.lua} defines a special page output:
+
+\begin{verbatim}
+function specialGetPageList(v,hyperpage) -- Entry table, boolean
+ local Pages = {}
+[..]
+ if (Pages[1]["special"] == nil) or (Pages[1]["number"] == nil) then return "" end
+ if #Pages == 1 then
+ return "\\relax"..Pages[1]["number"].."\\@nil"
+ else
+ pageNo = "\\relax"..Pages[1]["number"]
+ for i=2,#Pages do
+ if Pages[i]["number"] then
+ pageNo = pageNo..", "..Pages[i]["number"].."\\@nil"
+ Pages[i] = {}
+ end
+ end
+[..]
+end
+\end{verbatim}
+
+
+The following example runs \verb|xindex -c dtk -l de -n <input>|
+
+\begin{externalDocument}[
+ grfOptions={scale=0.9},% width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.25\linewidth,
+ pages={1},
+ frame=false,
+ compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-c dtk -n -l de,
+ force,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\RequirePackage{filecontents}
+\begin{filecontents*}{\jobname.idx}
+\indexentry{VoßHerbert@Herbert Voß!Wasgenstraße 121\protect \\10127 Potsdam\protect \\\Email {herbert"@xyz.de}}{3}
+\indexentry{SeversMartin@Martin Severs!siehe Seite~\protect \pageref {president}}{4}
+\indexentry{VoßHerbert@Herbert Voß!Wasgensteig 12\protect \\10127 Potsdam\protect \\\Email {herbert"@xyz.de}}{5}
+\indexentry{ZiegendatenMichael@Michael Ziegendaten!Lokostr. 19 \protect \\ 20713 Kalln \protect \\\Email {ziegendaten"@mail.com}}{9}
+\indexentry{BährendtsenElke@Elke Baehrendtsen!\Email {dori"@xyz.de}}{14}
+\indexentry{JacekJonasson Jared@Jonasson Jared Jazek!\Email {mail"@jones.net}}{20}
+\indexentry{KoomerMartin@Martin Koomer!Freiherr-von-Stein-Weg~16\protect \\ 15525~Erdingen-Neckar\protect \\ \Email {kooma"@xyz.info}}{24}
+\indexentry{KoomerMartin@Martin Koomer!Freiherr-von-Stein-Weg~16\protect \\ 15525~Erdingen-Neckar\protect \\ \Email {kooma"@xyz.info}}{31}
+\indexentry{SchusterEike@Eike Schuster!Haussteig~15\protect \\ 36396~Stuttens\protect \\ \Email {elke.schuster"@kabelxyz.de}}{40}
+\indexentry{FanntHorst@Horst Fannt!Friedrichallee 74\protect \\13233 Neu-Isenburg\protect \\\Email {juergen.fannt"@gmxnet.de}}{48}
+\end{filecontents*}
+\documentclass{article}
+\usepackage{url}
+\DeclareUrlCommand\Email{%
+ \def\UrlLeft{}%
+ \def\UrlRight{}%
+ \def\UrlLinkPrefix{mailto:}%
+ \def\UrlType{email}%
+}
+\usepackage{multicol}
+\makeatletter
+\def\DTK@scan@item#1\subitem#2\relax#3\@nil{%
+ \def\DTK@tempa{#1}\def\DTK@tempb{#2}\def\DTK@tempc{#3}%
+}
+\def\theindex{% only for demonstration
+ \columnseprule=\z@ \columnsep=10\p@
+ \begin{multicols}{2}[\noindent\textbf{\large Autorenliste}]%
+ \makeatletter
+ \def\indexspace{}%
+ \parindent\z@
+ \setlength{\parskip}{\z@ \@plus .3\p@}%
+ \setlength{\parfillskip}{\z@ \@plus 1fil}%
+ \raggedright
+ \def\item##1\@nil{\DTK@scan@item##1\@nil
+ \par\parbox{\columnwidth}{%
+ \textbf{\DTK@tempa}\hfill[\DTK@tempc]\par\DTK@tempb
+ }%
+ \par\bigskip
+ }%
+}
+\def\endtheindex{\end{multicols}}
+\makeatother
+%StartVisiblePreamble
+\usepackage{makeidx}
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+\mbox{}\ref{president}
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+\subsection{Sublabels}
+There are three predefined sublabels for \Lcs{subitems}. The program itself can handle more, there is
+no limit for \Lprog{xindex}.
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.55\linewidth,
+ pages={2},
+ frame=false,
+ compiler=lualatex,
+ crop,
+ xindex,
+% xindexOptions=,
+ force=true,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{article}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \pagestyle{empty}%
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+\pagestyle{empty}%
+%StartVisiblePreamble
+\makeatletter
+\g@addto@macro{\theindex}{%
+ \def\subsubsubitem{\@idxitem\hspace*{35\p@}}
+ \def\subsubsubsubitem{\@idxitem\hspace*{40\p@}}
+}
+\makeatother
+\usepackage{makeidx}\makeindex
+%StopVisiblePreamble
+\begin{document}
+foo\index{foo} bar\index{foo!bar}
+baz\index{foo!bar!baz} foobar%
+\index{foo!bar!baz!foobar} Kuba
+\index{foo!bar!baz!foobar!Kuba}
+\newpage \printindex
+\end{document}
+\end{externalDocument}
+
+
+
+
+
+
+
+
+\section{Including \LaTeX\ commands into the \Lext{idx} file}
+The command \Lcs{addtocontents} doesn't work for the index file. With the \LaTeX\ package
+\Lpack{xindex} (same name as the Lua program \Lprog{xindex}) defines a macro \Lcs{writeidx}
+which writes its argument into the \Lext{idx} file. This can be usefull to insert a
+\Index{pagebreak}/""\Index{columnbreak}
+before a new letter in the output of the index file:
+
+
+\begin{verbatim}
+\documentclass{article}
+\usepackage{makeidx}
+\makeindex
+\usepackage{xindex}
+\begin{document}
+
+\index{foo}foo and
+\writeidx{\clearpage}
+\index{bar}bar
+
+\printindex
+\end{document}
+\end{verbatim}
+
+
+Such commands are then taken into account by the program \Lprog{xindex}. With the often used program \Lprog{makeindex}
+such commands are ignored. In the following example we put an horizontal line after the first entry:
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.55\linewidth,
+ pages={2},
+ frame=false,
+ compiler=lualatex --shell-escape,
+ crop,
+ xindex,
+ xindexOptions=-l de,
+ force,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{scrartcl}
+\usepackage{libertinus-otf}
+%StartVisiblePreamble
+\usepackage{xindex}
+\makeindex
+%StopVisiblePreamble
+\pagestyle{empty}
+\makeatletter
+\def\theindex{% only for demonstration
+ \newpage
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+\begin{document}
+\index{foo}foo and
+\writeidx{\item\protect\hrulefill}
+\index{bar}bar
+\index{gex}gex
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+\section{Headings}
+By default the output uses the english headings: \textit{Symbols}, \textit{Numbers}, and \textit{A} \ldots
+There are three predefined languages \texttt{en}, \texttt{de}, and \texttt{fr}. The definition is in the file
+\Lfile{xindex-cfg-common.lua} (see also section \vref{language}).
+%
+It can easily be extended for other \Index{language}s. Sometimes the headers are not needed, for example in a name
+list. With the optional argument \verb=-n= or \verb=--noheadings= the created \Lext{ind} file has only
+the vertical space between different first letters:
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.55\linewidth,
+ pages={5},
+ frame=false,
+ compiler=lualatex,
+ crop,
+ xindex,
+ xindexOptions=-n,
+ force,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{scrartcl}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+%StartVisiblePreamble
+\usepackage{makeidx}\makeindex
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+Ein foo\index{foo}\index{bar|(}
+ \newpage und \index{foo}
+ein foo\index{foo|textit} \newpage
+und foo\index{foo|textbf} \newpage
+und foo\index{foo|fbox}
+\index{bar|)}
+\newpage
+\verb|xindex -n <file>|
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+\section{Case sensitive index entries}
+By default \textsf{foo} and \textsf{Foo} are two different entries and will handled differently
+by \Lprog{xindex}: \textsf{Foo} will be as an own entry \emph{before} \textsf{foo}. Let's see
+a more complex example. In the index the entry \verb|xindex-DIN2.lua| is the first one of
+the \verb|xindex-???| series because uppercase letters are sorted before lowercase letters.
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.55\linewidth,
+ pages={2},
+ frame=false,
+ compiler=lualatex --shell-escape,
+ crop,
+ xindex,
+% xindexOptions=,
+ force,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{scrartcl}
+\usepackage{libertinus-otf}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+\usepackage{filecontents}
+\begin{filecontents*}{\jobname.idx}
+\indexentry{xindex package@\texttt {xindex} package|hyperpage}{2}
+\indexentry{xindex program@\texttt {xindex} program|hyperpage}{4}
+\indexentry{xindex-cfg.lua file@\texttt {xindex-cfg.lua} file|hyperpage}{6}
+\indexentry{xindex-newfile.lua file@\texttt {xindex-newfile.lua} file|hyperpage}{6}
+\indexentry{xindex-DIN2.lua file@\texttt {xindex-DIN2.lua} file|hyperpage}{6}
+\indexentry{xindex-cfg-common.cfg file@\texttt {xindex-cfg-common.cfg} file|hyperpage}{9}
+\indexentry{xindex-cfg.lua file@\texttt {xindex-cfg.lua} file|hyperpage}{10}
+\indexentry{xindex-HAdW-eKO.lua file@\texttt {xindex-HAdW-eKO.lua} file|hyperpage}{10}
+\indexentry{xindex-dtk.lua file@\texttt {xindex-dtk.lua} file|hyperpage}{12}
+\indexentry{xindex program@\texttt {xindex} program|hyperpage}{13}
+\indexentry{xindex program@\texttt {xindex} program|hyperpage}{14}
+\indexentry{xindex-cfg-common.lua file@\texttt {xindex-cfg-common.lua} file|hyperpage}{14}
+\indexentry{xindex package@\texttt {xindex} package|hyperpage}{15}
+\end{filecontents*}
+%StartVisiblePreamble
+\usepackage{makeidx}
+\usepackage{hyperref}
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+foo\newpage
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+The same example sorted with the \verb|-a| or \verb|--nocasesensitive| has another output: now
+\verb|xindex-cfg-common.lua| is the first one of the \verb|xindex-???| series.
+
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.55\linewidth,
+ pages={2},
+ frame=false,
+ compiler=lualatex --shell-escape,
+ crop,
+ xindex,
+ xindexOptions=-a,
+ force,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{scrartcl}
+\usepackage{libertinus-otf}
+\makeatletter
+\def\theindex{% only for demonstration
+ \section*{\indexname}
+ \parskip\z@ \@plus .3\p@\relax \parindent\z@
+ \let\item\@idxitem}
+\makeatother
+\usepackage{filecontents}
+\begin{filecontents*}{\jobname.idx}
+\indexentry{xindex package@\texttt {xindex} package|hyperpage}{2}
+\indexentry{xindex program@\texttt {xindex} program|hyperpage}{4}
+\indexentry{xindex-cfg.lua file@\texttt {xindex-cfg.lua} file|hyperpage}{6}
+\indexentry{xindex-newfile.lua file@\texttt {xindex-newfile.lua} file|hyperpage}{6}
+\indexentry{xindex-DIN2.lua file@\texttt {xindex-DIN2.lua} file|hyperpage}{6}
+\indexentry{xindex-cfg-common.cfg file@\texttt {xindex-cfg-common.cfg} file|hyperpage}{9}
+\indexentry{xindex-cfg.lua file@\texttt {xindex-cfg.lua} file|hyperpage}{10}
+\indexentry{xindex-HAdW-eKO.lua file@\texttt {xindex-HAdW-eKO.lua} file|hyperpage}{10}
+\indexentry{xindex-dtk.lua file@\texttt {xindex-dtk.lua} file|hyperpage}{12}
+\indexentry{xindex program@\texttt {xindex} program|hyperpage}{13}
+\indexentry{xindex program@\texttt {xindex} program|hyperpage}{14}
+\indexentry{xindex-cfg-common.lua file@\texttt {xindex-cfg-common.lua} file|hyperpage}{14}
+\indexentry{xindex package@\texttt {xindex} package|hyperpage}{15}
+\end{filecontents*}
+%StartVisiblePreamble
+\usepackage{makeidx}
+\usepackage{hyperref}
+%StopVisiblePreamble
+\pagestyle{empty}
+\begin{document}
+foo\newpage
+\printindex
+\end{document}
+\end{externalDocument}
+
+
+
+
+\section{Automatic index creation}
+With package \Lpack{xindex} one can define several different index files, e.\,g.
+an \Index{index of names}. With the optional argument \Loption{imakeidx} the package itself loads \Lpack{imakeidx}
+and adds the program \Lprog{xindex} as the default program to \Lpack{imakeidx}.
+
+\begin{externalDocument}[
+% grfOptions={width=\dimexpr\linewidth-2\fboxsep-2\fboxrule},
+ mpwidth=0.55\linewidth,
+ pages={6},
+ frame=false,
+ compiler=lualatex --shell-escape,
+ crop,
+ xindex,
+ xindexOptions=-l de,
+ force,
+ runs=2,code,docType=latex,
+ showFilename,
+ align=\centering,
+ lstOptions={columns=fixed}]{xindex}
+\documentclass{scrartcl}
+\usepackage{libertinus-otf}
+\makeatletter
+\let\ps@plain\ps@empty
+\makeatother
+%StartVisiblePreamble
+\usepackage[imakeidx]{xindex}
+\makeindex[name=persons,title=Index of names,
+ columns=1,options=--noheadings]
+\def\ThanhVN{Hàn Thê\protect\llap{%
+ \raise 0.5ex\hbox{\'{}}}}
+%StopVisiblePreamble
+\pagestyle{empty}\renewcommand\thepage{}
+\begin{document}
+foo\index[persons]{Niepraschk,~ Rolf}
+foo\index[persons]{Lamport,~ Leslie}
+foo\index[persons]{Knuth,~ Donald}
+foo\index[persons]{Knuth,~ Donald}
+\newpage
+foo\index[persons]{Lamport,~ Leslie}
+foo\index[persons]{Thành,~ \ThanhVN}
+foo\index[persons]{Kew,~ Jonathan}
+foo\index[persons]{Kohm,~ Markus}
+foo\index[persons]{Preining,~ Norbert}
+\newpage
+foo\index[persons]{Schenk,~ Christian}
+foo\index[persons]{Feuerstack,~ Thomas}
+foo\index[persons]{Tobin,~ Geoffrey}
+foo\index[persons]{Wilson,~ Peter}
+\newpage
+foo\index[persons]{Kohm,~ Markus}
+foo\index[persons]{Theiling,~ Henrik}
+foo\index[persons]{Pégourié-Gonnard,~ Manuel}
+foo\index[persons]{Roux,~ Élie}
+\newpage
+foo\index[persons]{Mittelbach,~ Frank}
+foo\index[persons]{Fairbairns,~ Robin}
+foo\index[persons]{Lemberg,~ Werner}
+foo\index[persons]{Volovich,~ Vladimir}
+
+\printindex[persons]
+\end{document}
+\end{externalDocument}
+
+
+You have to run \LaTeX\ with the \verb|--shell-escape|\index{Shell escape} option to run \Lprog{xindex}
+from within the \LaTeX\ document.
+
+\section{Demerits}
+\begin{itemize}
+\item For more than 5000 entries in the \Lext{idx} file the internal Lua function
+for \Index{sorting} may take some time.
+\item The \Lext{idx} file is not checked for \LaTeX\ errors\index{LaTeX\ errors@\LaTeX\ errors}
+in the argument of \Lcs{indexentry}.
+\end{itemize}
+
+
+
+
+
+%\nocite{*}
+%\printbibliography
+
+
+\printindex
+
+\end{document}
+
+
+
+folium = {
+ de = {"f", "ff"},
+ en = {"f", "ff"},
+ fr = {"sq","sqq"},
+}
diff --git a/indexing/xindex/latex/xindex.sty b/indexing/xindex/latex/xindex.sty
new file mode 100644
index 0000000000..65799577dc
--- /dev/null
+++ b/indexing/xindex/latex/xindex.sty
@@ -0,0 +1,76 @@
+%% This is file `xindex.sty',
+%%
+%% Copyright (C) 2019-
+%% Herbert Voss
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% 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.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%
+% $Id: xindex.sty 836 2018-11-11 20:22:56Z herbert $
+%
+% -------------------------------------
+\ProvidesPackage{xindex}[2018/11/11 v. 0.02 write into an idx file (hv)]
+%
+\RequirePackage{xkeyval}
+
+\newif\if@@imakeidx \@@imakeidxfalse
+
+\DeclareOptionX{imakeidx}{\@@imakeidxtrue}
+\DeclareOptionX*{\PassOptionsToPackage\CurrentOption{imakeidx}}
+\ProcessOptionsX\relax
+
+\@ifpackageloaded{imakeidx}{}{% imakeidx already loaded?? if not then define ...
+ \newif\ifimki@startedidx
+ \newif\ifimki@splitindex
+}
+
+\if@@imakeidx
+ \typeout{xindex: Using package imakeidx}%
+ \RequirePackage{imakeidx}
+ \def\imki@progdefault{xindex}
+ \def\imki@program{xindex}
+%
+ \def\imki@@startidxsplit#1{%
+ \if@filesw
+ \def\index{\@bsphack
+ \@ifnextchar [{\@index}{\@index[\imki@jobname]}}
+ \expandafter\newwrite\csname #1@idxfile\endcsname
+ \immediate\openout \csname #1@idxfile\endcsname #1.idx\relax
+ \def\writeidx##1{\write\expandafter\csname #1@idxfile\endcsname{\noexpand##1}}%
+ \typeout{Writing index file #1.idx}%
+ \fi
+ }
+ \global\imki@startedidxfalse
+ \def\imki@@startidxunique#1{%
+ \if@filesw
+ \ifimki@startedidx\else
+ \newwrite\@indexfile
+ \immediate\openout\@indexfile\imki@jobname.idx%
+ \def\writeidx##1{\write\@indexfile{\noexpand##1}}%
+ \global\imki@startedidxtrue
+ \fi
+ \def\index{\@bsphack
+ \@ifnextchar [{\@index}{\@index[\imki@jobname]}}
+ \expandafter\let\csname #1@idxfile\endcsname\@empty
+ \typeout{Started index file #1}%
+ \fi
+ }
+%
+ \ifimki@splitindex
+ \let\imki@startidx\imki@@startidxunique
+ \else
+ \let\imki@startidx\imki@@startidxsplit
+ \fi
+\else
+ \typeout{xindex: Using package makeidx}%
+ \RequirePackage{makeidx}
+ \def\writeidx#1{\write\@indexfile{\noexpand#1}}
+\fi
+
+\endinput
+
diff --git a/indexing/xindex/lualatex/xindex-DIN2.lua b/indexing/xindex/lualatex/xindex-DIN2.lua
new file mode 100644
index 0000000000..601b977f8e
--- /dev/null
+++ b/indexing/xindex/lualatex/xindex-DIN2.lua
@@ -0,0 +1,103 @@
+-----------------------------------------------------------------------
+-- FILE: xindex-cfg.lua
+-- DESCRIPTION: configuration file for xindex.lua
+-- REQUIREMENTS:
+-- AUTHOR: Herbert Voß
+-- LICENSE: LPPL1.3
+-----------------------------------------------------------------------
+
+if not modules then modules = { } end modules ['xindex-cfg'] = {
+ version = 0.13,
+ comment = "configuration to xindex.lua",
+ author = "Herbert Voss",
+ copyright = "Herbert Voss",
+ license = "LPPL 1.3"
+}
+
+escape_chars = { -- by default " is the escape char
+ {'""', "\\escapedquote", "\"{}" },
+ {'"@', "\\escapedat", "@" },
+ {'"|', "\\escapedvert", "|" },
+ {'"!', "\\escapedexcl", "!" }
+}
+
+itemPageDelimiter = "," -- Hello, 14
+compressPages = true -- something like 12--15, instaead of 12,13,14,15. the |( ... |) syntax is still valid
+fCompress = true -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5
+minCompress = 3 -- 14--17 or
+numericPage = true -- for non numerical pagenumbers, like "VI-17"
+sublabels = {"", "-\\,", "--\\,", "---\\,"} -- for the (sub(sub(sub-items first one is for item
+pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17"
+indexOpening = "" -- commands after \begin{theindex}
+rangeSymbol = "--"
+
+
+--[[
+ Each character's position in this array-like table determines its 'priority'.
+ Several characters in the same slot have the same 'priority'.
+]]
+alphabet_lower = { -- for sorting
+ { ' ' }, -- only for internal tests
+ { 'a', 'á', 'à', 'å', 'æ', },
+ { 'ae', 'ä'},
+ { 'b' },
+ { 'c', 'ç' },
+ { 'd' },
+ { 'e', 'é', 'è', 'ë' },
+ { 'f' },
+ { 'g' },
+ { 'h' },
+ { 'i', 'í', 'ì', 'ï' },
+ { 'j' },
+ { 'k' },
+ { 'l' },
+ { 'm' },
+ { 'n', 'ñ' },
+ { 'o', 'ó', 'ò', 'ø', 'œ'},
+ { 'oe', 'ö' },
+ { 'p' },
+ { 'q' },
+ { 'r' },
+ { 's', 'š', 'ß' },
+ { 't' },
+ { 'u', 'ú', 'ù' },
+ { 'ue', 'ü' },
+ { 'v' },
+ { 'w' },
+ { 'x' },
+ { 'y', 'ý', 'ÿ' },
+ { 'z', 'ž' }
+}
+alphabet_upper = { -- for sorting
+ { ' ' },
+ { 'A', 'Á', 'À', 'Å', 'Æ'},
+ { 'AE', 'Ä'},
+ { 'B' },
+ { 'C', 'Ç' },
+ { 'D' },
+ { 'E', 'È', 'È', 'Ë' },
+ { 'F' },
+ { 'G' },
+ { 'H' },
+ { 'I', 'Í', 'Ì', 'Ï' },
+ { 'J' },
+ { 'K' },
+ { 'L' },
+ { 'M' },
+ { 'N', 'Ñ' },
+ { 'O', 'Ó', 'Ò', 'Ø','Œ' },
+ { 'OE', 'Ö' },
+ { 'P' },
+ { 'Q' },
+ { 'R' },
+ { 'S', 'Š' },
+ { 'T' },
+ { 'U', 'Ú', 'Ù' },
+ { 'UE', 'Ü' },
+ { 'V' },
+ { 'W' },
+ { 'X' },
+ { 'Y', 'Ý', 'Ÿ' },
+ { 'Z', 'Ž' }
+}
+
diff --git a/indexing/xindex/lualatex/xindex-HAdW-eKO.lua b/indexing/xindex/lualatex/xindex-HAdW-eKO.lua
new file mode 100644
index 0000000000..4601cccef5
--- /dev/null
+++ b/indexing/xindex/lualatex/xindex-HAdW-eKO.lua
@@ -0,0 +1,317 @@
+-----------------------------------------------------------------------
+-- FILE: xindex-HAdW-eKO.lua
+-- DESCRIPTION: configuration file for xindex.lua
+-- REQUIREMENTS:
+-- AUTHOR: Herbert Voß
+-- LICENSE: LPPL1.3
+-----------------------------------------------------------------------
+--
+-- configuration for index files of the Heidelberger Akademie der Wissenschaften
+
+if not modules then modules = { } end modules ['xindex-HAdW-eKO'] = {
+ version = 0.13,
+ comment = "configuration to xindex.lua",
+ author = "Herbert Voss",
+ copyright = "Herbert Voss",
+ license = "LPPL 1.3"
+}
+
+--local version = "0.01"
+
+itemPageDelimiter = " \\dotfill " -- Hello ..... 14
+compressPages = true -- something like 12--15, instaead of 12,13,14,15. the |( ... |) syntax is still valid
+fCompress = true -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5
+minCompress = 3 -- 14--17 or
+numericPage = false -- for non numerical pagenumbers, like "VI-17"
+sublabels = {"", "-\\,", "--\\,", "---\\,"} -- for the (sub(sub(sub-items first one is for item
+pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17"
+indexOpening = "" -- commands after \begin{theindex}
+rangeSymbol = "--"
+
+case_sensitive = false -- speeds up running
+
+--[[
+ Each character's position in this array-like table determines its 'priority'.
+ Several characters in the same slot have the same 'priority'.
+]]
+alphabet_lower = { -- for sorting
+ { ' ' }, -- only for internal tests
+ { 'a', 'á', 'à', 'ä'},
+ { 'b' },
+ { 'c' },
+ { 'd' },
+ { 'e', 'é', 'è', 'ë' },
+ { 'f' },
+ { 'g' },
+ { 'h' },
+ { 'i', 'í', 'ì', 'ï' },
+ { 'j' },
+ { 'k' },
+ { 'l' },
+ { 'm' },
+ { 'n', 'ñ' },
+ { 'o', 'ó', 'ò', 'ö' },
+ { 'p' },
+ { 'q' },
+ { 'r' },
+ { 's' },
+ { 't' },
+ { 'u', 'ú', 'ù', 'ü' },
+ { 'v' },
+ { 'w' },
+ { 'x' },
+ { 'y' },
+ { 'z' }
+}
+alphabet_upper = { -- for sorting
+ { ' ' },
+ { 'A', 'Á', 'À', 'Ä'},
+ { 'B' },
+ { 'C' },
+ { 'D' },
+ { 'E', 'È', 'È', 'ë' },
+ { 'F' },
+ { 'G' },
+ { 'H' },
+ { 'I', 'Í', 'Ì', 'ï' },
+ { 'J' },
+ { 'K' },
+ { 'L' },
+ { 'M' },
+ { 'N', 'Ñ' },
+ { 'O', 'Ó', 'Ò', 'Ö' },
+ { 'P' },
+ { 'Q' },
+ { 'R' },
+ { 'S' },
+ { 'T' },
+ { 'U', 'Ú', 'Ù', 'Ü' },
+ { 'V' },
+ { 'W' },
+ { 'X' },
+ { 'Y' },
+ { 'Z' }
+}
+
+
+--\indexentry{Ackers, Carolus}{VII/1-715}
+--\indexentry{Bremen!Adalbert I. von, Erzbischof}{VII/2/1-948}
+--\indexentry{Bremen!Adalbert I. von, Erzbischof}{VII/1-50}
+
+function specialCompressPageList(pages)
+-- print(#pages..".. number:|"..pages[1]["number"].."| Special:"..pages[1]["special"])
+ if (pages[1]["number"] == "") then pages[1]["number"] = " " end
+ if (#pages <= 1) then
+ pages[1]["number"] = pages[1]["number"]:gsub('-',':~')-- replace "-" with ":~"
+ return pages
+ end -- only one pageno
+--[[
+modify pagelist
+sortPages = {{ origin = { number=VII/1-715, special="" },
+ sort = 07/1-00715 },
+ {...}
+ }
+]]
+ local sortPages = {}
+ local roman
+ local volume
+ local page
+ local i
+--print("----------------------------------------")
+ for i=1,#pages do
+ roman = string.gsub(pages[i]["number"],'%U*','') -- only uppercase to catch VII/1-123f and VII/3-123ff (folium pages)
+ if romanToNumber(roman) then
+ roman = string.format("%05d",tonumber(romanToNumber(roman))) -- only roman part VII
+ else
+ roman = ""
+ end
+ volume = string.gsub(pages[i]["number"],'%a*','') -- only the number /2 123 or /2-123
+ if volume then volume = volume:gsub('-%d*','') end -- delete - char to get /2
+ page = string.gsub(pages[i]["number"],'.*-','')
+ page = string.format("%5s",page)
+ sortPages[#sortPages+1] = {
+ origin = pages[i],
+ sort = roman..volume.." "..page } -- no minus between Roman/Volume and first page
+--print(roman..volume.." "..page.." Special:"..pages[i]["special"])
+ end
+-- sort the page list
+ table.sort(sortPages, function(a,b) return a["sort"] < b["sort"] end )
+ local Pages = {}
+-- writeLog(1,print(getRawPagesP(sortPages)),2)
+ for i=1,#sortPages do -- use the sorted origin table
+ Pages[#Pages+1] = sortPages[i]["origin"]
+ end
+-- writeLog(1,print(getRawPagesP(Pages)),2)
+-- test if two or more pages in the list
+ if #Pages == 2 then -- only two pages
+ local page1 = string.gsub(Pages[1]["number"],'%A*','') -- get prefix1
+ local page2 = string.gsub(Pages[2]["number"],'%A*','') -- get prefix2
+ print(page1,Pages[1]["number"],page2,Pages[2]["number"])
+ if (page1 == page2) then -- same prefix
+ page1 = string.gsub(Pages[1]["number"],'.*-','') -- get page1
+ page2 = string.gsub(Pages[2]["number"],'.*-','') -- get page2
+ if ((type(tonumber(page1)) ~= "number") or (type(tonumber(page2)) ~= "number")) then return Pages end -- one is not numeric
+ if (page2-page1) == 1 then -- pagediff = 1
+ Pages[1]["number"] = Pages[1]["number"].."f"
+ Pages[2] = nil -- remove second page
+ return Pages
+ else -- page difference > 1
+ Pages[1]["number"] = pages[1]["number"]:gsub('-',':~')
+ Pages[2]["number"] = string.gsub(Pages[2]["number"],'.*-','') -- use only number -> same prefix
+ return Pages -- Pages[1] is the same
+ end
+ else -- different prefixes
+ Pages[1]["number"] = Pages[1]["number"]:gsub('-',':~')
+ Pages[2]["number"] = Pages[2]["number"]:gsub('-',':~')
+ return Pages -- different prefix -> simple return of the two pages
+ end
+ else -- more than two pages
+ local prefixList = {}
+ local lastPrefix = ""
+ local currentPrefix
+ for i=1,#Pages do -- create the list of different prefixes, eg {VI, VI/2/1, VI/2/2}
+ currentPrefix, j = string.gsub(Pages[i]["number"],'-.*','')
+ if currentPrefix ~= lastPrefix then
+ prefixList[#prefixList+1] = currentPrefix
+ lastPrefix = currentPrefix
+ end
+ end
+ pages = {}
+ for j = 1,#prefixList do
+ lastPrefix = prefixList[j]
+ i = 1
+ local subPageList = {}
+ while (i <= #Pages) do
+ currentPrefix, _ = string.gsub(Pages[i]["number"],'-.*','')
+ if (lastPrefix == currentPrefix) then
+ subPageList[#subPageList+1] = { number = string.gsub(Pages[i]["number"],'.*-',''), special = Pages[i]["special"] }
+ end
+ i = i +1
+ end
+ sortPages = compressPageList(subPageList)
+ -- instead of minus between Roman/Volume and first page insert colon
+ if (stripLeadingSpaces(sortPages[1]["number"]) == "") then
+ colon = ""
+ sortPages[1]["number"] = ""
+ else
+ colon = ':~'
+ end
+ pages[#pages+1] = { number = lastPrefix..colon..sortPages[1]["number"], special = sortPages[1]["special"] }
+ for i=2,#sortPages do
+ pages[#pages+1] = sortPages[i]
+ end
+ end
+ return pages
+ end
+end
+
+function replaceRoman(r)
+ local i = romanToNumber(r)
+ if i then return "//"..string.format("%05d",i).."//"
+ else return r
+ end
+end
+function replaceRomanB(r)
+ local i = romanToNumber(r)
+ if i then return "!//"..string.format("%05d",i).."//."
+ else return r
+ end
+end
+
+function SORTprehook(data) -- replace roman with algebraic, eg Karl IX -> Karl // 9//
+-- \indexentry{Karl!V., Kaiser}{VI/1-284} must also be catched
+-- writeLog(1,require 'xindex-pretty'.dump(data),0) -- only for internal dump
+ local entry
+ local elements = {}
+ for i=1,#data do
+ entry = data[i]["Entry"]
+ elements = entry:split()
+ if (#elements > 1) then -- at least one space (two elements)
+ local number = romanToNumber(elements[#elements])
+ if number then
+ local strNr = string.format("%03d",tostring(number))
+ elements[#elements] = "//"..strNr.."//"
+ entry = ""
+ for j=1,#elements do entry=entry.." "..elements[j] end -- has leading space
+ else
+ entry = entry:gsub("!(.-)%.",replaceRomanB) -- {Karl!V., Kaiser}{VI/1-284}
+ end
+ data[i]["Entry"] = entry:gsub("^%s*(.-)%s*$", "%1") -- strip leading space
+ end
+ end
+ return data
+end
+
+function SORTposthook(data) -- the other way round as prehook
+ local entry
+ local elements = {}
+ for i=1,#data do
+ entry = data[i]["Entry"]
+ if entry:find("//") then
+ data[i]["Entry"] = entry:gsub("//(.-)//",numberToRoman)
+ end
+ end
+ return data
+end
+
+function colorBox(str)
+ return ("\\colorbox{black!15}{"..str.."}:~")
+end
+
+-- Pages[1]["number"] = pages[1]["number"]:gsub('(.-):~',colorBox)
+-- Pages[2]["number"] = pages[2]["number"]:gsub('(.-):~',colorBox)
+
+
+function specialGetPageList(v,hyperpage)
+ local Pages = {}
+ if v["pages"] then
+ table.sort(v["pages"],pageCompare)-- nur nötig, da User manuell eine Zeile einfügen kann
+ if specialCompressPageList then
+ Pages = specialCompressPageList(v["pages"])
+ else
+ Pages = compressPageList(v["pages"])
+ end
+-- require 'xindex-pretty'.dump(Pages) -- only for internal dump
+ local pageNo
+--[[
+\indexentry{Auto|hyperindexformat{\textbf}}{1}
+-> \item Auto, \hyperindexformat{\textbf}{1}
+
+ add for example \hyperpage{5\nohyperpage{f}} , same for ff
+
+ \item foo, \hyperpage{1\nohyperpage{f}},
+ \hyperpage{4\nohyperpage{ff}}, \hyperpage{8}
+
+]]
+ if hyperpage then
+ if string.find(v["pages"][1]["special"],"hyperindexformat") then
+ pageNo = v["pages"][1]["special"].."{"..checkFF(Pages[1]["number"].."}")
+ else
+ pageNo = "\\hyperpage{"..checkFF(Pages[1]["number"]).."}"
+ end
+ for i=2,#Pages do
+ if string.find(v["pages"][i]["special"],"hyperindexformat") then
+ pageNo = pageNo..", "..v["pages"][i]["special"].."{"..checkFF(Pages[i]["number"].."}")
+ else
+ pageNo = pageNo..", \\hyperpage{"..checkFF(Pages[i]["number"]).."}"
+ end
+-- Pages[i] = nil
+ end
+ else
+ writeLog(1,"getPageList: "..tostring(Pages[1]["special"]).."{"..tostring(Pages[1]["number"]).."}\n",2)
+ if (Pages[1]["special"] == nil) or (Pages[1]["number"] == nil) then return "" end
+ pageNo = Pages[1]["special"].."{"..Pages[1]["number"]:gsub('(.-):~',colorBox).."}"
+ for i=2,#Pages do
+ if Pages[i]["number"] then
+ pageNo = pageNo..", "..Pages[i]["special"].."{"..Pages[i]["number"]:gsub('(.-):~',colorBox).."}"
+ Pages[i] = {}
+ end
+ end
+ end
+ return pageNo
+ else
+ return ""
+ end
+end
+
+
diff --git a/indexing/xindex/lualatex/xindex-base.lua b/indexing/xindex/lualatex/xindex-base.lua
new file mode 100644
index 0000000000..c2647f2df2
--- /dev/null
+++ b/indexing/xindex/lualatex/xindex-base.lua
@@ -0,0 +1,243 @@
+-----------------------------------------------------------------------
+-- FILE: xindex-base.lua
+-- DESCRIPTION: base file for xindex.lua
+-- REQUIREMENTS:
+-- AUTHOR: Herbert Voß
+-- LICENSE: LPPL1.3
+-----------------------------------------------------------------------
+
+local info = { version = 0.13 }
+
+-- check config
+if pageNoPrefixDel ~= "" then
+-- numericPage = false
+ pageNoPrefixPattern = "^.*"..pageNoPrefixDel
+end
+
+writeLog(2,"Read Data from file "..inFile.." ... \n",0)
+local lines = read_lines_from(inFile)
+writeLog(2,#lines.." lines of data read\n",0)
+
+if vlevel > 1 then
+ writeLog(1,"--------------- Input data -----------------\n",2)
+ for _,l in pairs(lines) do writeLog(1,l.."\n",2) end
+ writeLog(1,"--------------- end Input data -----------------\n",2)
+end
+
+local Index = {} -- Entry = "Seitenzahl(en)"
+local pages = {}
+local noEntryfound
+local noPagefound
+
+hyperpage, lines = checkHyperpage(lines) -- hyperref used?
+if hyperpage then writeLog(1,"We have hyperpages ... \n",1) end
+
+--for _,l in pairs(lines) do print (l) end
+
+writeLog(1,"Change escape chars with macros ... \n",0)
+for k,v in pairs(lines) do
+ if not commandEntry(v) then
+ for i, str0 in ipairs(escape_chars) do
+ v = v:gsub(str0[1],str0[2])
+ end
+ if k < #lines then
+ if commandEntry(lines[k+1]) then -- is the next line not a \indexentry ?
+ Index = getEntryAndPage(v,lines[k+1],Index)-- read two lines
+ else
+ Index = getEntryAndPage(v,"",Index)-- current line
+ end
+ else
+ Index = getEntryAndPage(v,"",Index)-- current line
+ end
+ end
+end
+
+writeLog(1,"... done\n",0)
+writeLog(1,"------------------ Start list after getEntryAndPage() ------------------------\n,",2)
+printList(Index,2)
+writeLog(1,"\n------------------ end list after getEntryAndPage() ------------------------\n",2)
+writeLog(2,"Sorting entries: for LARGE idx files it can take some minutes ... \n",0)
+
+if SORTprehook then Index = SORTprehook(Index) end
+k = 0
+table.sort(Index,UTFCompare)
+if SORTposthook then Index = SORTposthook(Index) end
+
+writeLog(1,"\n------------------ Start list after table.sort(Index,UTFCompare)------------\n",2)
+printList(Index,2)
+writeLog(1,require 'xindex-pretty'.dump(Index),3) -- only for internal dump
+writeLog(1,"\n------------------ end list after table.sort(Index,UTFCompare)------------\n",2)
+
+writeLog(1,"\n",0)
+writeLog(2,"\ncheck for |(...|) \n",0)
+writeLog(1,"------------------ Start list before checkParenthesis(Index)------------\n",2)
+writeLog(1,require 'xindex-pretty'.dump(Index),3) -- only for internal dump
+--for i=1,#Index do print(Index[i]["Entry"],Index[i]["pages"][1]["number"],Index[i]["pages"][1]["special"]) end
+
+Index = checkParenthesis(Index)
+
+writeLog(1,"\n",0)
+
+--for i=1,#Index do print(Index[i]["Entry"],Index[i]["pages"][1]["number"],Index[i]["pages"][1]["special"]) end
+writeLog(1,require 'xindex-pretty'.dump(Index),3) -- only for internal dump
+printList(Index,2)
+writeLog(1,"------------------ End list after checkParenthesis(Index) ------------\n",2)
+writeLog(2,"done\n",0)
+
+
+
+writeLog(2,"Replace @-operator ...\n",0)
+writeLog(1,"------------------ Start list before compressEntryList(Index)------------\n",1)
+writeLog(1,require 'xindex-pretty'.dump(Index),3) -- only for internal dump
+
+local NewIndex = {}
+NewIndex = compressEntryList(Index) -- replaces also foo@bar -> bar
+
+-- for i=1,#NewIndex do print(NewIndex[i]["Entry"],NewIndex[i]["pages"][1]["number"],NewIndex[i]["pages"][1]["special"]) end
+writeLog(1,require 'xindex-pretty'.dump(NewIndex),3) -- only for internal dump
+printList(NewIndex,2)
+writeLog(1,"------------------ End list after compressEntryList(Index)------------\n",1)
+writeLog(2,"done\n",0)
+
+-- output the .ind-list
+--[[
+for i, str0 in ipairs(escape_chars) do
+ outFile:write("\\def"..str0[2].."{"..str0[3].."}\n")
+end
+]] -- no more needed, we redo the setting
+
+if SORTendhook then
+ NewIndex = SORTendhook(NewIndex)
+end
+
+outFile:write("\n")
+outFile:write("\\begin{theindex}\n")
+
+if indexOpening ~= "" then -- commands after \begin{theindex}
+ outFile:write(indexOpening)
+end
+
+local entry
+local firstCLine = true
+local firstNLine = true
+local firstSLine = true
+local firstChar
+local symbols = true
+local numbers = false
+local letters = false
+local charType
+local currentChar
+local currentCharType = 0 -- assume Symbol; 1 number; 2 letter
+local oldChar = ""
+local excl = 0 -- number of ! symbols in one entry
+local lastItems = {"","",""}
+
+writeLog(2,"Start writing .ind file ... \n",0)
+
+-- first the special cases for symbols and numbers:
+
+writeLog(1,"---------- Start list to write the ind file --------------\n",1)
+writeLog(1,require 'xindex-pretty'.dump(NewIndex),3) -- only for internal dump
+
+for k=1,#NewIndex do
+-- require 'xindex-pretty'.dump(NewIndex[k]) -- only for internal dump
+ if NewIndex[k]["Entry"] then
+ local v = NewIndex[k]
+ writeLog(1," NewIndex[k]: "..v["Entry"].."\n",2)
+ writeLog(1,require 'xindex-pretty'.dump(v),3) -- only for internal dump
+ entry = v["Entry"]
+ writeLog(1,"\nBase start: "..entry.."\n",2)
+-- local c = utf.sub(v["sortChar"],1,1)
+-- if utf8.codepoint(c) < 12288 then -- Japanese starts at hex 3000
+-- firstChar = v["sortChar"]
+-- else
+ firstChar = utf.sub(v["sortChar"],1,1) -- catch a translatet Ö->OE
+-- end
+ currentChar = firstChar
+ charType = getCharType(firstChar)
+ if charType == 0 then
+ numbers = false
+ symbols = true
+ letters = false
+ end
+ if charType == 1 then
+ numbers = true
+ symbols = false
+ letters = false
+ end
+ if charType > 1 then
+ numbers = false
+ symbols = false
+ letters = true
+ end
+ if symbols then
+ writeLog(1,"We have symbols to print ...\n",3)
+ if firstSLine then
+ firstSLine = false
+ if not no_headings then
+ outFile:write("\\par\\textbf{"..index_header[1].."}")
+ if (labelPrefix == "") then
+ outFile:write("\\label{xindex-"..index_header[1].."}\n\\nopagebreak[4]\n")
+ else
+ outFile:write("\\label{"..labelPrefix.."-xindex-"..index_header[1].."}\n\\nopagebreak[4]\n")
+ end
+ end
+ end
+ if specialItemOutput then
+ lastItems = specialItemOutput(lastItems, v, hyperpage)
+ else
+ lastItems = itemOutput(lastItems, v, hyperpage)
+ end
+ else
+ writeLog(1,"We have no symbols to print ...\n",3)
+ end
+ if numbers then
+ writeLog(1,"We have numbers to print ...\n",3)
+ if firstNLine then
+ firstNLine = false
+ outFile:write("\n\\indexspace\n")
+ if not no_headings then
+ outFile:write("\\textbf{"..index_header[2].."}")
+ if (labelPrefix == "") then
+ outFile:write("\\label{xindex-"..index_header[2].."}\n\\nopagebreak[4]\n")
+ else
+ outFile:write("\\label{"..labelPrefix.."-xindex-"..index_header[2].."}\n\\nopagebreak[4]\n")
+ end
+ end
+ end
+ if specialItemOutput then
+ lastItems = specialItemOutput(lastItems, v, hyperpage)
+ else
+ lastItems = itemOutput(lastItems, v, hyperpage)
+ end
+ else
+ writeLog(1,"We have no numbers to print ...\n",3)
+ end
+ if letters then
+ writeLog(1,"We have letters to print ...\n",3)
+ if (currentChar ~= oldChar) and (charType == 2) then
+ outFile:write("\n\\indexspace\n")
+ if not no_headings then
+ outFile:write("\\textbf{"..currentChar.."}")
+ if (labelPrefix == '""') then
+ outFile:write("\\label{xindex-"..currentChar.."}\n\\nopagebreak[4]\n")
+ else
+ outFile:write("\\label{"..labelPrefix.."-xindex-"..currentChar.."}\n\\nopagebreak[4]\n")
+ end
+ end
+ oldChar = currentChar
+ end
+ if specialItemOutput then
+ lastItems = specialItemOutput(lastItems, v, hyperpage)
+ else
+ lastItems = itemOutput(lastItems, v, hyperpage)
+ end
+ end
+ if v["Macro"] then outFile:write(v["Macro"].."\n") end
+ end
+end
+outFile:write("\\end{theindex}\n")
+outFile:close()
+
+writeLog(2,"\ndone! closing program\n",0)
+
diff --git a/indexing/xindex/lualatex/xindex-cfg-common.lua b/indexing/xindex/lualatex/xindex-cfg-common.lua
new file mode 100644
index 0000000000..d98adb6b92
--- /dev/null
+++ b/indexing/xindex/lualatex/xindex-cfg-common.lua
@@ -0,0 +1,117 @@
+-----------------------------------------------------------------------
+-- FILE: xindex-cfg-common.lua
+-- DESCRIPTION: configuration file for xindex.lua
+-- REQUIREMENTS:
+-- AUTHOR: Herbert Voß
+-- LICENSE: LPPL1.3
+-----------------------------------------------------------------------
+
+if not modules then modules = { } end modules ['xindex-cfg-common'] = {
+ version = 0.13,
+ comment = "configuration to xindex.lua",
+ author = "Herbert Voss",
+ copyright = "Herbert Voss",
+ license = "LPPL 1.3"
+}
+
+indexheader = {
+ de = {"Symbole", "Zahlen"},
+ en = {"Symbols", "Numbers"},
+ fr = {"Symboles","Chiffre"},
+ jp = {"シンボル","番号"},
+}
+
+folium = {
+ de = {"f", "ff"},
+ en = {"f", "ff"},
+ fr = {"\\,sq","\\,sqq"},
+}
+
+alphabet_uppercase = {
+ { 'α', 'Α' },
+ { 'β', 'Β' },
+ { 'ϐ', 'ϐ' },
+ { 'γ', 'Γ' },
+ { 'δ', 'Δ' },
+ { 'ε', 'Ε' },
+ { 'ζ', 'Ζ' },
+ { 'η', 'Η' },
+ { 'θ', 'Θ' },
+ { 'ι', 'Ι' },
+ { 'κ', 'Κ' },
+ { 'λ', 'Λ' },
+ { 'μ', 'Μ' },
+ { 'ν', 'Ν' },
+ { 'ξ', 'Ξ' },
+ { 'ο', 'Ο' },
+ { 'π', 'Π' },
+ { 'ρ', 'Ρ' },
+ { 'σ', 'Σ' },
+ { 'ς', 'ς' },
+ { 'τ', 'Τ' },
+ { 'υ', 'Υ' },
+ { 'φ', 'Φ' },
+ { 'χ', 'Χ' },
+ { 'ψ', 'Ψ' },
+ { 'ω', 'Ω' },
+--
+ { 'a', 'A' },
+ { 'b', 'B' },
+ { 'c', 'C' },
+ { 'd', 'D' },
+ { 'e', 'E' },
+ { 'f', 'F' },
+ { 'g', 'G' },
+ { 'h', 'H' },
+ { 'i', 'I' },
+ { 'j', 'J' },
+ { 'k', 'K' },
+ { 'l', 'L' },
+ { 'm', 'M' },
+ { 'n', 'N' },
+ { 'o', 'O' },
+ { 'p', 'P' },
+ { 'q', 'Q' },
+ { 'r', 'R' },
+ { 's', 'S' },
+ { 't', 'T' },
+ { 'u', 'U' },
+ { 'v', 'V' },
+ { 'w', 'W' },
+ { 'x', 'X' },
+ { 'y', 'Y' },
+ { 'z', 'Z' },
+--
+ { 'а', 'А' },
+ { 'б', 'Б' },
+ { 'в', 'В' },
+ { 'г', 'Г' },
+ { 'д', 'Д' },
+ { 'е', 'Е' },
+ { 'ж', 'Ж' },
+ { 'з', 'З' },
+ { 'и', 'И' },
+ { 'й', 'Й' },
+ { 'к', 'К' },
+ { 'л', 'Л' },
+ { 'м', 'М' },
+ { 'н', 'Н' },
+ { 'о', 'О' },
+ { 'п', 'П' },
+ { 'р', 'Р' },
+ { 'с', 'С' },
+ { 'т', 'Т' },
+ { 'у', 'У' },
+ { 'ф', 'Ф' },
+ { 'х', 'Х' },
+ { 'ц', 'Ц' },
+ { 'ч', 'Ч' },
+ { 'ш', 'Ш' },
+ { 'щ', 'Щ' },
+ { 'ъ', 'Ъ' },
+ { 'ы', 'Ы' },
+ { 'ь', 'Ь' },
+ { 'э', 'Э' },
+ { 'ю', 'Ю' },
+ { 'я', 'Я' }
+}
diff --git a/indexing/xindex/lualatex/xindex-cfg.lua b/indexing/xindex/lualatex/xindex-cfg.lua
new file mode 100644
index 0000000000..a9e7213dda
--- /dev/null
+++ b/indexing/xindex/lualatex/xindex-cfg.lua
@@ -0,0 +1,90 @@
+-----------------------------------------------------------------------
+-- FILE: xindex-cfg.lua
+-- DESCRIPTION: configuration file for xindex.lua
+-- REQUIREMENTS:
+-- AUTHOR: Herbert Voß
+-- LICENSE: LPPL1.3
+-----------------------------------------------------------------------
+
+if not modules then modules = { } end modules ['xindex-cfg'] = {
+ version = 0.13,
+ comment = "main configuration to xindex.lua",
+ author = "Herbert Voss",
+ copyright = "Herbert Voss",
+ license = "LPPL 1.3"
+}
+
+itemPageDelimiter = "," -- Hello, 14
+compressPages = true -- something like 12--15, instaead of 12,13,14,15. the |( ... |) syntax is still valid
+fCompress = true -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5
+minCompress = 3 -- 14--17 or
+rangeSymbol = "--"
+numericPage = true -- for non numerical pagenumbers, like "VI-17"
+sublabels = {"", "-\\,", "--\\,", "---\\,"} -- for the (sub(sub(sub-items first one is for item
+pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17" -- not used !!!
+indexOpening = "" -- commands after \begin{theindex}
+
+
+--[[
+ Each character's position in this array-like table determines its 'priority'.
+ Several characters in the same slot have the same 'priority'.
+]]
+alphabet_lower = { -- for sorting
+ { ' ' }, -- only for internal tests
+ { 'a', 'á', 'à', 'ä', 'å', 'æ', },
+ { 'b' },
+ { 'c', 'ç' },
+ { 'd' },
+ { 'e', 'é', 'è', 'ë' },
+ { 'f' },
+ { 'g' },
+ { 'h' },
+ { 'i', 'í', 'ì', 'ï' },
+ { 'j' },
+ { 'k' },
+ { 'l' },
+ { 'm' },
+ { 'n', 'ñ' },
+ { 'o', 'ó', 'ò', 'ö', 'ø', 'œ'},
+ { 'p' },
+ { 'q' },
+ { 'r' },
+ { 's', 'š', 'ß' },
+ { 't' },
+ { 'u', 'ú', 'ù', 'ü' , 'û'},
+ { 'v' },
+ { 'w' },
+ { 'x' },
+ { 'y', 'ý', 'ÿ' },
+ { 'z', 'ž' }
+}
+alphabet_upper = { -- for sorting
+ { ' ' },
+ { 'A', 'Á', 'À', 'Ä', 'Å', 'Æ'},
+ { 'B' },
+ { 'C', 'Ç' },
+ { 'D' },
+ { 'E', 'È', 'È', 'Ë' },
+ { 'F' },
+ { 'G' },
+ { 'H' },
+ { 'I', 'Í', 'Ì', 'Ï' },
+ { 'J' },
+ { 'K' },
+ { 'L' },
+ { 'M' },
+ { 'N', 'Ñ' },
+ { 'O', 'Ó', 'Ò', 'Ö', 'Ø','Œ' },
+ { 'P' },
+ { 'Q' },
+ { 'R' },
+ { 'S', 'Š' },
+ { 'T' },
+ { 'U', 'Ú', 'Ù', 'Ü' },
+ { 'V' },
+ { 'W' },
+ { 'X' },
+ { 'Y', 'Ý', 'Ÿ' },
+ { 'Z', 'Ž' }
+}
+
diff --git a/indexing/xindex/lualatex/xindex-dtk.lua b/indexing/xindex/lualatex/xindex-dtk.lua
new file mode 100644
index 0000000000..cb38541fa2
--- /dev/null
+++ b/indexing/xindex/lualatex/xindex-dtk.lua
@@ -0,0 +1,158 @@
+-----------------------------------------------------------------------
+-- FILE: xindex-cfg.lua
+-- DESCRIPTION: configuration file for xindex.lua
+-- REQUIREMENTS:
+-- AUTHOR: Herbert Voß
+-- LICENSE: LPPL1.3
+-----------------------------------------------------------------------
+
+if not modules then modules = { } end modules ['xindex-cfg'] = {
+ version = 0.13,
+ comment = "DTK configuration to xindex.lua",
+ author = "Herbert Voss",
+ copyright = "Herbert Voss",
+ license = "LPPL 1.3"
+}
+
+itemPageDelimiter = "" -- Hello, 14
+compressPages = true -- something like 12--15, instaead of 12,13,14,15. the |( ... |) syntax is still valid
+fCompress = true -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5
+minCompress = 3 -- 14--17 or
+numericPage = true -- for non numerical pagenumbers, like "VI-17"
+sublabels = {"","","",""} -- for the sub(sub(sub-items
+pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17" -- not used !!!
+rangeSymbol = "--"
+indexOpening = "" --[[\providecommand*\lettergroupDefault[1]{}
+\providecommand*\lettergroup[1]{%
+ \par\textbf{#1}\par
+ \nopagebreak
+ }
+]]
+
+
+--[[
+ Each character's position in this array-like table determines its 'priority'.
+ Several characters in the same slot have the same 'priority'.
+]]
+alphabet_lower = { -- for sorting
+ { ' ' }, -- only for internal tests
+ { 'a', 'á', 'à', 'ä'},
+ { 'b' },
+ { 'c' },
+ { 'd' },
+ { 'e', 'é', 'è', 'ë' },
+ { 'f' },
+ { 'g' },
+ { 'h' },
+ { 'i', 'í', 'ì', 'ï' },
+ { 'j' },
+ { 'k' },
+ { 'l' },
+ { 'm' },
+ { 'n', 'ñ' },
+ { 'o', 'ó', 'ò', 'ö' },
+ { 'p' },
+ { 'q' },
+ { 'r' },
+ { 's' },
+ { 't' },
+ { 'u', 'ú', 'ù', 'ü' },
+ { 'v' },
+ { 'w' },
+ { 'x' },
+ { 'y' },
+ { 'z' }
+}
+alphabet_upper = { -- for sorting
+ { ' ' },
+ { 'A', 'Á', 'À', 'Ä'},
+ { 'B' },
+ { 'C' },
+ { 'D' },
+ { 'E', 'È', 'È', 'ë' },
+ { 'F' },
+ { 'G' },
+ { 'H' },
+ { 'I', 'Í', 'Ì', 'ï' },
+ { 'J' },
+ { 'K' },
+ { 'L' },
+ { 'M' },
+ { 'N', 'Ñ' },
+ { 'O', 'Ó', 'Ò', 'Ö' },
+ { 'P' },
+ { 'Q' },
+ { 'R' },
+ { 'S' },
+ { 'T' },
+ { 'U', 'Ú', 'Ù', 'Ü' },
+ { 'V' },
+ { 'W' },
+ { 'X' },
+ { 'Y' },
+ { 'Z' }
+}
+
+
+function specialGetPageList(v,hyperpage)
+ local Pages = {}
+ if v["pages"] then
+ table.sort(v["pages"],pageCompare)-- nur nötig, da User manuell eine Zeile einfügen kann
+ if specialCompressPageList then
+ Pages = specialCompressPageList(v["pages"])
+ else
+ Pages = compressPageList(v["pages"])
+ end
+ local pageNo
+ if hyperpage then
+ if string.find(v["pages"][1]["special"],"hyperindexformat") then
+ pageNo = v["pages"][1]["special"].."{"..checkFF(Pages[1]["number"].."}")
+ else
+ pageNo = "\\hyperpage{"..checkFF(Pages[1]["number"]).."}"
+ end
+ for i=2,#Pages do
+ if string.find(v["pages"][i]["special"],"hyperindexformat") then
+ pageNo = pageNo..", "..v["pages"][i]["special"].."{"..checkFF(Pages[i]["number"].."}")
+ else
+ pageNo = pageNo..", \\hyperpage{"..checkFF(Pages[i]["number"]).."}"
+ end
+-- Pages[i] = nil
+ end
+ else
+ if args_v then print("getPageList: "..tostring(Pages[1]["special"])..tostring(Pages[1]["number"])) end
+ if (Pages[1]["special"] == nil) or (Pages[1]["number"] == nil) then return "" end
+ if #Pages == 1 then
+ return "\\relax "..Pages[1]["number"].."\\@nil"
+ else
+ pageNo = "\\relax "..Pages[1]["number"]
+ for i=2,#Pages do
+ if Pages[i]["number"] then
+ pageNo = pageNo..", "..Pages[i]["number"]
+ Pages[i] = {}
+ end
+ end
+ pageNo = pageNo.."\\@nil" -- add \@nil
+ end
+ return pageNo
+ end
+ else
+ return ""
+ end
+end
+
+function specialItemOutput(last, v, hyperpage)
+ local lastItems = last
+ local currentItems = {}
+ local Entry = v["Entry"]
+ local name = getItem(Entry,0)
+ local adress = getItem(Entry,1)
+ outFile:write(" \\item "..name..itemPageDelimiter.."\n")
+ str = " \\subitem "..itemPageDelimiter.." "..adress..getPageList(v,hyperpage).."\n"
+ for i, str0 in ipairs(escape_chars) do -- undo the escape char setting
+ str = str:gsub(str0[2],str0[3])
+ end
+ outFile:write(str)
+ return last
+end
+
+
diff --git a/indexing/xindex/lualatex/xindex-lapp.lua b/indexing/xindex/lualatex/xindex-lapp.lua
new file mode 100644
index 0000000000..3912740ef7
--- /dev/null
+++ b/indexing/xindex/lualatex/xindex-lapp.lua
@@ -0,0 +1,325 @@
+-- lapp.lua
+-- Simple command-line parsing using human-readable specification
+-----------------------------
+--~ -- args.lua
+--~ local args = require ('lapp') [[
+--~ Testing parameter handling
+--~ -p Plain flag (defaults to false)
+--~ -q,--quiet Plain flag with GNU-style optional long name
+--~ -o (string) Required string option
+--~ -n (number) Required number option
+--~ -s (default 1.0) Option that takes a number, but will default
+--~ <start> (number) Required number argument
+--~ <input> (default stdin) A parameter which is an input file
+--~ <output> (default stdout) One that is an output file
+--~ ]]
+--~ for k,v in pairs(args) do
+--~ print(k,v)
+--~ end
+-------------------------------
+--~ > args -pq -o help -n 2 2.3
+--~ input file (781C1B78)
+--~ p true
+--~ s 1
+--~ output file (781C1B98)
+--~ quiet true
+--~ start 2.3
+--~ o help
+--~ n 2
+--------------------------------
+if not modules then modules = { } end modules ['xindex-lapp'] = {
+ version = 0.13,
+ comment = "read parameter for xindex.lua",
+ author = "Steve Donovan",
+ copyright = "Steve Donovan",
+ license = "MIT"
+}
+
+
+lapp = {}
+
+local append = table.insert
+local usage
+local open_files = {}
+local parms = {}
+local aliases = {}
+local parmlist = {}
+
+local filetypes = {
+ stdin = {io.stdin,'file-in'}, stdout = {io.stdout,'file-out'},
+ stderr = {io.stderr,'file-out'}
+}
+
+local function quit(msg,no_usage)
+ if msg then
+ io.stderr:write(msg..'\n\n')
+ end
+ if not no_usage then
+ io.stderr:write(usage)
+ end
+ os.exit(1);
+end
+
+local function error(msg,no_usage)
+ quit(arg[0]:gsub('.+[\\/]','')..':'..msg,no_usage)
+end
+
+local function ltrim(line)
+ return line:gsub('^%s*','')
+end
+
+local function rtrim(line)
+ return line:gsub('%s*$','')
+end
+
+local function trim(s)
+ return ltrim(rtrim(s))
+end
+
+local function open (file,opt)
+ local val,err = io.open(file,opt)
+ if not val then error(err,true) end
+ append(open_files,val)
+ return val
+end
+
+local function xassert(condn,msg)
+ if not condn then
+ error(msg)
+ end
+end
+
+local function range_check(x,min,max,parm)
+ xassert(min <= x and max >= x,parm..' out of range')
+end
+
+local function xtonumber(s)
+ local val = tonumber(s)
+ if not val then error("unable to convert to number: "..s) end
+ return val
+end
+
+local function is_filetype(type)
+ return type == 'file-in' or type == 'file-out'
+end
+
+local types = {}
+
+local function convert_parameter(ps,val)
+ if ps.converter then
+ val = ps.converter(val)
+ end
+ if ps.type == 'number' then
+ val = xtonumber(val)
+ elseif is_filetype(ps.type) then
+ val = open(val,(ps.type == 'file-in' and 'r') or 'w' )
+ elseif ps.type == 'boolean' then
+ val = true
+ end
+ if ps.constraint then
+ ps.constraint(val)
+ end
+ return val
+end
+
+function lapp.add_type (name,converter,constraint)
+ types[name] = {converter=converter,constraint=constraint}
+end
+
+local function force_short(short)
+ xassert(#short==1,short..": short parameters should be one character")
+end
+
+function process_options_string(str)
+ local res = {}
+ local varargs
+
+ local function check_varargs(s)
+ local res,cnt = s:gsub('%.%.%.$','')
+ varargs = cnt > 0
+ return res
+ end
+
+ local function set_result(ps,parm,val)
+ if not ps.varargs then
+ res[parm] = val
+ else
+ if not res[parm] then
+ res[parm] = { val }
+ else
+ append(res[parm],val)
+ end
+ end
+ end
+
+ usage = str
+
+ for line in str:gmatch('([^\n]*)\n') do
+ local optspec,optparm,i1,i2,defval,vtype,constraint
+ line = ltrim(line)
+ -- flags: either -<short> or -<short>,<long>
+ i1,i2,optspec = line:find('^%-(%S+)')
+ if i1 then
+ optspec = check_varargs(optspec)
+ local short,long = optspec:match('([^,]+),(.+)')
+ if short then
+ optparm = long:sub(3)
+ aliases[short] = optparm
+ force_short(short)
+ else
+ optparm = optspec
+ force_short(optparm)
+ end
+ else -- is it <parameter_name>?
+ i1,i2,optparm = line:find('(%b<>)')
+ if i1 then
+ -- so <input file...> becomes input_file ...
+ optparm = check_varargs(optparm:sub(2,-2)):gsub('%A','_')
+ append(parmlist,optparm)
+ end
+ end
+ if i1 then -- this is not a pure doc line
+ local last_i2 = i2
+ local sval
+ line = ltrim(line:sub(i2+1))
+ -- do we have (default <val>) or (<type>)?
+ i1,i2,typespec = line:find('^%s*(%b())')
+ if i1 then
+ typespec = trim(typespec:sub(2,-2)) -- trim the parens and any space
+ sval = typespec:match('default%s+(.+)')
+ if sval then
+ local val = tonumber(sval)
+ if val then -- we have a number!
+ defval = val
+ vtype = 'number'
+ elseif filetypes[sval] then
+ local ft = filetypes[sval]
+ defval = ft[1]
+ vtype = ft[2]
+ else
+ defval = sval
+ vtype = 'string'
+ end
+ else
+ local min,max = typespec:match '([^%.]+)%.%.(.+)'
+ if min then -- it's (min..max)
+ vtype = 'number'
+ min = xtonumber(min)
+ max = xtonumber(max)
+ constraint = function(x)
+ range_check(x,min,max,optparm)
+ end
+ else -- () just contains type of required parameter
+ vtype = typespec
+ end
+ end
+ else -- must be a plain flag, no extra parameter required
+ defval = false
+ vtype = 'boolean'
+ end
+ local ps = {
+ type = vtype,
+ defval = defval,
+ required = defval == nil,
+ comment = line:sub((i2 or last_i2)+1) or optparm,
+ constraint = constraint,
+ varargs = varargs
+ }
+ if types[vtype] then
+ local converter = types[vtype].converter
+ if type(converter) == 'string' then
+ ps.type = converter
+ else
+ ps.converter = converter
+ end
+ ps.constraint = types[vtype].constraint
+ end
+ parms[optparm] = ps
+ end
+ end
+ -- cool, we have our parms, let's parse the command line args
+ local iparm = 1
+ local iextra = 1
+ local i = 1
+ local parm,ps,val
+ while i <= #arg do
+ -- look for a flag, -<short flags> or --<long flag>
+ local i1,i2,dash,parmstr = arg[i]:find('^(%-+)(%a.*)')
+ if i1 then -- we have a flag
+ if #dash == 2 then -- long option
+ parm = parmstr
+ else -- short option
+ if #parmstr == 1 then
+ parm = parmstr
+ else -- multiple flags after a '-',?
+ parm = parmstr:sub(1,1)
+ if parmstr:find('^%a%d+') then
+ -- a short option followed by a digit? (exception for AW ;))
+ -- push ahead into the arg array
+ table.insert(arg,i+1,parmstr:sub(2))
+ else
+ -- push multiple flags into the arg array!
+ for k = 2,#parmstr do
+ table.insert(arg,i+k-1,'-'..parmstr:sub(k,k))
+ end
+ end
+ end
+ end
+ if parm == 'h' or parm == 'help' then
+ quit()
+ end
+ if aliases[parm] then parm = aliases[parm] end
+ ps = parms[parm]
+ if not ps then error("unrecognized parameter: "..parm) end
+ if ps.type ~= 'boolean' then -- we need a value! This should follow
+ val = arg[i+1]
+ i = i + 1
+ xassert(val,parm.." was expecting a value")
+ end
+ else -- a parameter
+ parm = parmlist[iparm]
+ if not parm then
+ -- extra unnamed parameters are indexed starting at 1
+ parm = iextra
+ iextra = iextra + 1
+ ps = { type = 'string' }
+ else
+ ps = parms[parm]
+ end
+ if not ps.varargs then
+ iparm = iparm + 1
+ end
+ val = arg[i]
+ end
+ ps.used = true
+ val = convert_parameter(ps,val)
+ set_result(ps,parm,val)
+ if is_filetype(ps.type) then
+ set_result(ps,parm..'_name',arg[i])
+ end
+ if lapp.callback then
+ lapp.callback(parm,arg[i],res)
+ end
+ i = i + 1
+ end
+ -- check unused parms, set defaults and check if any required parameters were missed
+ for parm,ps in pairs(parms) do
+ if not ps.used then
+ if ps.required then error("missing required parameter: "..parm) end
+ set_result(ps,parm,ps.defval)
+ end
+ end
+ return res
+end
+
+setmetatable(lapp, {
+ __call = function(tbl,str) return process_options_string(str) end,
+ __index = {
+ open = open,
+ quit = quit,
+ error = error,
+ assert = xassert,
+ }
+})
+
+return lapp
diff --git a/indexing/xindex/lualatex/xindex-lib.lua b/indexing/xindex/lualatex/xindex-lib.lua
new file mode 100644
index 0000000000..b1cfaabcb5
--- /dev/null
+++ b/indexing/xindex/lualatex/xindex-lib.lua
@@ -0,0 +1,980 @@
+-----------------------------------------------------------------------
+-- FILE: xindex-lib.lua
+-- DESCRIPTION: library for xindex.lua
+-- REQUIREMENTS:
+-- AUTHOR: Herbert Voß
+-- LICENSE: LPPL1.3
+-----------------------------------------------------------------------
+
+if not modules then modules = { } end modules ['xindex-lib'] = {
+ version = 0.13,
+ comment = "main library to xindex.lua",
+ author = "Herbert Voss",
+ copyright = "Herbert Voss",
+ license = "LPPL 1.3"
+}
+
+local escapechar1 = "\""
+local escapechar2 = "\"\""
+local Letters = "ÄÖÜäöüabcdefghijklmnopqrstuvwxyzßABCDEFGHIJKLMNOPQRSTUVWXYZ"
+local Digits = "0123456789"
+
+-- Looks up the character `character´ in the alphabet and returns its 'normalization' for sorting
+local function get_normalized_char( CharList, character )
+ for i, alphabet_entry in ipairs(CharList) do
+ for _, alphabet_char in ipairs(alphabet_entry) do
+ if character == alphabet_char then
+ return alphabet_entry[1]
+ end
+ end
+ end
+ return character
+end
+
+function Lower(strOrig) -- return UTF string.lower
+ local str = ""
+ for i=1, utf.len(strOrig) do
+ local c = utf.sub(strOrig,i,i)
+ if c == "Ä" then str = str.."ä"
+ elseif c == "Ö" then str = str.."ö"
+ elseif c == "Ü" then str = str.."ü"
+ else str = str..utf.lower(c)
+ end
+ end
+ return str
+end
+
+function NormalizedLower(strOrig) -- return normalized UTF string.lower (ä -> a)
+ local str = ""
+ for i=1, utf.len(strOrig) do
+ local c = get_normalized_char(alphabet_lower,utf.sub(strOrig,i,i))
+ str = str..string.lower(c)
+ end
+ return str
+end
+
+function NormalizedUpper(strOrig) -- return normalized UTF string.upper (ä -> A)
+ local str = ""
+ local c
+ for i=1, utf.len(strOrig) do
+ c = get_normalized_char(alphabet_lower,utf.sub(strOrig,i,i))
+-- str = str..string.upper(c)
+ str = str..c
+ end
+ strOrig = str
+ str=""
+ for i=1, utf.len(strOrig) do
+ c = get_normalized_char(alphabet_upper,utf.sub(strOrig,i,i))
+ c = NormalizedUppercase(c)
+ str = str..c
+ end
+ return str
+end
+
+function NormalizedUppercase(chr) -- return normalized UTF uppercase letter
+ for i, alphabet_entry in ipairs(alphabet_uppercase) do
+ if chr == alphabet_entry[1] then
+ return alphabet_entry[2]
+ end
+ end
+ return chr
+end
+
+function NormalizedChars(strOrig) -- return normalized UTF string (ä -> a) with first as upper case
+ local c = string.upper(get_normalized_char(alphabet_lower,utf.sub(strOrig,1,1)))
+ local str = c
+ for i=2, utf.len(strOrig) do
+ c = get_normalized_char(alphabet_lower,utf.sub(strOrig,i,i))
+ str = str..c
+ end
+ local strOrigTrue = strOrig
+ strOrig = str
+ c = string.upper(get_normalized_char(alphabet_upper,utf.sub(strOrig,1,1)))
+ str = c
+ for i=2, utf.len(strOrig) do
+ c = get_normalized_char(alphabet_upper,utf.sub(strOrig,i,i))
+ str = str..c
+ end
+-- print(strOrigTrue.." -> "..str)
+ return str
+end
+
+function checkVert(str) -- get the | part
+ local vert = string.find(str,"|",1,true)
+ if (vert) then
+ vertStr = string.sub(str,vert+1)
+ str = string.sub(str,1,vert-1)
+ return (vertStr)
+ else
+ return ("")
+ end
+end
+
+function checkEntry(str) -- get the index entry name
+ local at=string.find(str,"@")
+ local excl=string.find(str,"!")
+ if (excl and at) then
+ if (at < excl) then
+ return string.sub(str,1,at-1)
+ else
+ return string.sub(str,1,excl-1)
+ end
+ elseif (excl) then
+ return string.sub(str,1,excl-1)
+ elseif (at) then
+ return string.sub(str,1,at-1)
+ else
+ return (str)
+ end
+end
+
+function replaceAt(str) -- return "bar" from "foo@bar"
+-- return str:gsub('[^!|@%s]+@', '')
+ return str:gsub('[^!|@]+@', '')
+end
+
+function dofile(filename)
+ local file = kpse.find_file(filename)
+ local f = assert(loadfile(file))
+ return f()
+end
+
+-- see if the file exists
+function file_exists(file)
+local f = io.open(file, "rb")
+if f then f:close() end
+return f ~= nil
+end
+
+-- get all lines from a file, returns an empty
+-- list/table if the file does not exist
+function read_lines_from(infile)
+ if not file_exists(infile) then return {} end
+ local lines = {}
+ local str
+ local c
+ for line in io.lines(infile) do
+ if line ~= "" then
+ if string.find(line,'\\indexentry',1,true) then
+ str = line:gsub('^\\%a+%s*{','{') -- remove "\\indexentry "
+ writeLog(1,"read_lines: str="..str.." ("..utf.sub(str,2,2)..")\n",2)
+ if getCharType(utf.sub(str,2,2)) == 0 then -- we have a symbol
+ lines[#lines + 1] = str:gsub('^{*','{ ') -- add a space before the symbol
+ else
+ lines[#lines + 1] = str
+ end
+ else
+ lines[#lines + 1] = "\\MACRO<<< "..line -- allow macros between entries
+ end
+ end
+ end
+ return lines
+end
+
+function array_concat(...)
+ local t = {}
+ for n = 1,select("#",...) do
+ local arg = select(n,...)
+ if type(arg)=="table" then
+ for _,v in ipairs(arg) do
+ t[#t+1] = v
+ end
+ else
+ t[#t+1] = arg
+ end
+ end
+ return t
+end
+
+function findSequences(a) -- look for 1,2,3,4, ...
+ local b = {}
+ local firstPage = a[1] -- first page in the sequence
+ for i=2,#a do -- next page until end of page list
+ if a[i]-a[i-1] > 1 then -- not next page
+ lastPage = a[i-1] -- new start for a sequence search
+ if lastPage - firstPage >= minCompress then -- sequence found
+ b[#b+1]= tostring(firstPage)..rangeSymbol..tostring(lastPage)
+ else
+ b[#b+1]= firstPage
+ if (firstPage ~= lastPage) then b[#b+1]= lastPage end
+ end
+ firstPage=a[i]
+ end
+ end
+ if a[#a] - firstPage > 2 then -- test file end
+ b[#b+1]= tostring(firstPage)..rangeSymbol..tostring(a[#a])
+ else
+ b[#b+1]= firstPage
+ if (firstPage ~= a[#a]) then b[#b+1]= a[#a] end
+ end
+ return (b)
+end
+
+
+function deleteOpenClose(v) -- remove |( and/or |)
+ res, _ = string.gsub(v:gsub('\\[()]%s*$', ''), '\\[()]%s*', ' \\')
+ return res
+end
+
+-- "\) " -> ""
+-- "\)foo" -> \foo
+
+function checkParenthesis(Entries) -- search for |( ... |) entries
+ local paraOpen
+ local paraClose
+ local firstPage = 0
+ local lastPage
+ local newEntries = {}
+ for k,v in pairs(Entries) do
+ if (k % 50) == 0 then writeLog(1,".",1) end
+ if v["Entry"] then
+ v["Entry"] = replaceAt(v["Entry"]) -- foo@bar!baz@foobar -> bar!foobar
+ CurrentEntry = v["Entry"]
+ paraOpen = v["pages"][1]["special"]:find("\\(",1,true)
+ paraClose = v["pages"][1]["special"]:find("\\)",1,true)
+ if paraOpen then
+ firstPage = v["pages"][1]["number"]
+ elseif paraClose then
+ lastPage = v["pages"][1]["number"]
+ newEntries[#newEntries+1] = { Entry = v["Entry"],
+ pages = {{ number = firstPage..rangeSymbol..lastPage,
+ special = deleteOpenClose(v["pages"][1]["special"])}},
+ sortChar= v["sortChar"],
+ Macro = v["Macro"]
+ }
+ firstPage = 0
+ elseif ((firstPage == 0) and not paraClose) then
+ newEntries[#newEntries+1] = v -- same Entry with greater page or new entry
+ end
+ end
+ end
+ return newEntries
+end
+
+function replaceVerticalChar(v)
+-- res, _ = string.gsub(v:gsub('|[()]$', ''), '|[()]?', ' \\')
+-- return res
+ if not v:match('|') then
+ return v,""
+ else
+ return v:gsub('|.*',''), v:match('|.*'):gsub('|','\\'):gsub("%s+", "") -- part before, part after | without spaces
+ end
+end
+
+function getEntryAndPage(w, nextW, EntryList)
+-- \indexentry{Aachen, Johann von}{VII/1-215}
+-- \indexentry {Document@\idxtextClasses !IEEEtran@{\sfffffamily IEEEtran}}{185}
+-- if indexEntry(w) then
+ local macro = nil
+ if string.find(nextW,"\\MACRO<<< ") then
+ macro = string.gsub(nextW,'\\MACRO<<<','')
+ end
+ local entry, pageNo = w:match('{(.*)}%s*{(.*)}')
+-- if numericPage then
+-- if tonumber(pageNo) then -- check for roman numbering
+-- pageNo = tonumber(pageNo)
+-- end
+-- end
+ local IndexString, Special = replaceVerticalChar(entry)
+ EntryList[#EntryList+1] = {
+ Entry = IndexString, -- the index item foo@bar
+ pages = {{
+ number = pageNo,
+ special = Special }}, -- the page number(s) and the part after |
+ sortChar= NormalizedUpper(utf.sub(IndexString,1,1)), -- :byte(), -- Initial for later output
+ Macro = macro
+ }
+ if args_v then
+ if Special == "" then Special = "-" end
+ writeLog(1,"getEntryAndPage: "..tostring(IndexString,pageNo,Special,utf.sub(IndexString,1,1),macro).."\n",2)
+ end
+ return EntryList
+end
+
+function compressEntryList(EntryList)
+-- require 'xindex-pretty'.dump(EntryList) -- only for internal dump
+ local newList = {}
+ newList[1] = EntryList[1] -- at least one entry
+ local nPages = 1
+ for k=2,#EntryList do
+ if EntryList[k] then -- exists?
+ local vEntry = EntryList[k]["Entry"]
+ local last = EntryList[k-1] -- complete data
+ if (getSortString(last["Entry"]) == getSortString(vEntry)) then -- Entry exists -> add page
+-- require 'xindex-pretty'.dump(EntryList) -- only for internal dump
+-- require 'xindex-pretty'.dump(newList) -- only for internal dump
+ if (newList[#newList]["pages"][nPages]["number"] ~= EntryList[k]["pages"][1]["number"]) -- different pages or special?
+ or (newList[#newList]["pages"][nPages]["special"] ~= EntryList[k]["pages"][1]["special"]) then
+ newList[#newList]["pages"][nPages+1] = EntryList[k]["pages"][1]
+ nPages = nPages + 1
+-- require 'xindex-pretty'.dump(newList) -- only for internal dump
+ else
+ -- gleiche Entries, gleiche Seiten, gleiche specials -> nichts tun
+ end
+ else -- not the same entry
+-- require 'xindex-pretty'.dump(newList) -- only for internal dump
+ newList[#newList]["pages"] = deletePageDups(newList[#newList]["pages"])
+ newList[#newList+1] = EntryList[k]
+ nPages = 1
+ end
+ end
+ end
+ -- last data line
+ newList[#newList]["pages"] = deletePageDups(newList[#newList]["pages"])
+-- require 'xindex-pretty'.dump(newList) -- only for internal dump
+ return newList
+end
+
+--[[ example entry
+EntryList[2] = {
+ Entry = "Johann", -- the index item foo@bar
+ pages = { -- the page number(s) and the part after |
+ { number = 111,
+ special = '\\emph' },
+ { number = 11,
+ special = "\\textit"}
+ },
+ sortChar= "", -- Initial for later output
+ Macro = ""
+}
+]]
+
+
+function deletePageDups(pages)
+ if #pages == 1 then return pages end
+ local newPages = {pages[1]}
+ local notfound
+ for i=2,#pages do
+ notfound = true
+ for j=1,#newPages do
+ if (pages[i]["number"] == newPages[j]["number"]) and (pages[i]["special"] == newPages[j]["special"]) then
+ notfound = false
+ break
+ end
+ end
+ if notfound then
+ newPages[#newPages+1] = pages[i]
+ end
+ end
+ return newPages
+end
+
+
+function compressPageList(pages) -- called with (v["pages"])
+ writeLog(1,"compressPageList: we have "..#pages.." pages for this entry\n",2)
+-- require 'xindex-pretty'.dump(pages) -- only for internal dump
+ pages = deletePageDups(pages) -- delete duplicate page numners with same special
+ local str
+ if #pages == 1 then -- only one pageno
+ return pages
+ end -- only one pageno
+ if #pages == 2 then -- only two pages
+ if tonumber(pages[1]["number"]) and tonumber(pages[2]["number"]) then
+ if ((tonumber(pages[2]["number"]) - tonumber(pages[1]["number"])) == 1) and (pages[1]["special"] == pages[2]["special"]) then
+ if fCompress then
+ pages[1]["number"] = pages[1]["number"]..page_folium[1]
+ pages[2] = nil
+ elseif minCompress == 1 then
+ pages[1]["number"] = pages[1]["number"]..rangeSymbol..pages[2]["number"]
+ pages[2] = nil
+ end
+-- elseif (pages[1]["number"] == pages[2]["number"]) and
+-- (pages[1]["special"] == pages[2]["special"]) then
+-- pages[2] = nil
+ end
+ end
+ return pages
+ end
+ -- we have at least three pages
+ pages[#pages+1] = {number = 9999999, special = ""} -- dummy to sort the last real page number correct
+ local startIndex
+ local newPages = {} -- { pages[1], pages[2], ... }
+ local series = {} -- { pages[1], pages[2], ... }
+ if tonumber(pages[1]["number"]) then -- if a number we start with second page
+ newPages = {}
+ series = {pages[1]}
+ startIndex = 2
+ else -- if not a number we start with third page
+ newPages = {pages[1]}
+ series = {pages[2]}
+ startIndex = 3
+ end
+if args_v then print ("compressPageList: more than two pages for the entry\n") end
+ for i=startIndex,#pages do
+ if tonumber(pages[i-1]["number"]) and tonumber(pages[i]["number"]) then -- de we have something like 17--31 in the current list
+ if ((tonumber(pages[i]["number"])-tonumber(pages[i-1]["number"])) == 1) and
+ (pages[i]["special"] == pages[i-1]["special"]) then -- something like 12, 13 with identical |\special
+ series[#series+1] = pages[i]-- page difference is 1, add page to series
+ elseif (#series == 1) then -- no -f page -> only one page -> output
+ newPages[#newPages+1] = series[1]
+ series = {pages[i]}
+ elseif (#series > minCompress) then -- we found series or f pages like 11, 12, 13, 14
+ -- the sequenz gets the special from the first page
+ newPages[#newPages+1] = { number = series[1]["number"]..rangeSymbol..series[#series]["number"], special = series[1]["special"]} -- first..last
+ series = {pages[i]}
+ else -- series < minCompress
+ if fCompress then
+ if #series == 2 then -- two pages -> 3f
+ writeLog(1,"compressPageList: Two consecutive pages for this entry\n",2)
+ if series[1]["special"] == series[2]["special"] then
+ newPages[#newPages+1] = { number = series[1]["number"]..page_folium[1], special = series[1]["special"] }
+ else
+ newPages[#newPages+1] = series[1] -- different |\special -> no compress to -f
+ newPages[#newPages+1] = series[2]
+ end
+ else -- must be #series=3
+ if (series[1]["special"] == series[2]["special"]) and (series[2]["special"] == series[3]["special"]) then
+ newPages[#newPages+1] = { number = series[1]["number"]..page_folium[2], special = series[1]["special"] } -- three pages
+ elseif (series[1]["special"] == series[2]["special"]) then
+ newPages[#newPages+1] = { number = series[1]["number"]..page_folium[1], special = series[1]["special"] } -- three pages
+ newPages[#newPages+1] = series[3]
+ elseif (series[2]["special"] == series[3]["special"]) then
+ newPages[#newPages+1] = series[1]
+ newPages[#newPages+1] = { number = series[2]["number"]..page_folium[1], special = series[2]["special"] } -- three pages
+ else -- all different specials
+ newPages[#newPages+1] = series[1]
+ newPages[#newPages+1] = series[2]
+ newPages[#newPages+1] = series[3]
+ end
+ end
+ else
+ for i=1,#series do
+ newPages[#newPages+1] = series[i]
+ end
+ end
+ series = {pages[i]}
+ end
+ else -- current or forgoing page is not a number, we simply add it
+ if tonumber(pages[i]["number"]) then -- p[i-1] is non numeric p[i] is ok and not last no
+ series = {pages[i]}
+ else -- current page is non numeric
+ if (#series > minCompress) then -- we found a page series
+ newPages[#newPages+1] = { number = series[1]["number"]..rangeSymbol..series[#series]["number"], -- first..last
+ special =series[1]["special"] }
+ series = {pages[i]}
+ else -- series < minCompress
+ for i=1,#series do
+ newPages[#newPages+1] = series[i]
+ end
+ series = {pages[i]}
+ end
+ end
+ end
+ end
+-- require 'xindex-pretty'.dump(newPages)
+ return newPages
+end
+
+
+-- 2 letter
+-- 1 digit
+-- 0 symbol
+
+UTFdatafile = kpse.find_file("xindex-unicode.lua")
+local category_data = dofile(UTFdatafile)
+local floor = math.floor
+
+local function binary_range_search(code_point, ranges)
+ local low, mid, high
+ low, high = 1, #ranges
+ while low <= high do
+ mid = floor((low + high) / 2)
+ local range = ranges[mid]
+ if code_point < range[1] then
+ high = mid - 1
+ elseif code_point <= range[2] then
+ return range, mid
+ else
+ low = mid + 1
+ end
+ end
+ return nil, mid
+end
+
+function get_category(code_point)
+ if category_data.singles[code_point] then
+ return category_data.singles[code_point]
+ else
+ local range = binary_range_search(code_point, category_data.ranges)
+ return range and range[3] or "Cn"
+ end
+end
+
+function getCharType(c)
+-- print ("getCharType c="..c..": codepoint="..utf8.codepoint(c))
+ local category = get_category(utf8.codepoint(c))
+-- print ("getCharType: "..category)
+ if category == "Nd" then return 1
+ elseif category:sub(1, 1) == "L" then return 2
+ else return 0
+ end
+end
+
+--print(get_category(utf8.codepoint('ö')))
+--print(category_to_number(get_category(utf8.codepoint('ö'))))
+
+function getCharTypeOld(c) -- in case of Lua < 5.3 (has no utf support)
+ if utf.find(Letters,c,1,true) then return 2
+ elseif utf.find(Digits,c,1,true) then return 1
+ else return 0
+ end
+end
+
+-- string.gsub('{Entry}{page}', '{[^{}]*}$', '') -> {Entry}
+-- str = "\indexentry {foo}{bar}"
+-- first, second = str:match('{([^}]*)}%s*{([^}]*)}') -> foo, bar
+
+function UTFCompare(a,b)
+-- a, b are something like \indexentry{foo}{bar}
+-- writeLog(1,"UTFCompare: "..a["Entry"]..", "..a["pages"][1]["number"].." - "..b["Entry"]..", "..b["pages"][1]["number"].."\n",2)
+-- k = k + 1
+-- if (k % 50) == 0 then writeLog(1,".",1) end
+ local A,B,Apage,Bpage
+ if numericPage then
+ if tonumber(a["pages"][1]["number"]) then
+ Apage = string.format("%09d",a["pages"][1]["number"])
+ else
+ Apage = string.format("%09d",romanToNumber(a["pages"][1]["number"]))
+ end
+ if tonumber(b["pages"][1]["number"]) then
+ Bpage = string.format("%09d",b["pages"][1]["number"])
+ else
+ Bpage = string.format("%09d",romanToNumber(b["pages"][1]["number"]))
+ end
+ else
+ Apage = string.format("%09s",a["pages"][1]["number"])
+ Bpage = string.format("%09s",b["pages"][1]["number"])
+ end
+ if no_caseSensitive then
+ A = NormalizedUpper(getSortString(a["Entry"].." "..Apage..a["pages"][1]["special"]):gsub('!','')) -- replace! by empty
+ B = NormalizedUpper(getSortString(b["Entry"].." "..Bpage..b["pages"][1]["special"]):gsub('!',''))
+ else
+ A = NormalizedChars(getSortString(a["Entry"].." "..Apage..a["pages"][1]["special"]):gsub('!','')) -- replace! by empty
+ B = NormalizedChars(getSortString(b["Entry"].." "..Bpage..b["pages"][1]["special"]):gsub('!',''))
+ end
+ writeLog(1,"UTFCompare: A--B "..A.."--"..B.."\n",2)
+-- print(A,B)
+--[[
+ if A == B then -- same entry, use also page number
+ Apage = string.format("%09s",a["pages"][1]["number"])
+ Bpage = string.format("%09s",b["pages"][1]["number"])
+ A = string.format("%-90s",A)..Apage
+ B = string.format("%-90s",B)..Bpage
+ end
+ if numericPage then
+ if tonumber(a["pages"][1]["number"]) then
+ Apage = string.format("%09d",a["pages"][1]["number"])
+ else
+ Apage = string.format("%09d",romanToNumber(a["pages"][1]["number"]))
+ end
+ if tonumber(b["pages"][1]["number"]) then
+ Bpage = string.format("%09d",b["pages"][1]["number"])
+ else
+ Bpage = string.format("%09d",romanToNumber(b["pages"][1]["number"]))
+ end
+ else
+ Apage = string.format("%09s",a["pages"][1]["number"])
+ Bpage = string.format("%09s",b["pages"][1]["number"])
+ end
+ A = string.format("%-90s",A)..Apage
+ B = string.format("%-90s",B)..Bpage
+]]
+ return A < B
+end
+
+function pageCompare(a,b) -- a = {{number=...,special=..},{...,...}}
+-- a["number"], b["number"] are something like "3" or "VI-17" or "9--31"
+ writeLog(1,"pageCompare: "..a["number"].." "..b["number"].."\n",2)
+ if (a["number"] == nil) or (b["number"] == nil) then return true end -- should be no nil here
+ local a0 = a["number"] -- can be numeric or alphanumeric
+ local b0 = b["number"]
+-- if pageNoPrefixDel ~= "" then ---- not active
+-- A = (a0:gsub(pageNoPrefixPattern,''))
+-- B = (b0:gsub(pageNoPrefixPattern,''))
+-- a0 = tonumber(A) or romanToNumber(A)
+-- b0 = tonumber(B) or romanToNumber(B)
+-- else
+ if numericPage then
+ if (type(a0) == "number") and (type(b0) == "number") then return a0 < b0 end
+ if romanToNumber(a0) and (type(b0) == "number") then return true end -- ii < 2
+ if (type(a0) == "number") and romanToNumber(b0) then return false end -- ii > 2
+ if romanToNumber(a0) and romanToNumber(b0) then return a0 < b0 end -- ii < iii
+ -- now we have some special page numbers
+ A = tostring(a0)
+ B = tostring(b0)
+ A1 = A:find(rangeSymbol,1,true) or A:find("f",1,true) -- sequence or folio pages
+ B1 = B:find(rangeSymbol,1,true) or B:find("f",1,true)
+ if A1 then a0 = tonumber(A:sub(1,A1-1)) end
+ if B1 then b0 = tonumber(B:sub(1,B1-1)) end
+ return tonumber(a0) < tonumber(b0) -- numeric
+ else
+ return a0 < b0 -- alphanumeric (strings)
+ end
+end
+
+function charCompare(a,b) -- compare only first char
+ local A,B
+ A = string.upper(utf.sub(a["sortChar"],1,1))
+ B = string.upper(utf.sub(b["sortChar"],1,1))
+ return A < B
+end
+
+function checkFF(p)
+ if not p then return p end
+ local P = tostring(p)
+ if P:find("ff") then
+ return P:gsub('%a+','').."\\nohyperpage{"..page_folium[2].."}"
+ elseif P:find("f") then
+ return P:gsub('%a+','').."\\nohyperpage{"..page_folium[1].."}"
+ else
+ return P
+ end
+end
+
+function getRawPages(v)
+ writeLog(1,"getRawPages, Entry: "..v["Entry"]..", page: "..tostring(v["pages"][1]["number"]),2)
+ if v then
+ local str = tostring(v["pages"][1]["number"]).."("..tostring(v["pages"][1]["special"])..")"
+ for i=2,#v["pages"] do
+ if v["pages"] then
+ str = str..", "..tostring(v["pages"][i]["number"]).."("..tostring(v["pages"][i]["special"])..")"
+ end
+ end
+ return str
+ else
+ return "v->nil"
+ end
+end
+
+function getRawPagesP(p) -- does the same but uses table pages
+ if p then
+ local str = tostring(p[1]["number"]).."("..tostring(p[1]["special"])..")"
+ for i=2,#p do
+ if p then
+ str = str..", "..tostring(p[i]["number"]).."("..tostring(p[i]["special"])..")"
+ end
+ end
+ return str
+ else
+ return "pages->nil"
+ end
+end
+
+
+function getPageList(v,hyperpage)
+ if specialGetPageList then
+ local pageNo = specialGetPageList(v,hyperpage)
+ return pageNo
+ end
+ local Pages = {}
+ if v["pages"] then
+ table.sort(v["pages"],pageCompare)-- nur nötig, da User manuell eine Zeile einfügen kann
+ if specialCompressPageList then
+ Pages = specialCompressPageList(v["pages"])
+ else
+ Pages = compressPageList(v["pages"])
+ end
+-- require 'xindex-pretty'.dump(Pages) -- only for internal dump
+ local pageNo
+--[[
+\indexentry{Auto|hyperindexformat{\textbf}}{1}
+-> \item Auto, \hyperindexformat{\textbf}{1}
+
+ add for example \hyperpage{5\nohyperpage{f}} , same for ff
+
+ \item foo, \hyperpage{1\nohyperpage{f}},
+ \hyperpage{4\nohyperpage{ff}}, \hyperpage{8}
+
+]]
+ if hyperpage then
+ if string.find(v["pages"][1]["special"],"hyperindexformat") then
+ pageNo = v["pages"][1]["special"].."{"..checkFF(Pages[1]["number"].."}")
+ else
+ pageNo = "\\hyperpage{"..checkFF(Pages[1]["number"]).."}"
+ end
+ for i=2,#Pages do
+ if string.find(v["pages"][i]["special"],"hyperindexformat") then
+ pageNo = pageNo..", "..v["pages"][i]["special"].."{"..checkFF(Pages[i]["number"].."}")
+ else
+ pageNo = pageNo..", \\hyperpage{"..checkFF(Pages[i]["number"]).."}"
+ end
+-- Pages[i] = nil
+ end
+ else
+ writeLog(1,"getPageList: "..tostring(Pages[1]["special"]).."{"..tostring(Pages[1]["number"]).."}\n",2)
+ if (Pages[1]["special"] == nil) or (Pages[1]["number"] == nil) then return "" end
+ pageNo = Pages[1]["special"].."{"..Pages[1]["number"].."}"
+ for i=2,#Pages do
+ if Pages[i]["number"] then
+ pageNo = pageNo..", "..Pages[i]["special"].."{"..Pages[i]["number"].."}"
+ Pages[i] = {}
+ end
+ end
+ end
+ return pageNo
+ else
+ return ""
+ end
+end
+
+
+function getPathFileExt(str)
+ local filepath = str:match("(.*[/\\])")
+ local filename = str:match("^.+/(.+)$")
+ local fileext = str:match("^.+(%..+)$")
+ return filepath,filename,fileext
+end
+
+function printList(Index,level)
+ for k,v in pairs(Index) do
+ if v["Entry"] then
+ local sortChar = v["sortChar"]
+ if v["Entry"] and v["Macro"] then
+ writeLog(1,"Entry: "..v["Entry"].."; Pages: "..getRawPages(v).."Special: "..v["pages"][1]["special"].."; Type: "..sortChar.."; Macro: "..v["Macro"].."\n",level)
+ else
+ writeLog(1,"Entry: "..v["Entry"].."; Pages: "..getRawPages(v).."Special: "..v["pages"][1]["special"].."; Type: "..sortChar.."; Macro: nil".."\n",level)
+ end
+ end
+ end
+end
+
+function getItem(str,n)
+ if n >= 0 then
+ local item = (str:gsub("!.*", "%0!")
+ :gsub("[^!]*!", "", n)
+ :match("^([^!]*)!") )
+ writeLog(1,"getItem ("..str..", "..n..") = "..item.."\n",2)
+ return item
+ end
+end
+
+local romanMap = {
+ I = 1,
+ V = 5,
+ X = 10,
+ L = 50,
+ C = 100,
+ D = 500,
+ M = 1000,
+}
+
+local numbers = { 1, 5, 10, 50, 100, 500, 1000 }
+local romanchars = { "I", "V", "X", "L", "C", "D", "M" }
+local RomanNumerals = { }
+
+function numberToRoman(s)
+ --s = tostring(s)
+ s = tonumber(s)
+ if not s or s ~= s then error"Unable to convert to number" end
+ if s == math.huge then error"Unable to convert infinity" end
+ s = math.floor(s)
+ if s <= 0 then return s end
+ local ret = ""
+ for i = #numbers, 1, -1 do
+ local num = numbers[i]
+ while s - num >= 0 and s > 0 do
+ ret = ret .. romanchars[i]
+ s = s - num
+ end
+ for j = 1, i - 1 do
+ local n2 = numbers[j]
+ if s - (num - n2) >= 0 and s < num and s > 0 and num - n2 ~= n2 then
+ ret = ret .. romanchars[j] .. romanchars[i]
+ s = s - (num - n2)
+ break
+ end
+ end
+ end
+ return ret
+end
+
+function romanToNumber(s)
+-- if args_v then print("romanToNumber: "..tostring(s)) end
+-- if not s then return end
+ s = s:upper()
+ local ret = 0
+ local i = 1
+ while i <= s:len() do
+ local c = s:sub(i, i)
+ if c ~= " " then -- allow spaces
+ local m = romanMap[c]
+ if not m then return nil end --error("Unknown Roman Numeral '" .. c .. "'")
+ local next = s:sub(i + 1, i + 1)
+ local nextm = romanMap[next]
+ if next and nextm then
+ if nextm > m then
+ ret = ret + (nextm - m)
+ i = i + 1
+ else
+ ret = ret + m
+ end
+ else
+ ret = ret + m
+ end
+ end
+ i = i + 1
+ end
+ return ret
+end
+
+function commandEntry(line)
+ return string.find(line,"\\MACRO<<<",1,true)
+end
+
+function checkHyperpage(lines)
+ local hyperpage = false
+ for i=1,#lines do
+ if string.find(lines[i],'hyperpage}') then
+ hyperpage = true
+ break
+ end
+ end
+ if hyperpage then
+ for i=1,#lines do
+ lines[i] = string.gsub(lines[i],'|?hyperpage}{','}{')
+ end
+ return true, lines
+ else
+ return false, lines
+ end
+ return
+end
+
+function itemOutput(last, v, hyperpage)
+ local lastItems = last
+ local currentItems = {}
+ local Entry = v["Entry"]
+-- require 'xindex-pretty'.dump(v) -- only for internal dump
+ local str
+ local excl = select(2,string.gsub(Entry,"!","!")) -- Number of !
+ writeLog(1,"itemOutput(): We have entry "..Entry.."\n",2)
+ writeLog(1,"itemOutput(): The entry has "..excl.." Exclamation characters\n",2)
+ if excl == 0 then
+ str = " \\item "..Entry..itemPageDelimiter.." "..getPageList(v,hyperpage).."\n"
+ for i, str0 in ipairs(escape_chars) do -- undo the escape char setting
+ str = str:gsub(str0[2],str0[3])
+ end
+ outFile:write(str)
+ lastItems = {}
+ lastItems[1] = Entry
+ else
+ for i = 1,excl+1 do
+ currentItems[i] = getItem(Entry,i-1) -- 0 ! 1 ! 2 ! ...
+ local item = "item"
+ if (currentItems[i] ~= lastItems[i]) then
+ writeLog(1,"itemOutput: currentItems[i]: "..tostring(currentItems[i]).."~= lastItems[i]: "..tostring(lastItems[i]).."\n",2)
+ local space = " "
+ for j = 2,i do
+ item = "sub"..item -- get the sub...subitem
+ space = space.." "
+ end
+ if not sublabels[i] then sublabels[i] = "---" end -- only three levels are predefined
+ writeLog(1,"itemOutput: currentItems[i]: "..currentItems[i].."; item: "..item.."\n",2)
+ if (i == 1) and (item == "item") then
+ str = space.."\\"..item.." "..sublabels[i]..currentItems[i].."\n"
+ else
+ str = space.."\\"..item.." "..sublabels[i]..currentItems[i]..itemPageDelimiter.." "..getPageList(v,hyperpage).."\n"
+ end
+ for i, str0 in ipairs(escape_chars) do -- undo the escape char setting
+ str = string.gsub(str,str0[2],str0[3])
+ end
+ outFile:write(str)
+ lastItems[i] = currentItems[i]
+ else
+ writeLog(1,"itemOutput: currentItems[i]: "..currentItems[i].."= lastItems[i]: "..lastItems[i].."\n",2)
+ end
+ end
+ end
+ return lastItems
+end
+
+-- \item Bugenhagen, {VII/1-16}, {166}, {17}, {215}, {222f}, {226}, {237f}, {248}, {258f}, {263}, {269}, {316f}, {321}, {361}, {365f}, {368}, {385}, {431}, {57}, {65}, {68}, {71}, {714}, {728}, {73f}, {748}, {75}, {79}, {81}, {85}, {90f}, {VII/2/1-1013}, {1015}, {1049}, {1085}, {1088}, {1097--1100}, {1110}, {1114}, {1120}, {1126}, {1148}, {1175}, {1234}, {1236ff}, {761}, {782}, {785}, {799}, {803--811}, {813f}, {818}, {822f}, {829}, {832--835}, {839f}, {848f}, {851}, {857--862}, {864f}, {867--871}, {873}, {875}, {877}, {880}, {882}, {884}, {961}, {973}, {IX-277}
+-- \subitem -\,Johannes, {VII/1-16}, {166}, {17}, {215}, {222f}, {226}, {237f}, {248}, {258f}, {263}, {269}, {316f}, {321}, {361}, {365f}, {368}, {385}, {431}, {57}, {65}, {68}, {71}, {714}, {728}, {73f}, {748}, {75}, {79}, {81}, {85}, {90f}, {VII/2/1-1013}, {1015}, {1049}, {1085}, {1088}, {1097--1100}, {1110}, {1114}, {1120}, {1126}, {1148}, {1175}, {1234}, {1236ff}, {761}, {782}, {785}, {799}, {803--811}, {813f}, {818}, {822f}, {829}, {832--835}, {839f}, {848f}, {851}, {857--862}, {864f}, {867--871}, {873}, {875}, {877}, {880}, {882}, {884}, {961}, {973}, {IX-277}
+
+local match = function(expr)
+ local C, Ct, S = lpeg.C, lpeg.Ct, lpeg.S
+ local sep = S("@!|")
+ local str = C((1 - sep)^0)
+ local prefix = function(prefix)
+ return function(match)
+ return prefix .. match
+ end
+ end
+ local idx = str * ( "@" * str / prefix("@")
+ + "!" * str / prefix("!")
+ + "|" * str / prefix("|"))^0
+ return Ct(idx):match(expr)
+end
+
+function getSortString(Entry)
+ local t = match(Entry)
+-- require 'xindex-pretty'.dump(t) -- only for internal dump
+ local data = t[1]
+ local c = utf.sub(data,1,1)
+ if getCharType(c) == 0 then
+ data = " "..data
+ end
+ for i = 2,#t do
+ if not (t[i]:sub(1,1) == "@") then -- and not (t[i]:sub(1,1) == "|") then
+ data = data..t[i]
+ end
+ end
+ return data
+end
+
+function writeLog(i, str, level) -- mode i 0->console; 1->logfile: 2->both
+ if not_quiet then
+ if level <= vlevel then
+ if (i ~= 1) or (i < 0) then io.write(tostring(str)) end
+ if i > 0 then logFile:write(tostring(str)) end
+ end
+ else
+ if level < 0 then
+ io.write(tostring(str))
+ elseif level == 0 then
+ logFile:write(tostring(str))
+ end
+ end
+end
+
+function string:split()
+ local sep, fields = " ", {}
+ local pattern = string.format("([^%s]+)", sep)
+ self:gsub(pattern, function(c) fields[#fields+1] = c end)
+ return fields
+end
+
+
+
+--\indexentry{hello@foo!world@foo!bar|bar}{60}
+
+
+--[[
+\indexentry {Schrift!Höhe}{64}
+\indexentry {Schrift!Breite}{64}
+\indexentry {Schrift!Tiefe}{64}
+
+]]
+
+function shellsort(a)
+ local inc = math.ceil( #a / 2 )
+ while inc > 0 do
+ for i = inc, #a do
+ local tmp = a[i]
+ local j = i
+ while j > inc and not UTFCompare(a[j-inc],tmp) do
+ a[j] = a[j-inc]
+ j = j - inc
+ end
+ a[j] = tmp
+ end
+ inc = math.floor( 0.5 + inc / 2.2 )
+ end
+ return a
+end
+
+function stripLeadingSpaces(str)
+ return str:gsub("^%s*(.-)%s*$", "%1")
+end
+
+
diff --git a/indexing/xindex/lualatex/xindex-pretty.lua b/indexing/xindex/lualatex/xindex-pretty.lua
new file mode 100644
index 0000000000..569974ecfa
--- /dev/null
+++ b/indexing/xindex/lualatex/xindex-pretty.lua
@@ -0,0 +1,254 @@
+--- Pretty-printing Lua tables.
+-- based on Steve Donovans Penlight package
+-- Also provides a sandboxed Lua table reader and
+-- a function to present large numbers in human-friendly format.
+--
+
+if not modules then modules = { } end modules ['xindex-pretty'] = {
+ version = 0.13,
+ comment = "dump a Lua table for debugging",
+ author = "Steve Donovan",
+ copyright = "Steve Donovan",
+ license = "MIT"
+}
+
+local append = table.insert
+local concat = table.concat
+local mfloor, mhuge = math.floor, math.huge
+local mtype = math.type
+
+local original_tostring = tostring
+
+--- Utility function that finds any patterns that match a long string's an open or close.
+-- Note that having this function use the least number of equal signs that is possible is a harder algorithm to come up with.
+-- Right now, it simply returns the greatest number of them found.
+-- @param s The string
+-- @return 'nil' if not found. If found, the maximum number of equal signs found within all matches.
+local function has_lquote(s)
+ local lstring_pat = '([%[%]])(=*)%1'
+ local equals, new_equals, _
+ local finish = 1
+ repeat
+ _, finish, _, new_equals = s:find(lstring_pat, finish)
+ if new_equals then
+ equals = max(equals or 0, #new_equals)
+ end
+ until not new_equals
+
+ return equals
+end
+
+--- Quote the given string and preserve any control or escape characters, such that reloading the string in Lua returns the same result.
+-- @param s The string to be quoted.
+-- @return The quoted string.
+
+function quote_string(s)
+-- assert_string(1,s)
+ -- Find out if there are any embedded long-quote sequences that may cause issues.
+ -- This is important when strings are embedded within strings, like when serializing.
+ -- Append a closing bracket to catch unfinished long-quote sequences at the end of the string.
+ local equal_signs = has_lquote(s .. "]")
+
+ -- Note that strings containing "\r" can't be quoted using long brackets
+ -- as Lua lexer converts all newlines to "\n" within long strings.
+ if (s:find("\n") or equal_signs) and not s:find("\r") then
+ -- If there is an embedded sequence that matches a long quote, then
+ -- find the one with the maximum number of = signs and add one to that number.
+ equal_signs = ("="):rep((equal_signs or -1) + 1)
+ -- Long strings strip out leading newline. We want to retain that, when quoting.
+ if s:find("^\n") then s = "\n" .. s end
+ local lbracket, rbracket =
+ "[" .. equal_signs .. "[",
+ "]" .. equal_signs .. "]"
+ s = lbracket .. s .. rbracket
+ else
+ -- Escape funny stuff. Lua 5.1 does not handle "\r" correctly.
+ s = ("%q"):format(s):gsub("\r", "\\r")
+ end
+ return s
+end
+
+-- Patch tostring to format numbers with better precision
+-- and to produce cross-platform results for
+-- infinite values and NaN.
+local function tostring(value)
+ if type(value) ~= "number" then
+ return original_tostring(value)
+ elseif value ~= value then
+ return "NaN"
+ elseif value == mhuge then
+ return "Inf"
+ elseif value == -mhuge then
+ return "-Inf"
+ elseif (_VERSION ~= "Lua 5.3" or mtype(value) == "integer") and mfloor(value) == value then
+ return ("%d"):format(value)
+ else
+ local res = ("%.14g"):format(value)
+ if _VERSION == "Lua 5.3" and mtype(value) == "float" and not res:find("%.") then
+ -- Number is internally a float but looks like an integer.
+ -- Insert ".0" after first run of digits.
+ res = res:gsub("%d+", "%0.0", 1)
+ end
+ return res
+ end
+end
+
+local pretty = {}
+
+local function quote_if_necessary (v)
+ if not v then return ''
+ else
+ --AAS
+ if v:find ' ' then v = quote_string(v) end
+ end
+ return v
+end
+
+local keywords
+
+local function is_identifier (s)
+ return type(s) == 'string' and s:find('^[%a_][%w_]*$') and not keywords[s]
+end
+
+local function quote (s)
+ if type(s) == 'table' then
+ return pretty.write(s,'')
+ else
+ --AAS
+ return quote_string(s)-- ('%q'):format(tostring(s))
+ end
+end
+
+local function index (numkey,key)
+ --AAS
+ if not numkey then
+ key = quote(key)
+ key = key:find("^%[") and (" " .. key .. " ") or key
+ end
+ return '['..key..']'
+end
+
+--- Create a string representation of a Lua table.
+-- This function never fails, but may complain by returning an
+-- extra value. Normally puts out one item per line, using
+-- the provided indent; set the second parameter to an empty string
+-- if you want output on one line.
+-- @tab tbl Table to serialize to a string.
+-- @string[opt] space The indent to use.
+-- Defaults to two spaces; pass an empty string for no indentation.
+-- @bool[opt] not_clever Pass `true` for plain output, e.g `{['key']=1}`.
+-- Defaults to `false`.
+-- @return a string
+-- @return an optional error message
+
+function pretty.dump (tbl,space,not_clever)
+ if type(tbl) ~= 'table' then
+ local res = tostring(tbl)
+ if type(tbl) == 'string' then return quote(tbl) end
+ return res, 'not a table'
+ end
+ if not keywords then
+ keywords = {
+ ["and"] = true, ["break"] = true, ["do"] = true,
+ ["else"] = true, ["elseif"] = true, ["end"] = true,
+ ["false"] = true, ["for"] = true, ["function"] = true,
+ ["if"] = true, ["in"] = true, ["local"] = true, ["nil"] = true,
+ ["not"] = true, ["or"] = true, ["repeat"] = true,
+ ["return"] = true, ["then"] = true, ["true"] = true,
+ ["until"] = true, ["while"] = true
+ }
+ end
+ local set = ' = '
+ if space == '' then set = '=' end
+ space = space or ' '
+ local lines = {}
+ local line = ''
+ local tables = {}
+
+
+ local function put(s)
+ if #s > 0 then
+ line = line..s
+ end
+ end
+
+ local function putln (s)
+ if #line > 0 then
+ line = line..s
+ append(lines,line)
+ line = ''
+ else
+ append(lines,s)
+ end
+ end
+
+ local function eat_last_comma ()
+ local n = #lines
+ local lastch = lines[n]:sub(-1,-1)
+ if lastch == ',' then
+ lines[n] = lines[n]:sub(1,-2)
+ end
+ end
+
+ local writeit
+ writeit = function (t,oldindent,indent)
+ local tp = type(t)
+ if tp ~= 'string' and tp ~= 'table' then
+ putln(quote_if_necessary(tostring(t))..',')
+ elseif tp == 'string' then
+ -- if t:find('\n') then
+ -- putln('[[\n'..t..']],')
+ -- else
+ -- putln(quote(t)..',')
+ -- end
+ --AAS
+ putln(quote_string(t) ..",")
+ elseif tp == 'table' then
+ if tables[t] then
+ putln('<cycle>,')
+ return
+ end
+ tables[t] = true
+ local newindent = indent..space
+ putln('{')
+ local used = {}
+ if not not_clever then
+ for i,val in ipairs(t) do
+ put(indent)
+ writeit(val,indent,newindent)
+ used[i] = true
+ end
+ end
+ for key,val in pairs(t) do
+ local tkey = type(key)
+ local numkey = tkey == 'number'
+ if not_clever then
+ key = tostring(key)
+ put(indent..index(numkey,key)..set)
+ writeit(val,indent,newindent)
+ else
+ if not numkey or not used[key] then -- non-array indices
+ if tkey ~= 'string' then
+ key = tostring(key)
+ end
+ if numkey or not is_identifier(key) then
+ key = index(numkey,key)
+ end
+ put(indent..key..set)
+ writeit(val,indent,newindent)
+ end
+ end
+ end
+ tables[t] = nil
+ eat_last_comma()
+ putln(oldindent..'},')
+ else
+ putln(tostring(t)..',')
+ end
+ end
+ writeit(tbl,'',space)
+ eat_last_comma()
+ return concat(lines,#space > 0 and '\n' or '')
+end
+
+return pretty
diff --git a/indexing/xindex/lualatex/xindex-unicode.lua b/indexing/xindex/lualatex/xindex-unicode.lua
new file mode 100644
index 0000000000..d3f6c5b84a
--- /dev/null
+++ b/indexing/xindex/lualatex/xindex-unicode.lua
@@ -0,0 +1,3118 @@
+return {
+ singles = {
+ [0x00020] = "Zs",
+ [0x00024] = "Sc",
+ [0x00028] = "Ps",
+ [0x00029] = "Pe",
+ [0x0002A] = "Po",
+ [0x0002B] = "Sm",
+ [0x0002C] = "Po",
+ [0x0002D] = "Pd",
+ [0x0005B] = "Ps",
+ [0x0005C] = "Po",
+ [0x0005D] = "Pe",
+ [0x0005E] = "Sk",
+ [0x0005F] = "Pc",
+ [0x00060] = "Sk",
+ [0x0007B] = "Ps",
+ [0x0007C] = "Sm",
+ [0x0007D] = "Pe",
+ [0x0007E] = "Sm",
+ [0x000A0] = "Zs",
+ [0x000A1] = "Po",
+ [0x000A6] = "So",
+ [0x000A7] = "Po",
+ [0x000A8] = "Sk",
+ [0x000A9] = "So",
+ [0x000AA] = "Lo",
+ [0x000AB] = "Pi",
+ [0x000AC] = "Sm",
+ [0x000AD] = "Cf",
+ [0x000AE] = "So",
+ [0x000AF] = "Sk",
+ [0x000B0] = "So",
+ [0x000B1] = "Sm",
+ [0x000B4] = "Sk",
+ [0x000B5] = "Ll",
+ [0x000B8] = "Sk",
+ [0x000B9] = "No",
+ [0x000BA] = "Lo",
+ [0x000BB] = "Pf",
+ [0x000BF] = "Po",
+ [0x000D7] = "Sm",
+ [0x000F7] = "Sm",
+ [0x00100] = "Lu",
+ [0x00101] = "Ll",
+ [0x00102] = "Lu",
+ [0x00103] = "Ll",
+ [0x00104] = "Lu",
+ [0x00105] = "Ll",
+ [0x00106] = "Lu",
+ [0x00107] = "Ll",
+ [0x00108] = "Lu",
+ [0x00109] = "Ll",
+ [0x0010A] = "Lu",
+ [0x0010B] = "Ll",
+ [0x0010C] = "Lu",
+ [0x0010D] = "Ll",
+ [0x0010E] = "Lu",
+ [0x0010F] = "Ll",
+ [0x00110] = "Lu",
+ [0x00111] = "Ll",
+ [0x00112] = "Lu",
+ [0x00113] = "Ll",
+ [0x00114] = "Lu",
+ [0x00115] = "Ll",
+ [0x00116] = "Lu",
+ [0x00117] = "Ll",
+ [0x00118] = "Lu",
+ [0x00119] = "Ll",
+ [0x0011A] = "Lu",
+ [0x0011B] = "Ll",
+ [0x0011C] = "Lu",
+ [0x0011D] = "Ll",
+ [0x0011E] = "Lu",
+ [0x0011F] = "Ll",
+ [0x00120] = "Lu",
+ [0x00121] = "Ll",
+ [0x00122] = "Lu",
+ [0x00123] = "Ll",
+ [0x00124] = "Lu",
+ [0x00125] = "Ll",
+ [0x00126] = "Lu",
+ [0x00127] = "Ll",
+ [0x00128] = "Lu",
+ [0x00129] = "Ll",
+ [0x0012A] = "Lu",
+ [0x0012B] = "Ll",
+ [0x0012C] = "Lu",
+ [0x0012D] = "Ll",
+ [0x0012E] = "Lu",
+ [0x0012F] = "Ll",
+ [0x00130] = "Lu",
+ [0x00131] = "Ll",
+ [0x00132] = "Lu",
+ [0x00133] = "Ll",
+ [0x00134] = "Lu",
+ [0x00135] = "Ll",
+ [0x00136] = "Lu",
+ [0x00139] = "Lu",
+ [0x0013A] = "Ll",
+ [0x0013B] = "Lu",
+ [0x0013C] = "Ll",
+ [0x0013D] = "Lu",
+ [0x0013E] = "Ll",
+ [0x0013F] = "Lu",
+ [0x00140] = "Ll",
+ [0x00141] = "Lu",
+ [0x00142] = "Ll",
+ [0x00143] = "Lu",
+ [0x00144] = "Ll",
+ [0x00145] = "Lu",
+ [0x00146] = "Ll",
+ [0x00147] = "Lu",
+ [0x0014A] = "Lu",
+ [0x0014B] = "Ll",
+ [0x0014C] = "Lu",
+ [0x0014D] = "Ll",
+ [0x0014E] = "Lu",
+ [0x0014F] = "Ll",
+ [0x00150] = "Lu",
+ [0x00151] = "Ll",
+ [0x00152] = "Lu",
+ [0x00153] = "Ll",
+ [0x00154] = "Lu",
+ [0x00155] = "Ll",
+ [0x00156] = "Lu",
+ [0x00157] = "Ll",
+ [0x00158] = "Lu",
+ [0x00159] = "Ll",
+ [0x0015A] = "Lu",
+ [0x0015B] = "Ll",
+ [0x0015C] = "Lu",
+ [0x0015D] = "Ll",
+ [0x0015E] = "Lu",
+ [0x0015F] = "Ll",
+ [0x00160] = "Lu",
+ [0x00161] = "Ll",
+ [0x00162] = "Lu",
+ [0x00163] = "Ll",
+ [0x00164] = "Lu",
+ [0x00165] = "Ll",
+ [0x00166] = "Lu",
+ [0x00167] = "Ll",
+ [0x00168] = "Lu",
+ [0x00169] = "Ll",
+ [0x0016A] = "Lu",
+ [0x0016B] = "Ll",
+ [0x0016C] = "Lu",
+ [0x0016D] = "Ll",
+ [0x0016E] = "Lu",
+ [0x0016F] = "Ll",
+ [0x00170] = "Lu",
+ [0x00171] = "Ll",
+ [0x00172] = "Lu",
+ [0x00173] = "Ll",
+ [0x00174] = "Lu",
+ [0x00175] = "Ll",
+ [0x00176] = "Lu",
+ [0x00177] = "Ll",
+ [0x0017A] = "Ll",
+ [0x0017B] = "Lu",
+ [0x0017C] = "Ll",
+ [0x0017D] = "Lu",
+ [0x00183] = "Ll",
+ [0x00184] = "Lu",
+ [0x00185] = "Ll",
+ [0x00188] = "Ll",
+ [0x00192] = "Ll",
+ [0x00195] = "Ll",
+ [0x0019E] = "Ll",
+ [0x001A1] = "Ll",
+ [0x001A2] = "Lu",
+ [0x001A3] = "Ll",
+ [0x001A4] = "Lu",
+ [0x001A5] = "Ll",
+ [0x001A8] = "Ll",
+ [0x001A9] = "Lu",
+ [0x001AC] = "Lu",
+ [0x001AD] = "Ll",
+ [0x001B0] = "Ll",
+ [0x001B4] = "Ll",
+ [0x001B5] = "Lu",
+ [0x001B6] = "Ll",
+ [0x001BB] = "Lo",
+ [0x001BC] = "Lu",
+ [0x001C4] = "Lu",
+ [0x001C5] = "Lt",
+ [0x001C6] = "Ll",
+ [0x001C7] = "Lu",
+ [0x001C8] = "Lt",
+ [0x001C9] = "Ll",
+ [0x001CA] = "Lu",
+ [0x001CB] = "Lt",
+ [0x001CC] = "Ll",
+ [0x001CD] = "Lu",
+ [0x001CE] = "Ll",
+ [0x001CF] = "Lu",
+ [0x001D0] = "Ll",
+ [0x001D1] = "Lu",
+ [0x001D2] = "Ll",
+ [0x001D3] = "Lu",
+ [0x001D4] = "Ll",
+ [0x001D5] = "Lu",
+ [0x001D6] = "Ll",
+ [0x001D7] = "Lu",
+ [0x001D8] = "Ll",
+ [0x001D9] = "Lu",
+ [0x001DA] = "Ll",
+ [0x001DB] = "Lu",
+ [0x001DE] = "Lu",
+ [0x001DF] = "Ll",
+ [0x001E0] = "Lu",
+ [0x001E1] = "Ll",
+ [0x001E2] = "Lu",
+ [0x001E3] = "Ll",
+ [0x001E4] = "Lu",
+ [0x001E5] = "Ll",
+ [0x001E6] = "Lu",
+ [0x001E7] = "Ll",
+ [0x001E8] = "Lu",
+ [0x001E9] = "Ll",
+ [0x001EA] = "Lu",
+ [0x001EB] = "Ll",
+ [0x001EC] = "Lu",
+ [0x001ED] = "Ll",
+ [0x001EE] = "Lu",
+ [0x001F1] = "Lu",
+ [0x001F2] = "Lt",
+ [0x001F3] = "Ll",
+ [0x001F4] = "Lu",
+ [0x001F5] = "Ll",
+ [0x001F9] = "Ll",
+ [0x001FA] = "Lu",
+ [0x001FB] = "Ll",
+ [0x001FC] = "Lu",
+ [0x001FD] = "Ll",
+ [0x001FE] = "Lu",
+ [0x001FF] = "Ll",
+ [0x00200] = "Lu",
+ [0x00201] = "Ll",
+ [0x00202] = "Lu",
+ [0x00203] = "Ll",
+ [0x00204] = "Lu",
+ [0x00205] = "Ll",
+ [0x00206] = "Lu",
+ [0x00207] = "Ll",
+ [0x00208] = "Lu",
+ [0x00209] = "Ll",
+ [0x0020A] = "Lu",
+ [0x0020B] = "Ll",
+ [0x0020C] = "Lu",
+ [0x0020D] = "Ll",
+ [0x0020E] = "Lu",
+ [0x0020F] = "Ll",
+ [0x00210] = "Lu",
+ [0x00211] = "Ll",
+ [0x00212] = "Lu",
+ [0x00213] = "Ll",
+ [0x00214] = "Lu",
+ [0x00215] = "Ll",
+ [0x00216] = "Lu",
+ [0x00217] = "Ll",
+ [0x00218] = "Lu",
+ [0x00219] = "Ll",
+ [0x0021A] = "Lu",
+ [0x0021B] = "Ll",
+ [0x0021C] = "Lu",
+ [0x0021D] = "Ll",
+ [0x0021E] = "Lu",
+ [0x0021F] = "Ll",
+ [0x00220] = "Lu",
+ [0x00221] = "Ll",
+ [0x00222] = "Lu",
+ [0x00223] = "Ll",
+ [0x00224] = "Lu",
+ [0x00225] = "Ll",
+ [0x00226] = "Lu",
+ [0x00227] = "Ll",
+ [0x00228] = "Lu",
+ [0x00229] = "Ll",
+ [0x0022A] = "Lu",
+ [0x0022B] = "Ll",
+ [0x0022C] = "Lu",
+ [0x0022D] = "Ll",
+ [0x0022E] = "Lu",
+ [0x0022F] = "Ll",
+ [0x00230] = "Lu",
+ [0x00231] = "Ll",
+ [0x00232] = "Lu",
+ [0x0023C] = "Ll",
+ [0x00241] = "Lu",
+ [0x00242] = "Ll",
+ [0x00247] = "Ll",
+ [0x00248] = "Lu",
+ [0x00249] = "Ll",
+ [0x0024A] = "Lu",
+ [0x0024B] = "Ll",
+ [0x0024C] = "Lu",
+ [0x0024D] = "Ll",
+ [0x0024E] = "Lu",
+ [0x00294] = "Lo",
+ [0x002EC] = "Lm",
+ [0x002ED] = "Sk",
+ [0x002EE] = "Lm",
+ [0x00370] = "Lu",
+ [0x00371] = "Ll",
+ [0x00372] = "Lu",
+ [0x00373] = "Ll",
+ [0x00374] = "Lm",
+ [0x00375] = "Sk",
+ [0x00376] = "Lu",
+ [0x00377] = "Ll",
+ [0x0037A] = "Lm",
+ [0x0037E] = "Po",
+ [0x0037F] = "Lu",
+ [0x00386] = "Lu",
+ [0x00387] = "Po",
+ [0x0038C] = "Lu",
+ [0x00390] = "Ll",
+ [0x003CF] = "Lu",
+ [0x003D8] = "Lu",
+ [0x003D9] = "Ll",
+ [0x003DA] = "Lu",
+ [0x003DB] = "Ll",
+ [0x003DC] = "Lu",
+ [0x003DD] = "Ll",
+ [0x003DE] = "Lu",
+ [0x003DF] = "Ll",
+ [0x003E0] = "Lu",
+ [0x003E1] = "Ll",
+ [0x003E2] = "Lu",
+ [0x003E3] = "Ll",
+ [0x003E4] = "Lu",
+ [0x003E5] = "Ll",
+ [0x003E6] = "Lu",
+ [0x003E7] = "Ll",
+ [0x003E8] = "Lu",
+ [0x003E9] = "Ll",
+ [0x003EA] = "Lu",
+ [0x003EB] = "Ll",
+ [0x003EC] = "Lu",
+ [0x003ED] = "Ll",
+ [0x003EE] = "Lu",
+ [0x003F4] = "Lu",
+ [0x003F5] = "Ll",
+ [0x003F6] = "Sm",
+ [0x003F7] = "Lu",
+ [0x003F8] = "Ll",
+ [0x00460] = "Lu",
+ [0x00461] = "Ll",
+ [0x00462] = "Lu",
+ [0x00463] = "Ll",
+ [0x00464] = "Lu",
+ [0x00465] = "Ll",
+ [0x00466] = "Lu",
+ [0x00467] = "Ll",
+ [0x00468] = "Lu",
+ [0x00469] = "Ll",
+ [0x0046A] = "Lu",
+ [0x0046B] = "Ll",
+ [0x0046C] = "Lu",
+ [0x0046D] = "Ll",
+ [0x0046E] = "Lu",
+ [0x0046F] = "Ll",
+ [0x00470] = "Lu",
+ [0x00471] = "Ll",
+ [0x00472] = "Lu",
+ [0x00473] = "Ll",
+ [0x00474] = "Lu",
+ [0x00475] = "Ll",
+ [0x00476] = "Lu",
+ [0x00477] = "Ll",
+ [0x00478] = "Lu",
+ [0x00479] = "Ll",
+ [0x0047A] = "Lu",
+ [0x0047B] = "Ll",
+ [0x0047C] = "Lu",
+ [0x0047D] = "Ll",
+ [0x0047E] = "Lu",
+ [0x0047F] = "Ll",
+ [0x00480] = "Lu",
+ [0x00481] = "Ll",
+ [0x00482] = "So",
+ [0x0048A] = "Lu",
+ [0x0048B] = "Ll",
+ [0x0048C] = "Lu",
+ [0x0048D] = "Ll",
+ [0x0048E] = "Lu",
+ [0x0048F] = "Ll",
+ [0x00490] = "Lu",
+ [0x00491] = "Ll",
+ [0x00492] = "Lu",
+ [0x00493] = "Ll",
+ [0x00494] = "Lu",
+ [0x00495] = "Ll",
+ [0x00496] = "Lu",
+ [0x00497] = "Ll",
+ [0x00498] = "Lu",
+ [0x00499] = "Ll",
+ [0x0049A] = "Lu",
+ [0x0049B] = "Ll",
+ [0x0049C] = "Lu",
+ [0x0049D] = "Ll",
+ [0x0049E] = "Lu",
+ [0x0049F] = "Ll",
+ [0x004A0] = "Lu",
+ [0x004A1] = "Ll",
+ [0x004A2] = "Lu",
+ [0x004A3] = "Ll",
+ [0x004A4] = "Lu",
+ [0x004A5] = "Ll",
+ [0x004A6] = "Lu",
+ [0x004A7] = "Ll",
+ [0x004A8] = "Lu",
+ [0x004A9] = "Ll",
+ [0x004AA] = "Lu",
+ [0x004AB] = "Ll",
+ [0x004AC] = "Lu",
+ [0x004AD] = "Ll",
+ [0x004AE] = "Lu",
+ [0x004AF] = "Ll",
+ [0x004B0] = "Lu",
+ [0x004B1] = "Ll",
+ [0x004B2] = "Lu",
+ [0x004B3] = "Ll",
+ [0x004B4] = "Lu",
+ [0x004B5] = "Ll",
+ [0x004B6] = "Lu",
+ [0x004B7] = "Ll",
+ [0x004B8] = "Lu",
+ [0x004B9] = "Ll",
+ [0x004BA] = "Lu",
+ [0x004BB] = "Ll",
+ [0x004BC] = "Lu",
+ [0x004BD] = "Ll",
+ [0x004BE] = "Lu",
+ [0x004BF] = "Ll",
+ [0x004C2] = "Ll",
+ [0x004C3] = "Lu",
+ [0x004C4] = "Ll",
+ [0x004C5] = "Lu",
+ [0x004C6] = "Ll",
+ [0x004C7] = "Lu",
+ [0x004C8] = "Ll",
+ [0x004C9] = "Lu",
+ [0x004CA] = "Ll",
+ [0x004CB] = "Lu",
+ [0x004CC] = "Ll",
+ [0x004CD] = "Lu",
+ [0x004D0] = "Lu",
+ [0x004D1] = "Ll",
+ [0x004D2] = "Lu",
+ [0x004D3] = "Ll",
+ [0x004D4] = "Lu",
+ [0x004D5] = "Ll",
+ [0x004D6] = "Lu",
+ [0x004D7] = "Ll",
+ [0x004D8] = "Lu",
+ [0x004D9] = "Ll",
+ [0x004DA] = "Lu",
+ [0x004DB] = "Ll",
+ [0x004DC] = "Lu",
+ [0x004DD] = "Ll",
+ [0x004DE] = "Lu",
+ [0x004DF] = "Ll",
+ [0x004E0] = "Lu",
+ [0x004E1] = "Ll",
+ [0x004E2] = "Lu",
+ [0x004E3] = "Ll",
+ [0x004E4] = "Lu",
+ [0x004E5] = "Ll",
+ [0x004E6] = "Lu",
+ [0x004E7] = "Ll",
+ [0x004E8] = "Lu",
+ [0x004E9] = "Ll",
+ [0x004EA] = "Lu",
+ [0x004EB] = "Ll",
+ [0x004EC] = "Lu",
+ [0x004ED] = "Ll",
+ [0x004EE] = "Lu",
+ [0x004EF] = "Ll",
+ [0x004F0] = "Lu",
+ [0x004F1] = "Ll",
+ [0x004F2] = "Lu",
+ [0x004F3] = "Ll",
+ [0x004F4] = "Lu",
+ [0x004F5] = "Ll",
+ [0x004F6] = "Lu",
+ [0x004F7] = "Ll",
+ [0x004F8] = "Lu",
+ [0x004F9] = "Ll",
+ [0x004FA] = "Lu",
+ [0x004FB] = "Ll",
+ [0x004FC] = "Lu",
+ [0x004FD] = "Ll",
+ [0x004FE] = "Lu",
+ [0x004FF] = "Ll",
+ [0x00500] = "Lu",
+ [0x00501] = "Ll",
+ [0x00502] = "Lu",
+ [0x00503] = "Ll",
+ [0x00504] = "Lu",
+ [0x00505] = "Ll",
+ [0x00506] = "Lu",
+ [0x00507] = "Ll",
+ [0x00508] = "Lu",
+ [0x00509] = "Ll",
+ [0x0050A] = "Lu",
+ [0x0050B] = "Ll",
+ [0x0050C] = "Lu",
+ [0x0050D] = "Ll",
+ [0x0050E] = "Lu",
+ [0x0050F] = "Ll",
+ [0x00510] = "Lu",
+ [0x00511] = "Ll",
+ [0x00512] = "Lu",
+ [0x00513] = "Ll",
+ [0x00514] = "Lu",
+ [0x00515] = "Ll",
+ [0x00516] = "Lu",
+ [0x00517] = "Ll",
+ [0x00518] = "Lu",
+ [0x00519] = "Ll",
+ [0x0051A] = "Lu",
+ [0x0051B] = "Ll",
+ [0x0051C] = "Lu",
+ [0x0051D] = "Ll",
+ [0x0051E] = "Lu",
+ [0x0051F] = "Ll",
+ [0x00520] = "Lu",
+ [0x00521] = "Ll",
+ [0x00522] = "Lu",
+ [0x00523] = "Ll",
+ [0x00524] = "Lu",
+ [0x00525] = "Ll",
+ [0x00526] = "Lu",
+ [0x00527] = "Ll",
+ [0x00528] = "Lu",
+ [0x00529] = "Ll",
+ [0x0052A] = "Lu",
+ [0x0052B] = "Ll",
+ [0x0052C] = "Lu",
+ [0x0052D] = "Ll",
+ [0x0052E] = "Lu",
+ [0x0052F] = "Ll",
+ [0x00559] = "Lm",
+ [0x00589] = "Po",
+ [0x0058A] = "Pd",
+ [0x0058F] = "Sc",
+ [0x005BE] = "Pd",
+ [0x005BF] = "Mn",
+ [0x005C0] = "Po",
+ [0x005C3] = "Po",
+ [0x005C6] = "Po",
+ [0x005C7] = "Mn",
+ [0x0060B] = "Sc",
+ [0x0061B] = "Po",
+ [0x0061C] = "Cf",
+ [0x00640] = "Lm",
+ [0x00670] = "Mn",
+ [0x006D4] = "Po",
+ [0x006D5] = "Lo",
+ [0x006DD] = "Cf",
+ [0x006DE] = "So",
+ [0x006E9] = "So",
+ [0x006FF] = "Lo",
+ [0x0070F] = "Cf",
+ [0x00710] = "Lo",
+ [0x00711] = "Mn",
+ [0x007B1] = "Lo",
+ [0x007F6] = "So",
+ [0x007FA] = "Lm",
+ [0x007FD] = "Mn",
+ [0x0081A] = "Lm",
+ [0x00824] = "Lm",
+ [0x00828] = "Lm",
+ [0x0085E] = "Po",
+ [0x008E2] = "Cf",
+ [0x00903] = "Mc",
+ [0x0093A] = "Mn",
+ [0x0093B] = "Mc",
+ [0x0093C] = "Mn",
+ [0x0093D] = "Lo",
+ [0x0094D] = "Mn",
+ [0x00950] = "Lo",
+ [0x00970] = "Po",
+ [0x00971] = "Lm",
+ [0x00981] = "Mn",
+ [0x009B2] = "Lo",
+ [0x009BC] = "Mn",
+ [0x009BD] = "Lo",
+ [0x009CD] = "Mn",
+ [0x009CE] = "Lo",
+ [0x009D7] = "Mc",
+ [0x009FA] = "So",
+ [0x009FB] = "Sc",
+ [0x009FC] = "Lo",
+ [0x009FD] = "Po",
+ [0x009FE] = "Mn",
+ [0x00A03] = "Mc",
+ [0x00A3C] = "Mn",
+ [0x00A51] = "Mn",
+ [0x00A5E] = "Lo",
+ [0x00A75] = "Mn",
+ [0x00A76] = "Po",
+ [0x00A83] = "Mc",
+ [0x00ABC] = "Mn",
+ [0x00ABD] = "Lo",
+ [0x00AC9] = "Mc",
+ [0x00ACD] = "Mn",
+ [0x00AD0] = "Lo",
+ [0x00AF0] = "Po",
+ [0x00AF1] = "Sc",
+ [0x00AF9] = "Lo",
+ [0x00B01] = "Mn",
+ [0x00B3C] = "Mn",
+ [0x00B3D] = "Lo",
+ [0x00B3E] = "Mc",
+ [0x00B3F] = "Mn",
+ [0x00B40] = "Mc",
+ [0x00B4D] = "Mn",
+ [0x00B56] = "Mn",
+ [0x00B57] = "Mc",
+ [0x00B70] = "So",
+ [0x00B71] = "Lo",
+ [0x00B82] = "Mn",
+ [0x00B83] = "Lo",
+ [0x00B9C] = "Lo",
+ [0x00BC0] = "Mn",
+ [0x00BCD] = "Mn",
+ [0x00BD0] = "Lo",
+ [0x00BD7] = "Mc",
+ [0x00BF9] = "Sc",
+ [0x00BFA] = "So",
+ [0x00C00] = "Mn",
+ [0x00C04] = "Mn",
+ [0x00C3D] = "Lo",
+ [0x00C7F] = "So",
+ [0x00C80] = "Lo",
+ [0x00C81] = "Mn",
+ [0x00C84] = "Po",
+ [0x00CBC] = "Mn",
+ [0x00CBD] = "Lo",
+ [0x00CBE] = "Mc",
+ [0x00CBF] = "Mn",
+ [0x00CC6] = "Mn",
+ [0x00CDE] = "Lo",
+ [0x00D3D] = "Lo",
+ [0x00D4D] = "Mn",
+ [0x00D4E] = "Lo",
+ [0x00D4F] = "So",
+ [0x00D57] = "Mc",
+ [0x00D79] = "So",
+ [0x00DBD] = "Lo",
+ [0x00DCA] = "Mn",
+ [0x00DD6] = "Mn",
+ [0x00DF4] = "Po",
+ [0x00E31] = "Mn",
+ [0x00E3F] = "Sc",
+ [0x00E46] = "Lm",
+ [0x00E4F] = "Po",
+ [0x00E84] = "Lo",
+ [0x00E8A] = "Lo",
+ [0x00E8D] = "Lo",
+ [0x00EA5] = "Lo",
+ [0x00EA7] = "Lo",
+ [0x00EB1] = "Mn",
+ [0x00EBD] = "Lo",
+ [0x00EC6] = "Lm",
+ [0x00F00] = "Lo",
+ [0x00F13] = "So",
+ [0x00F14] = "Po",
+ [0x00F34] = "So",
+ [0x00F35] = "Mn",
+ [0x00F36] = "So",
+ [0x00F37] = "Mn",
+ [0x00F38] = "So",
+ [0x00F39] = "Mn",
+ [0x00F3A] = "Ps",
+ [0x00F3B] = "Pe",
+ [0x00F3C] = "Ps",
+ [0x00F3D] = "Pe",
+ [0x00F7F] = "Mc",
+ [0x00F85] = "Po",
+ [0x00FC6] = "Mn",
+ [0x01031] = "Mc",
+ [0x01038] = "Mc",
+ [0x0103F] = "Lo",
+ [0x01061] = "Lo",
+ [0x01082] = "Mn",
+ [0x0108D] = "Mn",
+ [0x0108E] = "Lo",
+ [0x0108F] = "Mc",
+ [0x0109D] = "Mn",
+ [0x010C7] = "Lu",
+ [0x010CD] = "Lu",
+ [0x010FB] = "Po",
+ [0x010FC] = "Lm",
+ [0x01258] = "Lo",
+ [0x012C0] = "Lo",
+ [0x01400] = "Pd",
+ [0x01680] = "Zs",
+ [0x0169B] = "Ps",
+ [0x0169C] = "Pe",
+ [0x017B6] = "Mc",
+ [0x017C6] = "Mn",
+ [0x017D7] = "Lm",
+ [0x017DB] = "Sc",
+ [0x017DC] = "Lo",
+ [0x017DD] = "Mn",
+ [0x01806] = "Pd",
+ [0x0180E] = "Cf",
+ [0x01843] = "Lm",
+ [0x018A9] = "Mn",
+ [0x018AA] = "Lo",
+ [0x01932] = "Mn",
+ [0x01940] = "So",
+ [0x019DA] = "No",
+ [0x01A1B] = "Mn",
+ [0x01A55] = "Mc",
+ [0x01A56] = "Mn",
+ [0x01A57] = "Mc",
+ [0x01A60] = "Mn",
+ [0x01A61] = "Mc",
+ [0x01A62] = "Mn",
+ [0x01A7F] = "Mn",
+ [0x01AA7] = "Lm",
+ [0x01ABE] = "Me",
+ [0x01B04] = "Mc",
+ [0x01B34] = "Mn",
+ [0x01B35] = "Mc",
+ [0x01B3B] = "Mc",
+ [0x01B3C] = "Mn",
+ [0x01B42] = "Mn",
+ [0x01B82] = "Mc",
+ [0x01BA1] = "Mc",
+ [0x01BAA] = "Mc",
+ [0x01BE6] = "Mn",
+ [0x01BE7] = "Mc",
+ [0x01BED] = "Mn",
+ [0x01BEE] = "Mc",
+ [0x01CD3] = "Po",
+ [0x01CE1] = "Mc",
+ [0x01CED] = "Mn",
+ [0x01CF4] = "Mn",
+ [0x01CF7] = "Mc",
+ [0x01D78] = "Lm",
+ [0x01E00] = "Lu",
+ [0x01E01] = "Ll",
+ [0x01E02] = "Lu",
+ [0x01E03] = "Ll",
+ [0x01E04] = "Lu",
+ [0x01E05] = "Ll",
+ [0x01E06] = "Lu",
+ [0x01E07] = "Ll",
+ [0x01E08] = "Lu",
+ [0x01E09] = "Ll",
+ [0x01E0A] = "Lu",
+ [0x01E0B] = "Ll",
+ [0x01E0C] = "Lu",
+ [0x01E0D] = "Ll",
+ [0x01E0E] = "Lu",
+ [0x01E0F] = "Ll",
+ [0x01E10] = "Lu",
+ [0x01E11] = "Ll",
+ [0x01E12] = "Lu",
+ [0x01E13] = "Ll",
+ [0x01E14] = "Lu",
+ [0x01E15] = "Ll",
+ [0x01E16] = "Lu",
+ [0x01E17] = "Ll",
+ [0x01E18] = "Lu",
+ [0x01E19] = "Ll",
+ [0x01E1A] = "Lu",
+ [0x01E1B] = "Ll",
+ [0x01E1C] = "Lu",
+ [0x01E1D] = "Ll",
+ [0x01E1E] = "Lu",
+ [0x01E1F] = "Ll",
+ [0x01E20] = "Lu",
+ [0x01E21] = "Ll",
+ [0x01E22] = "Lu",
+ [0x01E23] = "Ll",
+ [0x01E24] = "Lu",
+ [0x01E25] = "Ll",
+ [0x01E26] = "Lu",
+ [0x01E27] = "Ll",
+ [0x01E28] = "Lu",
+ [0x01E29] = "Ll",
+ [0x01E2A] = "Lu",
+ [0x01E2B] = "Ll",
+ [0x01E2C] = "Lu",
+ [0x01E2D] = "Ll",
+ [0x01E2E] = "Lu",
+ [0x01E2F] = "Ll",
+ [0x01E30] = "Lu",
+ [0x01E31] = "Ll",
+ [0x01E32] = "Lu",
+ [0x01E33] = "Ll",
+ [0x01E34] = "Lu",
+ [0x01E35] = "Ll",
+ [0x01E36] = "Lu",
+ [0x01E37] = "Ll",
+ [0x01E38] = "Lu",
+ [0x01E39] = "Ll",
+ [0x01E3A] = "Lu",
+ [0x01E3B] = "Ll",
+ [0x01E3C] = "Lu",
+ [0x01E3D] = "Ll",
+ [0x01E3E] = "Lu",
+ [0x01E3F] = "Ll",
+ [0x01E40] = "Lu",
+ [0x01E41] = "Ll",
+ [0x01E42] = "Lu",
+ [0x01E43] = "Ll",
+ [0x01E44] = "Lu",
+ [0x01E45] = "Ll",
+ [0x01E46] = "Lu",
+ [0x01E47] = "Ll",
+ [0x01E48] = "Lu",
+ [0x01E49] = "Ll",
+ [0x01E4A] = "Lu",
+ [0x01E4B] = "Ll",
+ [0x01E4C] = "Lu",
+ [0x01E4D] = "Ll",
+ [0x01E4E] = "Lu",
+ [0x01E4F] = "Ll",
+ [0x01E50] = "Lu",
+ [0x01E51] = "Ll",
+ [0x01E52] = "Lu",
+ [0x01E53] = "Ll",
+ [0x01E54] = "Lu",
+ [0x01E55] = "Ll",
+ [0x01E56] = "Lu",
+ [0x01E57] = "Ll",
+ [0x01E58] = "Lu",
+ [0x01E59] = "Ll",
+ [0x01E5A] = "Lu",
+ [0x01E5B] = "Ll",
+ [0x01E5C] = "Lu",
+ [0x01E5D] = "Ll",
+ [0x01E5E] = "Lu",
+ [0x01E5F] = "Ll",
+ [0x01E60] = "Lu",
+ [0x01E61] = "Ll",
+ [0x01E62] = "Lu",
+ [0x01E63] = "Ll",
+ [0x01E64] = "Lu",
+ [0x01E65] = "Ll",
+ [0x01E66] = "Lu",
+ [0x01E67] = "Ll",
+ [0x01E68] = "Lu",
+ [0x01E69] = "Ll",
+ [0x01E6A] = "Lu",
+ [0x01E6B] = "Ll",
+ [0x01E6C] = "Lu",
+ [0x01E6D] = "Ll",
+ [0x01E6E] = "Lu",
+ [0x01E6F] = "Ll",
+ [0x01E70] = "Lu",
+ [0x01E71] = "Ll",
+ [0x01E72] = "Lu",
+ [0x01E73] = "Ll",
+ [0x01E74] = "Lu",
+ [0x01E75] = "Ll",
+ [0x01E76] = "Lu",
+ [0x01E77] = "Ll",
+ [0x01E78] = "Lu",
+ [0x01E79] = "Ll",
+ [0x01E7A] = "Lu",
+ [0x01E7B] = "Ll",
+ [0x01E7C] = "Lu",
+ [0x01E7D] = "Ll",
+ [0x01E7E] = "Lu",
+ [0x01E7F] = "Ll",
+ [0x01E80] = "Lu",
+ [0x01E81] = "Ll",
+ [0x01E82] = "Lu",
+ [0x01E83] = "Ll",
+ [0x01E84] = "Lu",
+ [0x01E85] = "Ll",
+ [0x01E86] = "Lu",
+ [0x01E87] = "Ll",
+ [0x01E88] = "Lu",
+ [0x01E89] = "Ll",
+ [0x01E8A] = "Lu",
+ [0x01E8B] = "Ll",
+ [0x01E8C] = "Lu",
+ [0x01E8D] = "Ll",
+ [0x01E8E] = "Lu",
+ [0x01E8F] = "Ll",
+ [0x01E90] = "Lu",
+ [0x01E91] = "Ll",
+ [0x01E92] = "Lu",
+ [0x01E93] = "Ll",
+ [0x01E94] = "Lu",
+ [0x01E9E] = "Lu",
+ [0x01E9F] = "Ll",
+ [0x01EA0] = "Lu",
+ [0x01EA1] = "Ll",
+ [0x01EA2] = "Lu",
+ [0x01EA3] = "Ll",
+ [0x01EA4] = "Lu",
+ [0x01EA5] = "Ll",
+ [0x01EA6] = "Lu",
+ [0x01EA7] = "Ll",
+ [0x01EA8] = "Lu",
+ [0x01EA9] = "Ll",
+ [0x01EAA] = "Lu",
+ [0x01EAB] = "Ll",
+ [0x01EAC] = "Lu",
+ [0x01EAD] = "Ll",
+ [0x01EAE] = "Lu",
+ [0x01EAF] = "Ll",
+ [0x01EB0] = "Lu",
+ [0x01EB1] = "Ll",
+ [0x01EB2] = "Lu",
+ [0x01EB3] = "Ll",
+ [0x01EB4] = "Lu",
+ [0x01EB5] = "Ll",
+ [0x01EB6] = "Lu",
+ [0x01EB7] = "Ll",
+ [0x01EB8] = "Lu",
+ [0x01EB9] = "Ll",
+ [0x01EBA] = "Lu",
+ [0x01EBB] = "Ll",
+ [0x01EBC] = "Lu",
+ [0x01EBD] = "Ll",
+ [0x01EBE] = "Lu",
+ [0x01EBF] = "Ll",
+ [0x01EC0] = "Lu",
+ [0x01EC1] = "Ll",
+ [0x01EC2] = "Lu",
+ [0x01EC3] = "Ll",
+ [0x01EC4] = "Lu",
+ [0x01EC5] = "Ll",
+ [0x01EC6] = "Lu",
+ [0x01EC7] = "Ll",
+ [0x01EC8] = "Lu",
+ [0x01EC9] = "Ll",
+ [0x01ECA] = "Lu",
+ [0x01ECB] = "Ll",
+ [0x01ECC] = "Lu",
+ [0x01ECD] = "Ll",
+ [0x01ECE] = "Lu",
+ [0x01ECF] = "Ll",
+ [0x01ED0] = "Lu",
+ [0x01ED1] = "Ll",
+ [0x01ED2] = "Lu",
+ [0x01ED3] = "Ll",
+ [0x01ED4] = "Lu",
+ [0x01ED5] = "Ll",
+ [0x01ED6] = "Lu",
+ [0x01ED7] = "Ll",
+ [0x01ED8] = "Lu",
+ [0x01ED9] = "Ll",
+ [0x01EDA] = "Lu",
+ [0x01EDB] = "Ll",
+ [0x01EDC] = "Lu",
+ [0x01EDD] = "Ll",
+ [0x01EDE] = "Lu",
+ [0x01EDF] = "Ll",
+ [0x01EE0] = "Lu",
+ [0x01EE1] = "Ll",
+ [0x01EE2] = "Lu",
+ [0x01EE3] = "Ll",
+ [0x01EE4] = "Lu",
+ [0x01EE5] = "Ll",
+ [0x01EE6] = "Lu",
+ [0x01EE7] = "Ll",
+ [0x01EE8] = "Lu",
+ [0x01EE9] = "Ll",
+ [0x01EEA] = "Lu",
+ [0x01EEB] = "Ll",
+ [0x01EEC] = "Lu",
+ [0x01EED] = "Ll",
+ [0x01EEE] = "Lu",
+ [0x01EEF] = "Ll",
+ [0x01EF0] = "Lu",
+ [0x01EF1] = "Ll",
+ [0x01EF2] = "Lu",
+ [0x01EF3] = "Ll",
+ [0x01EF4] = "Lu",
+ [0x01EF5] = "Ll",
+ [0x01EF6] = "Lu",
+ [0x01EF7] = "Ll",
+ [0x01EF8] = "Lu",
+ [0x01EF9] = "Ll",
+ [0x01EFA] = "Lu",
+ [0x01EFB] = "Ll",
+ [0x01EFC] = "Lu",
+ [0x01EFD] = "Ll",
+ [0x01EFE] = "Lu",
+ [0x01F59] = "Lu",
+ [0x01F5B] = "Lu",
+ [0x01F5D] = "Lu",
+ [0x01F5F] = "Lu",
+ [0x01FBC] = "Lt",
+ [0x01FBD] = "Sk",
+ [0x01FBE] = "Ll",
+ [0x01FCC] = "Lt",
+ [0x01FFC] = "Lt",
+ [0x02018] = "Pi",
+ [0x02019] = "Pf",
+ [0x0201A] = "Ps",
+ [0x0201D] = "Pf",
+ [0x0201E] = "Ps",
+ [0x0201F] = "Pi",
+ [0x02028] = "Zl",
+ [0x02029] = "Zp",
+ [0x0202F] = "Zs",
+ [0x02039] = "Pi",
+ [0x0203A] = "Pf",
+ [0x02044] = "Sm",
+ [0x02045] = "Ps",
+ [0x02046] = "Pe",
+ [0x02052] = "Sm",
+ [0x02053] = "Po",
+ [0x02054] = "Pc",
+ [0x0205F] = "Zs",
+ [0x02070] = "No",
+ [0x02071] = "Lm",
+ [0x0207D] = "Ps",
+ [0x0207E] = "Pe",
+ [0x0207F] = "Lm",
+ [0x0208D] = "Ps",
+ [0x0208E] = "Pe",
+ [0x020E1] = "Mn",
+ [0x02102] = "Lu",
+ [0x02107] = "Lu",
+ [0x0210A] = "Ll",
+ [0x02113] = "Ll",
+ [0x02114] = "So",
+ [0x02115] = "Lu",
+ [0x02118] = "Sm",
+ [0x02124] = "Lu",
+ [0x02125] = "So",
+ [0x02126] = "Lu",
+ [0x02127] = "So",
+ [0x02128] = "Lu",
+ [0x02129] = "So",
+ [0x0212E] = "So",
+ [0x0212F] = "Ll",
+ [0x02134] = "Ll",
+ [0x02139] = "Ll",
+ [0x02145] = "Lu",
+ [0x0214A] = "So",
+ [0x0214B] = "Sm",
+ [0x0214E] = "Ll",
+ [0x0214F] = "So",
+ [0x02183] = "Lu",
+ [0x02184] = "Ll",
+ [0x02189] = "No",
+ [0x021A0] = "Sm",
+ [0x021A3] = "Sm",
+ [0x021A6] = "Sm",
+ [0x021AE] = "Sm",
+ [0x021D2] = "Sm",
+ [0x021D3] = "So",
+ [0x021D4] = "Sm",
+ [0x02308] = "Ps",
+ [0x02309] = "Pe",
+ [0x0230A] = "Ps",
+ [0x0230B] = "Pe",
+ [0x02329] = "Ps",
+ [0x0232A] = "Pe",
+ [0x0237C] = "Sm",
+ [0x025B7] = "Sm",
+ [0x025C1] = "Sm",
+ [0x0266F] = "Sm",
+ [0x02768] = "Ps",
+ [0x02769] = "Pe",
+ [0x0276A] = "Ps",
+ [0x0276B] = "Pe",
+ [0x0276C] = "Ps",
+ [0x0276D] = "Pe",
+ [0x0276E] = "Ps",
+ [0x0276F] = "Pe",
+ [0x02770] = "Ps",
+ [0x02771] = "Pe",
+ [0x02772] = "Ps",
+ [0x02773] = "Pe",
+ [0x02774] = "Ps",
+ [0x02775] = "Pe",
+ [0x027C5] = "Ps",
+ [0x027C6] = "Pe",
+ [0x027E6] = "Ps",
+ [0x027E7] = "Pe",
+ [0x027E8] = "Ps",
+ [0x027E9] = "Pe",
+ [0x027EA] = "Ps",
+ [0x027EB] = "Pe",
+ [0x027EC] = "Ps",
+ [0x027ED] = "Pe",
+ [0x027EE] = "Ps",
+ [0x027EF] = "Pe",
+ [0x02983] = "Ps",
+ [0x02984] = "Pe",
+ [0x02985] = "Ps",
+ [0x02986] = "Pe",
+ [0x02987] = "Ps",
+ [0x02988] = "Pe",
+ [0x02989] = "Ps",
+ [0x0298A] = "Pe",
+ [0x0298B] = "Ps",
+ [0x0298C] = "Pe",
+ [0x0298D] = "Ps",
+ [0x0298E] = "Pe",
+ [0x0298F] = "Ps",
+ [0x02990] = "Pe",
+ [0x02991] = "Ps",
+ [0x02992] = "Pe",
+ [0x02993] = "Ps",
+ [0x02994] = "Pe",
+ [0x02995] = "Ps",
+ [0x02996] = "Pe",
+ [0x02997] = "Ps",
+ [0x02998] = "Pe",
+ [0x029D8] = "Ps",
+ [0x029D9] = "Pe",
+ [0x029DA] = "Ps",
+ [0x029DB] = "Pe",
+ [0x029FC] = "Ps",
+ [0x029FD] = "Pe",
+ [0x02C60] = "Lu",
+ [0x02C61] = "Ll",
+ [0x02C67] = "Lu",
+ [0x02C68] = "Ll",
+ [0x02C69] = "Lu",
+ [0x02C6A] = "Ll",
+ [0x02C6B] = "Lu",
+ [0x02C6C] = "Ll",
+ [0x02C71] = "Ll",
+ [0x02C72] = "Lu",
+ [0x02C75] = "Lu",
+ [0x02C81] = "Ll",
+ [0x02C82] = "Lu",
+ [0x02C83] = "Ll",
+ [0x02C84] = "Lu",
+ [0x02C85] = "Ll",
+ [0x02C86] = "Lu",
+ [0x02C87] = "Ll",
+ [0x02C88] = "Lu",
+ [0x02C89] = "Ll",
+ [0x02C8A] = "Lu",
+ [0x02C8B] = "Ll",
+ [0x02C8C] = "Lu",
+ [0x02C8D] = "Ll",
+ [0x02C8E] = "Lu",
+ [0x02C8F] = "Ll",
+ [0x02C90] = "Lu",
+ [0x02C91] = "Ll",
+ [0x02C92] = "Lu",
+ [0x02C93] = "Ll",
+ [0x02C94] = "Lu",
+ [0x02C95] = "Ll",
+ [0x02C96] = "Lu",
+ [0x02C97] = "Ll",
+ [0x02C98] = "Lu",
+ [0x02C99] = "Ll",
+ [0x02C9A] = "Lu",
+ [0x02C9B] = "Ll",
+ [0x02C9C] = "Lu",
+ [0x02C9D] = "Ll",
+ [0x02C9E] = "Lu",
+ [0x02C9F] = "Ll",
+ [0x02CA0] = "Lu",
+ [0x02CA1] = "Ll",
+ [0x02CA2] = "Lu",
+ [0x02CA3] = "Ll",
+ [0x02CA4] = "Lu",
+ [0x02CA5] = "Ll",
+ [0x02CA6] = "Lu",
+ [0x02CA7] = "Ll",
+ [0x02CA8] = "Lu",
+ [0x02CA9] = "Ll",
+ [0x02CAA] = "Lu",
+ [0x02CAB] = "Ll",
+ [0x02CAC] = "Lu",
+ [0x02CAD] = "Ll",
+ [0x02CAE] = "Lu",
+ [0x02CAF] = "Ll",
+ [0x02CB0] = "Lu",
+ [0x02CB1] = "Ll",
+ [0x02CB2] = "Lu",
+ [0x02CB3] = "Ll",
+ [0x02CB4] = "Lu",
+ [0x02CB5] = "Ll",
+ [0x02CB6] = "Lu",
+ [0x02CB7] = "Ll",
+ [0x02CB8] = "Lu",
+ [0x02CB9] = "Ll",
+ [0x02CBA] = "Lu",
+ [0x02CBB] = "Ll",
+ [0x02CBC] = "Lu",
+ [0x02CBD] = "Ll",
+ [0x02CBE] = "Lu",
+ [0x02CBF] = "Ll",
+ [0x02CC0] = "Lu",
+ [0x02CC1] = "Ll",
+ [0x02CC2] = "Lu",
+ [0x02CC3] = "Ll",
+ [0x02CC4] = "Lu",
+ [0x02CC5] = "Ll",
+ [0x02CC6] = "Lu",
+ [0x02CC7] = "Ll",
+ [0x02CC8] = "Lu",
+ [0x02CC9] = "Ll",
+ [0x02CCA] = "Lu",
+ [0x02CCB] = "Ll",
+ [0x02CCC] = "Lu",
+ [0x02CCD] = "Ll",
+ [0x02CCE] = "Lu",
+ [0x02CCF] = "Ll",
+ [0x02CD0] = "Lu",
+ [0x02CD1] = "Ll",
+ [0x02CD2] = "Lu",
+ [0x02CD3] = "Ll",
+ [0x02CD4] = "Lu",
+ [0x02CD5] = "Ll",
+ [0x02CD6] = "Lu",
+ [0x02CD7] = "Ll",
+ [0x02CD8] = "Lu",
+ [0x02CD9] = "Ll",
+ [0x02CDA] = "Lu",
+ [0x02CDB] = "Ll",
+ [0x02CDC] = "Lu",
+ [0x02CDD] = "Ll",
+ [0x02CDE] = "Lu",
+ [0x02CDF] = "Ll",
+ [0x02CE0] = "Lu",
+ [0x02CE1] = "Ll",
+ [0x02CE2] = "Lu",
+ [0x02CEB] = "Lu",
+ [0x02CEC] = "Ll",
+ [0x02CED] = "Lu",
+ [0x02CEE] = "Ll",
+ [0x02CF2] = "Lu",
+ [0x02CF3] = "Ll",
+ [0x02CFD] = "No",
+ [0x02D27] = "Ll",
+ [0x02D2D] = "Ll",
+ [0x02D6F] = "Lm",
+ [0x02D70] = "Po",
+ [0x02D7F] = "Mn",
+ [0x02E02] = "Pi",
+ [0x02E03] = "Pf",
+ [0x02E04] = "Pi",
+ [0x02E05] = "Pf",
+ [0x02E09] = "Pi",
+ [0x02E0A] = "Pf",
+ [0x02E0B] = "Po",
+ [0x02E0C] = "Pi",
+ [0x02E0D] = "Pf",
+ [0x02E17] = "Pd",
+ [0x02E1A] = "Pd",
+ [0x02E1B] = "Po",
+ [0x02E1C] = "Pi",
+ [0x02E1D] = "Pf",
+ [0x02E20] = "Pi",
+ [0x02E21] = "Pf",
+ [0x02E22] = "Ps",
+ [0x02E23] = "Pe",
+ [0x02E24] = "Ps",
+ [0x02E25] = "Pe",
+ [0x02E26] = "Ps",
+ [0x02E27] = "Pe",
+ [0x02E28] = "Ps",
+ [0x02E29] = "Pe",
+ [0x02E2F] = "Lm",
+ [0x02E40] = "Pd",
+ [0x02E41] = "Po",
+ [0x02E42] = "Ps",
+ [0x03000] = "Zs",
+ [0x03004] = "So",
+ [0x03005] = "Lm",
+ [0x03006] = "Lo",
+ [0x03007] = "Nl",
+ [0x03008] = "Ps",
+ [0x03009] = "Pe",
+ [0x0300A] = "Ps",
+ [0x0300B] = "Pe",
+ [0x0300C] = "Ps",
+ [0x0300D] = "Pe",
+ [0x0300E] = "Ps",
+ [0x0300F] = "Pe",
+ [0x03010] = "Ps",
+ [0x03011] = "Pe",
+ [0x03014] = "Ps",
+ [0x03015] = "Pe",
+ [0x03016] = "Ps",
+ [0x03017] = "Pe",
+ [0x03018] = "Ps",
+ [0x03019] = "Pe",
+ [0x0301A] = "Ps",
+ [0x0301B] = "Pe",
+ [0x0301C] = "Pd",
+ [0x0301D] = "Ps",
+ [0x03020] = "So",
+ [0x03030] = "Pd",
+ [0x0303B] = "Lm",
+ [0x0303C] = "Lo",
+ [0x0303D] = "Po",
+ [0x0309F] = "Lo",
+ [0x030A0] = "Pd",
+ [0x030FB] = "Po",
+ [0x030FF] = "Lo",
+ [0x03250] = "So",
+ [0x0A015] = "Lm",
+ [0x0A60C] = "Lm",
+ [0x0A640] = "Lu",
+ [0x0A641] = "Ll",
+ [0x0A642] = "Lu",
+ [0x0A643] = "Ll",
+ [0x0A644] = "Lu",
+ [0x0A645] = "Ll",
+ [0x0A646] = "Lu",
+ [0x0A647] = "Ll",
+ [0x0A648] = "Lu",
+ [0x0A649] = "Ll",
+ [0x0A64A] = "Lu",
+ [0x0A64B] = "Ll",
+ [0x0A64C] = "Lu",
+ [0x0A64D] = "Ll",
+ [0x0A64E] = "Lu",
+ [0x0A64F] = "Ll",
+ [0x0A650] = "Lu",
+ [0x0A651] = "Ll",
+ [0x0A652] = "Lu",
+ [0x0A653] = "Ll",
+ [0x0A654] = "Lu",
+ [0x0A655] = "Ll",
+ [0x0A656] = "Lu",
+ [0x0A657] = "Ll",
+ [0x0A658] = "Lu",
+ [0x0A659] = "Ll",
+ [0x0A65A] = "Lu",
+ [0x0A65B] = "Ll",
+ [0x0A65C] = "Lu",
+ [0x0A65D] = "Ll",
+ [0x0A65E] = "Lu",
+ [0x0A65F] = "Ll",
+ [0x0A660] = "Lu",
+ [0x0A661] = "Ll",
+ [0x0A662] = "Lu",
+ [0x0A663] = "Ll",
+ [0x0A664] = "Lu",
+ [0x0A665] = "Ll",
+ [0x0A666] = "Lu",
+ [0x0A667] = "Ll",
+ [0x0A668] = "Lu",
+ [0x0A669] = "Ll",
+ [0x0A66A] = "Lu",
+ [0x0A66B] = "Ll",
+ [0x0A66C] = "Lu",
+ [0x0A66D] = "Ll",
+ [0x0A66E] = "Lo",
+ [0x0A66F] = "Mn",
+ [0x0A673] = "Po",
+ [0x0A67E] = "Po",
+ [0x0A67F] = "Lm",
+ [0x0A680] = "Lu",
+ [0x0A681] = "Ll",
+ [0x0A682] = "Lu",
+ [0x0A683] = "Ll",
+ [0x0A684] = "Lu",
+ [0x0A685] = "Ll",
+ [0x0A686] = "Lu",
+ [0x0A687] = "Ll",
+ [0x0A688] = "Lu",
+ [0x0A689] = "Ll",
+ [0x0A68A] = "Lu",
+ [0x0A68B] = "Ll",
+ [0x0A68C] = "Lu",
+ [0x0A68D] = "Ll",
+ [0x0A68E] = "Lu",
+ [0x0A68F] = "Ll",
+ [0x0A690] = "Lu",
+ [0x0A691] = "Ll",
+ [0x0A692] = "Lu",
+ [0x0A693] = "Ll",
+ [0x0A694] = "Lu",
+ [0x0A695] = "Ll",
+ [0x0A696] = "Lu",
+ [0x0A697] = "Ll",
+ [0x0A698] = "Lu",
+ [0x0A699] = "Ll",
+ [0x0A69A] = "Lu",
+ [0x0A69B] = "Ll",
+ [0x0A722] = "Lu",
+ [0x0A723] = "Ll",
+ [0x0A724] = "Lu",
+ [0x0A725] = "Ll",
+ [0x0A726] = "Lu",
+ [0x0A727] = "Ll",
+ [0x0A728] = "Lu",
+ [0x0A729] = "Ll",
+ [0x0A72A] = "Lu",
+ [0x0A72B] = "Ll",
+ [0x0A72C] = "Lu",
+ [0x0A72D] = "Ll",
+ [0x0A72E] = "Lu",
+ [0x0A732] = "Lu",
+ [0x0A733] = "Ll",
+ [0x0A734] = "Lu",
+ [0x0A735] = "Ll",
+ [0x0A736] = "Lu",
+ [0x0A737] = "Ll",
+ [0x0A738] = "Lu",
+ [0x0A739] = "Ll",
+ [0x0A73A] = "Lu",
+ [0x0A73B] = "Ll",
+ [0x0A73C] = "Lu",
+ [0x0A73D] = "Ll",
+ [0x0A73E] = "Lu",
+ [0x0A73F] = "Ll",
+ [0x0A740] = "Lu",
+ [0x0A741] = "Ll",
+ [0x0A742] = "Lu",
+ [0x0A743] = "Ll",
+ [0x0A744] = "Lu",
+ [0x0A745] = "Ll",
+ [0x0A746] = "Lu",
+ [0x0A747] = "Ll",
+ [0x0A748] = "Lu",
+ [0x0A749] = "Ll",
+ [0x0A74A] = "Lu",
+ [0x0A74B] = "Ll",
+ [0x0A74C] = "Lu",
+ [0x0A74D] = "Ll",
+ [0x0A74E] = "Lu",
+ [0x0A74F] = "Ll",
+ [0x0A750] = "Lu",
+ [0x0A751] = "Ll",
+ [0x0A752] = "Lu",
+ [0x0A753] = "Ll",
+ [0x0A754] = "Lu",
+ [0x0A755] = "Ll",
+ [0x0A756] = "Lu",
+ [0x0A757] = "Ll",
+ [0x0A758] = "Lu",
+ [0x0A759] = "Ll",
+ [0x0A75A] = "Lu",
+ [0x0A75B] = "Ll",
+ [0x0A75C] = "Lu",
+ [0x0A75D] = "Ll",
+ [0x0A75E] = "Lu",
+ [0x0A75F] = "Ll",
+ [0x0A760] = "Lu",
+ [0x0A761] = "Ll",
+ [0x0A762] = "Lu",
+ [0x0A763] = "Ll",
+ [0x0A764] = "Lu",
+ [0x0A765] = "Ll",
+ [0x0A766] = "Lu",
+ [0x0A767] = "Ll",
+ [0x0A768] = "Lu",
+ [0x0A769] = "Ll",
+ [0x0A76A] = "Lu",
+ [0x0A76B] = "Ll",
+ [0x0A76C] = "Lu",
+ [0x0A76D] = "Ll",
+ [0x0A76E] = "Lu",
+ [0x0A76F] = "Ll",
+ [0x0A770] = "Lm",
+ [0x0A779] = "Lu",
+ [0x0A77A] = "Ll",
+ [0x0A77B] = "Lu",
+ [0x0A77C] = "Ll",
+ [0x0A77F] = "Ll",
+ [0x0A780] = "Lu",
+ [0x0A781] = "Ll",
+ [0x0A782] = "Lu",
+ [0x0A783] = "Ll",
+ [0x0A784] = "Lu",
+ [0x0A785] = "Ll",
+ [0x0A786] = "Lu",
+ [0x0A787] = "Ll",
+ [0x0A788] = "Lm",
+ [0x0A78B] = "Lu",
+ [0x0A78C] = "Ll",
+ [0x0A78D] = "Lu",
+ [0x0A78E] = "Ll",
+ [0x0A78F] = "Lo",
+ [0x0A790] = "Lu",
+ [0x0A791] = "Ll",
+ [0x0A792] = "Lu",
+ [0x0A796] = "Lu",
+ [0x0A797] = "Ll",
+ [0x0A798] = "Lu",
+ [0x0A799] = "Ll",
+ [0x0A79A] = "Lu",
+ [0x0A79B] = "Ll",
+ [0x0A79C] = "Lu",
+ [0x0A79D] = "Ll",
+ [0x0A79E] = "Lu",
+ [0x0A79F] = "Ll",
+ [0x0A7A0] = "Lu",
+ [0x0A7A1] = "Ll",
+ [0x0A7A2] = "Lu",
+ [0x0A7A3] = "Ll",
+ [0x0A7A4] = "Lu",
+ [0x0A7A5] = "Ll",
+ [0x0A7A6] = "Lu",
+ [0x0A7A7] = "Ll",
+ [0x0A7A8] = "Lu",
+ [0x0A7A9] = "Ll",
+ [0x0A7AF] = "Ll",
+ [0x0A7B5] = "Ll",
+ [0x0A7B6] = "Lu",
+ [0x0A7B7] = "Ll",
+ [0x0A7B8] = "Lu",
+ [0x0A7B9] = "Ll",
+ [0x0A7F7] = "Lo",
+ [0x0A7FA] = "Ll",
+ [0x0A802] = "Mn",
+ [0x0A806] = "Mn",
+ [0x0A80B] = "Mn",
+ [0x0A827] = "Mc",
+ [0x0A838] = "Sc",
+ [0x0A839] = "So",
+ [0x0A8FB] = "Lo",
+ [0x0A8FC] = "Po",
+ [0x0A8FF] = "Mn",
+ [0x0A95F] = "Po",
+ [0x0A983] = "Mc",
+ [0x0A9B3] = "Mn",
+ [0x0A9BC] = "Mn",
+ [0x0A9CF] = "Lm",
+ [0x0A9E5] = "Mn",
+ [0x0A9E6] = "Lm",
+ [0x0AA43] = "Mn",
+ [0x0AA4C] = "Mn",
+ [0x0AA4D] = "Mc",
+ [0x0AA70] = "Lm",
+ [0x0AA7A] = "Lo",
+ [0x0AA7B] = "Mc",
+ [0x0AA7C] = "Mn",
+ [0x0AA7D] = "Mc",
+ [0x0AAB0] = "Mn",
+ [0x0AAB1] = "Lo",
+ [0x0AAC0] = "Lo",
+ [0x0AAC1] = "Mn",
+ [0x0AAC2] = "Lo",
+ [0x0AADD] = "Lm",
+ [0x0AAEB] = "Mc",
+ [0x0AAF2] = "Lo",
+ [0x0AAF5] = "Mc",
+ [0x0AAF6] = "Mn",
+ [0x0AB5B] = "Sk",
+ [0x0ABE5] = "Mn",
+ [0x0ABE8] = "Mn",
+ [0x0ABEB] = "Po",
+ [0x0ABEC] = "Mc",
+ [0x0ABED] = "Mn",
+ [0x0FB1D] = "Lo",
+ [0x0FB1E] = "Mn",
+ [0x0FB29] = "Sm",
+ [0x0FB3E] = "Lo",
+ [0x0FD3E] = "Pe",
+ [0x0FD3F] = "Ps",
+ [0x0FDFC] = "Sc",
+ [0x0FDFD] = "So",
+ [0x0FE17] = "Ps",
+ [0x0FE18] = "Pe",
+ [0x0FE19] = "Po",
+ [0x0FE30] = "Po",
+ [0x0FE35] = "Ps",
+ [0x0FE36] = "Pe",
+ [0x0FE37] = "Ps",
+ [0x0FE38] = "Pe",
+ [0x0FE39] = "Ps",
+ [0x0FE3A] = "Pe",
+ [0x0FE3B] = "Ps",
+ [0x0FE3C] = "Pe",
+ [0x0FE3D] = "Ps",
+ [0x0FE3E] = "Pe",
+ [0x0FE3F] = "Ps",
+ [0x0FE40] = "Pe",
+ [0x0FE41] = "Ps",
+ [0x0FE42] = "Pe",
+ [0x0FE43] = "Ps",
+ [0x0FE44] = "Pe",
+ [0x0FE47] = "Ps",
+ [0x0FE48] = "Pe",
+ [0x0FE58] = "Pd",
+ [0x0FE59] = "Ps",
+ [0x0FE5A] = "Pe",
+ [0x0FE5B] = "Ps",
+ [0x0FE5C] = "Pe",
+ [0x0FE5D] = "Ps",
+ [0x0FE5E] = "Pe",
+ [0x0FE62] = "Sm",
+ [0x0FE63] = "Pd",
+ [0x0FE68] = "Po",
+ [0x0FE69] = "Sc",
+ [0x0FEFF] = "Cf",
+ [0x0FF04] = "Sc",
+ [0x0FF08] = "Ps",
+ [0x0FF09] = "Pe",
+ [0x0FF0A] = "Po",
+ [0x0FF0B] = "Sm",
+ [0x0FF0C] = "Po",
+ [0x0FF0D] = "Pd",
+ [0x0FF3B] = "Ps",
+ [0x0FF3C] = "Po",
+ [0x0FF3D] = "Pe",
+ [0x0FF3E] = "Sk",
+ [0x0FF3F] = "Pc",
+ [0x0FF40] = "Sk",
+ [0x0FF5B] = "Ps",
+ [0x0FF5C] = "Sm",
+ [0x0FF5D] = "Pe",
+ [0x0FF5E] = "Sm",
+ [0x0FF5F] = "Ps",
+ [0x0FF60] = "Pe",
+ [0x0FF61] = "Po",
+ [0x0FF62] = "Ps",
+ [0x0FF63] = "Pe",
+ [0x0FF70] = "Lm",
+ [0x0FFE2] = "Sm",
+ [0x0FFE3] = "Sk",
+ [0x0FFE4] = "So",
+ [0x0FFE8] = "So",
+ [0x101A0] = "So",
+ [0x101FD] = "Mn",
+ [0x102E0] = "Mn",
+ [0x10341] = "Nl",
+ [0x1034A] = "Nl",
+ [0x1039F] = "Po",
+ [0x103D0] = "Po",
+ [0x1056F] = "Po",
+ [0x10808] = "Lo",
+ [0x1083C] = "Lo",
+ [0x10857] = "Po",
+ [0x1091F] = "Po",
+ [0x1093F] = "Po",
+ [0x10A00] = "Lo",
+ [0x10A3F] = "Mn",
+ [0x10A7F] = "Po",
+ [0x10AC8] = "So",
+ [0x10F27] = "Lo",
+ [0x11000] = "Mc",
+ [0x11001] = "Mn",
+ [0x11002] = "Mc",
+ [0x11082] = "Mc",
+ [0x110BD] = "Cf",
+ [0x110CD] = "Cf",
+ [0x1112C] = "Mc",
+ [0x11144] = "Lo",
+ [0x11173] = "Mn",
+ [0x11176] = "Lo",
+ [0x11182] = "Mc",
+ [0x111CD] = "Po",
+ [0x111DA] = "Lo",
+ [0x111DB] = "Po",
+ [0x111DC] = "Lo",
+ [0x11234] = "Mn",
+ [0x11235] = "Mc",
+ [0x1123E] = "Mn",
+ [0x11288] = "Lo",
+ [0x112A9] = "Po",
+ [0x112DF] = "Mn",
+ [0x1133D] = "Lo",
+ [0x11340] = "Mn",
+ [0x11350] = "Lo",
+ [0x11357] = "Mc",
+ [0x11445] = "Mc",
+ [0x11446] = "Mn",
+ [0x1145B] = "Po",
+ [0x1145D] = "Po",
+ [0x1145E] = "Mn",
+ [0x114B9] = "Mc",
+ [0x114BA] = "Mn",
+ [0x114C1] = "Mc",
+ [0x114C6] = "Po",
+ [0x114C7] = "Lo",
+ [0x115BE] = "Mc",
+ [0x1163D] = "Mn",
+ [0x1163E] = "Mc",
+ [0x11644] = "Lo",
+ [0x116AB] = "Mn",
+ [0x116AC] = "Mc",
+ [0x116AD] = "Mn",
+ [0x116B6] = "Mc",
+ [0x116B7] = "Mn",
+ [0x11726] = "Mc",
+ [0x1173F] = "So",
+ [0x11838] = "Mc",
+ [0x1183B] = "Po",
+ [0x118FF] = "Lo",
+ [0x11A00] = "Lo",
+ [0x11A39] = "Mc",
+ [0x11A3A] = "Lo",
+ [0x11A47] = "Mn",
+ [0x11A50] = "Lo",
+ [0x11A97] = "Mc",
+ [0x11A9D] = "Lo",
+ [0x11C2F] = "Mc",
+ [0x11C3E] = "Mc",
+ [0x11C3F] = "Mn",
+ [0x11C40] = "Lo",
+ [0x11CA9] = "Mc",
+ [0x11CB1] = "Mc",
+ [0x11CB4] = "Mc",
+ [0x11D3A] = "Mn",
+ [0x11D46] = "Lo",
+ [0x11D47] = "Mn",
+ [0x11D95] = "Mn",
+ [0x11D96] = "Mc",
+ [0x11D97] = "Mn",
+ [0x11D98] = "Lo",
+ [0x16AF5] = "Po",
+ [0x16B44] = "Po",
+ [0x16B45] = "So",
+ [0x16F50] = "Lo",
+ [0x1BC9C] = "So",
+ [0x1BC9F] = "Po",
+ [0x1D245] = "So",
+ [0x1D49C] = "Lu",
+ [0x1D4A2] = "Lu",
+ [0x1D4BB] = "Ll",
+ [0x1D546] = "Lu",
+ [0x1D6C1] = "Sm",
+ [0x1D6DB] = "Sm",
+ [0x1D6FB] = "Sm",
+ [0x1D715] = "Sm",
+ [0x1D735] = "Sm",
+ [0x1D74F] = "Sm",
+ [0x1D76F] = "Sm",
+ [0x1D789] = "Sm",
+ [0x1D7A9] = "Sm",
+ [0x1D7C3] = "Sm",
+ [0x1D7CA] = "Lu",
+ [0x1D7CB] = "Ll",
+ [0x1DA75] = "Mn",
+ [0x1DA84] = "Mn",
+ [0x1ECAC] = "So",
+ [0x1ECB0] = "Sc",
+ [0x1EE24] = "Lo",
+ [0x1EE27] = "Lo",
+ [0x1EE39] = "Lo",
+ [0x1EE3B] = "Lo",
+ [0x1EE42] = "Lo",
+ [0x1EE47] = "Lo",
+ [0x1EE49] = "Lo",
+ [0x1EE4B] = "Lo",
+ [0x1EE54] = "Lo",
+ [0x1EE57] = "Lo",
+ [0x1EE59] = "Lo",
+ [0x1EE5B] = "Lo",
+ [0x1EE5D] = "Lo",
+ [0x1EE5F] = "Lo",
+ [0x1EE64] = "Lo",
+ [0x1EE7E] = "Lo",
+ [0x1F97A] = "So",
+ [0xE0001] = "Cf",
+ },
+ ranges = {
+ { 0x000000, 0x00001F, "Cc" },
+ { 0x000021, 0x000023, "Po" },
+ { 0x000025, 0x000027, "Po" },
+ { 0x00002E, 0x00002F, "Po" },
+ { 0x000030, 0x000039, "Nd" },
+ { 0x00003A, 0x00003B, "Po" },
+ { 0x00003C, 0x00003E, "Sm" },
+ { 0x00003F, 0x000040, "Po" },
+ { 0x000041, 0x00005A, "Lu" },
+ { 0x000061, 0x00007A, "Ll" },
+ { 0x00007F, 0x00009F, "Cc" },
+ { 0x0000A2, 0x0000A5, "Sc" },
+ { 0x0000B2, 0x0000B3, "No" },
+ { 0x0000B6, 0x0000B7, "Po" },
+ { 0x0000BC, 0x0000BE, "No" },
+ { 0x0000C0, 0x0000D6, "Lu" },
+ { 0x0000D8, 0x0000DE, "Lu" },
+ { 0x0000DF, 0x0000F6, "Ll" },
+ { 0x0000F8, 0x0000FF, "Ll" },
+ { 0x000137, 0x000138, "Ll" },
+ { 0x000148, 0x000149, "Ll" },
+ { 0x000178, 0x000179, "Lu" },
+ { 0x00017E, 0x000180, "Ll" },
+ { 0x000181, 0x000182, "Lu" },
+ { 0x000186, 0x000187, "Lu" },
+ { 0x000189, 0x00018B, "Lu" },
+ { 0x00018C, 0x00018D, "Ll" },
+ { 0x00018E, 0x000191, "Lu" },
+ { 0x000193, 0x000194, "Lu" },
+ { 0x000196, 0x000198, "Lu" },
+ { 0x000199, 0x00019B, "Ll" },
+ { 0x00019C, 0x00019D, "Lu" },
+ { 0x00019F, 0x0001A0, "Lu" },
+ { 0x0001A6, 0x0001A7, "Lu" },
+ { 0x0001AA, 0x0001AB, "Ll" },
+ { 0x0001AE, 0x0001AF, "Lu" },
+ { 0x0001B1, 0x0001B3, "Lu" },
+ { 0x0001B7, 0x0001B8, "Lu" },
+ { 0x0001B9, 0x0001BA, "Ll" },
+ { 0x0001BD, 0x0001BF, "Ll" },
+ { 0x0001C0, 0x0001C3, "Lo" },
+ { 0x0001DC, 0x0001DD, "Ll" },
+ { 0x0001EF, 0x0001F0, "Ll" },
+ { 0x0001F6, 0x0001F8, "Lu" },
+ { 0x000233, 0x000239, "Ll" },
+ { 0x00023A, 0x00023B, "Lu" },
+ { 0x00023D, 0x00023E, "Lu" },
+ { 0x00023F, 0x000240, "Ll" },
+ { 0x000243, 0x000246, "Lu" },
+ { 0x00024F, 0x000293, "Ll" },
+ { 0x000295, 0x0002AF, "Ll" },
+ { 0x0002B0, 0x0002C1, "Lm" },
+ { 0x0002C2, 0x0002C5, "Sk" },
+ { 0x0002C6, 0x0002D1, "Lm" },
+ { 0x0002D2, 0x0002DF, "Sk" },
+ { 0x0002E0, 0x0002E4, "Lm" },
+ { 0x0002E5, 0x0002EB, "Sk" },
+ { 0x0002EF, 0x0002FF, "Sk" },
+ { 0x000300, 0x00036F, "Mn" },
+ { 0x00037B, 0x00037D, "Ll" },
+ { 0x000384, 0x000385, "Sk" },
+ { 0x000388, 0x00038A, "Lu" },
+ { 0x00038E, 0x00038F, "Lu" },
+ { 0x000391, 0x0003A1, "Lu" },
+ { 0x0003A3, 0x0003AB, "Lu" },
+ { 0x0003AC, 0x0003CE, "Ll" },
+ { 0x0003D0, 0x0003D1, "Ll" },
+ { 0x0003D2, 0x0003D4, "Lu" },
+ { 0x0003D5, 0x0003D7, "Ll" },
+ { 0x0003EF, 0x0003F3, "Ll" },
+ { 0x0003F9, 0x0003FA, "Lu" },
+ { 0x0003FB, 0x0003FC, "Ll" },
+ { 0x0003FD, 0x00042F, "Lu" },
+ { 0x000430, 0x00045F, "Ll" },
+ { 0x000483, 0x000487, "Mn" },
+ { 0x000488, 0x000489, "Me" },
+ { 0x0004C0, 0x0004C1, "Lu" },
+ { 0x0004CE, 0x0004CF, "Ll" },
+ { 0x000531, 0x000556, "Lu" },
+ { 0x00055A, 0x00055F, "Po" },
+ { 0x000560, 0x000588, "Ll" },
+ { 0x00058D, 0x00058E, "So" },
+ { 0x000591, 0x0005BD, "Mn" },
+ { 0x0005C1, 0x0005C2, "Mn" },
+ { 0x0005C4, 0x0005C5, "Mn" },
+ { 0x0005D0, 0x0005EA, "Lo" },
+ { 0x0005EF, 0x0005F2, "Lo" },
+ { 0x0005F3, 0x0005F4, "Po" },
+ { 0x000600, 0x000605, "Cf" },
+ { 0x000606, 0x000608, "Sm" },
+ { 0x000609, 0x00060A, "Po" },
+ { 0x00060C, 0x00060D, "Po" },
+ { 0x00060E, 0x00060F, "So" },
+ { 0x000610, 0x00061A, "Mn" },
+ { 0x00061E, 0x00061F, "Po" },
+ { 0x000620, 0x00063F, "Lo" },
+ { 0x000641, 0x00064A, "Lo" },
+ { 0x00064B, 0x00065F, "Mn" },
+ { 0x000660, 0x000669, "Nd" },
+ { 0x00066A, 0x00066D, "Po" },
+ { 0x00066E, 0x00066F, "Lo" },
+ { 0x000671, 0x0006D3, "Lo" },
+ { 0x0006D6, 0x0006DC, "Mn" },
+ { 0x0006DF, 0x0006E4, "Mn" },
+ { 0x0006E5, 0x0006E6, "Lm" },
+ { 0x0006E7, 0x0006E8, "Mn" },
+ { 0x0006EA, 0x0006ED, "Mn" },
+ { 0x0006EE, 0x0006EF, "Lo" },
+ { 0x0006F0, 0x0006F9, "Nd" },
+ { 0x0006FA, 0x0006FC, "Lo" },
+ { 0x0006FD, 0x0006FE, "So" },
+ { 0x000700, 0x00070D, "Po" },
+ { 0x000712, 0x00072F, "Lo" },
+ { 0x000730, 0x00074A, "Mn" },
+ { 0x00074D, 0x0007A5, "Lo" },
+ { 0x0007A6, 0x0007B0, "Mn" },
+ { 0x0007C0, 0x0007C9, "Nd" },
+ { 0x0007CA, 0x0007EA, "Lo" },
+ { 0x0007EB, 0x0007F3, "Mn" },
+ { 0x0007F4, 0x0007F5, "Lm" },
+ { 0x0007F7, 0x0007F9, "Po" },
+ { 0x0007FE, 0x0007FF, "Sc" },
+ { 0x000800, 0x000815, "Lo" },
+ { 0x000816, 0x000819, "Mn" },
+ { 0x00081B, 0x000823, "Mn" },
+ { 0x000825, 0x000827, "Mn" },
+ { 0x000829, 0x00082D, "Mn" },
+ { 0x000830, 0x00083E, "Po" },
+ { 0x000840, 0x000858, "Lo" },
+ { 0x000859, 0x00085B, "Mn" },
+ { 0x000860, 0x00086A, "Lo" },
+ { 0x0008A0, 0x0008B4, "Lo" },
+ { 0x0008B6, 0x0008BD, "Lo" },
+ { 0x0008D3, 0x0008E1, "Mn" },
+ { 0x0008E3, 0x000902, "Mn" },
+ { 0x000904, 0x000939, "Lo" },
+ { 0x00093E, 0x000940, "Mc" },
+ { 0x000941, 0x000948, "Mn" },
+ { 0x000949, 0x00094C, "Mc" },
+ { 0x00094E, 0x00094F, "Mc" },
+ { 0x000951, 0x000957, "Mn" },
+ { 0x000958, 0x000961, "Lo" },
+ { 0x000962, 0x000963, "Mn" },
+ { 0x000964, 0x000965, "Po" },
+ { 0x000966, 0x00096F, "Nd" },
+ { 0x000972, 0x000980, "Lo" },
+ { 0x000982, 0x000983, "Mc" },
+ { 0x000985, 0x00098C, "Lo" },
+ { 0x00098F, 0x000990, "Lo" },
+ { 0x000993, 0x0009A8, "Lo" },
+ { 0x0009AA, 0x0009B0, "Lo" },
+ { 0x0009B6, 0x0009B9, "Lo" },
+ { 0x0009BE, 0x0009C0, "Mc" },
+ { 0x0009C1, 0x0009C4, "Mn" },
+ { 0x0009C7, 0x0009C8, "Mc" },
+ { 0x0009CB, 0x0009CC, "Mc" },
+ { 0x0009DC, 0x0009DD, "Lo" },
+ { 0x0009DF, 0x0009E1, "Lo" },
+ { 0x0009E2, 0x0009E3, "Mn" },
+ { 0x0009E6, 0x0009EF, "Nd" },
+ { 0x0009F0, 0x0009F1, "Lo" },
+ { 0x0009F2, 0x0009F3, "Sc" },
+ { 0x0009F4, 0x0009F9, "No" },
+ { 0x000A01, 0x000A02, "Mn" },
+ { 0x000A05, 0x000A0A, "Lo" },
+ { 0x000A0F, 0x000A10, "Lo" },
+ { 0x000A13, 0x000A28, "Lo" },
+ { 0x000A2A, 0x000A30, "Lo" },
+ { 0x000A32, 0x000A33, "Lo" },
+ { 0x000A35, 0x000A36, "Lo" },
+ { 0x000A38, 0x000A39, "Lo" },
+ { 0x000A3E, 0x000A40, "Mc" },
+ { 0x000A41, 0x000A42, "Mn" },
+ { 0x000A47, 0x000A48, "Mn" },
+ { 0x000A4B, 0x000A4D, "Mn" },
+ { 0x000A59, 0x000A5C, "Lo" },
+ { 0x000A66, 0x000A6F, "Nd" },
+ { 0x000A70, 0x000A71, "Mn" },
+ { 0x000A72, 0x000A74, "Lo" },
+ { 0x000A81, 0x000A82, "Mn" },
+ { 0x000A85, 0x000A8D, "Lo" },
+ { 0x000A8F, 0x000A91, "Lo" },
+ { 0x000A93, 0x000AA8, "Lo" },
+ { 0x000AAA, 0x000AB0, "Lo" },
+ { 0x000AB2, 0x000AB3, "Lo" },
+ { 0x000AB5, 0x000AB9, "Lo" },
+ { 0x000ABE, 0x000AC0, "Mc" },
+ { 0x000AC1, 0x000AC5, "Mn" },
+ { 0x000AC7, 0x000AC8, "Mn" },
+ { 0x000ACB, 0x000ACC, "Mc" },
+ { 0x000AE0, 0x000AE1, "Lo" },
+ { 0x000AE2, 0x000AE3, "Mn" },
+ { 0x000AE6, 0x000AEF, "Nd" },
+ { 0x000AFA, 0x000AFF, "Mn" },
+ { 0x000B02, 0x000B03, "Mc" },
+ { 0x000B05, 0x000B0C, "Lo" },
+ { 0x000B0F, 0x000B10, "Lo" },
+ { 0x000B13, 0x000B28, "Lo" },
+ { 0x000B2A, 0x000B30, "Lo" },
+ { 0x000B32, 0x000B33, "Lo" },
+ { 0x000B35, 0x000B39, "Lo" },
+ { 0x000B41, 0x000B44, "Mn" },
+ { 0x000B47, 0x000B48, "Mc" },
+ { 0x000B4B, 0x000B4C, "Mc" },
+ { 0x000B5C, 0x000B5D, "Lo" },
+ { 0x000B5F, 0x000B61, "Lo" },
+ { 0x000B62, 0x000B63, "Mn" },
+ { 0x000B66, 0x000B6F, "Nd" },
+ { 0x000B72, 0x000B77, "No" },
+ { 0x000B85, 0x000B8A, "Lo" },
+ { 0x000B8E, 0x000B90, "Lo" },
+ { 0x000B92, 0x000B95, "Lo" },
+ { 0x000B99, 0x000B9A, "Lo" },
+ { 0x000B9E, 0x000B9F, "Lo" },
+ { 0x000BA3, 0x000BA4, "Lo" },
+ { 0x000BA8, 0x000BAA, "Lo" },
+ { 0x000BAE, 0x000BB9, "Lo" },
+ { 0x000BBE, 0x000BBF, "Mc" },
+ { 0x000BC1, 0x000BC2, "Mc" },
+ { 0x000BC6, 0x000BC8, "Mc" },
+ { 0x000BCA, 0x000BCC, "Mc" },
+ { 0x000BE6, 0x000BEF, "Nd" },
+ { 0x000BF0, 0x000BF2, "No" },
+ { 0x000BF3, 0x000BF8, "So" },
+ { 0x000C01, 0x000C03, "Mc" },
+ { 0x000C05, 0x000C0C, "Lo" },
+ { 0x000C0E, 0x000C10, "Lo" },
+ { 0x000C12, 0x000C28, "Lo" },
+ { 0x000C2A, 0x000C39, "Lo" },
+ { 0x000C3E, 0x000C40, "Mn" },
+ { 0x000C41, 0x000C44, "Mc" },
+ { 0x000C46, 0x000C48, "Mn" },
+ { 0x000C4A, 0x000C4D, "Mn" },
+ { 0x000C55, 0x000C56, "Mn" },
+ { 0x000C58, 0x000C5A, "Lo" },
+ { 0x000C60, 0x000C61, "Lo" },
+ { 0x000C62, 0x000C63, "Mn" },
+ { 0x000C66, 0x000C6F, "Nd" },
+ { 0x000C78, 0x000C7E, "No" },
+ { 0x000C82, 0x000C83, "Mc" },
+ { 0x000C85, 0x000C8C, "Lo" },
+ { 0x000C8E, 0x000C90, "Lo" },
+ { 0x000C92, 0x000CA8, "Lo" },
+ { 0x000CAA, 0x000CB3, "Lo" },
+ { 0x000CB5, 0x000CB9, "Lo" },
+ { 0x000CC0, 0x000CC4, "Mc" },
+ { 0x000CC7, 0x000CC8, "Mc" },
+ { 0x000CCA, 0x000CCB, "Mc" },
+ { 0x000CCC, 0x000CCD, "Mn" },
+ { 0x000CD5, 0x000CD6, "Mc" },
+ { 0x000CE0, 0x000CE1, "Lo" },
+ { 0x000CE2, 0x000CE3, "Mn" },
+ { 0x000CE6, 0x000CEF, "Nd" },
+ { 0x000CF1, 0x000CF2, "Lo" },
+ { 0x000D00, 0x000D01, "Mn" },
+ { 0x000D02, 0x000D03, "Mc" },
+ { 0x000D05, 0x000D0C, "Lo" },
+ { 0x000D0E, 0x000D10, "Lo" },
+ { 0x000D12, 0x000D3A, "Lo" },
+ { 0x000D3B, 0x000D3C, "Mn" },
+ { 0x000D3E, 0x000D40, "Mc" },
+ { 0x000D41, 0x000D44, "Mn" },
+ { 0x000D46, 0x000D48, "Mc" },
+ { 0x000D4A, 0x000D4C, "Mc" },
+ { 0x000D54, 0x000D56, "Lo" },
+ { 0x000D58, 0x000D5E, "No" },
+ { 0x000D5F, 0x000D61, "Lo" },
+ { 0x000D62, 0x000D63, "Mn" },
+ { 0x000D66, 0x000D6F, "Nd" },
+ { 0x000D70, 0x000D78, "No" },
+ { 0x000D7A, 0x000D7F, "Lo" },
+ { 0x000D82, 0x000D83, "Mc" },
+ { 0x000D85, 0x000D96, "Lo" },
+ { 0x000D9A, 0x000DB1, "Lo" },
+ { 0x000DB3, 0x000DBB, "Lo" },
+ { 0x000DC0, 0x000DC6, "Lo" },
+ { 0x000DCF, 0x000DD1, "Mc" },
+ { 0x000DD2, 0x000DD4, "Mn" },
+ { 0x000DD8, 0x000DDF, "Mc" },
+ { 0x000DE6, 0x000DEF, "Nd" },
+ { 0x000DF2, 0x000DF3, "Mc" },
+ { 0x000E01, 0x000E30, "Lo" },
+ { 0x000E32, 0x000E33, "Lo" },
+ { 0x000E34, 0x000E3A, "Mn" },
+ { 0x000E40, 0x000E45, "Lo" },
+ { 0x000E47, 0x000E4E, "Mn" },
+ { 0x000E50, 0x000E59, "Nd" },
+ { 0x000E5A, 0x000E5B, "Po" },
+ { 0x000E81, 0x000E82, "Lo" },
+ { 0x000E87, 0x000E88, "Lo" },
+ { 0x000E94, 0x000E97, "Lo" },
+ { 0x000E99, 0x000E9F, "Lo" },
+ { 0x000EA1, 0x000EA3, "Lo" },
+ { 0x000EAA, 0x000EAB, "Lo" },
+ { 0x000EAD, 0x000EB0, "Lo" },
+ { 0x000EB2, 0x000EB3, "Lo" },
+ { 0x000EB4, 0x000EB9, "Mn" },
+ { 0x000EBB, 0x000EBC, "Mn" },
+ { 0x000EC0, 0x000EC4, "Lo" },
+ { 0x000EC8, 0x000ECD, "Mn" },
+ { 0x000ED0, 0x000ED9, "Nd" },
+ { 0x000EDC, 0x000EDF, "Lo" },
+ { 0x000F01, 0x000F03, "So" },
+ { 0x000F04, 0x000F12, "Po" },
+ { 0x000F15, 0x000F17, "So" },
+ { 0x000F18, 0x000F19, "Mn" },
+ { 0x000F1A, 0x000F1F, "So" },
+ { 0x000F20, 0x000F29, "Nd" },
+ { 0x000F2A, 0x000F33, "No" },
+ { 0x000F3E, 0x000F3F, "Mc" },
+ { 0x000F40, 0x000F47, "Lo" },
+ { 0x000F49, 0x000F6C, "Lo" },
+ { 0x000F71, 0x000F7E, "Mn" },
+ { 0x000F80, 0x000F84, "Mn" },
+ { 0x000F86, 0x000F87, "Mn" },
+ { 0x000F88, 0x000F8C, "Lo" },
+ { 0x000F8D, 0x000F97, "Mn" },
+ { 0x000F99, 0x000FBC, "Mn" },
+ { 0x000FBE, 0x000FC5, "So" },
+ { 0x000FC7, 0x000FCC, "So" },
+ { 0x000FCE, 0x000FCF, "So" },
+ { 0x000FD0, 0x000FD4, "Po" },
+ { 0x000FD5, 0x000FD8, "So" },
+ { 0x000FD9, 0x000FDA, "Po" },
+ { 0x001000, 0x00102A, "Lo" },
+ { 0x00102B, 0x00102C, "Mc" },
+ { 0x00102D, 0x001030, "Mn" },
+ { 0x001032, 0x001037, "Mn" },
+ { 0x001039, 0x00103A, "Mn" },
+ { 0x00103B, 0x00103C, "Mc" },
+ { 0x00103D, 0x00103E, "Mn" },
+ { 0x001040, 0x001049, "Nd" },
+ { 0x00104A, 0x00104F, "Po" },
+ { 0x001050, 0x001055, "Lo" },
+ { 0x001056, 0x001057, "Mc" },
+ { 0x001058, 0x001059, "Mn" },
+ { 0x00105A, 0x00105D, "Lo" },
+ { 0x00105E, 0x001060, "Mn" },
+ { 0x001062, 0x001064, "Mc" },
+ { 0x001065, 0x001066, "Lo" },
+ { 0x001067, 0x00106D, "Mc" },
+ { 0x00106E, 0x001070, "Lo" },
+ { 0x001071, 0x001074, "Mn" },
+ { 0x001075, 0x001081, "Lo" },
+ { 0x001083, 0x001084, "Mc" },
+ { 0x001085, 0x001086, "Mn" },
+ { 0x001087, 0x00108C, "Mc" },
+ { 0x001090, 0x001099, "Nd" },
+ { 0x00109A, 0x00109C, "Mc" },
+ { 0x00109E, 0x00109F, "So" },
+ { 0x0010A0, 0x0010C5, "Lu" },
+ { 0x0010D0, 0x0010FA, "Ll" },
+ { 0x0010FD, 0x0010FF, "Ll" },
+ { 0x001100, 0x001248, "Lo" },
+ { 0x00124A, 0x00124D, "Lo" },
+ { 0x001250, 0x001256, "Lo" },
+ { 0x00125A, 0x00125D, "Lo" },
+ { 0x001260, 0x001288, "Lo" },
+ { 0x00128A, 0x00128D, "Lo" },
+ { 0x001290, 0x0012B0, "Lo" },
+ { 0x0012B2, 0x0012B5, "Lo" },
+ { 0x0012B8, 0x0012BE, "Lo" },
+ { 0x0012C2, 0x0012C5, "Lo" },
+ { 0x0012C8, 0x0012D6, "Lo" },
+ { 0x0012D8, 0x001310, "Lo" },
+ { 0x001312, 0x001315, "Lo" },
+ { 0x001318, 0x00135A, "Lo" },
+ { 0x00135D, 0x00135F, "Mn" },
+ { 0x001360, 0x001368, "Po" },
+ { 0x001369, 0x00137C, "No" },
+ { 0x001380, 0x00138F, "Lo" },
+ { 0x001390, 0x001399, "So" },
+ { 0x0013A0, 0x0013F5, "Lu" },
+ { 0x0013F8, 0x0013FD, "Ll" },
+ { 0x001401, 0x00166C, "Lo" },
+ { 0x00166D, 0x00166E, "Po" },
+ { 0x00166F, 0x00167F, "Lo" },
+ { 0x001681, 0x00169A, "Lo" },
+ { 0x0016A0, 0x0016EA, "Lo" },
+ { 0x0016EB, 0x0016ED, "Po" },
+ { 0x0016EE, 0x0016F0, "Nl" },
+ { 0x0016F1, 0x0016F8, "Lo" },
+ { 0x001700, 0x00170C, "Lo" },
+ { 0x00170E, 0x001711, "Lo" },
+ { 0x001712, 0x001714, "Mn" },
+ { 0x001720, 0x001731, "Lo" },
+ { 0x001732, 0x001734, "Mn" },
+ { 0x001735, 0x001736, "Po" },
+ { 0x001740, 0x001751, "Lo" },
+ { 0x001752, 0x001753, "Mn" },
+ { 0x001760, 0x00176C, "Lo" },
+ { 0x00176E, 0x001770, "Lo" },
+ { 0x001772, 0x001773, "Mn" },
+ { 0x001780, 0x0017B3, "Lo" },
+ { 0x0017B4, 0x0017B5, "Mn" },
+ { 0x0017B7, 0x0017BD, "Mn" },
+ { 0x0017BE, 0x0017C5, "Mc" },
+ { 0x0017C7, 0x0017C8, "Mc" },
+ { 0x0017C9, 0x0017D3, "Mn" },
+ { 0x0017D4, 0x0017D6, "Po" },
+ { 0x0017D8, 0x0017DA, "Po" },
+ { 0x0017E0, 0x0017E9, "Nd" },
+ { 0x0017F0, 0x0017F9, "No" },
+ { 0x001800, 0x001805, "Po" },
+ { 0x001807, 0x00180A, "Po" },
+ { 0x00180B, 0x00180D, "Mn" },
+ { 0x001810, 0x001819, "Nd" },
+ { 0x001820, 0x001842, "Lo" },
+ { 0x001844, 0x001878, "Lo" },
+ { 0x001880, 0x001884, "Lo" },
+ { 0x001885, 0x001886, "Mn" },
+ { 0x001887, 0x0018A8, "Lo" },
+ { 0x0018B0, 0x0018F5, "Lo" },
+ { 0x001900, 0x00191E, "Lo" },
+ { 0x001920, 0x001922, "Mn" },
+ { 0x001923, 0x001926, "Mc" },
+ { 0x001927, 0x001928, "Mn" },
+ { 0x001929, 0x00192B, "Mc" },
+ { 0x001930, 0x001931, "Mc" },
+ { 0x001933, 0x001938, "Mc" },
+ { 0x001939, 0x00193B, "Mn" },
+ { 0x001944, 0x001945, "Po" },
+ { 0x001946, 0x00194F, "Nd" },
+ { 0x001950, 0x00196D, "Lo" },
+ { 0x001970, 0x001974, "Lo" },
+ { 0x001980, 0x0019AB, "Lo" },
+ { 0x0019B0, 0x0019C9, "Lo" },
+ { 0x0019D0, 0x0019D9, "Nd" },
+ { 0x0019DE, 0x0019FF, "So" },
+ { 0x001A00, 0x001A16, "Lo" },
+ { 0x001A17, 0x001A18, "Mn" },
+ { 0x001A19, 0x001A1A, "Mc" },
+ { 0x001A1E, 0x001A1F, "Po" },
+ { 0x001A20, 0x001A54, "Lo" },
+ { 0x001A58, 0x001A5E, "Mn" },
+ { 0x001A63, 0x001A64, "Mc" },
+ { 0x001A65, 0x001A6C, "Mn" },
+ { 0x001A6D, 0x001A72, "Mc" },
+ { 0x001A73, 0x001A7C, "Mn" },
+ { 0x001A80, 0x001A89, "Nd" },
+ { 0x001A90, 0x001A99, "Nd" },
+ { 0x001AA0, 0x001AA6, "Po" },
+ { 0x001AA8, 0x001AAD, "Po" },
+ { 0x001AB0, 0x001ABD, "Mn" },
+ { 0x001B00, 0x001B03, "Mn" },
+ { 0x001B05, 0x001B33, "Lo" },
+ { 0x001B36, 0x001B3A, "Mn" },
+ { 0x001B3D, 0x001B41, "Mc" },
+ { 0x001B43, 0x001B44, "Mc" },
+ { 0x001B45, 0x001B4B, "Lo" },
+ { 0x001B50, 0x001B59, "Nd" },
+ { 0x001B5A, 0x001B60, "Po" },
+ { 0x001B61, 0x001B6A, "So" },
+ { 0x001B6B, 0x001B73, "Mn" },
+ { 0x001B74, 0x001B7C, "So" },
+ { 0x001B80, 0x001B81, "Mn" },
+ { 0x001B83, 0x001BA0, "Lo" },
+ { 0x001BA2, 0x001BA5, "Mn" },
+ { 0x001BA6, 0x001BA7, "Mc" },
+ { 0x001BA8, 0x001BA9, "Mn" },
+ { 0x001BAB, 0x001BAD, "Mn" },
+ { 0x001BAE, 0x001BAF, "Lo" },
+ { 0x001BB0, 0x001BB9, "Nd" },
+ { 0x001BBA, 0x001BE5, "Lo" },
+ { 0x001BE8, 0x001BE9, "Mn" },
+ { 0x001BEA, 0x001BEC, "Mc" },
+ { 0x001BEF, 0x001BF1, "Mn" },
+ { 0x001BF2, 0x001BF3, "Mc" },
+ { 0x001BFC, 0x001BFF, "Po" },
+ { 0x001C00, 0x001C23, "Lo" },
+ { 0x001C24, 0x001C2B, "Mc" },
+ { 0x001C2C, 0x001C33, "Mn" },
+ { 0x001C34, 0x001C35, "Mc" },
+ { 0x001C36, 0x001C37, "Mn" },
+ { 0x001C3B, 0x001C3F, "Po" },
+ { 0x001C40, 0x001C49, "Nd" },
+ { 0x001C4D, 0x001C4F, "Lo" },
+ { 0x001C50, 0x001C59, "Nd" },
+ { 0x001C5A, 0x001C77, "Lo" },
+ { 0x001C78, 0x001C7D, "Lm" },
+ { 0x001C7E, 0x001C7F, "Po" },
+ { 0x001C80, 0x001C88, "Ll" },
+ { 0x001C90, 0x001CBA, "Lu" },
+ { 0x001CBD, 0x001CBF, "Lu" },
+ { 0x001CC0, 0x001CC7, "Po" },
+ { 0x001CD0, 0x001CD2, "Mn" },
+ { 0x001CD4, 0x001CE0, "Mn" },
+ { 0x001CE2, 0x001CE8, "Mn" },
+ { 0x001CE9, 0x001CEC, "Lo" },
+ { 0x001CEE, 0x001CF1, "Lo" },
+ { 0x001CF2, 0x001CF3, "Mc" },
+ { 0x001CF5, 0x001CF6, "Lo" },
+ { 0x001CF8, 0x001CF9, "Mn" },
+ { 0x001D00, 0x001D2B, "Ll" },
+ { 0x001D2C, 0x001D6A, "Lm" },
+ { 0x001D6B, 0x001D77, "Ll" },
+ { 0x001D79, 0x001D9A, "Ll" },
+ { 0x001D9B, 0x001DBF, "Lm" },
+ { 0x001DC0, 0x001DF9, "Mn" },
+ { 0x001DFB, 0x001DFF, "Mn" },
+ { 0x001E95, 0x001E9D, "Ll" },
+ { 0x001EFF, 0x001F07, "Ll" },
+ { 0x001F08, 0x001F0F, "Lu" },
+ { 0x001F10, 0x001F15, "Ll" },
+ { 0x001F18, 0x001F1D, "Lu" },
+ { 0x001F20, 0x001F27, "Ll" },
+ { 0x001F28, 0x001F2F, "Lu" },
+ { 0x001F30, 0x001F37, "Ll" },
+ { 0x001F38, 0x001F3F, "Lu" },
+ { 0x001F40, 0x001F45, "Ll" },
+ { 0x001F48, 0x001F4D, "Lu" },
+ { 0x001F50, 0x001F57, "Ll" },
+ { 0x001F60, 0x001F67, "Ll" },
+ { 0x001F68, 0x001F6F, "Lu" },
+ { 0x001F70, 0x001F7D, "Ll" },
+ { 0x001F80, 0x001F87, "Ll" },
+ { 0x001F88, 0x001F8F, "Lt" },
+ { 0x001F90, 0x001F97, "Ll" },
+ { 0x001F98, 0x001F9F, "Lt" },
+ { 0x001FA0, 0x001FA7, "Ll" },
+ { 0x001FA8, 0x001FAF, "Lt" },
+ { 0x001FB0, 0x001FB4, "Ll" },
+ { 0x001FB6, 0x001FB7, "Ll" },
+ { 0x001FB8, 0x001FBB, "Lu" },
+ { 0x001FBF, 0x001FC1, "Sk" },
+ { 0x001FC2, 0x001FC4, "Ll" },
+ { 0x001FC6, 0x001FC7, "Ll" },
+ { 0x001FC8, 0x001FCB, "Lu" },
+ { 0x001FCD, 0x001FCF, "Sk" },
+ { 0x001FD0, 0x001FD3, "Ll" },
+ { 0x001FD6, 0x001FD7, "Ll" },
+ { 0x001FD8, 0x001FDB, "Lu" },
+ { 0x001FDD, 0x001FDF, "Sk" },
+ { 0x001FE0, 0x001FE7, "Ll" },
+ { 0x001FE8, 0x001FEC, "Lu" },
+ { 0x001FED, 0x001FEF, "Sk" },
+ { 0x001FF2, 0x001FF4, "Ll" },
+ { 0x001FF6, 0x001FF7, "Ll" },
+ { 0x001FF8, 0x001FFB, "Lu" },
+ { 0x001FFD, 0x001FFE, "Sk" },
+ { 0x002000, 0x00200A, "Zs" },
+ { 0x00200B, 0x00200F, "Cf" },
+ { 0x002010, 0x002015, "Pd" },
+ { 0x002016, 0x002017, "Po" },
+ { 0x00201B, 0x00201C, "Pi" },
+ { 0x002020, 0x002027, "Po" },
+ { 0x00202A, 0x00202E, "Cf" },
+ { 0x002030, 0x002038, "Po" },
+ { 0x00203B, 0x00203E, "Po" },
+ { 0x00203F, 0x002040, "Pc" },
+ { 0x002041, 0x002043, "Po" },
+ { 0x002047, 0x002051, "Po" },
+ { 0x002055, 0x00205E, "Po" },
+ { 0x002060, 0x002064, "Cf" },
+ { 0x002066, 0x00206F, "Cf" },
+ { 0x002074, 0x002079, "No" },
+ { 0x00207A, 0x00207C, "Sm" },
+ { 0x002080, 0x002089, "No" },
+ { 0x00208A, 0x00208C, "Sm" },
+ { 0x002090, 0x00209C, "Lm" },
+ { 0x0020A0, 0x0020BF, "Sc" },
+ { 0x0020D0, 0x0020DC, "Mn" },
+ { 0x0020DD, 0x0020E0, "Me" },
+ { 0x0020E2, 0x0020E4, "Me" },
+ { 0x0020E5, 0x0020F0, "Mn" },
+ { 0x002100, 0x002101, "So" },
+ { 0x002103, 0x002106, "So" },
+ { 0x002108, 0x002109, "So" },
+ { 0x00210B, 0x00210D, "Lu" },
+ { 0x00210E, 0x00210F, "Ll" },
+ { 0x002110, 0x002112, "Lu" },
+ { 0x002116, 0x002117, "So" },
+ { 0x002119, 0x00211D, "Lu" },
+ { 0x00211E, 0x002123, "So" },
+ { 0x00212A, 0x00212D, "Lu" },
+ { 0x002130, 0x002133, "Lu" },
+ { 0x002135, 0x002138, "Lo" },
+ { 0x00213A, 0x00213B, "So" },
+ { 0x00213C, 0x00213D, "Ll" },
+ { 0x00213E, 0x00213F, "Lu" },
+ { 0x002140, 0x002144, "Sm" },
+ { 0x002146, 0x002149, "Ll" },
+ { 0x00214C, 0x00214D, "So" },
+ { 0x002150, 0x00215F, "No" },
+ { 0x002160, 0x002182, "Nl" },
+ { 0x002185, 0x002188, "Nl" },
+ { 0x00218A, 0x00218B, "So" },
+ { 0x002190, 0x002194, "Sm" },
+ { 0x002195, 0x002199, "So" },
+ { 0x00219A, 0x00219B, "Sm" },
+ { 0x00219C, 0x00219F, "So" },
+ { 0x0021A1, 0x0021A2, "So" },
+ { 0x0021A4, 0x0021A5, "So" },
+ { 0x0021A7, 0x0021AD, "So" },
+ { 0x0021AF, 0x0021CD, "So" },
+ { 0x0021CE, 0x0021CF, "Sm" },
+ { 0x0021D0, 0x0021D1, "So" },
+ { 0x0021D5, 0x0021F3, "So" },
+ { 0x0021F4, 0x0022FF, "Sm" },
+ { 0x002300, 0x002307, "So" },
+ { 0x00230C, 0x00231F, "So" },
+ { 0x002320, 0x002321, "Sm" },
+ { 0x002322, 0x002328, "So" },
+ { 0x00232B, 0x00237B, "So" },
+ { 0x00237D, 0x00239A, "So" },
+ { 0x00239B, 0x0023B3, "Sm" },
+ { 0x0023B4, 0x0023DB, "So" },
+ { 0x0023DC, 0x0023E1, "Sm" },
+ { 0x0023E2, 0x002426, "So" },
+ { 0x002440, 0x00244A, "So" },
+ { 0x002460, 0x00249B, "No" },
+ { 0x00249C, 0x0024E9, "So" },
+ { 0x0024EA, 0x0024FF, "No" },
+ { 0x002500, 0x0025B6, "So" },
+ { 0x0025B8, 0x0025C0, "So" },
+ { 0x0025C2, 0x0025F7, "So" },
+ { 0x0025F8, 0x0025FF, "Sm" },
+ { 0x002600, 0x00266E, "So" },
+ { 0x002670, 0x002767, "So" },
+ { 0x002776, 0x002793, "No" },
+ { 0x002794, 0x0027BF, "So" },
+ { 0x0027C0, 0x0027C4, "Sm" },
+ { 0x0027C7, 0x0027E5, "Sm" },
+ { 0x0027F0, 0x0027FF, "Sm" },
+ { 0x002800, 0x0028FF, "So" },
+ { 0x002900, 0x002982, "Sm" },
+ { 0x002999, 0x0029D7, "Sm" },
+ { 0x0029DC, 0x0029FB, "Sm" },
+ { 0x0029FE, 0x002AFF, "Sm" },
+ { 0x002B00, 0x002B2F, "So" },
+ { 0x002B30, 0x002B44, "Sm" },
+ { 0x002B45, 0x002B46, "So" },
+ { 0x002B47, 0x002B4C, "Sm" },
+ { 0x002B4D, 0x002B73, "So" },
+ { 0x002B76, 0x002B95, "So" },
+ { 0x002B98, 0x002BC8, "So" },
+ { 0x002BCA, 0x002BFE, "So" },
+ { 0x002C00, 0x002C2E, "Lu" },
+ { 0x002C30, 0x002C5E, "Ll" },
+ { 0x002C62, 0x002C64, "Lu" },
+ { 0x002C65, 0x002C66, "Ll" },
+ { 0x002C6D, 0x002C70, "Lu" },
+ { 0x002C73, 0x002C74, "Ll" },
+ { 0x002C76, 0x002C7B, "Ll" },
+ { 0x002C7C, 0x002C7D, "Lm" },
+ { 0x002C7E, 0x002C80, "Lu" },
+ { 0x002CE3, 0x002CE4, "Ll" },
+ { 0x002CE5, 0x002CEA, "So" },
+ { 0x002CEF, 0x002CF1, "Mn" },
+ { 0x002CF9, 0x002CFC, "Po" },
+ { 0x002CFE, 0x002CFF, "Po" },
+ { 0x002D00, 0x002D25, "Ll" },
+ { 0x002D30, 0x002D67, "Lo" },
+ { 0x002D80, 0x002D96, "Lo" },
+ { 0x002DA0, 0x002DA6, "Lo" },
+ { 0x002DA8, 0x002DAE, "Lo" },
+ { 0x002DB0, 0x002DB6, "Lo" },
+ { 0x002DB8, 0x002DBE, "Lo" },
+ { 0x002DC0, 0x002DC6, "Lo" },
+ { 0x002DC8, 0x002DCE, "Lo" },
+ { 0x002DD0, 0x002DD6, "Lo" },
+ { 0x002DD8, 0x002DDE, "Lo" },
+ { 0x002DE0, 0x002DFF, "Mn" },
+ { 0x002E00, 0x002E01, "Po" },
+ { 0x002E06, 0x002E08, "Po" },
+ { 0x002E0E, 0x002E16, "Po" },
+ { 0x002E18, 0x002E19, "Po" },
+ { 0x002E1E, 0x002E1F, "Po" },
+ { 0x002E2A, 0x002E2E, "Po" },
+ { 0x002E30, 0x002E39, "Po" },
+ { 0x002E3A, 0x002E3B, "Pd" },
+ { 0x002E3C, 0x002E3F, "Po" },
+ { 0x002E43, 0x002E4E, "Po" },
+ { 0x002E80, 0x002E99, "So" },
+ { 0x002E9B, 0x002EF3, "So" },
+ { 0x002F00, 0x002FD5, "So" },
+ { 0x002FF0, 0x002FFB, "So" },
+ { 0x003001, 0x003003, "Po" },
+ { 0x003012, 0x003013, "So" },
+ { 0x00301E, 0x00301F, "Pe" },
+ { 0x003021, 0x003029, "Nl" },
+ { 0x00302A, 0x00302D, "Mn" },
+ { 0x00302E, 0x00302F, "Mc" },
+ { 0x003031, 0x003035, "Lm" },
+ { 0x003036, 0x003037, "So" },
+ { 0x003038, 0x00303A, "Nl" },
+ { 0x00303E, 0x00303F, "So" },
+ { 0x003041, 0x003096, "Lo" },
+ { 0x003099, 0x00309A, "Mn" },
+ { 0x00309B, 0x00309C, "Sk" },
+ { 0x00309D, 0x00309E, "Lm" },
+ { 0x0030A1, 0x0030FA, "Lo" },
+ { 0x0030FC, 0x0030FE, "Lm" },
+ { 0x003105, 0x00312F, "Lo" },
+ { 0x003131, 0x00318E, "Lo" },
+ { 0x003190, 0x003191, "So" },
+ { 0x003192, 0x003195, "No" },
+ { 0x003196, 0x00319F, "So" },
+ { 0x0031A0, 0x0031BA, "Lo" },
+ { 0x0031C0, 0x0031E3, "So" },
+ { 0x0031F0, 0x0031FF, "Lo" },
+ { 0x003200, 0x00321E, "So" },
+ { 0x003220, 0x003229, "No" },
+ { 0x00322A, 0x003247, "So" },
+ { 0x003248, 0x00324F, "No" },
+ { 0x003251, 0x00325F, "No" },
+ { 0x003260, 0x00327F, "So" },
+ { 0x003280, 0x003289, "No" },
+ { 0x00328A, 0x0032B0, "So" },
+ { 0x0032B1, 0x0032BF, "No" },
+ { 0x0032C0, 0x0032FE, "So" },
+ { 0x003300, 0x0033FF, "So" },
+ { 0x003400, 0x004DB5, "Lo" },
+ { 0x004DC0, 0x004DFF, "So" },
+ { 0x004E00, 0x009FEF, "Lo" },
+ { 0x00A000, 0x00A014, "Lo" },
+ { 0x00A016, 0x00A48C, "Lo" },
+ { 0x00A490, 0x00A4C6, "So" },
+ { 0x00A4D0, 0x00A4F7, "Lo" },
+ { 0x00A4F8, 0x00A4FD, "Lm" },
+ { 0x00A4FE, 0x00A4FF, "Po" },
+ { 0x00A500, 0x00A60B, "Lo" },
+ { 0x00A60D, 0x00A60F, "Po" },
+ { 0x00A610, 0x00A61F, "Lo" },
+ { 0x00A620, 0x00A629, "Nd" },
+ { 0x00A62A, 0x00A62B, "Lo" },
+ { 0x00A670, 0x00A672, "Me" },
+ { 0x00A674, 0x00A67D, "Mn" },
+ { 0x00A69C, 0x00A69D, "Lm" },
+ { 0x00A69E, 0x00A69F, "Mn" },
+ { 0x00A6A0, 0x00A6E5, "Lo" },
+ { 0x00A6E6, 0x00A6EF, "Nl" },
+ { 0x00A6F0, 0x00A6F1, "Mn" },
+ { 0x00A6F2, 0x00A6F7, "Po" },
+ { 0x00A700, 0x00A716, "Sk" },
+ { 0x00A717, 0x00A71F, "Lm" },
+ { 0x00A720, 0x00A721, "Sk" },
+ { 0x00A72F, 0x00A731, "Ll" },
+ { 0x00A771, 0x00A778, "Ll" },
+ { 0x00A77D, 0x00A77E, "Lu" },
+ { 0x00A789, 0x00A78A, "Sk" },
+ { 0x00A793, 0x00A795, "Ll" },
+ { 0x00A7AA, 0x00A7AE, "Lu" },
+ { 0x00A7B0, 0x00A7B4, "Lu" },
+ { 0x00A7F8, 0x00A7F9, "Lm" },
+ { 0x00A7FB, 0x00A801, "Lo" },
+ { 0x00A803, 0x00A805, "Lo" },
+ { 0x00A807, 0x00A80A, "Lo" },
+ { 0x00A80C, 0x00A822, "Lo" },
+ { 0x00A823, 0x00A824, "Mc" },
+ { 0x00A825, 0x00A826, "Mn" },
+ { 0x00A828, 0x00A82B, "So" },
+ { 0x00A830, 0x00A835, "No" },
+ { 0x00A836, 0x00A837, "So" },
+ { 0x00A840, 0x00A873, "Lo" },
+ { 0x00A874, 0x00A877, "Po" },
+ { 0x00A880, 0x00A881, "Mc" },
+ { 0x00A882, 0x00A8B3, "Lo" },
+ { 0x00A8B4, 0x00A8C3, "Mc" },
+ { 0x00A8C4, 0x00A8C5, "Mn" },
+ { 0x00A8CE, 0x00A8CF, "Po" },
+ { 0x00A8D0, 0x00A8D9, "Nd" },
+ { 0x00A8E0, 0x00A8F1, "Mn" },
+ { 0x00A8F2, 0x00A8F7, "Lo" },
+ { 0x00A8F8, 0x00A8FA, "Po" },
+ { 0x00A8FD, 0x00A8FE, "Lo" },
+ { 0x00A900, 0x00A909, "Nd" },
+ { 0x00A90A, 0x00A925, "Lo" },
+ { 0x00A926, 0x00A92D, "Mn" },
+ { 0x00A92E, 0x00A92F, "Po" },
+ { 0x00A930, 0x00A946, "Lo" },
+ { 0x00A947, 0x00A951, "Mn" },
+ { 0x00A952, 0x00A953, "Mc" },
+ { 0x00A960, 0x00A97C, "Lo" },
+ { 0x00A980, 0x00A982, "Mn" },
+ { 0x00A984, 0x00A9B2, "Lo" },
+ { 0x00A9B4, 0x00A9B5, "Mc" },
+ { 0x00A9B6, 0x00A9B9, "Mn" },
+ { 0x00A9BA, 0x00A9BB, "Mc" },
+ { 0x00A9BD, 0x00A9C0, "Mc" },
+ { 0x00A9C1, 0x00A9CD, "Po" },
+ { 0x00A9D0, 0x00A9D9, "Nd" },
+ { 0x00A9DE, 0x00A9DF, "Po" },
+ { 0x00A9E0, 0x00A9E4, "Lo" },
+ { 0x00A9E7, 0x00A9EF, "Lo" },
+ { 0x00A9F0, 0x00A9F9, "Nd" },
+ { 0x00A9FA, 0x00A9FE, "Lo" },
+ { 0x00AA00, 0x00AA28, "Lo" },
+ { 0x00AA29, 0x00AA2E, "Mn" },
+ { 0x00AA2F, 0x00AA30, "Mc" },
+ { 0x00AA31, 0x00AA32, "Mn" },
+ { 0x00AA33, 0x00AA34, "Mc" },
+ { 0x00AA35, 0x00AA36, "Mn" },
+ { 0x00AA40, 0x00AA42, "Lo" },
+ { 0x00AA44, 0x00AA4B, "Lo" },
+ { 0x00AA50, 0x00AA59, "Nd" },
+ { 0x00AA5C, 0x00AA5F, "Po" },
+ { 0x00AA60, 0x00AA6F, "Lo" },
+ { 0x00AA71, 0x00AA76, "Lo" },
+ { 0x00AA77, 0x00AA79, "So" },
+ { 0x00AA7E, 0x00AAAF, "Lo" },
+ { 0x00AAB2, 0x00AAB4, "Mn" },
+ { 0x00AAB5, 0x00AAB6, "Lo" },
+ { 0x00AAB7, 0x00AAB8, "Mn" },
+ { 0x00AAB9, 0x00AABD, "Lo" },
+ { 0x00AABE, 0x00AABF, "Mn" },
+ { 0x00AADB, 0x00AADC, "Lo" },
+ { 0x00AADE, 0x00AADF, "Po" },
+ { 0x00AAE0, 0x00AAEA, "Lo" },
+ { 0x00AAEC, 0x00AAED, "Mn" },
+ { 0x00AAEE, 0x00AAEF, "Mc" },
+ { 0x00AAF0, 0x00AAF1, "Po" },
+ { 0x00AAF3, 0x00AAF4, "Lm" },
+ { 0x00AB01, 0x00AB06, "Lo" },
+ { 0x00AB09, 0x00AB0E, "Lo" },
+ { 0x00AB11, 0x00AB16, "Lo" },
+ { 0x00AB20, 0x00AB26, "Lo" },
+ { 0x00AB28, 0x00AB2E, "Lo" },
+ { 0x00AB30, 0x00AB5A, "Ll" },
+ { 0x00AB5C, 0x00AB5F, "Lm" },
+ { 0x00AB60, 0x00AB65, "Ll" },
+ { 0x00AB70, 0x00ABBF, "Ll" },
+ { 0x00ABC0, 0x00ABE2, "Lo" },
+ { 0x00ABE3, 0x00ABE4, "Mc" },
+ { 0x00ABE6, 0x00ABE7, "Mc" },
+ { 0x00ABE9, 0x00ABEA, "Mc" },
+ { 0x00ABF0, 0x00ABF9, "Nd" },
+ { 0x00AC00, 0x00D7A3, "Lo" },
+ { 0x00D7B0, 0x00D7C6, "Lo" },
+ { 0x00D7CB, 0x00D7FB, "Lo" },
+ { 0x00D800, 0x00DFFF, "Cs" },
+ { 0x00E000, 0x00F8FF, "Co" },
+ { 0x00F900, 0x00FA6D, "Lo" },
+ { 0x00FA70, 0x00FAD9, "Lo" },
+ { 0x00FB00, 0x00FB06, "Ll" },
+ { 0x00FB13, 0x00FB17, "Ll" },
+ { 0x00FB1F, 0x00FB28, "Lo" },
+ { 0x00FB2A, 0x00FB36, "Lo" },
+ { 0x00FB38, 0x00FB3C, "Lo" },
+ { 0x00FB40, 0x00FB41, "Lo" },
+ { 0x00FB43, 0x00FB44, "Lo" },
+ { 0x00FB46, 0x00FBB1, "Lo" },
+ { 0x00FBB2, 0x00FBC1, "Sk" },
+ { 0x00FBD3, 0x00FD3D, "Lo" },
+ { 0x00FD50, 0x00FD8F, "Lo" },
+ { 0x00FD92, 0x00FDC7, "Lo" },
+ { 0x00FDF0, 0x00FDFB, "Lo" },
+ { 0x00FE00, 0x00FE0F, "Mn" },
+ { 0x00FE10, 0x00FE16, "Po" },
+ { 0x00FE20, 0x00FE2F, "Mn" },
+ { 0x00FE31, 0x00FE32, "Pd" },
+ { 0x00FE33, 0x00FE34, "Pc" },
+ { 0x00FE45, 0x00FE46, "Po" },
+ { 0x00FE49, 0x00FE4C, "Po" },
+ { 0x00FE4D, 0x00FE4F, "Pc" },
+ { 0x00FE50, 0x00FE52, "Po" },
+ { 0x00FE54, 0x00FE57, "Po" },
+ { 0x00FE5F, 0x00FE61, "Po" },
+ { 0x00FE64, 0x00FE66, "Sm" },
+ { 0x00FE6A, 0x00FE6B, "Po" },
+ { 0x00FE70, 0x00FE74, "Lo" },
+ { 0x00FE76, 0x00FEFC, "Lo" },
+ { 0x00FF01, 0x00FF03, "Po" },
+ { 0x00FF05, 0x00FF07, "Po" },
+ { 0x00FF0E, 0x00FF0F, "Po" },
+ { 0x00FF10, 0x00FF19, "Nd" },
+ { 0x00FF1A, 0x00FF1B, "Po" },
+ { 0x00FF1C, 0x00FF1E, "Sm" },
+ { 0x00FF1F, 0x00FF20, "Po" },
+ { 0x00FF21, 0x00FF3A, "Lu" },
+ { 0x00FF41, 0x00FF5A, "Ll" },
+ { 0x00FF64, 0x00FF65, "Po" },
+ { 0x00FF66, 0x00FF6F, "Lo" },
+ { 0x00FF71, 0x00FF9D, "Lo" },
+ { 0x00FF9E, 0x00FF9F, "Lm" },
+ { 0x00FFA0, 0x00FFBE, "Lo" },
+ { 0x00FFC2, 0x00FFC7, "Lo" },
+ { 0x00FFCA, 0x00FFCF, "Lo" },
+ { 0x00FFD2, 0x00FFD7, "Lo" },
+ { 0x00FFDA, 0x00FFDC, "Lo" },
+ { 0x00FFE0, 0x00FFE1, "Sc" },
+ { 0x00FFE5, 0x00FFE6, "Sc" },
+ { 0x00FFE9, 0x00FFEC, "Sm" },
+ { 0x00FFED, 0x00FFEE, "So" },
+ { 0x00FFF9, 0x00FFFB, "Cf" },
+ { 0x00FFFC, 0x00FFFD, "So" },
+ { 0x010000, 0x01000B, "Lo" },
+ { 0x01000D, 0x010026, "Lo" },
+ { 0x010028, 0x01003A, "Lo" },
+ { 0x01003C, 0x01003D, "Lo" },
+ { 0x01003F, 0x01004D, "Lo" },
+ { 0x010050, 0x01005D, "Lo" },
+ { 0x010080, 0x0100FA, "Lo" },
+ { 0x010100, 0x010102, "Po" },
+ { 0x010107, 0x010133, "No" },
+ { 0x010137, 0x01013F, "So" },
+ { 0x010140, 0x010174, "Nl" },
+ { 0x010175, 0x010178, "No" },
+ { 0x010179, 0x010189, "So" },
+ { 0x01018A, 0x01018B, "No" },
+ { 0x01018C, 0x01018E, "So" },
+ { 0x010190, 0x01019B, "So" },
+ { 0x0101D0, 0x0101FC, "So" },
+ { 0x010280, 0x01029C, "Lo" },
+ { 0x0102A0, 0x0102D0, "Lo" },
+ { 0x0102E1, 0x0102FB, "No" },
+ { 0x010300, 0x01031F, "Lo" },
+ { 0x010320, 0x010323, "No" },
+ { 0x01032D, 0x010340, "Lo" },
+ { 0x010342, 0x010349, "Lo" },
+ { 0x010350, 0x010375, "Lo" },
+ { 0x010376, 0x01037A, "Mn" },
+ { 0x010380, 0x01039D, "Lo" },
+ { 0x0103A0, 0x0103C3, "Lo" },
+ { 0x0103C8, 0x0103CF, "Lo" },
+ { 0x0103D1, 0x0103D5, "Nl" },
+ { 0x010400, 0x010427, "Lu" },
+ { 0x010428, 0x01044F, "Ll" },
+ { 0x010450, 0x01049D, "Lo" },
+ { 0x0104A0, 0x0104A9, "Nd" },
+ { 0x0104B0, 0x0104D3, "Lu" },
+ { 0x0104D8, 0x0104FB, "Ll" },
+ { 0x010500, 0x010527, "Lo" },
+ { 0x010530, 0x010563, "Lo" },
+ { 0x010600, 0x010736, "Lo" },
+ { 0x010740, 0x010755, "Lo" },
+ { 0x010760, 0x010767, "Lo" },
+ { 0x010800, 0x010805, "Lo" },
+ { 0x01080A, 0x010835, "Lo" },
+ { 0x010837, 0x010838, "Lo" },
+ { 0x01083F, 0x010855, "Lo" },
+ { 0x010858, 0x01085F, "No" },
+ { 0x010860, 0x010876, "Lo" },
+ { 0x010877, 0x010878, "So" },
+ { 0x010879, 0x01087F, "No" },
+ { 0x010880, 0x01089E, "Lo" },
+ { 0x0108A7, 0x0108AF, "No" },
+ { 0x0108E0, 0x0108F2, "Lo" },
+ { 0x0108F4, 0x0108F5, "Lo" },
+ { 0x0108FB, 0x0108FF, "No" },
+ { 0x010900, 0x010915, "Lo" },
+ { 0x010916, 0x01091B, "No" },
+ { 0x010920, 0x010939, "Lo" },
+ { 0x010980, 0x0109B7, "Lo" },
+ { 0x0109BC, 0x0109BD, "No" },
+ { 0x0109BE, 0x0109BF, "Lo" },
+ { 0x0109C0, 0x0109CF, "No" },
+ { 0x0109D2, 0x0109FF, "No" },
+ { 0x010A01, 0x010A03, "Mn" },
+ { 0x010A05, 0x010A06, "Mn" },
+ { 0x010A0C, 0x010A0F, "Mn" },
+ { 0x010A10, 0x010A13, "Lo" },
+ { 0x010A15, 0x010A17, "Lo" },
+ { 0x010A19, 0x010A35, "Lo" },
+ { 0x010A38, 0x010A3A, "Mn" },
+ { 0x010A40, 0x010A48, "No" },
+ { 0x010A50, 0x010A58, "Po" },
+ { 0x010A60, 0x010A7C, "Lo" },
+ { 0x010A7D, 0x010A7E, "No" },
+ { 0x010A80, 0x010A9C, "Lo" },
+ { 0x010A9D, 0x010A9F, "No" },
+ { 0x010AC0, 0x010AC7, "Lo" },
+ { 0x010AC9, 0x010AE4, "Lo" },
+ { 0x010AE5, 0x010AE6, "Mn" },
+ { 0x010AEB, 0x010AEF, "No" },
+ { 0x010AF0, 0x010AF6, "Po" },
+ { 0x010B00, 0x010B35, "Lo" },
+ { 0x010B39, 0x010B3F, "Po" },
+ { 0x010B40, 0x010B55, "Lo" },
+ { 0x010B58, 0x010B5F, "No" },
+ { 0x010B60, 0x010B72, "Lo" },
+ { 0x010B78, 0x010B7F, "No" },
+ { 0x010B80, 0x010B91, "Lo" },
+ { 0x010B99, 0x010B9C, "Po" },
+ { 0x010BA9, 0x010BAF, "No" },
+ { 0x010C00, 0x010C48, "Lo" },
+ { 0x010C80, 0x010CB2, "Lu" },
+ { 0x010CC0, 0x010CF2, "Ll" },
+ { 0x010CFA, 0x010CFF, "No" },
+ { 0x010D00, 0x010D23, "Lo" },
+ { 0x010D24, 0x010D27, "Mn" },
+ { 0x010D30, 0x010D39, "Nd" },
+ { 0x010E60, 0x010E7E, "No" },
+ { 0x010F00, 0x010F1C, "Lo" },
+ { 0x010F1D, 0x010F26, "No" },
+ { 0x010F30, 0x010F45, "Lo" },
+ { 0x010F46, 0x010F50, "Mn" },
+ { 0x010F51, 0x010F54, "No" },
+ { 0x010F55, 0x010F59, "Po" },
+ { 0x011003, 0x011037, "Lo" },
+ { 0x011038, 0x011046, "Mn" },
+ { 0x011047, 0x01104D, "Po" },
+ { 0x011052, 0x011065, "No" },
+ { 0x011066, 0x01106F, "Nd" },
+ { 0x01107F, 0x011081, "Mn" },
+ { 0x011083, 0x0110AF, "Lo" },
+ { 0x0110B0, 0x0110B2, "Mc" },
+ { 0x0110B3, 0x0110B6, "Mn" },
+ { 0x0110B7, 0x0110B8, "Mc" },
+ { 0x0110B9, 0x0110BA, "Mn" },
+ { 0x0110BB, 0x0110BC, "Po" },
+ { 0x0110BE, 0x0110C1, "Po" },
+ { 0x0110D0, 0x0110E8, "Lo" },
+ { 0x0110F0, 0x0110F9, "Nd" },
+ { 0x011100, 0x011102, "Mn" },
+ { 0x011103, 0x011126, "Lo" },
+ { 0x011127, 0x01112B, "Mn" },
+ { 0x01112D, 0x011134, "Mn" },
+ { 0x011136, 0x01113F, "Nd" },
+ { 0x011140, 0x011143, "Po" },
+ { 0x011145, 0x011146, "Mc" },
+ { 0x011150, 0x011172, "Lo" },
+ { 0x011174, 0x011175, "Po" },
+ { 0x011180, 0x011181, "Mn" },
+ { 0x011183, 0x0111B2, "Lo" },
+ { 0x0111B3, 0x0111B5, "Mc" },
+ { 0x0111B6, 0x0111BE, "Mn" },
+ { 0x0111BF, 0x0111C0, "Mc" },
+ { 0x0111C1, 0x0111C4, "Lo" },
+ { 0x0111C5, 0x0111C8, "Po" },
+ { 0x0111C9, 0x0111CC, "Mn" },
+ { 0x0111D0, 0x0111D9, "Nd" },
+ { 0x0111DD, 0x0111DF, "Po" },
+ { 0x0111E1, 0x0111F4, "No" },
+ { 0x011200, 0x011211, "Lo" },
+ { 0x011213, 0x01122B, "Lo" },
+ { 0x01122C, 0x01122E, "Mc" },
+ { 0x01122F, 0x011231, "Mn" },
+ { 0x011232, 0x011233, "Mc" },
+ { 0x011236, 0x011237, "Mn" },
+ { 0x011238, 0x01123D, "Po" },
+ { 0x011280, 0x011286, "Lo" },
+ { 0x01128A, 0x01128D, "Lo" },
+ { 0x01128F, 0x01129D, "Lo" },
+ { 0x01129F, 0x0112A8, "Lo" },
+ { 0x0112B0, 0x0112DE, "Lo" },
+ { 0x0112E0, 0x0112E2, "Mc" },
+ { 0x0112E3, 0x0112EA, "Mn" },
+ { 0x0112F0, 0x0112F9, "Nd" },
+ { 0x011300, 0x011301, "Mn" },
+ { 0x011302, 0x011303, "Mc" },
+ { 0x011305, 0x01130C, "Lo" },
+ { 0x01130F, 0x011310, "Lo" },
+ { 0x011313, 0x011328, "Lo" },
+ { 0x01132A, 0x011330, "Lo" },
+ { 0x011332, 0x011333, "Lo" },
+ { 0x011335, 0x011339, "Lo" },
+ { 0x01133B, 0x01133C, "Mn" },
+ { 0x01133E, 0x01133F, "Mc" },
+ { 0x011341, 0x011344, "Mc" },
+ { 0x011347, 0x011348, "Mc" },
+ { 0x01134B, 0x01134D, "Mc" },
+ { 0x01135D, 0x011361, "Lo" },
+ { 0x011362, 0x011363, "Mc" },
+ { 0x011366, 0x01136C, "Mn" },
+ { 0x011370, 0x011374, "Mn" },
+ { 0x011400, 0x011434, "Lo" },
+ { 0x011435, 0x011437, "Mc" },
+ { 0x011438, 0x01143F, "Mn" },
+ { 0x011440, 0x011441, "Mc" },
+ { 0x011442, 0x011444, "Mn" },
+ { 0x011447, 0x01144A, "Lo" },
+ { 0x01144B, 0x01144F, "Po" },
+ { 0x011450, 0x011459, "Nd" },
+ { 0x011480, 0x0114AF, "Lo" },
+ { 0x0114B0, 0x0114B2, "Mc" },
+ { 0x0114B3, 0x0114B8, "Mn" },
+ { 0x0114BB, 0x0114BE, "Mc" },
+ { 0x0114BF, 0x0114C0, "Mn" },
+ { 0x0114C2, 0x0114C3, "Mn" },
+ { 0x0114C4, 0x0114C5, "Lo" },
+ { 0x0114D0, 0x0114D9, "Nd" },
+ { 0x011580, 0x0115AE, "Lo" },
+ { 0x0115AF, 0x0115B1, "Mc" },
+ { 0x0115B2, 0x0115B5, "Mn" },
+ { 0x0115B8, 0x0115BB, "Mc" },
+ { 0x0115BC, 0x0115BD, "Mn" },
+ { 0x0115BF, 0x0115C0, "Mn" },
+ { 0x0115C1, 0x0115D7, "Po" },
+ { 0x0115D8, 0x0115DB, "Lo" },
+ { 0x0115DC, 0x0115DD, "Mn" },
+ { 0x011600, 0x01162F, "Lo" },
+ { 0x011630, 0x011632, "Mc" },
+ { 0x011633, 0x01163A, "Mn" },
+ { 0x01163B, 0x01163C, "Mc" },
+ { 0x01163F, 0x011640, "Mn" },
+ { 0x011641, 0x011643, "Po" },
+ { 0x011650, 0x011659, "Nd" },
+ { 0x011660, 0x01166C, "Po" },
+ { 0x011680, 0x0116AA, "Lo" },
+ { 0x0116AE, 0x0116AF, "Mc" },
+ { 0x0116B0, 0x0116B5, "Mn" },
+ { 0x0116C0, 0x0116C9, "Nd" },
+ { 0x011700, 0x01171A, "Lo" },
+ { 0x01171D, 0x01171F, "Mn" },
+ { 0x011720, 0x011721, "Mc" },
+ { 0x011722, 0x011725, "Mn" },
+ { 0x011727, 0x01172B, "Mn" },
+ { 0x011730, 0x011739, "Nd" },
+ { 0x01173A, 0x01173B, "No" },
+ { 0x01173C, 0x01173E, "Po" },
+ { 0x011800, 0x01182B, "Lo" },
+ { 0x01182C, 0x01182E, "Mc" },
+ { 0x01182F, 0x011837, "Mn" },
+ { 0x011839, 0x01183A, "Mn" },
+ { 0x0118A0, 0x0118BF, "Lu" },
+ { 0x0118C0, 0x0118DF, "Ll" },
+ { 0x0118E0, 0x0118E9, "Nd" },
+ { 0x0118EA, 0x0118F2, "No" },
+ { 0x011A01, 0x011A0A, "Mn" },
+ { 0x011A0B, 0x011A32, "Lo" },
+ { 0x011A33, 0x011A38, "Mn" },
+ { 0x011A3B, 0x011A3E, "Mn" },
+ { 0x011A3F, 0x011A46, "Po" },
+ { 0x011A51, 0x011A56, "Mn" },
+ { 0x011A57, 0x011A58, "Mc" },
+ { 0x011A59, 0x011A5B, "Mn" },
+ { 0x011A5C, 0x011A83, "Lo" },
+ { 0x011A86, 0x011A89, "Lo" },
+ { 0x011A8A, 0x011A96, "Mn" },
+ { 0x011A98, 0x011A99, "Mn" },
+ { 0x011A9A, 0x011A9C, "Po" },
+ { 0x011A9E, 0x011AA2, "Po" },
+ { 0x011AC0, 0x011AF8, "Lo" },
+ { 0x011C00, 0x011C08, "Lo" },
+ { 0x011C0A, 0x011C2E, "Lo" },
+ { 0x011C30, 0x011C36, "Mn" },
+ { 0x011C38, 0x011C3D, "Mn" },
+ { 0x011C41, 0x011C45, "Po" },
+ { 0x011C50, 0x011C59, "Nd" },
+ { 0x011C5A, 0x011C6C, "No" },
+ { 0x011C70, 0x011C71, "Po" },
+ { 0x011C72, 0x011C8F, "Lo" },
+ { 0x011C92, 0x011CA7, "Mn" },
+ { 0x011CAA, 0x011CB0, "Mn" },
+ { 0x011CB2, 0x011CB3, "Mn" },
+ { 0x011CB5, 0x011CB6, "Mn" },
+ { 0x011D00, 0x011D06, "Lo" },
+ { 0x011D08, 0x011D09, "Lo" },
+ { 0x011D0B, 0x011D30, "Lo" },
+ { 0x011D31, 0x011D36, "Mn" },
+ { 0x011D3C, 0x011D3D, "Mn" },
+ { 0x011D3F, 0x011D45, "Mn" },
+ { 0x011D50, 0x011D59, "Nd" },
+ { 0x011D60, 0x011D65, "Lo" },
+ { 0x011D67, 0x011D68, "Lo" },
+ { 0x011D6A, 0x011D89, "Lo" },
+ { 0x011D8A, 0x011D8E, "Mc" },
+ { 0x011D90, 0x011D91, "Mn" },
+ { 0x011D93, 0x011D94, "Mc" },
+ { 0x011DA0, 0x011DA9, "Nd" },
+ { 0x011EE0, 0x011EF2, "Lo" },
+ { 0x011EF3, 0x011EF4, "Mn" },
+ { 0x011EF5, 0x011EF6, "Mc" },
+ { 0x011EF7, 0x011EF8, "Po" },
+ { 0x012000, 0x012399, "Lo" },
+ { 0x012400, 0x01246E, "Nl" },
+ { 0x012470, 0x012474, "Po" },
+ { 0x012480, 0x012543, "Lo" },
+ { 0x013000, 0x01342E, "Lo" },
+ { 0x014400, 0x014646, "Lo" },
+ { 0x016800, 0x016A38, "Lo" },
+ { 0x016A40, 0x016A5E, "Lo" },
+ { 0x016A60, 0x016A69, "Nd" },
+ { 0x016A6E, 0x016A6F, "Po" },
+ { 0x016AD0, 0x016AED, "Lo" },
+ { 0x016AF0, 0x016AF4, "Mn" },
+ { 0x016B00, 0x016B2F, "Lo" },
+ { 0x016B30, 0x016B36, "Mn" },
+ { 0x016B37, 0x016B3B, "Po" },
+ { 0x016B3C, 0x016B3F, "So" },
+ { 0x016B40, 0x016B43, "Lm" },
+ { 0x016B50, 0x016B59, "Nd" },
+ { 0x016B5B, 0x016B61, "No" },
+ { 0x016B63, 0x016B77, "Lo" },
+ { 0x016B7D, 0x016B8F, "Lo" },
+ { 0x016E40, 0x016E5F, "Lu" },
+ { 0x016E60, 0x016E7F, "Ll" },
+ { 0x016E80, 0x016E96, "No" },
+ { 0x016E97, 0x016E9A, "Po" },
+ { 0x016F00, 0x016F44, "Lo" },
+ { 0x016F51, 0x016F7E, "Mc" },
+ { 0x016F8F, 0x016F92, "Mn" },
+ { 0x016F93, 0x016F9F, "Lm" },
+ { 0x016FE0, 0x016FE1, "Lm" },
+ { 0x017000, 0x0187F1, "Lo" },
+ { 0x018800, 0x018AF2, "Lo" },
+ { 0x01B000, 0x01B11E, "Lo" },
+ { 0x01B170, 0x01B2FB, "Lo" },
+ { 0x01BC00, 0x01BC6A, "Lo" },
+ { 0x01BC70, 0x01BC7C, "Lo" },
+ { 0x01BC80, 0x01BC88, "Lo" },
+ { 0x01BC90, 0x01BC99, "Lo" },
+ { 0x01BC9D, 0x01BC9E, "Mn" },
+ { 0x01BCA0, 0x01BCA3, "Cf" },
+ { 0x01D000, 0x01D0F5, "So" },
+ { 0x01D100, 0x01D126, "So" },
+ { 0x01D129, 0x01D164, "So" },
+ { 0x01D165, 0x01D166, "Mc" },
+ { 0x01D167, 0x01D169, "Mn" },
+ { 0x01D16A, 0x01D16C, "So" },
+ { 0x01D16D, 0x01D172, "Mc" },
+ { 0x01D173, 0x01D17A, "Cf" },
+ { 0x01D17B, 0x01D182, "Mn" },
+ { 0x01D183, 0x01D184, "So" },
+ { 0x01D185, 0x01D18B, "Mn" },
+ { 0x01D18C, 0x01D1A9, "So" },
+ { 0x01D1AA, 0x01D1AD, "Mn" },
+ { 0x01D1AE, 0x01D1E8, "So" },
+ { 0x01D200, 0x01D241, "So" },
+ { 0x01D242, 0x01D244, "Mn" },
+ { 0x01D2E0, 0x01D2F3, "No" },
+ { 0x01D300, 0x01D356, "So" },
+ { 0x01D360, 0x01D378, "No" },
+ { 0x01D400, 0x01D419, "Lu" },
+ { 0x01D41A, 0x01D433, "Ll" },
+ { 0x01D434, 0x01D44D, "Lu" },
+ { 0x01D44E, 0x01D454, "Ll" },
+ { 0x01D456, 0x01D467, "Ll" },
+ { 0x01D468, 0x01D481, "Lu" },
+ { 0x01D482, 0x01D49B, "Ll" },
+ { 0x01D49E, 0x01D49F, "Lu" },
+ { 0x01D4A5, 0x01D4A6, "Lu" },
+ { 0x01D4A9, 0x01D4AC, "Lu" },
+ { 0x01D4AE, 0x01D4B5, "Lu" },
+ { 0x01D4B6, 0x01D4B9, "Ll" },
+ { 0x01D4BD, 0x01D4C3, "Ll" },
+ { 0x01D4C5, 0x01D4CF, "Ll" },
+ { 0x01D4D0, 0x01D4E9, "Lu" },
+ { 0x01D4EA, 0x01D503, "Ll" },
+ { 0x01D504, 0x01D505, "Lu" },
+ { 0x01D507, 0x01D50A, "Lu" },
+ { 0x01D50D, 0x01D514, "Lu" },
+ { 0x01D516, 0x01D51C, "Lu" },
+ { 0x01D51E, 0x01D537, "Ll" },
+ { 0x01D538, 0x01D539, "Lu" },
+ { 0x01D53B, 0x01D53E, "Lu" },
+ { 0x01D540, 0x01D544, "Lu" },
+ { 0x01D54A, 0x01D550, "Lu" },
+ { 0x01D552, 0x01D56B, "Ll" },
+ { 0x01D56C, 0x01D585, "Lu" },
+ { 0x01D586, 0x01D59F, "Ll" },
+ { 0x01D5A0, 0x01D5B9, "Lu" },
+ { 0x01D5BA, 0x01D5D3, "Ll" },
+ { 0x01D5D4, 0x01D5ED, "Lu" },
+ { 0x01D5EE, 0x01D607, "Ll" },
+ { 0x01D608, 0x01D621, "Lu" },
+ { 0x01D622, 0x01D63B, "Ll" },
+ { 0x01D63C, 0x01D655, "Lu" },
+ { 0x01D656, 0x01D66F, "Ll" },
+ { 0x01D670, 0x01D689, "Lu" },
+ { 0x01D68A, 0x01D6A5, "Ll" },
+ { 0x01D6A8, 0x01D6C0, "Lu" },
+ { 0x01D6C2, 0x01D6DA, "Ll" },
+ { 0x01D6DC, 0x01D6E1, "Ll" },
+ { 0x01D6E2, 0x01D6FA, "Lu" },
+ { 0x01D6FC, 0x01D714, "Ll" },
+ { 0x01D716, 0x01D71B, "Ll" },
+ { 0x01D71C, 0x01D734, "Lu" },
+ { 0x01D736, 0x01D74E, "Ll" },
+ { 0x01D750, 0x01D755, "Ll" },
+ { 0x01D756, 0x01D76E, "Lu" },
+ { 0x01D770, 0x01D788, "Ll" },
+ { 0x01D78A, 0x01D78F, "Ll" },
+ { 0x01D790, 0x01D7A8, "Lu" },
+ { 0x01D7AA, 0x01D7C2, "Ll" },
+ { 0x01D7C4, 0x01D7C9, "Ll" },
+ { 0x01D7CE, 0x01D7FF, "Nd" },
+ { 0x01D800, 0x01D9FF, "So" },
+ { 0x01DA00, 0x01DA36, "Mn" },
+ { 0x01DA37, 0x01DA3A, "So" },
+ { 0x01DA3B, 0x01DA6C, "Mn" },
+ { 0x01DA6D, 0x01DA74, "So" },
+ { 0x01DA76, 0x01DA83, "So" },
+ { 0x01DA85, 0x01DA86, "So" },
+ { 0x01DA87, 0x01DA8B, "Po" },
+ { 0x01DA9B, 0x01DA9F, "Mn" },
+ { 0x01DAA1, 0x01DAAF, "Mn" },
+ { 0x01E000, 0x01E006, "Mn" },
+ { 0x01E008, 0x01E018, "Mn" },
+ { 0x01E01B, 0x01E021, "Mn" },
+ { 0x01E023, 0x01E024, "Mn" },
+ { 0x01E026, 0x01E02A, "Mn" },
+ { 0x01E800, 0x01E8C4, "Lo" },
+ { 0x01E8C7, 0x01E8CF, "No" },
+ { 0x01E8D0, 0x01E8D6, "Mn" },
+ { 0x01E900, 0x01E921, "Lu" },
+ { 0x01E922, 0x01E943, "Ll" },
+ { 0x01E944, 0x01E94A, "Mn" },
+ { 0x01E950, 0x01E959, "Nd" },
+ { 0x01E95E, 0x01E95F, "Po" },
+ { 0x01EC71, 0x01ECAB, "No" },
+ { 0x01ECAD, 0x01ECAF, "No" },
+ { 0x01ECB1, 0x01ECB4, "No" },
+ { 0x01EE00, 0x01EE03, "Lo" },
+ { 0x01EE05, 0x01EE1F, "Lo" },
+ { 0x01EE21, 0x01EE22, "Lo" },
+ { 0x01EE29, 0x01EE32, "Lo" },
+ { 0x01EE34, 0x01EE37, "Lo" },
+ { 0x01EE4D, 0x01EE4F, "Lo" },
+ { 0x01EE51, 0x01EE52, "Lo" },
+ { 0x01EE61, 0x01EE62, "Lo" },
+ { 0x01EE67, 0x01EE6A, "Lo" },
+ { 0x01EE6C, 0x01EE72, "Lo" },
+ { 0x01EE74, 0x01EE77, "Lo" },
+ { 0x01EE79, 0x01EE7C, "Lo" },
+ { 0x01EE80, 0x01EE89, "Lo" },
+ { 0x01EE8B, 0x01EE9B, "Lo" },
+ { 0x01EEA1, 0x01EEA3, "Lo" },
+ { 0x01EEA5, 0x01EEA9, "Lo" },
+ { 0x01EEAB, 0x01EEBB, "Lo" },
+ { 0x01EEF0, 0x01EEF1, "Sm" },
+ { 0x01F000, 0x01F02B, "So" },
+ { 0x01F030, 0x01F093, "So" },
+ { 0x01F0A0, 0x01F0AE, "So" },
+ { 0x01F0B1, 0x01F0BF, "So" },
+ { 0x01F0C1, 0x01F0CF, "So" },
+ { 0x01F0D1, 0x01F0F5, "So" },
+ { 0x01F100, 0x01F10C, "No" },
+ { 0x01F110, 0x01F16B, "So" },
+ { 0x01F170, 0x01F1AC, "So" },
+ { 0x01F1E6, 0x01F202, "So" },
+ { 0x01F210, 0x01F23B, "So" },
+ { 0x01F240, 0x01F248, "So" },
+ { 0x01F250, 0x01F251, "So" },
+ { 0x01F260, 0x01F265, "So" },
+ { 0x01F300, 0x01F3FA, "So" },
+ { 0x01F3FB, 0x01F3FF, "Sk" },
+ { 0x01F400, 0x01F6D4, "So" },
+ { 0x01F6E0, 0x01F6EC, "So" },
+ { 0x01F6F0, 0x01F6F9, "So" },
+ { 0x01F700, 0x01F773, "So" },
+ { 0x01F780, 0x01F7D8, "So" },
+ { 0x01F800, 0x01F80B, "So" },
+ { 0x01F810, 0x01F847, "So" },
+ { 0x01F850, 0x01F859, "So" },
+ { 0x01F860, 0x01F887, "So" },
+ { 0x01F890, 0x01F8AD, "So" },
+ { 0x01F900, 0x01F90B, "So" },
+ { 0x01F910, 0x01F93E, "So" },
+ { 0x01F940, 0x01F970, "So" },
+ { 0x01F973, 0x01F976, "So" },
+ { 0x01F97C, 0x01F9A2, "So" },
+ { 0x01F9B0, 0x01F9B9, "So" },
+ { 0x01F9C0, 0x01F9C2, "So" },
+ { 0x01F9D0, 0x01F9FF, "So" },
+ { 0x01FA60, 0x01FA6D, "So" },
+ { 0x020000, 0x02A6D6, "Lo" },
+ { 0x02A700, 0x02B734, "Lo" },
+ { 0x02B740, 0x02B81D, "Lo" },
+ { 0x02B820, 0x02CEA1, "Lo" },
+ { 0x02CEB0, 0x02EBE0, "Lo" },
+ { 0x02F800, 0x02FA1D, "Lo" },
+ { 0x0E0020, 0x0E007F, "Cf" },
+ { 0x0E0100, 0x0E01EF, "Mn" },
+ { 0x0F0000, 0x0FFFFD, "Co" },
+ { 0x100000, 0x10FFFD, "Co" },
+ },
+}
diff --git a/indexing/xindex/scripts/xindex.lua b/indexing/xindex/scripts/xindex.lua
new file mode 100755
index 0000000000..74f4edaa21
--- /dev/null
+++ b/indexing/xindex/scripts/xindex.lua
@@ -0,0 +1,200 @@
+#!/usr/bin/env texlua
+-----------------------------------------------------------------------
+-- FILE: xindex.lua
+-- DESCRIPTION: create an index
+-- REQUIREMENTS:
+-- AUTHOR: Herbert Voß
+-- LICENSE: LPPL 1.3
+-----------------------------------------------------------------------
+
+ xindex = xindex or { }
+ local version = 0.13
+xindex.version = version
+--xindex.self = "xindex"
+
+--[[doc--
+
+xindex(1)
+
+This file is provided under the terms of the LPPL v1.3 or
+later as printed in full text in the manual (xindex.pdf).
+
+\url{https://ctan.org/license/lppl1.3}.
+
+Report bugs to
+
+ \url{https://gitlab.com/hvoss49/xindex/issues}.
+
+--doc]]--
+
+kpse.set_program_name("luatex")
+
+require("lualibs") -- all part of LuaTeX
+require('unicode')
+require('string')
+require("lpeg")
+
+
+local args = require ('xindex-lapp') [[
+ parameter handling
+ -q,--quiet
+ -h,--help
+ -v... Verbosity level; can be -v, -vv, -vvv
+ -c,--config (default cfg)
+ -e,--escapechar (default ")
+ -n,--noheadings
+ -a,--no_casesensitive
+ -o,--output (default "")
+ -l,--language (default en)
+ -p,--prefix (default L)
+ <input> (string)
+]]
+
+
+--[[
+ No -v flag, v is just { false }. not args.v[1] is true, so vlevel becomes 0.
+ One -v flags, v is { true }
+ Two -v flags, v is { true, true }
+ Three -v flags, v is { true, true, true }
+]]
+
+vlevel = not args.v[1] and 0 or #args.v
+not_quiet = not args["quiet"]
+
+local luaVersion = _VERSION
+if (luaVersion < "Lua 5.3") then
+ print("=========================================")
+ print("Sorry. but we need at least LuaTeX 1.09")
+ print("Leaving program xindex")
+ print("=========================================")
+ os.exit()
+end
+
+--local inspect = require 'inspect'
+--print(inspect(args))
+
+--[[
+if args.h then
+print(
+Syntax: xinput [options] <file>
+By default the Lua program "xindex" creates a so-called
+.ind file, which has the same main filename as the input file
+unless you are using the option "-o <output file>" There will
+be no log file created.
+)
+end
+]]
+
+
+--[[
+if not args["input"] then
+ io.write ("Filename: ")
+ inFile = io.read()
+else
+ inFile = args["input"]
+end
+]]
+
+require('xindex-lib')
+
+inFile = args["input"]
+if not file_exists(inFile) then
+ if file_exists(inFile..".idx") then
+ inFile = inFile..".idx"
+ else
+ writeLog(2,"Inputfile "..inFile.." or "..inFile..".idx not found!\n",0)
+ os.exit()
+ end
+end
+
+local filename
+local logfilename
+if args["output"] == '""' then
+ if inFile:sub(inFile:len()-3,inFile:len()) == ".idx" then
+ filename = inFile:sub(1,inFile:len()-3).."ind"
+ logfilename = inFile:sub(1,inFile:len()-3).."ilg"
+ else
+ filename = inFile..".ind"
+ logfilename = inFile..".ilg"
+ end
+else
+ filename = args.output
+ logfilename = filename:gsub('%p...','')..".ilg"
+end
+
+logFile = io.open(logfilename,"w+")
+writeLog(2,"xindex v."..version.." (c) Herbert Voß\n",-1)
+writeLog(1,"Verbose level = "..vlevel.."\n",1)
+
+writeLog(2,"Open outputfile "..filename,0)
+outFile = io.open(filename,"w+")
+writeLog(2," ... done\n",0)
+
+if vlevel > 0 then
+ writeLog(1,"---------- parameter ----------\n",1)
+ for k,v in pairs(args) do
+ writeLog(1,tostring(k)..", "..tostring(v).."\n",1)
+ end
+ for k=1,#args.v do
+ writeLog(1,"v["..k.."]= "..tostring(args.v[k]).."\n",1)
+ end
+ writeLog(1,"---------- parameter ----------\n",1)
+end
+
+writeLog(2,"Using input file: "..inFile.."\n",0)
+
+labelPrefix = args.prefix
+writeLog(2,"Label prefix: "..labelPrefix.."\n",-1)
+
+writeLog(2,"Loading common config file ".."xindex-cfg-common\n",1)
+Config_File_Common = kpse.find_file("xindex-cfg-common.lua")
+cfg_common = require(Config_File_Common)
+
+local config_file = "xindex-"..args.config..".lua"
+writeLog(2,"Loading local config file "..config_file,0)
+Config_File = kpse.find_file(config_file)
+cfg = require(Config_File)
+writeLog(2," ... done\n",0)
+
+local esc_char = args.escapechar
+writeLog(2,"Escapechar = "..esc_char.."\n",1)
+escape_chars = { -- by default " is the escape char
+ {esc_char..'"', '//escapedquote//', '\\"{}' },
+ {esc_char..'@', '//escapedat//', '@' },
+ {esc_char..'|', '//escapedvert//', "|" },
+ {esc_char..'!', '//scapedexcl//', '!' }
+}
+
+language = string.lower(args["language"])
+writeLog(2,"Language = "..language.."\n",1)
+index_header = indexheader[language]
+if vlevel > 0 then for i=1,#index_header do writeLog(2,index_header[i].."\n",1) end end
+page_folium = folium[language]
+
+
+no_caseSensitive = args["no_casesensitive"]
+if no_caseSensitive then
+ writeLog(1,"Sorting will be no case sensitive\n",1)
+else
+ writeLog(1,"Sorting will be case sensitive\n",1)
+end
+
+no_headings = args["noheadings"]
+if no_headings then
+ writeLog(1,"Output with NO headings between different first letter\n",1)
+else
+ writeLog(1,"Output with headings between different first letter\n",1)
+end
+
+writeLog(2,"Open outputfile "..filename,0)
+outFile = io.open(filename,"w+")
+writeLog(2,"... done\n",0)
+
+
+writeLog(1,"Starting base file ... \n",2)
+BaseRunFile = kpse.find_file("xindex-base.lua")
+dofile(BaseRunFile)
+
+logFile:close()
+
+