summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-09-25 03:01:31 +0000
committerNorbert Preining <norbert@preining.info>2021-09-25 03:01:31 +0000
commit8322a8a248262d9acaadab2fa12d90012fcf1877 (patch)
tree5dd59d39bf68ca7c1882c1a07aec8470b36dc20e /macros
parent5d714d9476cbb90b125ff14a9d764ad90bb7c2ed (diff)
CTAN sync 202109250301
Diffstat (limited to 'macros')
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/LICENSE.tex2
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/Makefile49
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/VERSION.tex2
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/DESCRIPTION2
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/DESCRIPTION1
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/jabberwocky-dark.pngbin0 -> 166994 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/jabberwocky-light.pngbin0 -> 166994 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-lualatex.pdf (renamed from macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-med-lualatex.pdf)bin897025 -> 918116 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-lualatex.tex395
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-pdflatex.pdf (renamed from macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-med-pdflatex.pdf)bin918624 -> 952731 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-pdflatex.tex398
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/econ-lualatex.pdfbin900730 -> 900732 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/econ-pdflatex.pdfbin922305 -> 934859 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fi-lualatex.pdfbin898917 -> 898918 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fi-pdflatex.pdfbin920564 -> 933083 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fsps-lualatex.pdfbin898628 -> 898625 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fsps-pdflatex.pdfbin920200 -> 932750 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fss-lualatex.pdfbin898027 -> 898043 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fss-pdflatex.pdfbin919634 -> 932158 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/law-lualatex.pdfbin896413 -> 896416 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/law-pdflatex.pdfbin917982 -> 930522 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/med-lualatex.pdfbin897025 -> 897033 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/med-pdflatex.pdfbin918624 -> 931170 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/ped-lualatex.pdfbin898329 -> 898341 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/ped-pdflatex.pdfbin919961 -> 932490 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/phil-lualatex.pdfbin896872 -> 896879 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/phil-pdflatex.pdfbin918473 -> 931007 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/sci-lualatex.pdfbin897249 -> 897250 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/sci-pdflatex.pdfbin918833 -> 931373 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/fibeamer.dtx6
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/fibeamer.pdfbin354911 -> 357661 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/econ.pdfbin440526 -> 285352 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fi.pdfbin450557 -> 293275 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fsps.pdfbin439299 -> 286416 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fss.pdfbin440685 -> 287446 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/law.pdfbin448566 -> 285167 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/med.pdfbin439169 -> 283430 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/ped.pdfbin442422 -> 287260 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/phil.pdfbin440547 -> 284500 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/sci.pdfbin481954 -> 294975 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/DESCRIPTION2
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/Makefile13
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/fibeamer-bs-standard-english.pdfbin0 -> 59086 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/fibeamer-bs-standard-italian.pdfbin0 -> 58190 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/DESCRIPTION3
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/EXAMPLE/DESCRIPTION2
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/DESCRIPTION3
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/Makefile26
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-econ-lualatex.pdfbin900730 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-econ-pdflatex.pdfbin922305 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fi-lualatex.pdfbin898917 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fi-pdflatex.pdfbin920564 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fsps-lualatex.pdfbin898628 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fsps-pdflatex.pdfbin920200 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fss-lualatex.pdfbin898027 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fss-pdflatex.pdfbin919634 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-law-lualatex.pdfbin896413 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-law-pdflatex.pdfbin917982 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-ped-lualatex.pdfbin898329 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-ped-pdflatex.pdfbin919961 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-phil-lualatex.pdfbin896872 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-phil-pdflatex.pdfbin918473 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-sci-lualatex.pdfbin897249 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-sci-pdflatex.pdfbin918833 -> 0 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/DESCRIPTION2
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/Makefile15
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/base.dtx355
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/base.ins6
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/standard.dtx113
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/standard.ins3
-rw-r--r--macros/latex/contrib/ccool/README.md7
-rw-r--r--macros/latex/contrib/ccool/ccool.bib50
-rw-r--r--macros/latex/contrib/ccool/ccool.dtx1698
-rw-r--r--macros/latex/contrib/ccool/ccool.ins64
-rw-r--r--macros/latex/contrib/ccool/ccool.pdfbin815782 -> 829119 bytes
-rw-r--r--macros/latex/contrib/debate/DEPENDS.txt3
-rw-r--r--macros/latex/contrib/debate/README.md29
-rw-r--r--macros/latex/contrib/debate/debate.pdfbin0 -> 235280 bytes
-rw-r--r--macros/latex/contrib/debate/debate.sty52
-rw-r--r--macros/latex/contrib/debate/debate.tex77
-rw-r--r--macros/luatex/latex/yamlvars/README.md32
-rw-r--r--macros/luatex/latex/yamlvars/YAMLvars.lua369
-rw-r--r--macros/luatex/latex/yamlvars/YAMLvars.pdfbin0 -> 39208 bytes
-rw-r--r--macros/luatex/latex/yamlvars/YAMLvars.sty59
-rw-r--r--macros/luatex/latex/yamlvars/YAMLvars.tex264
-rw-r--r--macros/luatex/latex/yamlvars/tinyyaml.lua816
86 files changed, 3721 insertions, 1197 deletions
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/LICENSE.tex b/macros/latex/contrib/beamer-contrib/themes/fibeamer/LICENSE.tex
index 939c962fd5..b47399e489 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/LICENSE.tex
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/LICENSE.tex
@@ -1,7 +1,7 @@
\input docstrip.tex
\preamble
-Copyright 2016-2020 Vít Novotný <witiko@mail.muni.cz>
+Copyright 2016-2021 Vít Novotný <witiko@mail.muni.cz>
Faculty of Informatics, Masaryk University (Brno, Czech Republic)
This work is based on the (Unofficial) University of Manchester
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/Makefile b/macros/latex/contrib/beamer-contrib/themes/fibeamer/Makefile
index 4396a9d8d0..1911b8a005 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/Makefile
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/Makefile
@@ -1,22 +1,20 @@
-SUBMAKES_REQUIRED=logo/mu theme/mu
-SUBMAKES_EXTRA=guide/mu example/mu
-SUBMAKES_TEST=test/mu
-SUBMAKES=$(SUBMAKES_REQUIRED) $(SUBMAKES_EXTRA) $(SUBMAKES_TEST)
+SUBMAKES_REQUIRED=logo/mu theme/mu logo/bs theme/bs
+SUBMAKES_EXTRA=guide/mu example/mu example/bs
+SUBMAKES=$(SUBMAKES_REQUIRED) $(SUBMAKES_EXTRA)
.PHONY: all base complete docs clean dist dist-implode implode \
- install install-base install-docs uninstall tests $(SUBMAKES)
+ install install-base install-docs uninstall $(SUBMAKES)
BASETHEMEFILE=beamerthemefibeamer.sty
-OTHERTHEMEFILES=theme/mu/*.sty
+OTHERTHEMEFILES=theme/mu/*.sty theme/bs/*.sty
THEMEFILES=$(BASETHEMEFILE) $(OTHERTHEMEFILES)
LOGOSOURCES=logo/*/*.pdf
LOGOS=logo/*/*.eps
-DTXFILES=*.dtx theme/mu/*.dtx
-INSFILES=*.ins theme/mu/*.ins
-TESTS=test/mu/*.pdf
+DTXFILES=*.dtx theme/mu/*.dtx theme/bs/*.dtx
+INSFILES=*.ins theme/mu/*.ins theme/bs/*.ins
MAKES=guide/mu/Makefile theme/mu/Makefile logo/mu/Makefile Makefile \
- test/mu/Makefile
-USEREXAMPLE_SOURCES=example/mu/Makefile example/mu/example.dtx \
- example/mu/*.ins
+ theme/bs/Makefile logo/bs/Makefile
+USEREXAMPLE_SOURCES=example/mu/Makefile example/mu/example.dtx example/mu/*.ins \
+ example/bs/Makefile example/bs/example.dtx example/bs/standard.ins
USEREXAMPLES=example/mu/econ-lualatex.pdf \
example/mu/econ-pdflatex.pdf example/mu/fi-lualatex.pdf \
example/mu/fi-pdflatex.pdf example/mu/fsps-lualatex.pdf \
@@ -26,22 +24,27 @@ USEREXAMPLES=example/mu/econ-lualatex.pdf \
example/mu/med-pdflatex.pdf example/mu/ped-lualatex.pdf \
example/mu/ped-pdflatex.pdf example/mu/phil-lualatex.pdf \
example/mu/phil-pdflatex.pdf example/mu/sci-lualatex.pdf \
- example/mu/sci-pdflatex.pdf
+ example/mu/sci-pdflatex.pdf \
+ example/bs/standard-pdflatex.pdf example/bs/standard-lualatex.pdf
DEVEXAMPLES=logo/DESCRIPTION logo/EXAMPLE/DESCRIPTION \
logo/mu/DESCRIPTION theme/EXAMPLE/DESCRIPTION \
theme/mu/DESCRIPTION theme/DESCRIPTION example/DESCRIPTION \
example/EXAMPLE/DESCRIPTION example/mu/DESCRIPTION \
example/mu/resources/DESCRIPTION guide/DESCRIPTION \
guide/EXAMPLE/DESCRIPTION guide/mu/DESCRIPTION \
- guide/mu/resources/DESCRIPTION test/DESCRIPTION \
- test/EXAMPLE/DESCRIPTION test/mu/DESCRIPTION
+ guide/mu/resources/DESCRIPTION \
+ theme/bs/DESCRIPTION logo/bs/DESCRIPTION example/bs/DESCRIPTION \
+ example/bs/resources/DESCRIPTION
EXAMPLES=$(USEREXAMPLES) $(DEVEXAMPLES)
MISCELLANEOUS=guide/mu/guide.bib \
guide/mu/guide.dtx guide/mu/*.ins guide/mu/resources/cog.pdf \
guide/mu/resources/vader.pdf guide/mu/resources/yoda.pdf \
$(USEREXAMPLES:.pdf=.tex) \
example/mu/resources/jabberwocky-dark.png \
- example/mu/resources/jabberwocky-light.png README.md
+ example/mu/resources/jabberwocky-light.png \
+ example/bs/resources/jabberwocky-dark.png \
+ example/bs/resources/jabberwocky-light.png \
+ README.md
RESOURCES=$(THEMEFILES) $(LOGOS) $(LOGOSOURCES)
SOURCES=$(DTXFILES) $(INSFILES) LICENSE.tex
AUXFILES=fibeamer.aux fibeamer.log fibeamer.toc fibeamer.ind \
@@ -85,9 +88,6 @@ docs:
$(SUBMAKES):
make -C $@ all
-# This pseudo-target performs the tests.
-tests: base $(SUBMAKES_TEST)
-
# This pseudo-target creates the distribution archive.
dist: dist-implode complete
make $(TDSARCHIVE) $(DISTARCHIVE) $(CTANARCHIVE)
@@ -117,24 +117,23 @@ $(TDSARCHIVE):
mv "$$DIR"/$@ $@ && rm -rf "$$DIR"
# This target generates a distribution file.
-$(DISTARCHIVE): $(SOURCES) $(RESOURCES) $(MAKES) $(TESTS) \
+$(DISTARCHIVE): $(SOURCES) $(RESOURCES) $(MAKES) \
$(USEREXAMPLE_SOURCES) $(DOCS) $(PDFSOURCES) $(MISCELLANEOUS) \
$(EXAMPLES) $(VERSION)
DIR=`mktemp -d` && \
- cp --verbose $(TDSARCHIVE) "$$DIR" && \
+# cp --verbose $(TDSARCHIVE) "$$DIR" && \
cp --parents --verbose $^ "$$DIR" && \
- (cd "$$DIR" && zip -r -v -nw $@ *) && \
+ (cd "$$DIR" && zip --symlinks -r -v -nw $@ *) && \
mv "$$DIR"/$@ . && rm -rf "$$DIR"
# This target generates a CTAN distribution file.
-$(CTANARCHIVE): $(SOURCES) $(MAKES) $(TESTS) $(EXAMPLES) \
+$(CTANARCHIVE): $(SOURCES) $(MAKES) $(EXAMPLES) \
$(MISCELLANEOUS) $(DOCS) $(VERSION) $(LOGOSOURCES)
DIR=`mktemp -d` && mkdir -p "$$DIR/fibeamer" && \
- cp --verbose $(TDSARCHIVE) "$$DIR" && \
cp --parents --verbose $^ "$$DIR/fibeamer" && \
printf '.PHONY: implode\nimplode:\n' > \
"$$DIR/fibeamer/example/mu/Makefile" && \
- (cd "$$DIR" && zip -r -v -nw $@ *) && \
+ (cd "$$DIR" && zip --symlinks -r -v -nw $@ *) && \
mv "$$DIR"/$@ . && rm -rf "$$DIR"
# This pseudo-target installs the logo and theme files - as well as
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/VERSION.tex b/macros/latex/contrib/beamer-contrib/themes/fibeamer/VERSION.tex
index a488162c77..5e78f5422a 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/VERSION.tex
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/VERSION.tex
@@ -1 +1 @@
-2019/12/16 v1.1.8 fibeamer MU beamer theme
+2021/09/07 v1.2.0 fibeamer MU beamer theme
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/DESCRIPTION b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/DESCRIPTION
new file mode 100644
index 0000000000..cd7970a8d2
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/DESCRIPTION
@@ -0,0 +1,2 @@
+This directory contains example documents for the
+Università degli Studi di Brescia (Brescia, Italy)
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/DESCRIPTION b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/DESCRIPTION
new file mode 100644
index 0000000000..a4fd771298
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/DESCRIPTION
@@ -0,0 +1 @@
+This directory contains resources for the example documents.
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/jabberwocky-dark.png b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/jabberwocky-dark.png
new file mode 100644
index 0000000000..f793ae6f50
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/jabberwocky-dark.png
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/jabberwocky-light.png b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/jabberwocky-light.png
new file mode 100644
index 0000000000..e7933cea2c
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/resources/jabberwocky-light.png
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-med-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-lualatex.pdf
index fe254f79ef..a3e593ad82 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-med-lualatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-lualatex.tex b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-lualatex.tex
new file mode 100644
index 0000000000..8b765d748a
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-lualatex.tex
@@ -0,0 +1,395 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% I, the copyright holder of this work, release this work into the
+%% public domain. This applies worldwide. In some countries this may
+%% not be legally possible; if so: I grant anyone the right to use
+%% this work for any purpose, without any conditions, unless such
+%% conditions are required by law.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass{beamer}
+\usetheme[university=bs,faculty=standard]{fibeamer}
+\usepackage{polyglossia} %% By using `italian` as the
+\setmainlanguage{english} %% main locale instead of `english`, you
+%% can typeset the presentation in Italian.
+\setotherlanguages{italian} %% The additional key allow
+%%
+%% \begin{otherlanguage}{italian} ... \end{otherlanguage}
+%%
+%% These macros specify information about the presentation
+\title{Presentation Title} %% that will be typeset on the
+\subtitle{Presentation Subtitle} %% title page.
+\author{Author's Name}
+%% These additional packages are used within the document:
+\usepackage{ragged2e} % `\justifying` text
+\usepackage{booktabs} % Tables
+\usepackage{tabularx}
+\usepackage{tikz} % Diagrams
+\usetikzlibrary{calc, shapes, backgrounds}
+\usepackage{amsmath, amssymb}
+\usepackage{url} % `\url`s
+\usepackage{listings} % Code listings
+\frenchspacing
+\begin{document}
+ \frame[c]{\maketitle}
+
+ \AtBeginSection[]{% Print an outline at the beginning of sections
+ \begin{frame}<beamer>
+ \frametitle{Outline for Section \thesection}
+ \tableofcontents[currentsection]
+ \end{frame}}
+
+ \section{Light Frames}
+ \subsection{Blind Text}
+ \begin{frame}{Jabberwocky}
+ \framesubtitle{Lewis Carroll}%
+ \begin{tikzpicture}[overlay,remember picture]
+ \node[anchor=south east,xshift=-30pt,yshift=35pt]
+ at (current page.south east) {
+ \includegraphics[width=35mm]{resources/jabberwocky-light}
+ };
+ \end{tikzpicture}%
+ 'Twas brillig, and the slithy toves\\
+ Did gyre and gimble in the wabe;\\
+ All mimsy were the borogoves,\\
+ And the mome raths outgrabe.\\\bigskip
+
+ “Beware the Jabberwock, my son!\\
+ The jaws that bite, the claws that catch!\\
+ Beware the Jubjub bird, and shun\\
+ The frumious Bandersnatch!”\\
+ \end{frame}
+
+ \begin{frame}[label=lists]{Lists and locales}
+ \framesubtitle{Lorem ipsum dolor sit amet}
+ \begin{columns}[onlytextwidth]
+ \column{.5\textwidth}
+ \begin{itemize}
+ \item Nulla nec lacinia odio. Curabitur urna tellus.
+ \begin{itemize}
+ \item Fusce id sodales dolor. Sed id metus dui.
+ \begin{itemize}
+ \item Cupio virtus licet mi vel feugiat.
+ \end{itemize}
+ \end{itemize}
+ \end{itemize}
+ \column{.5\textwidth}
+ \begin{enumerate}
+ \item Donec porta, risus porttitor egestas scelerisque video.
+ \begin{enumerate}
+ \item Nunc non ante fringilla, manus potentis cario.
+ \begin{enumerate}
+ \item Pellentesque servus morbi tristique.
+ \end{enumerate}
+ \end{enumerate}
+ \end{enumerate}
+ \end{columns}
+ \bigskip
+ \justifying
+
+ {\raggedright\uselanguage{italian}Fúgge tra sélve spaventóse e scure,
+ per lóchi inabitáti, érmi e selvaggi.
+ che di cerri sentia, d’olmi e di faggi,
+ fatto le avea con subite paure
+ trovar di qua di là strani viaggi...}
+ {\uselanguage{english}The quick, brown fox jumps over the lazy
+ dog.}
+ \end{frame}
+
+ \subsection{Structuring Elements}
+ \begin{frame}[label=simmonshall]{Text blocks}
+ \framesubtitle{In plain, example, and \alert{alert} flavour}
+ \alert{This text} is highlighted.
+
+ \begin{block}{A plain block}
+ This is a plain block containing some \alert{highlighted text}.
+ \end{block}
+ \begin{exampleblock}{An example block}
+ This is an example block containing some \alert{highlighted text}.
+ \end{exampleblock}
+ \begin{alertblock}{An alert block}
+ This is an alert block containing some \alert{highlighted text}.
+ \end{alertblock}
+ \end{frame}
+
+ \begin{frame}[label=proof]{Definitions, theorems, and proofs}
+ \framesubtitle{All integers divide zero}
+ \begin{definition}
+ $\forall a,b\in\mathds{Z}: a\mid b\iff\exists c\in\mathds{Z}:a\cdot c=b$
+ \end{definition}
+ \begin{theorem}
+ $\forall a\in\mathds{Z}: a\mid 0$
+ \end{theorem}
+ \begin{proof}[Proof\nopunct]
+ $\forall a\in\mathds{Z}: a\cdot 0=0$
+ \end{proof}
+ \end{frame}
+
+ \subsection{Numerals and Mathematics}
+ \begin{frame}[label=math]{Numerals and Mathematics}
+ \framesubtitle{Formulae, equations, and expressions}
+ \begin{columns}[onlytextwidth]
+ \column{.20\textwidth}
+ 1234567890
+ \column{.20\textwidth}
+ \oldstylenums{1234567890}
+ \column{.20\textwidth}
+ $\hat{x}$, $\check{x}$, $\tilde{a}$,
+ $\bar{a}$, $\dot{y}$, $\ddot{y}$
+ \column{.40\textwidth}
+ $\int \!\! \int f(x,y,z)\,\mathsf{d}x\mathsf{d}y\mathsf{d}z$
+ \end{columns}
+ \begin{columns}[onlytextwidth]
+ \column{.5\textwidth}
+ $$\frac{1}{\displaystyle 1+
+ \frac{1}{\displaystyle 2+
+ \frac{1}{\displaystyle 3+x}}} +
+ \frac{1}{1+\frac{1}{2+\frac{1}{3+x}}}$$
+ \column{.5\textwidth}
+ $$F:\left| \begin{array}{ccc}
+ F''_{xx} & F''_{xy} & F'_x \\
+ F''_{yx} & F''_{yy} & F'_y \\
+ F'_x & F'_y & 0
+ \end{array}\right| = 0$$
+ \end{columns}
+ \begin{columns}[onlytextwidth]
+ \column{.3\textwidth}
+ $$\mathop{\int \!\!\! \int}_{\mathbf{x} \in \mathds{R}^2}
+ \! \langle \mathbf{x},\mathbf{y}\rangle\,\mathsf{d}\mathbf{x}$$
+ \column{.33\textwidth}
+ $$\overline{\overline{a\alpha}^2+\underline{b\beta}
+ +\overline{\overline{d\delta}}}$$
+ \column{.37\textwidth}
+ $\left] 0,1\right[ + \lceil x \rfloor - \langle x,y\rangle$
+ \end{columns}
+ \begin{columns}[onlytextwidth]
+ \column{.4\textwidth}
+ \begin{eqnarray*}
+ e^x &\approx& 1+x+x^2/2! + \\
+ && {}+x^3/3! + x^4/4!
+ \end{eqnarray*}
+ \column{.6\textwidth}
+ $${n+1\choose k} = {n\choose k} + {n \choose k-1}$$
+ \end{columns}
+ \end{frame}
+
+ \subsection{Figures and Code Listings}
+ \begin{frame}[label=figs1]{Figures}
+ \framesubtitle{Tables, graphs, and images}
+ \begin{table}[!b]
+ {\carlitoTLF % Use monospaced lining figures
+ \begin{tabularx}{\textwidth}{Xrrr}
+ \textbf{Faculty} & \textbf{With \TeX} & \textbf{Total} &
+ \textbf{\%} \\
+ \toprule
+ Faculty of Informatics & 1\,716 & 2\,904 &
+ 59.09 \\% 1433
+ Faculty of Science & 786 & 5\,275 &
+ 14.90 \\% 1431
+ Faculty of $\genfrac{}{}{0pt}{}{\textsf{Economics and}}{%
+ \textsf{Administration}}$ & 64 & 4\,591 &
+ 1.39 \\% 1456
+ Faculty of Arts & 69 & 10\,000 &
+ 0.69 \\% 1421
+ Faculty of Medicine & 8 & 2\,014 &
+ 0.40 \\% 1411
+ Faculty of Law & 15 & 4\,824 &
+ 0.31 \\% 1422
+ Faculty of Education & 19 & 8\,219 &
+ 0.23 \\% 1441
+ Faculty of Social Studies & 12 & 5\,599 &
+ 0.21 \\% 1423
+ Faculty of Sports Studies & 3 & 2\,062 &
+ 0.15 \\% 1451
+ \bottomrule
+ \end{tabularx}}
+ \caption{The distribution of theses written using \TeX\ during 2010--15 at MU}
+ \end{table}
+ \end{frame}
+ \begin{frame}[label=figs2]{Figures}
+ \framesubtitle{Tables, graphs, and images}
+ \begin{figure}[b]
+ \centering
+ % Flipping a coin
+ % Author: cis
+ \tikzset{
+ head/.style = {fill = none, label = center:\textsf{H}},
+ tail/.style = {fill = none, label = center:\textsf{T}}}
+ \scalebox{0.65}{\begin{tikzpicture}[
+ scale = 1.5, transform shape, thick,
+ every node/.style = {draw, circle, minimum size = 10mm},
+ grow = down, % alignment of characters
+ level 1/.style = {sibling distance=3cm},
+ level 2/.style = {sibling distance=4cm},
+ level 3/.style = {sibling distance=2cm},
+ level distance = 1.25cm
+ ]
+ \node[shape = rectangle,
+ minimum width = 6cm, font = \sffamily] {Coin flipping}
+ child { node[shape = circle split, draw, line width = 1pt,
+ minimum size = 10mm, inner sep = 0mm, rotate = 30] (Start)
+ { \rotatebox{-30}{H} \nodepart{lower} \rotatebox{-30}{T}}
+ child { node [head] (A) {}
+ child { node [head] (B) {}}
+ child { node [tail] (C) {}}
+ }
+ child { node [tail] (D) {}
+ child { node [head] (E) {}}
+ child { node [tail] (F) {}}
+ }
+ };
+
+ % Filling the root (Start)
+ \begin{scope}[on background layer, rotate=30]
+ \fill[head] (Start.base) ([xshift = 0mm]Start.east) arc (0:180:5mm)
+ -- cycle;
+ \fill[tail] (Start.base) ([xshift = 0pt]Start.west) arc (180:360:5mm)
+ -- cycle;
+ \end{scope}
+
+ % Labels
+ \begin{scope}[nodes = {draw = none}]
+ \path (Start) -- (A) node [near start, left] {$0.5$};
+ \path (A) -- (B) node [near start, left] {$0.5$};
+ \path (A) -- (C) node [near start, right] {$0.5$};
+ \path (Start) -- (D) node [near start, right] {$0.5$};
+ \path (D) -- (E) node [near start, left] {$0.5$};
+ \path (D) -- (F) node [near start, right] {$0.5$};
+ \begin{scope}[nodes = {below = 11pt}]
+ \node [name = X] at (B) {$0.25$};
+ \node at (C) {$0.25$};
+ \node [name = Y] at (E) {$0.25$};
+ \node at (F) {$0.25$};
+ \end{scope}
+ \end{scope}
+ \end{tikzpicture}}
+ \caption{Tree of probabilities -- Flipping a coin\footnote[frame]{%
+ A derivative of a diagram from \url{texample.net} by cis, CC BY 2.5 licensed}}
+ \end{figure}
+ \end{frame}
+
+ \defverbatim[colored]\sleepSort{
+ \begin{lstlisting}[language=C,tabsize=2]
+ #include <stdio.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
+
+ // This is a comment
+ int main(int argc, char **argv)
+ {
+ while (--c > 1 && !fork());
+ sleep(c = atoi(v[c]));
+ printf("%d\n", c);
+ wait(0);
+ return 0;
+ }
+ \end{lstlisting}}
+ \begin{frame}{Code listings}{An example source code in C}
+ \sleepSort
+ \end{frame}
+
+ \subsection{Citations and Bibliography}
+ \begin{frame}[label=citations]{Citations}
+ \framesubtitle{\TeX, \LaTeX, and Beamer}
+
+ \justifying\TeX\ is a programming language for the typesetting
+ of documents. It was created by Donald Erwin Knuth in the late
+ 1970s and it is documented in \emph{The \TeX
+ book}~\cite{knuth84}.
+
+ In the early 1980s, Leslie Lamport created the initial version
+ of \LaTeX, a high-level language on top of \TeX, which is
+ documented in \emph{\LaTeX : A Document Preparation
+ System}~\cite{lamport94}. There exists a healthy ecosystem of
+ packages that extend the base functionality of \LaTeX;
+ \emph{The \LaTeX\ Companion}~\cite{MG94} acts as a guide
+ through the ecosystem.
+
+ In 2003, Till Tantau created the initial version of Beamer, a
+ \LaTeX\ package for the creation of presentations. Beamer is
+ documented in the \emph{User's Guide to the Beamer
+ Class}~\cite{tantau04}.
+ \end{frame}
+
+ \begin{frame}[label=bibliography]{Bibliography}
+ \framesubtitle{\TeX, \LaTeX, and Beamer}
+ \begin{thebibliography}{9}
+ \bibitem{knuth84}
+ Donald~E.~Knuth.
+ \emph{The \TeX book}.
+ Addison-Wesley, 1984.
+ \bibitem{lamport94}
+ Leslie~Lamport.
+ \emph{\LaTeX : A Document Preparation System}.
+ Addison-Wesley, 1986.
+ \bibitem{MG94}
+ M.~Goossens, F.~Mittelbach, and A.~Samarin.
+ \emph{The \LaTeX\ Companion}.
+ Addison-Wesley, 1994.
+ \bibitem{tantau04}
+ Till~Tantau.
+ \emph{User's Guide to the Beamer Class Version 3.01}.
+ Available at \url{http://latex-beamer.sourceforge.net}.
+ \bibitem{MS05}
+ A.~Mertz and W.~Slough.
+ Edited by B.~Beeton and K.~Berry.
+ \emph{Beamer by example} In TUGboat,
+ Vol. 26, No. 1., pp. 68-73.
+ \end{thebibliography}
+ \end{frame}
+
+ \section{Dark Frames}
+ \begin{darkframes}
+ \subsection{Blind Text}
+ \begin{frame}{Jabberwocky}
+ \framesubtitle{Lewis Carroll}%
+ \begin{tikzpicture}[overlay,remember picture]
+ \node[anchor=south east,xshift=-30pt,yshift=35pt]
+ at (current page.south east) {
+ \includegraphics[width=35mm]{resources/jabberwocky-dark}
+ };
+ \end{tikzpicture}%
+ 'Twas brillig, and the slithy toves\\
+ Did gyre and gimble in the wabe;\\
+ All mimsy were the borogoves,\\
+ And the mome raths outgrabe.\\\bigskip
+
+ “Beware the Jabberwock, my son!\\
+ The jaws that bite, the claws that catch!\\
+ Beware the Jubjub bird, and shun\\
+ The frumious Bandersnatch!”\\
+ \end{frame}
+ \againframe{lists}
+ \subsection{Structuring Elements}
+ \againframe{simmonshall}
+ \againframe{proof}
+ \subsection{Numerals and Mathematics}
+ \againframe{math}
+ \subsection{Figures and Code Listings}
+ \againframe{figs1}
+ \againframe{figs2}
+ \defverbatim[colored]\sleepSort{
+ \begin{lstlisting}[language=C,tabsize=2]
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+// This is a comment
+int main(int argc, char **argv)
+{
+ while (--c > 1 && !fork());
+ sleep(c = atoi(v[c]));
+ printf("%d\n", c);
+ wait(0);
+ return 0;
+}
+ \end{lstlisting}}
+ \begin{frame}{Code listings}{An example source code in C}
+ \sleepSort
+ \end{frame}
+ \subsection{Citations and Bibliography}
+ \againframe{citations}
+ \againframe{bibliography}
+ \end{darkframes}
+\end{document}
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-med-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-pdflatex.pdf
index a9c099bffe..1ca4a91b29 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-med-pdflatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-pdflatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-pdflatex.tex b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-pdflatex.tex
new file mode 100644
index 0000000000..0f8ad83b8f
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/bs/standard-pdflatex.tex
@@ -0,0 +1,398 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% I, the copyright holder of this work, release this work into the
+%% public domain. This applies worldwide. In some countries this may
+%% not be legally possible; if so: I grant anyone the right to use
+%% this work for any purpose, without any conditions, unless such
+%% conditions are required by law.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass{beamer}
+\usetheme[university=bs,faculty=standard]{fibeamer}
+\usepackage[utf8]{inputenc}
+\usepackage[
+ main=english, %% By using `italian`as the main locale
+ %% instead of `english`, you can typeset the
+ %% presentation in Italian.
+ italian %% The additional key allow foreign texts to be
+]{babel} %% typeset as follows:
+%%
+%% \begin{otherlanguage}{italian} ... \end{otherlanguage}
+%%
+%% These macros specify information about the presentation
+\title{Presentation Title} %% that will be typeset on the
+\subtitle{Presentation Subtitle} %% title page.
+\author{Author's Name}
+%% These additional packages are used within the document:
+\usepackage{ragged2e} % `\justifying` text
+\usepackage{booktabs} % Tables
+\usepackage{tabularx}
+\usepackage{tikz} % Diagrams
+\usetikzlibrary{calc, shapes, backgrounds}
+\usepackage{amsmath, amssymb}
+\usepackage{url} % `\url`s
+\usepackage{listings} % Code listings
+\frenchspacing
+\begin{document}
+ \frame[c]{\maketitle}
+
+ \AtBeginSection[]{% Print an outline at the beginning of sections
+ \begin{frame}<beamer>
+ \frametitle{Outline for Section \thesection}
+ \tableofcontents[currentsection]
+ \end{frame}}
+
+ \section{Light Frames}
+ \subsection{Blind Text}
+ \begin{frame}{Jabberwocky}
+ \framesubtitle{Lewis Carroll}%
+ \begin{tikzpicture}[overlay,remember picture]
+ \node[anchor=south east,xshift=-30pt,yshift=35pt]
+ at (current page.south east) {
+ \includegraphics[width=35mm]{resources/jabberwocky-light}
+ };
+ \end{tikzpicture}%
+ 'Twas brillig, and the slithy toves\\
+ Did gyre and gimble in the wabe;\\
+ All mimsy were the borogoves,\\
+ And the mome raths outgrabe.\\\bigskip
+
+ “Beware the Jabberwock, my son!\\
+ The jaws that bite, the claws that catch!\\
+ Beware the Jubjub bird, and shun\\
+ The frumious Bandersnatch!”\\
+ \end{frame}
+
+ \begin{frame}[label=lists]{Lists and locales}
+ \framesubtitle{Lorem ipsum dolor sit amet}
+ \begin{columns}[onlytextwidth]
+ \column{.5\textwidth}
+ \begin{itemize}
+ \item Nulla nec lacinia odio. Curabitur urna tellus.
+ \begin{itemize}
+ \item Fusce id sodales dolor. Sed id metus dui.
+ \begin{itemize}
+ \item Cupio virtus licet mi vel feugiat.
+ \end{itemize}
+ \end{itemize}
+ \end{itemize}
+ \column{.5\textwidth}
+ \begin{enumerate}
+ \item Donec porta, risus porttitor egestas scelerisque video.
+ \begin{enumerate}
+ \item Nunc non ante fringilla, manus potentis cario.
+ \begin{enumerate}
+ \item Pellentesque servus morbi tristique.
+ \end{enumerate}
+ \end{enumerate}
+ \end{enumerate}
+ \end{columns}
+ \bigskip
+ \justifying
+
+ {\raggedright\uselanguage{italian}Fúgge tra sélve spaventóse e scure,
+ per lóchi inabitáti, érmi e selvaggi.
+ che di cerri sentia, d’olmi e di faggi,
+ fatto le avea con subite paure
+ trovar di qua di là strani viaggi...}
+ {\uselanguage{english}The quick, brown fox jumps over the lazy
+ dog.}
+ \end{frame}
+
+ \subsection{Structuring Elements}
+ \begin{frame}[label=simmonshall]{Text blocks}
+ \framesubtitle{In plain, example, and \alert{alert} flavour}
+ \alert{This text} is highlighted.
+
+ \begin{block}{A plain block}
+ This is a plain block containing some \alert{highlighted text}.
+ \end{block}
+ \begin{exampleblock}{An example block}
+ This is an example block containing some \alert{highlighted text}.
+ \end{exampleblock}
+ \begin{alertblock}{An alert block}
+ This is an alert block containing some \alert{highlighted text}.
+ \end{alertblock}
+ \end{frame}
+
+ \begin{frame}[label=proof]{Definitions, theorems, and proofs}
+ \framesubtitle{All integers divide zero}
+ \begin{definition}
+ $\forall a,b\in\mathds{Z}: a\mid b\iff\exists c\in\mathds{Z}:a\cdot c=b$
+ \end{definition}
+ \begin{theorem}
+ $\forall a\in\mathds{Z}: a\mid 0$
+ \end{theorem}
+ \begin{proof}[Proof\nopunct]
+ $\forall a\in\mathds{Z}: a\cdot 0=0$
+ \end{proof}
+ \end{frame}
+
+ \subsection{Numerals and Mathematics}
+ \begin{frame}[label=math]{Numerals and Mathematics}
+ \framesubtitle{Formulae, equations, and expressions}
+ \begin{columns}[onlytextwidth]
+ \column{.20\textwidth}
+ 1234567890
+ \column{.20\textwidth}
+ \oldstylenums{1234567890}
+ \column{.20\textwidth}
+ $\hat{x}$, $\check{x}$, $\tilde{a}$,
+ $\bar{a}$, $\dot{y}$, $\ddot{y}$
+ \column{.40\textwidth}
+ $\int \!\! \int f(x,y,z)\,\mathsf{d}x\mathsf{d}y\mathsf{d}z$
+ \end{columns}
+ \begin{columns}[onlytextwidth]
+ \column{.5\textwidth}
+ $$\frac{1}{\displaystyle 1+
+ \frac{1}{\displaystyle 2+
+ \frac{1}{\displaystyle 3+x}}} +
+ \frac{1}{1+\frac{1}{2+\frac{1}{3+x}}}$$
+ \column{.5\textwidth}
+ $$F:\left| \begin{array}{ccc}
+ F''_{xx} & F''_{xy} & F'_x \\
+ F''_{yx} & F''_{yy} & F'_y \\
+ F'_x & F'_y & 0
+ \end{array}\right| = 0$$
+ \end{columns}
+ \begin{columns}[onlytextwidth]
+ \column{.3\textwidth}
+ $$\mathop{\int \!\!\! \int}_{\mathbf{x} \in \mathds{R}^2}
+ \! \langle \mathbf{x},\mathbf{y}\rangle\,\mathsf{d}\mathbf{x}$$
+ \column{.33\textwidth}
+ $$\overline{\overline{a\alpha}^2+\underline{b\beta}
+ +\overline{\overline{d\delta}}}$$
+ \column{.37\textwidth}
+ $\left] 0,1\right[ + \lceil x \rfloor - \langle x,y\rangle$
+ \end{columns}
+ \begin{columns}[onlytextwidth]
+ \column{.4\textwidth}
+ \begin{eqnarray*}
+ e^x &\approx& 1+x+x^2/2! + \\
+ && {}+x^3/3! + x^4/4!
+ \end{eqnarray*}
+ \column{.6\textwidth}
+ $${n+1\choose k} = {n\choose k} + {n \choose k-1}$$
+ \end{columns}
+ \end{frame}
+
+ \subsection{Figures and Code Listings}
+ \begin{frame}[label=figs1]{Figures}
+ \framesubtitle{Tables, graphs, and images}
+ \begin{table}[!b]
+ {\carlitoTLF % Use monospaced lining figures
+ \begin{tabularx}{\textwidth}{Xrrr}
+ \textbf{Faculty} & \textbf{With \TeX} & \textbf{Total} &
+ \textbf{\%} \\
+ \toprule
+ Faculty of Informatics & 1\,716 & 2\,904 &
+ 59.09 \\% 1433
+ Faculty of Science & 786 & 5\,275 &
+ 14.90 \\% 1431
+ Faculty of $\genfrac{}{}{0pt}{}{\textsf{Economics and}}{%
+ \textsf{Administration}}$ & 64 & 4\,591 &
+ 1.39 \\% 1456
+ Faculty of Arts & 69 & 10\,000 &
+ 0.69 \\% 1421
+ Faculty of Medicine & 8 & 2\,014 &
+ 0.40 \\% 1411
+ Faculty of Law & 15 & 4\,824 &
+ 0.31 \\% 1422
+ Faculty of Education & 19 & 8\,219 &
+ 0.23 \\% 1441
+ Faculty of Social Studies & 12 & 5\,599 &
+ 0.21 \\% 1423
+ Faculty of Sports Studies & 3 & 2\,062 &
+ 0.15 \\% 1451
+ \bottomrule
+ \end{tabularx}}
+ \caption{The distribution of theses written using \TeX\ during 2010--15 at MU}
+ \end{table}
+ \end{frame}
+ \begin{frame}[label=figs2]{Figures}
+ \framesubtitle{Tables, graphs, and images}
+ \begin{figure}[b]
+ \centering
+ % Flipping a coin
+ % Author: cis
+ \tikzset{
+ head/.style = {fill = none, label = center:\textsf{H}},
+ tail/.style = {fill = none, label = center:\textsf{T}}}
+ \scalebox{0.65}{\begin{tikzpicture}[
+ scale = 1.5, transform shape, thick,
+ every node/.style = {draw, circle, minimum size = 10mm},
+ grow = down, % alignment of characters
+ level 1/.style = {sibling distance=3cm},
+ level 2/.style = {sibling distance=4cm},
+ level 3/.style = {sibling distance=2cm},
+ level distance = 1.25cm
+ ]
+ \node[shape = rectangle,
+ minimum width = 6cm, font = \sffamily] {Coin flipping}
+ child { node[shape = circle split, draw, line width = 1pt,
+ minimum size = 10mm, inner sep = 0mm, rotate = 30] (Start)
+ { \rotatebox{-30}{H} \nodepart{lower} \rotatebox{-30}{T}}
+ child { node [head] (A) {}
+ child { node [head] (B) {}}
+ child { node [tail] (C) {}}
+ }
+ child { node [tail] (D) {}
+ child { node [head] (E) {}}
+ child { node [tail] (F) {}}
+ }
+ };
+
+ % Filling the root (Start)
+ \begin{scope}[on background layer, rotate=30]
+ \fill[head] (Start.base) ([xshift = 0mm]Start.east) arc (0:180:5mm)
+ -- cycle;
+ \fill[tail] (Start.base) ([xshift = 0pt]Start.west) arc (180:360:5mm)
+ -- cycle;
+ \end{scope}
+
+ % Labels
+ \begin{scope}[nodes = {draw = none}]
+ \path (Start) -- (A) node [near start, left] {$0.5$};
+ \path (A) -- (B) node [near start, left] {$0.5$};
+ \path (A) -- (C) node [near start, right] {$0.5$};
+ \path (Start) -- (D) node [near start, right] {$0.5$};
+ \path (D) -- (E) node [near start, left] {$0.5$};
+ \path (D) -- (F) node [near start, right] {$0.5$};
+ \begin{scope}[nodes = {below = 11pt}]
+ \node [name = X] at (B) {$0.25$};
+ \node at (C) {$0.25$};
+ \node [name = Y] at (E) {$0.25$};
+ \node at (F) {$0.25$};
+ \end{scope}
+ \end{scope}
+ \end{tikzpicture}}
+ \caption{Tree of probabilities -- Flipping a coin\footnote[frame]{%
+ A derivative of a diagram from \url{texample.net} by cis, CC BY 2.5 licensed}}
+ \end{figure}
+ \end{frame}
+
+ \defverbatim[colored]\sleepSort{
+ \begin{lstlisting}[language=C,tabsize=2]
+ #include <stdio.h>
+ #include <unistd.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
+
+ // This is a comment
+ int main(int argc, char **argv)
+ {
+ while (--c > 1 && !fork());
+ sleep(c = atoi(v[c]));
+ printf("%d\n", c);
+ wait(0);
+ return 0;
+ }
+ \end{lstlisting}}
+ \begin{frame}{Code listings}{An example source code in C}
+ \sleepSort
+ \end{frame}
+
+ \subsection{Citations and Bibliography}
+ \begin{frame}[label=citations]{Citations}
+ \framesubtitle{\TeX, \LaTeX, and Beamer}
+
+ \justifying\TeX\ is a programming language for the typesetting
+ of documents. It was created by Donald Erwin Knuth in the late
+ 1970s and it is documented in \emph{The \TeX
+ book}~\cite{knuth84}.
+
+ In the early 1980s, Leslie Lamport created the initial version
+ of \LaTeX, a high-level language on top of \TeX, which is
+ documented in \emph{\LaTeX : A Document Preparation
+ System}~\cite{lamport94}. There exists a healthy ecosystem of
+ packages that extend the base functionality of \LaTeX;
+ \emph{The \LaTeX\ Companion}~\cite{MG94} acts as a guide
+ through the ecosystem.
+
+ In 2003, Till Tantau created the initial version of Beamer, a
+ \LaTeX\ package for the creation of presentations. Beamer is
+ documented in the \emph{User's Guide to the Beamer
+ Class}~\cite{tantau04}.
+ \end{frame}
+
+ \begin{frame}[label=bibliography]{Bibliography}
+ \framesubtitle{\TeX, \LaTeX, and Beamer}
+ \begin{thebibliography}{9}
+ \bibitem{knuth84}
+ Donald~E.~Knuth.
+ \emph{The \TeX book}.
+ Addison-Wesley, 1984.
+ \bibitem{lamport94}
+ Leslie~Lamport.
+ \emph{\LaTeX : A Document Preparation System}.
+ Addison-Wesley, 1986.
+ \bibitem{MG94}
+ M.~Goossens, F.~Mittelbach, and A.~Samarin.
+ \emph{The \LaTeX\ Companion}.
+ Addison-Wesley, 1994.
+ \bibitem{tantau04}
+ Till~Tantau.
+ \emph{User's Guide to the Beamer Class Version 3.01}.
+ Available at \url{http://latex-beamer.sourceforge.net}.
+ \bibitem{MS05}
+ A.~Mertz and W.~Slough.
+ Edited by B.~Beeton and K.~Berry.
+ \emph{Beamer by example} In TUGboat,
+ Vol. 26, No. 1., pp. 68-73.
+ \end{thebibliography}
+ \end{frame}
+
+ \section{Dark Frames}
+ \begin{darkframes}
+ \subsection{Blind Text}
+ \begin{frame}{Jabberwocky}
+ \framesubtitle{Lewis Carroll}%
+ \begin{tikzpicture}[overlay,remember picture]
+ \node[anchor=south east,xshift=-30pt,yshift=35pt]
+ at (current page.south east) {
+ \includegraphics[width=35mm]{resources/jabberwocky-dark}
+ };
+ \end{tikzpicture}%
+ 'Twas brillig, and the slithy toves\\
+ Did gyre and gimble in the wabe;\\
+ All mimsy were the borogoves,\\
+ And the mome raths outgrabe.\\\bigskip
+
+ “Beware the Jabberwock, my son!\\
+ The jaws that bite, the claws that catch!\\
+ Beware the Jubjub bird, and shun\\
+ The frumious Bandersnatch!”\\
+ \end{frame}
+ \againframe{lists}
+ \subsection{Structuring Elements}
+ \againframe{simmonshall}
+ \againframe{proof}
+ \subsection{Numerals and Mathematics}
+ \againframe{math}
+ \subsection{Figures and Code Listings}
+ \againframe{figs1}
+ \againframe{figs2}
+ \defverbatim[colored]\sleepSort{
+ \begin{lstlisting}[language=C,tabsize=2]
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+// This is a comment
+int main(int argc, char **argv)
+{
+ while (--c > 1 && !fork());
+ sleep(c = atoi(v[c]));
+ printf("%d\n", c);
+ wait(0);
+ return 0;
+}
+ \end{lstlisting}}
+ \begin{frame}{Code listings}{An example source code in C}
+ \sleepSort
+ \end{frame}
+ \subsection{Citations and Bibliography}
+ \againframe{citations}
+ \againframe{bibliography}
+ \end{darkframes}
+\end{document}
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/econ-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/econ-lualatex.pdf
index 99caf4f323..a83549d6e7 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/econ-lualatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/econ-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/econ-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/econ-pdflatex.pdf
index 5118988622..d000a2f2e0 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/econ-pdflatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/econ-pdflatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fi-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fi-lualatex.pdf
index 9c0d968a0a..ee30acd4bf 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fi-lualatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fi-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fi-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fi-pdflatex.pdf
index 14f0faa4ee..22a2ddbf9c 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fi-pdflatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fi-pdflatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fsps-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fsps-lualatex.pdf
index d862e4e438..396950f8e0 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fsps-lualatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fsps-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fsps-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fsps-pdflatex.pdf
index a7b6b044ac..a16d0041cc 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fsps-pdflatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fsps-pdflatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fss-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fss-lualatex.pdf
index 9a8a6de238..1941631a42 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fss-lualatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fss-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fss-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fss-pdflatex.pdf
index 2ce4f56075..1589fc4c42 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fss-pdflatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/fss-pdflatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/law-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/law-lualatex.pdf
index e65d59162f..26b8b06bff 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/law-lualatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/law-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/law-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/law-pdflatex.pdf
index 62d7c4b3cb..5cca8c8fc5 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/law-pdflatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/law-pdflatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/med-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/med-lualatex.pdf
index 52d4a27d2d..5a59ea33d2 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/med-lualatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/med-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/med-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/med-pdflatex.pdf
index d481be2468..3f98837a0f 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/med-pdflatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/med-pdflatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/ped-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/ped-lualatex.pdf
index bee8b171e5..df834fbc1c 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/ped-lualatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/ped-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/ped-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/ped-pdflatex.pdf
index 8a4546f274..be6eafc8e5 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/ped-pdflatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/ped-pdflatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/phil-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/phil-lualatex.pdf
index cac53d577d..cfd1fadee1 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/phil-lualatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/phil-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/phil-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/phil-pdflatex.pdf
index f453ab1d77..db4045a008 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/phil-pdflatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/phil-pdflatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/sci-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/sci-lualatex.pdf
index 3095339004..82bf8a0e27 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/sci-lualatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/sci-lualatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/sci-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/sci-pdflatex.pdf
index 7d69eb9919..b77d449e5a 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/sci-pdflatex.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/example/mu/sci-pdflatex.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/fibeamer.dtx b/macros/latex/contrib/beamer-contrib/themes/fibeamer/fibeamer.dtx
index 5c682e4f5d..373bb74e2a 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/fibeamer.dtx
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/fibeamer.dtx
@@ -54,7 +54,7 @@
\gdef\fibeamer@version@number{#1}
\gdef\fibeamer@version@date{#2}
\gdef\fibeamer@version{#2 #1 fibeamer MU beamer theme}}
-\fibeamer@versiondef{v1.1.8}{2019/12/16}}
+\fibeamer@versiondef{v1.2.0}{2021/09/07}}
% {\newwrite\f\openout\f=VERSION\write\f{\fibeamer@version}\closeout\f}
%
% \changes{v1.1.5:1} {2016/05/18}{Added \texttt{pdfencoding} to the
@@ -67,7 +67,9 @@
% \fi
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
+%
+% \changes{v1.2.0} {2021/09/07}{Added support for the University
+% of Brescia}
% \changes{v1.1.8} {2019/12/15}{Fixed active character \texttt{-}
% in pdf\LaTeX{} example documents.}
% \changes{v1.1.3} {2016/02/24}{Added visual tests of output
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/fibeamer.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/fibeamer.pdf
index 5b5be04e08..2500012d60 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/fibeamer.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/fibeamer.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/econ.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/econ.pdf
index 52013554dd..5a27363329 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/econ.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/econ.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fi.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fi.pdf
index 59c2599100..67cb6d16f3 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fi.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fi.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fsps.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fsps.pdf
index b01f9c9283..c4672905cb 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fsps.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fsps.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fss.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fss.pdf
index cd669bdb59..92056dab2c 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fss.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/fss.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/law.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/law.pdf
index 4b433ec5c6..86a63fc7d3 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/law.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/law.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/med.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/med.pdf
index 322d3ce800..13fa02a0d0 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/med.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/med.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/ped.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/ped.pdf
index 9ced7c4c1e..722bf23657 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/ped.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/ped.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/phil.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/phil.pdf
index 1be53a95b0..8e86f04b13 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/phil.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/phil.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/sci.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/sci.pdf
index 55d65e5bf9..b9c6a14659 100644
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/sci.pdf
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/guide/mu/sci.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/DESCRIPTION b/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/DESCRIPTION
new file mode 100644
index 0000000000..a4140cae2b
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/DESCRIPTION
@@ -0,0 +1,2 @@
+This directory contains the logo files of the
+Università degli Studi di Brescia (Brescia, Italy)
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/Makefile b/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/Makefile
new file mode 100644
index 0000000000..c9a5541a63
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/Makefile
@@ -0,0 +1,13 @@
+EPSFILES=fibeamer-bs-standard-english.eps fibeamer-bs-standard-italian.eps
+.PHONY: all implode
+
+# This target converts all the PDF logos to EPS.
+all: $(EPSFILES)
+
+# This target converts a single PDF logo to EPS.
+%.eps: %.pdf
+ inkscape $< --export-eps=$@
+
+# This target removes all EPS logos.
+implode:
+ rm -f $(EPSFILES)
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/fibeamer-bs-standard-english.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/fibeamer-bs-standard-english.pdf
new file mode 100644
index 0000000000..dfd245656f
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/fibeamer-bs-standard-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/fibeamer-bs-standard-italian.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/fibeamer-bs-standard-italian.pdf
new file mode 100644
index 0000000000..bd1c3c8f7e
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/logo/bs/fibeamer-bs-standard-italian.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/DESCRIPTION b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/DESCRIPTION
deleted file mode 100644
index 4cb935c797..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/DESCRIPTION
+++ /dev/null
@@ -1,3 +0,0 @@
-This directory contains the tests for the base fithesis3 class. It
-can also contain subdirectories with tests for the themes of
-various universities.
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/EXAMPLE/DESCRIPTION b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/EXAMPLE/DESCRIPTION
deleted file mode 100644
index 5b795c1c89..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/EXAMPLE/DESCRIPTION
+++ /dev/null
@@ -1,2 +0,0 @@
-This is an empty directory. You can rename it to match the name of
-your university and place the respective test files in here.
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/DESCRIPTION b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/DESCRIPTION
deleted file mode 100644
index 46e67f7601..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/DESCRIPTION
+++ /dev/null
@@ -1,3 +0,0 @@
-This directory contains precompiled files from the `/example/mu`
-directory. These files are visually compared against fresh-compiled
-files from the `/example/mu` directory.
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/Makefile b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/Makefile
deleted file mode 100644
index 51cc09cb88..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-.PHONY: all implode
-TARGETS=expected-econ-lualatex.pdf expected-fss-pdflatex.pdf \
- expected-phil-lualatex.pdf expected-econ-pdflatex.pdf \
- expected-law-lualatex.pdf expected-phil-pdflatex.pdf \
- expected-fi-lualatex.pdf expected-law-pdflatex.pdf \
- expected-sci-lualatex.pdf expected-fi-pdflatex.pdf \
- expected-med-lualatex.pdf expected-sci-pdflatex.pdf \
- expected-fsps-lualatex.pdf expected-med-pdflatex.pdf \
- expected-fsps-pdflatex.pdf expected-ped-lualatex.pdf \
- expected-fss-lualatex.pdf expected-ped-pdflatex.pdf
-EXAMPLEDIR=../../example/mu
-
-# This target runs all the tests.
-all:
- make -C $(EXAMPLEDIR) implode
- make -C $(EXAMPLEDIR) all
- make $(TARGETS)
-
-# This target runs a single test.
-expected-%.pdf: $(EXAMPLEDIR)/%.pdf
- ../comparepdf.sh $< $@ || \
- { [ "$(UPDATE_FAILED)" = true ] && mv $< $@; }
-
-# This is a dummy target.
-implode:
-
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-econ-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-econ-lualatex.pdf
deleted file mode 100644
index 0fa9e366d7..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-econ-lualatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-econ-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-econ-pdflatex.pdf
deleted file mode 100644
index ac84d26944..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-econ-pdflatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fi-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fi-lualatex.pdf
deleted file mode 100644
index 3ac69cdf67..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fi-lualatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fi-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fi-pdflatex.pdf
deleted file mode 100644
index 00e318baf4..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fi-pdflatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fsps-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fsps-lualatex.pdf
deleted file mode 100644
index b24e7eb642..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fsps-lualatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fsps-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fsps-pdflatex.pdf
deleted file mode 100644
index f90c9f14bd..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fsps-pdflatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fss-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fss-lualatex.pdf
deleted file mode 100644
index f3b868b8fa..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fss-lualatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fss-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fss-pdflatex.pdf
deleted file mode 100644
index 1dc5ee24c5..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-fss-pdflatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-law-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-law-lualatex.pdf
deleted file mode 100644
index 5bd2cc8bb0..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-law-lualatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-law-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-law-pdflatex.pdf
deleted file mode 100644
index ef87412631..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-law-pdflatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-ped-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-ped-lualatex.pdf
deleted file mode 100644
index b51076bdfa..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-ped-lualatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-ped-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-ped-pdflatex.pdf
deleted file mode 100644
index 0d0e6f02c0..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-ped-pdflatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-phil-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-phil-lualatex.pdf
deleted file mode 100644
index a55497584b..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-phil-lualatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-phil-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-phil-pdflatex.pdf
deleted file mode 100644
index c1b3e5ad59..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-phil-pdflatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-sci-lualatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-sci-lualatex.pdf
deleted file mode 100644
index fe85351287..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-sci-lualatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-sci-pdflatex.pdf b/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-sci-pdflatex.pdf
deleted file mode 100644
index 42d63adfe5..0000000000
--- a/macros/latex/contrib/beamer-contrib/themes/fibeamer/test/mu/expected-sci-pdflatex.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/DESCRIPTION b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/DESCRIPTION
new file mode 100644
index 0000000000..78f6002443
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/DESCRIPTION
@@ -0,0 +1,2 @@
+This directory contains an unofficial theme for the
+Università degli Studi di Brescia (Brescia, Italy)
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/Makefile b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/Makefile
new file mode 100644
index 0000000000..d0cca3f810
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/Makefile
@@ -0,0 +1,15 @@
+LOGS=base.log standard.log
+OUTPUT= \
+ beamercolorthemefibeamer-bs.sty beamerfontthemefibeamer-bs.sty \
+ beamerinnerthemefibeamer-bs.sty beamerouterthemefibeamer-bs.sty \
+ beamercolorthemefibeamer-bs-standard.sty \
+
+.PHONY: explode implode clean all
+all: explode
+explode: $(LOGS)
+
+%.log: %.ins %.dtx
+ xetex $<
+
+implode:
+ rm -f $(OUTPUT) $(LOGS)
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/base.dtx b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/base.dtx
new file mode 100644
index 0000000000..bd98ea6773
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/base.dtx
@@ -0,0 +1,355 @@
+% \iffalse
+%<*color>
+% \fi\file{theme/bs/beamercolorthemefibeamer-bs.sty}
+% This is the base color theme for presentations written at the
+% Masaryk University in Brno.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{fibeamer/theme/bs/%
+ beamercolorthemefibeamer-bs}[2016/05/06]
+% \end{macrocode}
+% \begin{macro}{\darkframes}
+% The |darkframes| environment switches the color definitions to
+% render the enclosed frames in dark colors. This is a dummy
+% definition, which will be overridden by the subsequently loaded
+% color theme in the presentation mode.
+% \begin{macrocode}
+\newenvironment{darkframes}{}{}
+% \end{macrocode}
+% \end{macro}
+% The rest of the theme will be ignored outside the presentation
+% mode.
+% \begin{macrocode}
+\mode<presentation>
+% \end{macrocode}
+% The theme loads the following packages, which will be used by the
+% subsequently loaded color theme specific to a faculty:
+% \begin{itemize}
+% \item\textsf{listings} -- This package is used for code
+% listings. The subsequently loaded color theme will specify
+% source code coloring for the package.
+% \item\textsf{ifthen} -- This package is used to construct
+% compound conditionals.
+% \item\textsf{tikz} -- This package is used to create gradient
+% background for dark slides.
+% \end{itemize}
+% \begin{macrocode}
+ \RequirePackage{listings}
+ \RequirePackage{ifthen}
+ \RequirePackage{tikz}
+% \end{macrocode}
+% \begin{macro}{\iffibeamer@dark}
+% The |\iffibeamer@dark| conditional will be switched on and off by
+% the subsequently loaded color theme based on whether or not the
+% given frame is being typeset in light or dark colors. This
+% information will be used by outer themes to insert the correct
+% logo into each frame.
+% \begin{macrocode}
+ \newif\iffibeamer@dark\fibeamer@darkfalse
+% \end{macrocode}
+% \end{macro}
+% A frame that is either title or dark, as specified by the value
+% of the |\iffibeamer@dark| conditional, will have a gradient
+% background as specified by the |fibeamer@dark@backgroundInner|
+% and |fibeamer@light@backgroundOuter| colors that shall be defined
+% by the subsequently loaded color theme.
+%
+% A frame that is neither title nor dark, as specified by the value
+% of the |\iffibeamer@dark| conditional, will have a gradient
+% background as specified by the |fibeamer@light@backgroundInner|
+% and |fibeamer@light@backgroundOuter| colors that shall be defined
+% by the subsequently loaded color theme.
+% \begin{macrocode}
+ \defbeamertemplate*{background canvas}{fibeamer}{%
+ \ifthenelse{%
+ \boolean{fibeamer@dark} \OR \c@framenumber=0
+ }{%
+ \begin{tikzpicture}
+ \clip (0,\fibeamer@lengths@clipbottom) rectangle
+ (\paperwidth,\fibeamer@lengths@cliptop);
+ \path [inner color = fibeamer@dark@backgroundInner,
+ outer color = fibeamer@dark@backgroundOuter]
+ (0,0) rectangle (\paperwidth,\paperwidth);
+ \end{tikzpicture}
+ }{%
+ \begin{tikzpicture}
+ \clip (0,\fibeamer@lengths@clipbottom) rectangle
+ (\paperwidth,\fibeamer@lengths@cliptop);
+ \path [inner color = fibeamer@light@backgroundInner,
+ outer color = fibeamer@light@backgroundOuter]
+ (0,0) rectangle (\paperwidth,\paperwidth);
+ \end{tikzpicture}
+ }}
+% \end{macrocode}
+% The |\qed| symbol inserted at the end of proofs will have the
+% same color as the rest of the proof.
+% \begin{macrocode}
+ \setbeamercolor{qed symbol}{%
+ use=block body,
+ fg=block body.fg,
+ bg=block body.bg}
+% \end{macrocode}
+% The links can be colored by the subsequently loaded color themes.
+% \begin{macrocode}
+ \hypersetup{colorlinks,linkcolor=}
+\mode
+<all>
+% \end{macrocode}
+% \iffalse
+%</color>
+%<*font>
+% \fi\file{theme/bs/beamerfontthemefibeamer-bs.sty}
+% This is the base font theme for presentations written at the
+% Masaryk University in Brno. The theme has no effect outside the
+% presentation mode.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{fibeamer/theme/bs/%
+ beamerfontthemefibeamer-bs}[2016/01/12]
+\mode<presentation>
+ \setbeamerfont{normal text}{size=\normalsize}
+ \setbeamerfont{title}{size=\LARGE, series=\bfseries}
+ \setbeamerfont{subtitle}{parent=normal text, size=\Large}
+ \setbeamerfont{frametitle}{size=\Large}
+ \setbeamerfont{framesubtitle}{size=\large, shape=\itshape}
+ \setbeamerfont{description item}{series=\bfseries}
+ \setbeamerfont{author}{size=\large}
+\mode
+<all>
+% \end{macrocode}
+% \iffalse
+%</font>
+%<*inner>
+% \fi\file{theme/bs/beamerinnerthemefibeamer-bs.sty}
+% This is the base inner theme for presentations written at the
+% Masaryk University in Brno. The theme has no effect outside the
+% presentation mode.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{fibeamer/theme/bs/%
+ beamerinnerthemefibeamer-bs}[2016/01/14]
+\mode<presentation>
+% \end{macrocode}
+% This part of the inner theme defines the design of lists.
+% \begin{macrocode}
+\defbeamertemplate*{itemize item}{fibeamer}{$\bullet$}
+\defbeamertemplate*{itemize subitem}{fibeamer}{\---}
+\defbeamertemplate*{itemize subsubitem}{fibeamer}{\guillemotright}
+% \end{macrocode}
+% This part of the inner theme defines the design of bibliography
+% items and citations.^^A
+% \begin{macrocode}
+\defbeamertemplate*{bibliography item}{fibeamer}{\insertbiblabel}
+\AtBeginDocument{%
+ \let\fibeamer@oldcite\cite
+ \def\cite#1{{%
+ \usebeamercolor[fg]{item}%
+ \fibeamer@oldcite{#1}}}}
+% \end{macrocode}
+% This part of the inner theme defines the design of the table of
+% contents.
+% \begin{macrocode}
+\defbeamertemplate*{section in toc}{fibeamer}{%
+ \usebeamercolor[fg]{item}%
+ \inserttocsectionnumber.%
+ \usebeamercolor[fg]{structure}%
+ \kern1.25ex\inserttocsection\par}
+\defbeamertemplate*{subsection in toc}{fibeamer}{%
+ \hspace\leftmargini
+ \usebeamercolor[fg]{item}%
+ \inserttocsectionnumber.\inserttocsubsectionnumber%
+ \usebeamercolor[fg]{structure}%
+ \kern1.25ex\inserttocsubsection\par}
+\defbeamertemplate*{subsubsection in toc}{fibeamer}{%
+ \hspace\leftmargini
+ \hspace\leftmarginii
+ \usebeamercolor[fg]{item}%
+ \inserttocsectionnumber.\inserttocsubsectionnumber.%
+ \inserttocsubsubsectionnumber%
+ \usebeamercolor[fg]{structure}%
+ \kern1.25ex\inserttocsubsubsection\par}
+\mode
+<all>
+% \end{macrocode}
+% \iffalse
+%</inner>
+%<*outer>
+% \fi\file{theme/bs/beamerouterthemefibeamer-bs.sty}
+% This is the base outer theme for presentations written at the
+% Masaryk University in Brno. The theme has no effect outside the
+% presentation mode.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{fibeamer/theme/bs/%
+ beamerouterthemefibeamer-bs}[2016/01/12]
+\mode<presentation>
+% \end{macrocode}
+% The theme uses the following packages:
+% \begin{itemize}
+% \item\textsf{ifthen} -- This package is used to construct
+% compound conditionals.
+% \item\textsf{ifpdf} -- This package is used to check, whether
+% the document is being typeset in DVI mode. If it is, then
+% the |\pdfpagewidth| and |\pdfpageheight| dimensions are
+% defined, so that positioning in TikZ works correctly.
+% \changes{v1.0.1}{2015/10/03}{Added DVI output support. [VN]}
+% ^^A <http://tex.stackexchange.com/a/246631/70941>
+% \item\textsf{tikz} -- This package is used to position the
+% logo and the frame number on a frame.
+% \item\textsf{pgfcore} -- This package is used to draw the
+% dashed line at the title frame.
+% \end{itemize}
+% \begin{macrocode}
+ \RequirePackage{ifthen}
+ \RequirePackage{ifpdf}
+ \ifpdf\else
+ \@ifundefined{pdfpagewidth}{\newdimen\pdfpagewidth}{}
+ \@ifundefined{pdfpageheight}{\newdimen\pdfpageheight}{}
+ \pdfpagewidth=\paperwidth
+ \pdfpageheight=\paperheight
+ \fi
+ \RequirePackage{tikz}
+ \RequirePackage{pgfcore}
+% \end{macrocode}
+% This part of the outer theme defines the geometry of the frames
+% along with other dimensions.
+% \begin{macrocode}
+ \newlength\fibeamer@lengths@baseunit
+ \fibeamer@lengths@baseunit=3.75mm
+ % The footer padding
+ \newlength\fibeamer@lengths@footerpad
+ \setlength\fibeamer@lengths@footerpad{%
+ \fibeamer@lengths@baseunit}
+ % The side margins
+ \newlength\fibeamer@lengths@margin
+ \setlength\fibeamer@lengths@margin{%
+ 3\fibeamer@lengths@baseunit}
+ \setbeamersize{
+ text margin left=\fibeamer@lengths@margin,
+ text margin right=\fibeamer@lengths@margin}
+ % The upper margin
+ \newlength\fibeamer@lengths@titleline
+ \setlength\fibeamer@lengths@titleline{%
+ 3\fibeamer@lengths@baseunit}
+ % The background clipping
+ \newlength\fibeamer@lengths@clipbottom
+ \setlength\fibeamer@lengths@clipbottom\paperwidth
+ \addtolength\fibeamer@lengths@clipbottom{-\paperheight}
+ \setlength\fibeamer@lengths@clipbottom{%
+ 0.5\fibeamer@lengths@clipbottom}
+ \newlength\fibeamer@lengths@cliptop
+ \setlength\fibeamer@lengths@cliptop\paperwidth
+ \addtolength\fibeamer@lengths@cliptop{%
+ -\fibeamer@lengths@clipbottom}
+
+ % The logo size
+ \newlength\fibeamer@lengths@logowidth
+ \setlength\fibeamer@lengths@logowidth{%
+ 10.5\fibeamer@lengths@baseunit}
+ \newlength\fibeamer@lengths@logoheight
+ \setlength\fibeamer@lengths@logoheight{%
+ 4,37\fibeamer@lengths@baseunit}
+% \end{macrocode}
+% The outer theme completely culls the bottom navigation.
+% \begin{macrocode}
+ \defbeamertemplate*{navigation symbols}{fibeamer}{}
+% \end{macrocode}
+% The outer theme also culls the headline.
+% \begin{macrocode}
+ \defbeamertemplate*{headline}{fibeamer}{}
+% \end{macrocode}
+% The frame title.
+% \begin{macrocode}
+ \defbeamertemplate*{frametitle}{fibeamer}{%
+ \vskip-1em % Align the text with the top border
+ \vskip\fibeamer@lengths@titleline
+ \usebeamercolor[fg]{frametitle}%
+ \usebeamerfont{frametitle}%
+ \insertframetitle\par%
+ \usebeamercolor[fg]{framesubtitle}%
+ \usebeamerfont{framesubtitle}%
+ \insertframesubtitle}
+% \end{macrocode}
+% The footline contains the frame number. It is flushed right.
+% \begin{macrocode}
+ \defbeamertemplate*{footline}{fibeamer}{%
+ \ifnum\c@framenumber=0\else%
+ \begin{tikzpicture}[overlay]
+ \node[anchor=south east,
+ yshift=\fibeamer@lengths@footerpad,
+ xshift=-\fibeamer@lengths@footerpad] at
+ (current page.south east) {
+ \usebeamercolor[fg]{framenumber}%
+ \usebeamerfont{framenumber}%
+ \insertframenumber/\inserttotalframenumber};
+ \end{tikzpicture}
+ \fi}
+% \end{macrocode}
+% The title frame contains the main logo, the |\title|, the
+% |\subtitle|, and the |\author|.
+% \begin{macrocode}
+ \defbeamertemplate*{title page}{fibeamer}{%
+
+ \begin{darkframes}
+
+ % This is slide 0
+ \setcounter{framenumber}{0}
+
+ % Input the university logo
+ \begin{tikzpicture}[
+ remember picture,
+ overlay,
+ xshift=0.5\fibeamer@lengths@logowidth,
+ yshift=0.5\fibeamer@lengths@logoheight
+ ]
+ \node at (0,0) {
+ \fibeamer@includeLogo[
+ width=\fibeamer@lengths@logowidth,
+ height=\fibeamer@lengths@logoheight
+ ]};
+ \end{tikzpicture}
+
+ % Input the title
+ \usebeamerfont{title}%
+ \usebeamercolor[fg]{title}%
+ \begin{minipage}[b][2\baselineskip][b]{\textwidth}%
+ \raggedright\inserttitle
+ \end{minipage}
+ \vskip-.5\baselineskip
+
+ % Input the dashed line
+ \begin{pgfpicture}
+ \pgfsetlinewidth{2pt}
+ \pgfsetroundcap
+ \pgfsetdash{{0pt}{4pt}}{0cm}
+
+ \pgfpathmoveto{\pgfpoint{0mm}{0mm}}
+ \pgfpathlineto{\pgfpoint{\textwidth}{0mm}}
+
+ \pgfusepath{stroke}
+ \end{pgfpicture}
+ \vfill
+
+ % Input the subtitle
+ \usebeamerfont{subtitle}%
+ \usebeamercolor[fg]{subtitle}%
+ \begin{minipage}{\textwidth}
+ \raggedright%
+ \insertsubtitle%
+ \end{minipage}\vskip.25\baselineskip
+
+ % Input the author's name
+ \usebeamerfont{author}%
+ \usebeamercolor[fg]{author}%
+ \begin{minipage}{\textwidth}
+ \raggedright%
+ \insertauthor%
+ \end{minipage}
+ \end{darkframes}}
+
+\mode
+<all>
+% \end{macrocode}
+% \iffalse
+%</outer>
+% \fi
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/base.ins b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/base.ins
new file mode 100644
index 0000000000..2432a41d26
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/base.ins
@@ -0,0 +1,6 @@
+\input ../../LICENSE
+\generate{\file{beamercolorthemefibeamer-bs.sty}{\from{base.dtx}{color}}
+ \file{beamerfontthemefibeamer-bs.sty} {\from{base.dtx}{font}}
+ \file{beamerinnerthemefibeamer-bs.sty}{\from{base.dtx}{inner}}
+ \file{beamerouterthemefibeamer-bs.sty}{\from{base.dtx}{outer}}}
+\endbatchfile
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/standard.dtx b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/standard.dtx
new file mode 100644
index 0000000000..d747275cc1
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/standard.dtx
@@ -0,0 +1,113 @@
+% \file{theme/bs/beamercolorthemefibeamer-standard.sty}
+% This is the color theme for all the presentations written at the
+% University of Brescia. This theme has no effect outside the presentation mode.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{fibeamer/theme/bs/%
+ beamercolorthemefibeamer-bs-standard}[2021-08-27]
+\mode<presentation>
+% \end{macrocode}
+% This color theme uses the combination of yellow and shades of gray. The
+% |fibeamer@{dark,|\-|light}@background{Inner,|\-|Outer}| colors are used
+% within the background canvas template, which is defined within the base
+% color theme of the Masaryk University and which draws the gradient
+% background of the frames.
+% \begin{macrocode}
+ \definecolor{fibeamer@black}{HTML}{2B2E34}
+ \definecolor{fibeamer@white}{HTML}{FFFFFF}
+ \definecolor{fibeamer@blue}{HTML}{3C5896}
+ \colorlet{fibeamer@lightBlue}{fibeamer@blue!30!fibeamer@white}
+ \colorlet{fibeamer@darkBlue}{fibeamer@blue!50!fibeamer@black}
+ \definecolor{fibeamer@gray}{HTML}{BFBFBF}
+ \definecolor{fibeamer@lightOrange}{HTML}{FFA25E}
+ \colorlet{fibeamer@orange}{fibeamer@lightOrange!80!fibeamer@darkBlue}
+
+ %% Background gradients
+ \colorlet{fibeamer@dark@backgroundInner}{fibeamer@darkBlue}
+ \colorlet{fibeamer@dark@backgroundOuter}{fibeamer@darkBlue}
+ \colorlet{fibeamer@light@backgroundInner}{fibeamer@white}
+ \colorlet{fibeamer@light@backgroundOuter}{fibeamer@white}
+% \end{macrocode}
+% The |darkframes| environment switches the |\iffibeamer@darktrue|
+% conditional on and sets a dark color theme.
+% \begin{macrocode}
+ \renewenvironment{darkframes}{%
+ \begingroup
+ \fibeamer@darktrue
+ %% Structures
+ \setbeamercolor*{frametitle}{fg=fibeamer@gray!30!fibeamer@white}
+ \setbeamercolor*{framesubtitle}{fg=fibeamer@gray!30!fibeamer@white}
+ %% Text
+ \setbeamercolor*{normal text}{fg=fibeamer@white, bg=fibeamer@blue}
+ \setbeamercolor*{structure}{fg=fibeamer@white, bg=fibeamer@blue}
+
+ \setbeamercolor*{alerted text}{fg=fibeamer@lightOrange}
+
+ %% Items, footnotes and links
+ \setbeamercolor*{item}{fg=fibeamer@lightBlue}
+ \setbeamercolor*{footnote mark}{fg=fibeamer@lightBlue}
+ \hypersetup{urlcolor=fibeamer@lightBlue, citecolor=fibeamer@lightBlue}
+ %% Blocks
+ \setbeamercolor*{block title}{%
+ fg=fibeamer@white, bg=fibeamer@blue!60!fibeamer@white}
+ \setbeamercolor*{block title example}{%
+ fg=fibeamer@white, bg=fibeamer@blue!60!fibeamer@white}
+ \setbeamercolor*{block title alerted}{%
+ fg=fibeamer@darkBlue, bg=fibeamer@lightOrange}
+ \setbeamercolor*{block body}{%
+ fg=fibeamer@blue,
+ bg=fibeamer@gray!15!fibeamer@white}
+ \usebeamercolor*{normal text}
+ % Code listings
+ \lstset{%
+ commentstyle=\color{green!30!fibeamer@white},
+ keywordstyle=\color{blue!30!fibeamer@white},
+ stringstyle=\color{fibeamer@blue!30!fibeamer@white}}
+ }{%
+ \endgroup}
+% \end{macrocode}
+% Outside the |darkframes| environment, the light theme is used.
+% \begin{macrocode}
+ %% Structures
+ \setbeamercolor{frametitle}{fg=fibeamer@blue}
+ \setbeamercolor{framesubtitle}{fg=fibeamer@black!75!fibeamer@white}
+ %% Text
+ \setbeamercolor{normal text}{fg=fibeamer@black, bg=fibeamer@white}
+ \setbeamercolor{structure}{fg=fibeamer@black, bg=fibeamer@white}
+
+ \setbeamercolor{alerted text}{fg=red}
+ \addtobeamertemplate{block begin}{%
+ \iffibeamer@dark % alerted text in plain block at dark slides
+ \setbeamercolor{alerted text}{fg=fibeamer@orange}%
+ \fi}{}
+
+ %% Items, footnotes and links
+ \setbeamercolor{item}{fg=fibeamer@blue}
+ \setbeamercolor{footnote mark}{fg=fibeamer@blue}
+ \hypersetup{urlcolor=fibeamer@blue, citecolor=fibeamer@blue}
+ %% Blocks
+ \setbeamercolor{block title}{%
+ fg=fibeamer@white, bg=fibeamer@blue}
+ \setbeamercolor{block title example}{%
+ fg=fibeamer@white, bg=fibeamer@blue}
+ \setbeamercolor{block title alerted}{%
+ fg=fibeamer@white, bg=red}
+ \setbeamercolor{block body}{%
+ fg=fibeamer@blue, bg=fibeamer@gray!20!fibeamer@white}
+ %% Title
+ \setbeamercolor{title}{fg=fibeamer@white, bg=fibeamer@blue}
+ % Code listings
+ \lstset{%
+ basicstyle=\footnotesize\ttfamily,
+ breakatwhitespace=false,
+ breaklines=true,
+ commentstyle=\color{green!60!fibeamer@black},
+ extendedchars=true,
+ keywordstyle=\color{blue},
+ showspaces=false,
+ showstringspaces=false,
+ showtabs=false,
+ stringstyle=\color{violet}}
+\mode
+<all>
+% \end{macrocode}
diff --git a/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/standard.ins b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/standard.ins
new file mode 100644
index 0000000000..a7ce8eaee6
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/fibeamer/theme/bs/standard.ins
@@ -0,0 +1,3 @@
+\input ../../LICENSE
+\generate{\file{beamercolorthemefibeamer-bs-standard.sty}{\from{standard.dtx}{}}}
+\endbatchfile
diff --git a/macros/latex/contrib/ccool/README.md b/macros/latex/contrib/ccool/README.md
index a3801bd081..2c7340c3ef 100644
--- a/macros/latex/contrib/ccool/README.md
+++ b/macros/latex/contrib/ccool/README.md
@@ -1,7 +1,6 @@
-----------------------------------------------------------------
-##### ccool --- A key-value document command parser
+-----------------------------------------------------------------
+##### ccool --- (Custom) COntext Oriented LaTeX
- Source repository: https://github.com/rogard/ccool
- Released under the LaTeX Project Public License v1.3c or later
- See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
+-----------------------------------------------------------------
diff --git a/macros/latex/contrib/ccool/ccool.bib b/macros/latex/contrib/ccool/ccool.bib
new file mode 100644
index 0000000000..2e33736500
--- /dev/null
+++ b/macros/latex/contrib/ccool/ccool.bib
@@ -0,0 +1,50 @@
+@phdthesis{oh-2005,
+ author = {Olympia Hadjiliadis},
+ title = {Change--point detection of two--sided alternatives in the Brownian motion model and its connection to the gambler's ruin problem with relative wealth perception},
+ year = {2005},
+ school = {Columbia University}
+}
+@misc{a-547018,
+ author = {@{}Javier Bezos},
+ title = {When loading babel with spanish, spurious document command parser},
+ note = {\url{https://tex.stackexchange.com/a/547018/112708}},
+ year = {2020}}
+@misc{a-536597,
+ author = {@{}frougon},
+ title = {``Journaling calls to a function \textdel{taking inline code as argument}''},
+ year = {2020},
+ note = {\url{https://tex.stackexchange.com/a/536620}}}
+@manual{interface3,
+ title = {The \LaTeX3 interfaces},
+ author = {The \LaTeX3 Project Team},
+ year = {2019},
+ note = {\url{https://ctan.math.washington.edu/tex-archive/macros/latex/contrib/l3kernel/expl3.pdf}},
+ annote = {} }
+@manual{xparse,
+ title = {The \pkg{xparse} package},
+ author = {The \LaTeX3 Project Team},
+ year = {2019},
+ note = {\url{https://ctan.math.illinois.edu/macros/latex/contrib/l3packages/xparse.pdf}},
+ annote = {} }
+@manual{2005-cool,
+ title = {The \pkg{cool} package},
+ author = {Nick Setzer},
+ year = {2005},
+ note = {\url{https://www.ctan.org/pkg/cool}},
+ annote = {} }
+@manual{l3build,
+ title = {The \pkg{l3build} package},
+ author = {The \LaTeX3 Project Team},
+ year = {2019},
+ note = {\url{https://ctan.math.washington.edu/tex-archive/macros/latex/contrib/l3build/l3build.pdf}},
+ annote = {} }
+@manual{tcolorbox,
+ title = {The \pkg{tcolorbox} package},
+ author = {Sturm, Thomas F.},
+ year = {2019},
+ note = {\url{http://www.texdoc.net/texmf-dist/doc/latex/tcolorbox/tcolorbox.pdf}},
+ annote = {} }
+@misc{p158966,
+ title = {\cs{Ccool}, extension à \LaTeX~à vocation mathématique},
+ note = {\url{http://forum.mathematex.net/latex-f6/ccool-extension-latex-a-vocation-mathematique-t17314.html}},
+ year = {2020}}
diff --git a/macros/latex/contrib/ccool/ccool.dtx b/macros/latex/contrib/ccool/ccool.dtx
index 933183883d..0d7add543e 100644
--- a/macros/latex/contrib/ccool/ccool.dtx
+++ b/macros/latex/contrib/ccool/ccool.dtx
@@ -4,13 +4,12 @@
\iffalse
%</internal>
%<*readme>
-----------------------------------------------------------------
-##### ccool --- A key-value document command parser
+-----------------------------------------------------------------
+##### ccool --- (Custom) COntext Oriented LaTeX
- Source repository: https://github.com/rogard/ccool
- Released under the LaTeX Project Public License v1.3c or later
- See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
+-----------------------------------------------------------------
%</readme>
%<*internal>
\fi
@@ -24,8 +23,8 @@
\keepsilent
\askforoverwritefalse
\preamble
-----------------------------------------------------------------------------
-ccool --- A key-value document command parser
+-----------------------------------------------------------------------------
+ccool --- (Custom) COntext Oriented LaTeX
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
----------------------------------------------------------------------------
@@ -33,7 +32,7 @@ See http://www.latex-project.org/lppl.txt
\endpreamble
\postamble
-Copyright (C) 2020 by Erwann Rogard
+Copyright (C) 2020-2021 by Erwann Rogard
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
@@ -68,120 +67,111 @@ ccool.sty, and ccool.pdf.
\expandafter\endgroup
\fi
%</internal>
-%<package> \NeedsTeXFormat{LaTeX2e}[2020/02/02]
-%<package> \RequirePackage{erw-l3}[2020/06/04]
-%<package> \RequirePackage{etoolbox}[2019/09/21]
-%<package> \RequirePackage{l3keys2e}[2020/03/06]
-%<package> \RequirePackage{xparse}[2020/03/06]
+%<package> \NeedsTeXFormat{LaTeX2e}[2021-06-01]
+%<package> \RequirePackage{expl3, xparse, l3keys2e}[2021-06-01]
+%<package> \RequirePackage{lambdax}[2021-06-01]
%<package> \ProvidesExplPackage
-%<package> {ccool} % Package name
-%<package> {2020/10/10} % Release date
-%<package> {3.1} % Release version
-%<package> {cool --- A key-value document command parser} % Description
-%
-%<*driver>
-\RequirePackage{fvextra, xparse}%^^A\NB{done}{Warning:csquotes should be loaded after fvextra->nope}
-\documentclass[full, show-notes]{l3doc}
-\listfiles
-%^^A\usepackage{xparse, longtable, array, booktabs}
-\ExplSyntaxOn
-\clist_new:N \g__ccooldoc_usepackage_clist
-\cs_new_protected:Nn \__ccooldoc_usepackage:n
-{
- \clist_put_right:Nn \g__ccooldoc_usepackage_clist
- {
- \textbackslash{}usepackage\char`{ #1 \char`}
- }
- \usepackage{#1}
-}
-\cs_new_protected:Nn \__ccooldoc_usepackage:nn
-{
- \clist_put_right:Nn \g__ccooldoc_usepackage_clist
- {
- {
- \textbackslash{}
- usepackage
- \char`[ #1 \char`]
- \char`{ #2 \char`}
- }
- }
- \usepackage[#1]{#2}
-}
-\cs_new:Nn \__ccooldoc_usepackage:
-{
- \texttt
- {
- \noindent
- \clist_use:Nnnn \g__ccooldoc_usepackage_clist { \\ } { \\ } { \\ }
- }
-}
-\__ccooldoc_usepackage:n{amsmath, amssymb}
-\__ccooldoc_usepackage:nn{
-%^^A afrikaans,
-%^^A basque,
-%^^A catalan,
-%^^A croatian,
-%^^A czech,
-%^^A danish,
-%^^A dutch,
-%^^A %^^A esperanto, % ERROR
-%^^A estonian,
-%^^A finnish,
-french,
-%^^A % ^^A galician, % ERROR
-german,
-%^^A hungarian,
-%^^A icelandic,
-%^^A indonesian,
-%^^A irish,
-%^^A italian,
-%^^A %^^A kurmanji, % ERROR
-%^^A latin,
-%^^A %^^A latvian, % ERROR
-%^^A lithuanian,
-%^^A ngerman,
-%^^A polish,
-%^^A portuguese,
-%^^A romanian,
-%^^A slovak,
-spanish.noquoting,
-%^^A swedish,
-%^^A swissgerman,
-%^^A turkish,
-%^^A turkmen,
-%^^A welsh,
-english
-}
-{babel}
-\__ccooldoc_usepackage:n{bookmark, ccool, microtype, tabto, tcolorbox}
-\__ccooldoc_usepackage:nn{T1}{fontenc}% \char`[
- \ExplSyntaxOff
-\tcbuselibrary{listings, breakable}
-\makeatletter
-\newcommand*{\docsetnameref}{\def\@currentlabelname}%https://tex.stackexchange.com/questions/537751
-\makeatother
-\ExplSyntaxOn
-\tl_gset:Nn \partname {Part}
-\ExplSyntaxOff
+%<package> {ccool} % Package name
+%<package> {2021-09-20} % Release date
+%<package> {3.2} % Release version
+%<package> {ccool --- (Custom) COntext Oriented LaTeX } % Description
+%<*driver>
+\documentclass[show-notes]{l3doc}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
-% ^^A\AtEndDocument { \PrintChanges \PrintIndex }
-\ExplSyntaxOn
-\newenvironment{docabstract}[1]%https://latex.org/forum/viewtopic.php?t=12156
-{\renewcommand{\abstractname}{#1}\begin{abstract}}
- {\end{abstract}}
-\ProvideDocumentCommand\DocPhantomSection{smmm}
-{
- \leavevmode
- \refstepcounter{#2}
- \IfBooleanT{#1}
- {
- \addcontentsline{toc}{#2}{\protect\numberline{\use:c{the#2}}#3}
- }
- \docsetnameref{#3}
- \label{#4}
+%^^A\documentclass[full, show-notes]{l3doc}
+%^^A \listfiles
+\usepackage{amsmath, bookmark, enumitem, mathtools, microtype, tcolorbox, xparse}
+\usepackage[french, german, english]{babel}
+\usepackage[T1]{fontenc}
+\usepackage[bibencoding=auto, backend=biber, sorting=ynt]{biblatex}
+\begin{filecontents*}{\jobname.bib}
+@phdthesis{oh-2005,
+ author = {Olympia Hadjiliadis},
+ title = {Change--point detection of two--sided alternatives in the Brownian motion model and its connection to the gambler's ruin problem with relative wealth perception},
+ year = {2005},
+ school = {Columbia University}
}
+@misc{a-547018,
+ author = {@{}Javier Bezos},
+ title = {When loading babel with spanish, spurious document command parser},
+ note = {\url{https://tex.stackexchange.com/a/547018/112708}},
+ year = {2020}}
+@misc{a-536597,
+ author = {@{}frougon},
+ title = {``Journaling calls to a function \textdel{taking inline code as argument}''},
+ year = {2020},
+ note = {\url{https://tex.stackexchange.com/a/536620}}}
+@manual{interface3,
+ title = {The \LaTeX3 interfaces},
+ author = {The \LaTeX3 Project Team},
+ year = {2019},
+ note = {\url{https://ctan.math.washington.edu/tex-archive/macros/latex/contrib/l3kernel/expl3.pdf}},
+ annote = {} }
+@manual{xparse,
+ title = {The \pkg{xparse} package},
+ author = {The \LaTeX3 Project Team},
+ year = {2019},
+ note = {\url{https://ctan.math.illinois.edu/macros/latex/contrib/l3packages/xparse.pdf}},
+ annote = {} }
+@manual{2005-cool,
+ title = {The \pkg{cool} package},
+ author = {Nick Setzer},
+ year = {2005},
+ note = {\url{https://www.ctan.org/pkg/cool}},
+ annote = {} }
+@manual{l3build,
+ title = {The \pkg{l3build} package},
+ author = {The \LaTeX3 Project Team},
+ year = {2019},
+ note = {\url{https://ctan.math.washington.edu/tex-archive/macros/latex/contrib/l3build/l3build.pdf}},
+ annote = {} }
+@manual{tcolorbox,
+ title = {The \pkg{tcolorbox} package},
+ author = {Sturm, Thomas F.},
+ year = {2019},
+ note = {\url{http://www.texdoc.net/texmf-dist/doc/latex/tcolorbox/tcolorbox.pdf}},
+ annote = {} }
+@misc{p158966,
+ title = {\cs{Ccool}, extension à \LaTeX~à vocation mathématique},
+ note = {\url{http://forum.mathematex.net/latex-f6/ccool-extension-latex-a-vocation-mathematique-t17314.html}},
+ year = {2020}}
+\end{filecontents*}
+\addbibresource{\jobname.bib}
+\ExplSyntaxOn
+%^^A *** Sectioning
+\tl_gset:Nn \partname {Part}%^^A allows to test w/o babel
+\makeatletter
+\newcommand*{\docsetnameref}
+{\def\@currentlabelname}%https://tex.stackexchange.com/questions/537751
+\makeatother
+\newcounter{cscounter}
+\ProvideDocumentCommand
+\DocPhantomSection{sO{subsection}D<>{}mo}
+{\leavevmode
+ \refstepcounter{cscounter}
+ \IfBooleanF{#1}{\addcontentsline{toc}{#2}{#4}}
+ \IfValueT{#5}
+ {\docsetnameref{#3#4}\label{#5}}}
+% ^^A *** Msg
+\msg_new:nnn{__ccool_doc}{unknown}{~#1:#2~unknown}
+% ^^A *** Expressions
+\ProvideDocumentCommand{\pkgpattpair}{mm}{\texttt{>\{#1\}\{#2\}}}
+\ProvideDocumentCommand{\pkgrule}{}{\texttt{$\rightarrow$}}
+% ^^A *** L3 package
+\ProvideDocumentCommand{\docplaceh}{mO{1}}{\texttt{\prg_replicate:nn{#2}{\#}#1}}
+% ^^A *** Lists
+\newlist{arab-inl}{enumerate*}{1}
+\setlist[arab-inl]{label=\arabic*)}
+\newlist{colon-inl}{itemize*}{1}
+\setlist[colon-inl]
+{ %^^Abefore=\noindent,
+ label={},
+ itemjoin={{; }},
+ after={{.}}}
+\newlist{descr}{description}{1}
+\setlist[descr]{nosep, align=right, itemindent=0pt, font=\sffamily\tiny}
% ^^A Sort--->
\providecommand\docarg[1]{\texttt{#1}} % fun[param] (macro) vs fun[arg] (eval)
\providecommand\docargnoval{\c_novalue_tl}
@@ -269,6 +259,38 @@ english
\providecommand\pkgwrite{\cs{Ccool}\docarg{\meta{\pkgparpa}}\docpare{i}{\meta{\pkgparin}}\Arg{\pkgparkvl}}
% ^^A Sort<---
\ExplSyntaxOff
+%^^A *** listing
+\tcbuselibrary{listings, breakable}
+\newtcblisting[auto counter]
+{listing}[2][]{
+ noparskip,
+ breakable,
+ colback=white,
+ colframe=black,
+ opacitybacktitle=.8,%
+ fonttitle=\bfseries,
+ title={Listing~\thetcbcounter. #1},
+ arc=0pt,
+ outer arc=0pt,
+ boxrule=1pt,
+ listing and text,
+ #2}
+\newtcblisting
+{internal}
+{text only,
+ breakable,
+ colback=white,
+ fontupper=\sffamily,
+ arc=1pt,
+ outer arc=1pt,
+ boxrule=0pt,
+ halign=left,
+ fontupper=\small\sffamily,
+ left=0pt,
+ top=0pt,
+ bottom=0pt}
+\usepackage{ccool}
+\usepackage{hyperref} %^^A comes last
\begin{document}
\DocInput{\jobname.dtx}
\end{document}
@@ -276,79 +298,27 @@ english
% \fi
%
% \GetFileInfo{\jobname.sty}
-% \begin{documentation}
-% \title{The \pkg{ccool} package\thanks{^^A
-% This file describes version \fileversion, last revised \filedate.^^A
+% \title{The \pkg{ccool} package\thanks{^^A
+% This file describes version \fileversion, last revised \filedate.^^A
% }^^A
% }
-% \author{Erwann Rogard\thanks{firstname dot lastname AusTria gmail dot com}}
+% \author{Erwann Rogard\thanks{first.lastname at gmail.com}}
%
% \date{Released \filedate}
-%
-% \maketitle
-%
-% \selectlanguage{english}
-% \begin{docabstract}{Abstract}
-% The package \pkg{ccool} for \LaTeX~is a \textit{key-value} interface, \nameref{usage:cs:ccool},
-% on top of \pkg{xparse}'s document command parser. Global options control input processing and its expansion.
-% By default, they are set to meet likely requirements, depending on context: the selected language,
-% and which of text and math mode is active. These options can be overriden inline.
-% This versality could find its use, for example, to encode notational conventions (such as \docexpand{\cs{Real}}{}|\mathbb{R}|)
-% at the point where they are introduced in the \env{document} (``Let $\mathbb{R}$ denote real numbers'').
-% Polymorphic commands can be generated by parameterizing the keys
-% (for instance, one parameter value for style, another for a property).
-% User input to \cs{Ccool} can optionally be serialized.
-% This can useful for typesetting documents sharing the same notation.
-% \end{docabstract}
-%
-% \selectlanguage{french}
-% \begin{docabstract}{Résumé}
-% L'extension~\pkg{ccool} pour \LaTeX~met à disposition une interface de type \textit{clé-valeur}, \nameref{usage:cs:ccool},
-% destinée à faciliter la géneration de commandes. Les paramètres globaux contrôlant le traitement de ces \textit{clé-valeur} sont fixés
-% par défaut pour répondre aux besoins courants, suivant le contexte (langage, mode textuel ou mathématique).
-% Un exemple d'application, est la command-isation des conventions de notation (\docexpand{\cs{Reel}}{} |\mathbb{R}|),
-% au point dans le \env{document} où elles sont introduites (``Soit~$\mathbb{R}$~les nombres réels.'').
-% Des commandes polymorphes peuvent être générées, en associant aux clés un paramètre
-% (par exemple, une valeur pour le style typographique, une autre pour la description du concept associé).
-% En option, les instructions passées à cette interface peuvent être sauvegardées,
-% ce qui peut être utile pour la rédaction de documents faisant appel à des conventions typographiques communes.
-% \end{docabstract}
-% \selectlanguage{english}
-%
-% \tableofcontents
-%
-% \part{Usage}\label{part:usage}
-% ^^A \VerbatimFootnotes
-%
-% \setcounter{section}{0}
-% \label{usage:conv}
-% \addcontentsline{toc}{section}{\protect\numberline{\thesection}Convention}
-% \section*{Convention}
-% \begin{enumerate}[label={\emph{\alph*)}}]
-% \item \label{conv:expl3} Loosely, those of \cite{interface3}, for example as to the meaning of \docccept{\docccepttl}, which may be abbreviated \docccept{tl}.
-% \item \label{conv:xparse} Those of \cite{xparse}, for example \docparo{arg} is an \docccept{\docxparseo}.
-% \item \docassign{\meta{X}}{\docarg{Y}}: set \meta{X} to |Y|
-% \item \docexpand{\cs{X}}{\docarg{Y}}: \cs{X} expands to |Y|
-% \item If unspecified, the environment in which a macro is to be used is \docenvdoc.
-% \end{enumerate}
-%
-% \refstepcounter{section}
-% \label{usage:load}
-% \addcontentsline{toc}{section}{\protect\numberline{\thesection}Loading the package}
-% \begin{function}{\usepackage}
-% \begin{syntax}
-% \cs{usepackage}\docparm{\pkg{ccool}}
-% \end{syntax}
-% \begin{description}
-% \item[Requirement]\docfillblank
-% \begin{enumerate}
-% \item \file{ccool.sty} is in the path of the \LaTeX~engine. See \autoref{part:other}, \autoref{other:support}.
-% \item Put in the~\docccept{\doccceptpre}
-% \end{enumerate}
-% \end{description}
-% \end{function}
-%
-% \DocPhantomSection*{section}{\cs{Ccool}}{usage:cs:ccool}
+% \begin{documentation}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This \LaTeX package provides an interface to define and evaluate key-based replacement rules\cite{interface3}.
+% It can be used to parse the argument specification of a document command\cite{xparse}.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \part{Usage}\label{part:usage}
+%
+% \DocPhantomSection*{section}{\cs{Ccool}}[usage:cs:ccool]
% \begin{function}{\Ccool}
% \begin{syntax}
% \cs{Ccool}\docparo{\meta{\pkgparhe}}\docpard{\meta{\pkgparpa}}\docpare{c}{\meta{\pkgparin}}\Arg{\pkgparkvl}\pkgparap\pkgparex\docpare{s}{\meta{\doccceptsep}}\docpare{c}{\meta{\pkgparou}}\docparo{\meta{\pkgparta}}
@@ -360,22 +330,22 @@ english
%
% \subsection{Core feature}
% \label{ccool:core}
-% \nameref{usage:cs:ccool}\Arg{\pkgparkvl} executes for each \meta{\pkgkey}|=|\meta{\pkgval},
+% \cs{Ccool}\Arg{\pkgparkvl} executes for each \meta{\pkgkey}|=|\meta{\pkgval},
% \begin{enumerate}[label=\emph{\arabic*)}]
% \item \docassign{\meta{\pkgval} }
% { \cs{function}\Arg{\pkgval} }\label{step:val}
% \item define \cs{\meta{\pkgkey}} such that \docexpand{ \cs{\meta{\pkgkey} } }{\meta{\pkgval}},
% \label{step:key}
-% \end{enumerate}where \cs{function} is encoded in \docccept{\doccceptgopt}~\nameref{usage:opt:in}.
+% \end{enumerate}where \cs{function} is encoded in \docccept{\doccceptgopt}~\pkgoptin.
% For instance, the side effect of |\Ccool{ Real = \mathbb{R} }| is \docexpand{\cs{Real}}{\docarg{\textbackslash{}mathbb\{R\}}}.
-% To be sparingly used, \docccept{\doccceptgopt}~\nameref{usage:opt:ex} controls the type of expansion of \meta{\pkgkey}~and \meta{\pkgval}.
+% To be sparingly used, \docccept{\doccceptgopt}~\pkgoptex controls the type of expansion of \meta{\pkgkey}~and \meta{\pkgval}.
%
-% See \nameref{usage:cs:lambda} to allow command \cs{\meta{\pkgkey}} to take arguments.
+% if \cs{\meta{\pkgkey}} needs arguments, use \cs{lambdax} from \pkg{lambdax} on the rhs.
%
-% \subsection{Process the \texorpdfstring{\docccept{\pkgval}}'s}
+% \subsection{Process the \texorpdfstring{\docccept{\pkgval}}{val_i}'s}
% \label{ccool:in}
-% \nameref{usage:cs:ccool}\ \docpare{c}{\meta{\pkgparin}}\Arg{\pkgparkvl} is identical to the \nameref{ccool:core},
-% except it overrides \nameref{usage:opt:in}.
+% \cs{Ccool}\ \docpare{c}{\meta{\pkgparin}}\Arg{\pkgparkvl} is identical to the \nameref{ccool:core},
+% except it overrides \pkgoptin.
%
% In our example, if multiple number systems are defined with \cs{Ccool} (natural, reals, \dots),
% it is more efficient to omit |\mathbb{.}| inside \meta{\pkgval}, and instead
@@ -383,15 +353,15 @@ english
%
% \subsection{Append to a hook}
% \label{ccool:ap}
-% \nameref{usage:cs:ccool}\Arg{\pkgparkvl}\pkgparap~is identical to the \nameref{ccool:core}, except it
-% repeats after \nameref{usage:cs:hook}.
+% \cs{Ccool}\Arg{\pkgparkvl}\pkgparap~is identical to the \nameref{ccool:core}, except it
+% repeats after \cs{CcoolHook}.
% This is useful to make the side effect persist after a \docccept{\doccceptgroup} (such as \env{theorem}).
%
-% \subsection{Expand the \texorpdfstring{\docccept{\pkgval}}'s}
+% \subsection{Expand the \texorpdfstring{\docccept{\pkgval}}{val_i}'s}
% \label{ccool:ex}
-% \nameref{usage:cs:ccool}\Arg{\pkgparkvl}\pkgparex~supplements the \nameref{ccool:core} with
-% the expansion of the \meta{\pkgval}'s using typesetting rules encoded in \docccept{\doccceptgopt}~\nameref{usage:opt:se}
-% and~\nameref{usage:opt:ou}. The first are \docccept{\doccceptsep} applied to the \meta{\pkgval}'s to form a \docccept{\docccepttl},
+% \cs{Ccool}\Arg{\pkgparkvl}\pkgparex~supplements the \nameref{ccool:core} with
+% the expansion of the \meta{\pkgval}'s using typesetting rules encoded in \docccept{\doccceptgopt}~\pkgoptse
+% and~\pkgoptou. The first are \docccept{\doccceptsep} applied to the \meta{\pkgval}'s to form a \docccept{\docccepttl},
% and the second a function applied to the latter.
%
% They can be overriden inline by appending further \docpare{s}{\meta{\doccceptsep}}~and~\docpare{c}{\meta{\pkgparou}}, respectively,
@@ -399,30 +369,30 @@ english
%
% \subsection{Head}
% \label{ccool:he}
-% \nameref{usage:cs:ccool}\docparo{\meta{\pkgparhe}}\Arg{\pkgparkvl}~expands \meta{\pkgparhe} and executes the \nameref{ccool:core}.
+% \cs{Ccool}\docparo{\meta{\pkgparhe}}\Arg{\pkgparkvl}~expands \meta{\pkgparhe} and executes the \nameref{ccool:core}.
%
% There may be situations where it is convenient to pass \meta{\pkgparhe}~as \doccceptempty.
%
% \subsection{Tail}
% \label{ccool:ta}
-% \nameref{usage:cs:ccool}\Arg{\pkgparkvl}\docparo{\meta{\pkgparta}}\Arg{\pkgparkvlnxt}~is identical to
-% \nameref{usage:cs:ccool}\Arg{\pkgparkvl} followed by \nameref{usage:cs:ccool}\docparo{\meta{\pkgparta}}\Arg{\pkgparkvlnxt}.
+% \cs{Ccool}\Arg{\pkgparkvl}\docparo{\meta{\pkgparta}}\Arg{\pkgparkvlnxt}~is identical to
+% \cs{Ccool}\Arg{\pkgparkvl} followed by \cs{Ccool}\docparo{\meta{\pkgparta}}\Arg{\pkgparkvlnxt}.
%
% The combination of \nameref{ccool:core}, \nameref{ccool:he}, and \nameref{ccool:ta} allows to integrate typesetting and
% the creation of commands.
%
-% \subsection{Parameterize the \texorpdfstring{\docccept{\pkgkey}}'s}
+% \subsection{Parameterize the \texorpdfstring{\docccept{\pkgkey}}{key_i}'s}
% \label{ccool:pa}
-% \nameref{usage:cs:ccool}\docpard{\meta{\pkgparpa}}\Arg{\pkgparkvl} is identical to the \nameref{ccool:core},
+% \cs{Ccool}\docpard{\meta{\pkgparpa}}\Arg{\pkgparkvl} is identical to the \nameref{ccool:core},
% except \meta{\pkgkey} is replaced by \meta{\pkgkey\docpard{\pkgparpa}}.
-% The default value of \meta{\pkgparpa} is encoded in \nameref{usage:opt:pa}.
+% The default value of \meta{\pkgparpa} is encoded in \pkgoptpa.
% In our example, \meta{\pkgparpa} could be \docarg{Style}.
%
% \subsection{Write}
% \label{ccool:wr}
-% \docccept{\doccceptgopt}~\nameref{usage:opt:wr}~is identical to the \nameref{ccool:core},
-% except that if \nameref{usage:opt:wr} is set to \cs{BooleanTrue},
-% the code is written to a file whose \doccceptpath~is encoded in \docccept{\doccceptgopt}~\nameref{usage:opt:fi}.
+% \docccept{\doccceptgopt}~\pkgoptwr~is identical to the \nameref{ccool:core},
+% except that if \pkgoptwr is set to \cs{BooleanTrue},
+% the code is written to a file whose \doccceptpath~is encoded in \docccept{\doccceptgopt}~\pkgoptfi.
%
% \DocPhantomSection*{section}{\cs{CcoolClear}}{usage:cs:clear}
% \begin{function}{\CcoolClear}
@@ -444,39 +414,31 @@ english
% \end{description}
% \end{function}
%
-% \DocPhantomSection*{section}{\cs{CcoolLambda}}{usage:cs:lambda}
-% \begin{function}{\CcoolLambda}
-% \begin{syntax}
-% \cs{CcoolLambda}\docparo{\meta{\doccceptargspec}}\Arg{\doccceptcode},
-% \end{syntax} where \docccept{\doccceptargspec} is by default an \docccept{\docxparseo}.
-% \begin{description}
-% \item[Example] \cs{Ccool}|{ EvalAt = \CcoolLambda{(#1)} }|
-% \item[Semantics] Returns a command of type \cs{DeclareDocumentCommand}\cite{xparse},
-% \end{description}
-% \end{function}
+% \changes{v3.2}
+% {2021/09/20}
+% {Removed~usage~for\cs[no-index]{CcoolLambda}~as~superseded~by~\cs[no-index]{LambdaX}.}
%
% \DocPhantomSection*{section}{\cs{CcoolOption}}{usage:cs:option}
% \begin{function}{\CcoolOption}
% \begin{syntax}
% \cs{CcoolOption}\docparo{\dots{}\docmetakeyorkeyval[i],\dots}
% \end{syntax}where \meta{\doccceptkey_i} is either of
-% \nameref{usage:opt:an},
-% \nameref{usage:opt:ex},
-% \nameref{usage:opt:fi},
-% \nameref{usage:opt:in},
-% \nameref{usage:opt:pa},
-% \nameref{usage:opt:ou},
-% \nameref{usage:opt:se},
-% and \nameref{usage:opt:wr}.
+% \pkgoptan,
+% \pkgoptex,
+% \pkgoptfi,
+% \pkgoptin,
+% \pkgoptpa,
+% \pkgoptou,
+% \pkgoptse,
+% and \pkgoptwr.
% \begin{description}
-% \item[Semantics] Modify the default behavior of \nameref{usage:cs:ccool}
+% \item[Semantics] Modify the default behavior of \cs{Ccool}
% \end{description}
% \end{function}
%
% \DocPhantomSection*{subsection}{\pkgoptan}{usage:opt:an}
% \DescribeOption{\pkgoptan}
% \begin{description}
-% \item[Also see] \autoref{part:impl}~\nameref{impl:opt:an}
% \item[Semantics] Sets the translation of \textit{and} in language \meta{\doccceptkey} to \meta{\doccceptval}
% \item[Syntax] \meta{\doccceptkvl}
% \end{description}
@@ -484,35 +446,30 @@ english
% \DocPhantomSection*{subsection}{\pkgoptex}{usage:opt:ex}
% \DescribeOption{\pkgoptex}
% \begin{description}
-% \item[Also see] \nameref{ccool:core} and \autoref{part:impl}~\nameref{impl:opt:ex}
% \item[Syntax] \texttt{eo\docpipe{}ee\docpipe{}ex\docpipe{}xo\docpipe{}xe\docpipe{}xx}
% \end{description}
%
% \DocPhantomSection*{subsection}{\pkgoptfi}{usage:opt:fi}
% \DescribeOption{\pkgoptfi}
% \begin{description}
-% \item[Also see] \autoref{part:usage}~\nameref{ccool:wr} and \autoref{part:impl}~\nameref{impl:opt:fi}
% \item[Syntax] \meta{\doccceptpath}
% \end{description}
%
% \DocPhantomSection*{subsection}{\pkgoptin}{usage:opt:in}
% \DescribeOption{\pkgoptin}
% \begin{description}
-% \item[Also see] \nameref{ccool:in} and \autoref{part:impl}~\nameref{impl:opt:in}
% \item[Syntax] \meta{\doccceptcode}, with |####1| as the \docccept{\doccceptplaceh}
% \end{description}
%
% \DocPhantomSection*{subsection}{\pkgoptpa}{usage:opt:pa}
% \DescribeOption{\pkgoptpa}
% \begin{description}
-% \item[Also see] \nameref{ccool:pa}, and \autoref{part:impl}~\nameref{impl:opt:pa}
% \item[Syntax] \meta{\docccepttl}
% \end{description}
%
% \DocPhantomSection*{subsection}{\pkgoptou}{usage:opt:ou}
% \DescribeOption{\pkgoptou}
% \begin{description}
-% \item[Also see] \nameref{ccool:ex}, and \autoref{part:impl}~\nameref{impl:opt:ou}
% \item[Default] |\ensuremath{####1}|
% \item[Syntax] \meta{\doccceptcode}, with |####1| as the \docccept{\doccceptplaceh}
% \end{description}
@@ -520,7 +477,6 @@ english
% \DocPhantomSection*{subsection}{\pkgoptse}{usage:opt:se}
% \DescribeOption{\pkgoptse}
% \begin{description}
-% \item[Also see] \nameref{ccool:ex}; \doclist{lang}; and \autoref{part:impl}~\nameref{impl:opt:se}
% \item[Other] Default behavior depends on whether \pkg{babel} and \pkg{amsmath} are loaded
% \item[Syntax] That of \docccept{\doccceptsep} in \cite[Section 8 of \pkg{l3seq}]{interface3}
% \end{description}
@@ -528,7 +484,6 @@ english
% \DocPhantomSection*{subsection}{\pkgoptwr}{usage:opt:wr}
% \DescribeOption{\pkgoptwr}
% \begin{description}
-% \item[Also see] \autoref{part:usage}~\nameref{ccool:wr} and \autoref{part:impl}~\nameref{impl:opt:wr}
% \item[Syntax] \cs{BooleanFalse}\docpipe\cs{BooleanTrue}
% \end{description}
%
@@ -538,7 +493,6 @@ english
% \cs{CcoolRead}\docparo{\meta{\doccceptpath}}
% \end{syntax}
% \begin{description}
-% \item[Also see] \autoref{part:impl}~\nameref{impl:cs:read}
% \item[Semantics]\docfillblank
% \begin{enumerate}
% \item Reads the definitions in \meta{\doccceptpath}.
@@ -556,11 +510,15 @@ english
% \item[Semantics] \docexpand{}{the package's version}
% \end{description}
% \end{function}
+% \part{Other}
+%
+% \section{Bibliograhy}
+% \printbibliography[heading=none]
%
% \section{Do's and dont's}
% \label{usage:dosdont}
%
-% \begin{enumerate}[label=\emph{\arabic*)}]
+% \begin{enumerate}
% \item \docfillblank
% \begin{itemize}
% \item[\docissuedont] |Inner=\{####1\}|
@@ -587,76 +545,217 @@ english
% \item[\docissuedont] |\[x_0,x\]|
% \item[\docissuedo] |\left[x_0,x\right]|
% \end{itemize}
-% \item \docfillblank
-% \begin{itemize}
-% \item[\docissuedont] Use \docccept{\docxparsed[]} or \docccept{\docxparsee[]}~arguments\cite{xparse} for \nameref{usage:cs:lambda}
-% \item[\docissuedo] Use only \docccept{\docxparsem[]} and \docccept{\docxparseo[]}~arguments
-% \end{itemize}
+%^^A \item \docfillblank
+%^^A \begin{itemize}
+%^^A \item[\docissuedont] Use \docccept{\docxparsed[]} or \docccept{\docxparsee[]}~arguments\cite{xparse} for \nameref{usage:cs:lambda}
+%^^A \item[\docissuedo] Use only \docccept{\docxparsem[]} and \docccept{\docxparseo[]}~arguments
+%^^A \end{itemize}
% \item \docfillblank
% \begin{itemize}
% \item[\docissuedont] |\usepackage[spanish]{babel}|
% \item[\docissuedo] |\usepackage[spanish.noquoting]{babel}|\cite{a-547018}
% \end{itemize}
-% \item Also see \autoref{part:other}, \autoref{other:issue}
% \end{enumerate}
-%
-% \clearpage
-% \part{Listing}\label{part:listing}
-%
-% \newtcblisting[auto counter]
-% {listing}[2][]{
-% noparskip,
-% breakable,
-% colback=white,
-% colframe=black,
-% opacitybacktitle=.8,%
-% fonttitle=\bfseries,
-% title={Listing~\thetcbcounter. #1},
-% arc=0pt,
-% outer arc=0pt,
-% boxrule=1pt,
-% listing and text,
-% #2}
-%
-% \docnb
+%
+% \section{To do}
% \begin{enumerate}
-% \item Some statements affect only the output of listings that come after that in which they appear.
-% The demarcation is indicated by |%^^||A--->| and |%^^||A<---|, where applicable
+% \item Create an environment for \cs{CoolHook}.
% \end{enumerate}
-% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:vers}.\cs{CcoolVers}}
-% \iffalse
-%<*guardlisting>
-% \fi
-\begin{listing}[\cs{CcoolVers}]
- {label=listing:vers}
- \CcoolVers
-\end{listing}
-% \iffalse
-%</guardlisting>
-% \fi
+%
+% \section{Support}\label{other:support}
%
-% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:thisdeps}. This doc's dependencies}
-% \iffalse
-%<*guardlisting>
-% \fi
-\begin{listing}[This doc's dependencies]
- {label=listing:thisdeps}
- \ExplSyntaxOn
- \__ccooldoc_usepackage:
- \ExplSyntaxOff
-\end{listing}
-% \iffalse
-%</guardlisting>
-% \fi
+% This package is available from \url{https://github.com/rogard/ccool}.
%
-% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:numbrsys:base}. \texorpdfstring{Let~$\mathbb{N}$ and $\mathbb{R}$ denote\dots} (start of the tutorial)}
+%
+% \changes{v1.0}
+% {2020/03/08}
+% {Initial version}
+% \changes{v1.1}
+% {2020/04/04}
+% {Rearrange: much of the implementation}
+% \changes{v1.1}
+% {2020/04/04}
+% {Replace: \Arg{kvl_{2}}~by~\docpard{\meta{kvl_{2}}}~given that option type \texttt{G} not recommended\cite{xparse}}
+% \changes{v1.1}
+% {2020/04/04}
+% {Replace: \cs[no-index]{OopsOptions}~by~\cs[no-index]{OopsOption}}
+% \changes{v1.1}
+% {2020/04/04}
+% {Replace: \docarg{GenericObject}~by~\docarg{Name}}
+% \changes{v1.1}
+% {2020/04/04}
+% {Replace: \docarg{Separators}~by~\docarg{Separ}}
+% \changes{v1.1}
+% {2020/04/04}
+% {Add:\cs[no-index]{OopsTest}}
+% \changes{v1.1}
+% {2020/04/04}
+% {Add:\cs[no-index]{OopsRestore}}
+% \changes{v1.1}
+% {2020/04/04}
+% {Add: \docarg{Save}}
+% \changes{v1.2}
+% {2020/04/06}
+% {Add: optional \pkgparex to \cs[no-index]{OopsNew} as instruction to expand \pkgparkvl}
+% \changes{v1.2}
+% {2020/04/06}
+% {Replace: \cs[no-index]{OopsClear}\Arg{\pkgparpa} by \cs[no-index]{OopsClear}\docparo{\meta{\doccceptkvl}}}
+% \changes{v1.2}
+% {2020/04/06}
+% {Delete: \meta{kvl_{2}}~and~\meta{code_{2}}}
+% \changes{v1.2}
+% {2020/04/06}
+% {Delete: \cs[no-index]{OopsTest}}
+% \changes{v1.2}
+% {2020/04/06}
+% {Replace: \cs[no-index]{Save} by \cs[no-index]{Write}}
+% \changes{v1.2}
+% {2020/04/06}
+% {Replace: \cs[no-index]{Restore} by \cs[no-index]{Read}}
+% \changes{v1.3}
+% {2020/04/06}
+% {Replace: \cs[no-index]{OopsNew} by \cs[no-index]{Oops}}
+% \changes{v1.3}
+% {2020/04/06}
+% {Replace: \Arg{\pkgparpa} and \docparo{\meta{\pkgparpa}} by \docpard{\meta{\pkgparpa}} }
+% \changes{v1.4}
+% {2020/04/10}
+% {Replace: \docpare{s}{\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}
+% by \docpare{s}{\Arg{\pkgparsi}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}}
+% \changes{v1.4}
+% {2020/04/10}
+% {Add:optional \pkgparap to \cs[no-index]{OopsNew} to make side effects presist beyond local group}
+% \changes{v1.4}
+% {2020/04/10}
+% {Add: \cs[no-index]{OopsHook}}
+% \changes{v1.4}
+% {2020/04/10}
+% {Add: \docarg{Expans} (for debugging' sake, but...) }
+% \changes{v1.4}
+% {2020/04/10}
+% {Add: \autoref{usage:dosdont} }
+% \changes{v1.4}
+% {2020/04/10}
+% {Add: \cs[no-index]{OopsDebug} }
+% \changes{v1.5}
+% {2020/04/10}
+% {Delete: dependence on \pkg{datetime} }
+% \changes{v1.5}
+% {2020/04/10}
+% {Add: \pkgoptfi }
+% \changes{v1.6}
+% {2020/04/10}
+% {Rename: \pkg{oops} to \pkg{ccool} (better describes the purpose) }
+% \changes{v1.6}
+% {2020/04/10}
+% {Rename: \cs[no-index]{Oops} to \cs[no-index]{Ccool}}
+% \changes{v1.6}
+% {2020/04/10}
+% {Rename: \cs[no-index]{OopsClear} to \cs[no-index]{CcoolClear}}
+% \changes{v1.6}
+% {2020/04/10}
+% {Rename: \cs[no-index]{OopsDebug} to \cs[no-index]{CcoolDebug}}
+% \changes{v1.6}
+% {2020/04/10}
+% {Rename: \cs[no-index]{OopsHook} to \cs[no-index]{CcoolHook}}
+% \changes{v1.6}
+% {2020/04/10}
+% {Rename: \cs[no-index]{OopsOption} to \cs[no-index]{CcoolOption}}
+% \changes{v1.6}
+% {2020/04/10}
+% {Rename: \cs[no-index]{OopsRead} to \cs[no-index]{CcoolRead}}
+% \changes{v1.7}
+% {2020/04/11}
+% {Delete: \cs[no-index]{CcoolDebug} }
+% \changes{v1.8}
+% {2020/04/12}
+% {Add: \hyperref[usage:cs:lambda]{\cs[no-index]{CcoolLambda}} }
+% \changes{v1.8}
+% {2020/04/12}
+% {Add: \cs[no-index]{CcoolVers} }
+% \changes{v1.9}
+% {2020/04/14}
+% {Add: support for \LuaTeX }
+% \changes{v1.9}
+% {2020/04/14}
+% {Move: from \autoref{part:usage} to \autoref{part:impl}, what is now that part's \autoref{impl:frontend}}
+% \changes{v2.0}
+% {2020/04/15}
+% {Delete: \pkgoptfi's dependency on \pkg{texosquery} and \cs[no-index]{pdfcreationdate}}
+% \changes{v2.0}
+% {2020/04/15}
+% {Add: support for \XeTeX}
+% \changes{v2.0}
+% {2020/04/15}
+% {Update: \cs[no-index]{RequirePackage}, \cs[no-index]{NeedsTeXFormat}'s second argument / TeX Live 2020}
+% \changes{v2.1}
+% {2020/04/17}
+% {Replace: \hyperref[usage:cs:lambda]{\cs[no-index]{CcoolLambda}}'s optional integer argument (number of \texttt{m}'s)
+% by a standard argument list}
+% \changes{v2.1}
+% {2020/04/17}
+% {Replace: \hyperref[ccool:pa]{\meta{\pkgparpa}}'s position within \cs[no-index]{Ccool}'s argument list, from first to second. Greater versatility }
+% \changes{v2.1}
+% {2020/04/17}
+% {Replace: as~the~default~of~\pkgoptpa,~\docarg{Math}~by~\pkgoptpad}
+% \changes{v2.1}
+% {2020/04/17}
+% {Replace: \docccept{\doccceptgopt}~\docarg{Name} by \pkgoptpa }
+% \changes{v2.2}
+% {2020/04/20}
+% {Replace: part of the abstract's with more straighforward descriptions based on input from forum participtants}
+% \changes{v2.3}
+% {2020/05/16}
+% {Replace: for \cs[no-index]{Ccool}, \docpare{i}{} by \docpare{c}{}}
+% \changes{v2.3}
+% {2020/05/16}
+% {Rearranged: \cs{Ccool}'s subsections. Previously, by argument. Now, by feature. }
+% \changes{v2.3}
+% {2020/05/16}
+% {Replace: In \docstep{key}, the created command's implementation, from \cs[no-index]{ProvideDocumentCommand} to \cs[no-index]{DeclareDocumentCommand}}
+% \changes{v2.5}
+% {2020/05/21}
+% {Modify: behavior of \autoref{part:usage}~\nameref{ccool:ex}, rely on \pkg{erw-l3}'s \cs[no-index]{erw_seq_use:Nn} }
+% \changes{v2.5}
+% {2020/05/21}
+% {Modify: Rely on \pkg{erw-l3}'s \cs[no-index]{erw_jobnametimestamp:} }
+% \changes{v2.6}
+% {2020/05/22}
+% {Modify: Rely on \pkg{erw-l3}'s \cs[no-index]{erw_lambda:nnn} }
+% \changes{v2.7}
+% {2020/05/28}
+% {Add: \docccept{\doccceptgopt}~\pkgoptan }
+% \changes{v2.7}
+% {2020/05/28}
+% {Modify: \pkgoptse's default rely on \pkg{babel} and \pkg{amsmath}, if applicable}
+% \changes{v2.7}
+% {2020/05/28}
+% {Modify: Replace \docxparsem by \docxparseo}
+% \changes{v2.8}
+% {2020/05/28}
+% {Fix: conflict between \cs[no-index]{usepackage}\docparo{spanish}\docparm{babel} and \nameref{ccool:pa} }
+% \changes{v2.9}
+% {2020/06/03}
+% {Miscellaneous }
+% \changes{v3.0}
+% {2020/06/04}
+% {Miscellaneous }
+% \changes{v3.1}
+% {2020/10/10}
+% {Replaced: \doclist{thisdeps}'s content, from exhaustive dependencies to those explicit with \cs[no-index]{usepackage}}
+% \changes{v3.2}
+% {2021/09/20}
+% {Removed~listing~changes~(little~information,~difficult~to~keep~track)}
+%
+% \clearpage
+% \part{Listing}\label{part:listing}
+%
+%\phantomsection\addcontentsline{toc}{section}{Tutorial\textgreater}
+%\phantomsection\addcontentsline{toc}{section}{\ref{listing:numbrsys:base}. Let~\texorpdfstring{$\mathbb{N}$}{N} and \texorpdfstring{$\mathbb{R}$}{R} denote\dots}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[``Let~$\mathbb{N}$ and $\mathbb{R}$ denote\dots'' (start of the tutorial)]
+\begin{listing}[``Let~$\mathbb{N}$ and $\mathbb{R}$ denote\dots'']
{label=listing:numbrsys:base, listing and text}
Let~$\mathbb{N}$ and $\mathbb{R}$ denote the natural and real numbers.
\end{listing}
@@ -665,11 +764,11 @@ english
% \fi
%
% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:numbrsys:cmd}. Equivalent to \ref{listing:numbrsys:base}, with \cs{NewDocumentCommand}}
+% {\ref{listing:numbrsys:cmd}. Same as \ref{listing:numbrsys:base}, with \cs{NewDocumentCommand}}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[ Equivalent to \ref{listing:numbrsys:base}, with \cs{NewDocumentCommand}]
+\begin{listing}[ Same as \ref{listing:numbrsys:base}, with \cs{NewDocumentCommand}]
{label=listing:numbrsys:cmd, listing and text}
\DeclareDocumentCommand\Nat{}{\mathbb{N}}
\DeclareDocumentCommand\Real{}{\mathbb{R}}
@@ -680,366 +779,71 @@ english
% \fi
%
% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:numbrsys:in}. Equivalent to \ref{listing:numbrsys:cmd}, with \cs{Ccool}}
+% {\ref{listing:numbrsys:in}. Same as \ref{listing:numbrsys:cmd}, with \cs{Ccool}}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[ Equivalent to \ref{listing:numbrsys:cmd}, with \cs{Ccool}]
+\begin{listing}[ Same as \ref{listing:numbrsys:cmd}, with \cs{Ccool} ]
{label=listing:numbrsys:in, listing and text}
- % ^^A--->
+ \begingroup
\Ccool c{\mathbb{#1}}{ Nat = {N}, Real = {R} }
Let~$\Nat$ and $\Real$~denote the natural and real numbers.
- % ^^A<---
- \CcoolClear
+ \endgroup
\end{listing}
% \iffalse
%</guardlisting>
% \fi
%
% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:numbrsys:ex}. Equivalent to \ref{listing:numbrsys:in}, with expansion}
+% {\ref{listing:numbrsys:ex}. Same as \ref{listing:numbrsys:in}, with expansion}
% \iffalse
%<*guardlisting>
\fi
-\begin{listing}[ Equivalent to \ref{listing:numbrsys:in}, with expansion]
+\begin{listing}[ Same as \ref{listing:numbrsys:in}, with expansion]
{label=listing:numbrsys:ex, listing and text}
- % ^^A--->
+\begingroup
\Ccool[Let~]
c{\mathbb{#1}}{ Nat = {N}, Real = {R} }*
[~denote the natural and real numbers.]{}
- % ^^A<---
- \CcoolClear
+\endgroup
\end{listing}
% \iffalse
%</guardlisting>
% \fi
-%
+%
+% \changes{v3.2}
+% {2021/09/20}
+% {\cs[no-index]{begingroup}~and~\cs[no-index]{endgroup}~inside~listings.}
+%
% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:numbrsys:pa}. Equivalent to \ref{listing:numbrsys:in}, parameterized (end of the tutorial)}
+% {\ref{listing:numbrsys:pa}. Same as \ref{listing:numbrsys:in}, parameterized}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[ Equivalent to \ref{listing:numbrsys:in}, parameterized (end of the tutorial)]
+\begin{listing}[ Same as \ref{listing:numbrsys:in}, parameterized]
{label=listing:numbrsys:pa, listing and text}
- % ^^A--->
- \Ccool<Style>c{\mathbb{#1}}{ Nat = {N}, Real = {R} }
- [Let $\Nat<Style>$ and $\Real<Style>$ denote the natural and real numbers.]{}
- % ^^A<---
- \CcoolClear<Style>
-\end{listing}
-% \iffalse
-%</guardlisting>
-% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:lang}. Language and mode}
-%^^A \selectlanguage{afrikaans}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{basque}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{catalan}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{croatian}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{czech}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{danish}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{dutch}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A % ^^A esperanto, % ERROR
-%^^A \selectlanguage{estonian}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{finnish}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{french}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A % ^^A galician, % ERROR
-%^^A \selectlanguage{german}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{hungarian}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{icelandic}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{indonesian}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{irish}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{italian}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A % ^^A kurmanji, % ERROR
-%^^A \selectlanguage{latin}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A % ^^A latvian, % ERROR
-%^^A \selectlanguage{lithuanian}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{ngerman}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{polish}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{portuguese}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{romanian}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{slovak}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{spanish}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{swedish}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{swissgerman}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{turkish}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{turkmen}\\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-%^^A \selectlanguage{welsh} \\
-%^^A \noindent\textbf{\languagename}{:}\\
-%^^A \CcoolOption[ Separ ]
-%^^A \Ccool{ X = x, Y = y }*
-% \iffalse
-%<*guardlisting>
-% \fi
-\begin{listing}[Language and mode]
- {label=listing:lang}
- % ^^A--->
- \textbf{\languagename}{:}~\Ccool{ X = x, Y = y }*
- \begin{otherlanguage}{spanish}
- \CcoolOption[ Separ ]\\
- \textbf{\languagename}{:}~\Ccool{ X = x, Y = y }*
- \end{otherlanguage}\\
- \textbf{\languagename}{:}~\Ccool{ X = x, Y = y }*
- \\[1em]
- \CcoolOption[ Outer = ####1 ]
- \textbf{\languagename}{:}~\Ccool{ X = this, Y = that }*
- \begin{otherlanguage}{spanish}
- \CcoolOption[ Separ ]\\
- \textbf{\languagename}{:}~\Ccool{ X = esto, Y = aquello }*
- \end{otherlanguage}\\
- \textbf{\languagename}{:}~\Ccool{ X = this, Y = that }*
- \CcoolOption[ Separ ]\\
- % ^^A<---
- \CcoolOption
-\end{listing}
-% \iffalse
-%</guardlisting>
-% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:se}. Separators}
-% \iffalse
-%<*guardlisting>
-% \fi
-\begin{listing}[Separators
- % \NB{bug}
- % {Removing the closing \CcoolOption subsequently causes inconsistent separators between text and math mode (case replicated in uncommented form in dtx)
- % ^^A% \begin{listing}[Separators]
- % ^^A% {label=listing:se}
- % ^^A% % ^^A--->
- % ^^A% \CcoolOption[ Separ={{\ \char`@\ }{\ \%\ }{\ \char`@\ }} ]
- % ^^A% \Ccool{ X = x, Y = y }*[\\]
- % ^^A% { X = x, Y = y }*s{{~\&~}}[\\]
- % ^^A% { X = x, Y = y }*s{{,~}{~\&~}}[\\[1em]]
- % ^^A% { X = x, Y = y, Z = z }*[\\]
- % ^^A% { X = x, Y = y, Z = z }*s{{~\&~}}[\\]
- % ^^A% { X = x, Y = y, Z = z }*s{{,~}{\&~}}[\\]
- % ^^A% { X = x, Y = y, Z = z }*s{{~\&~}{,~}{,~\&~}}\\
- % ^^A%% ^^A<---
- % ^^A% \CcoolClear
- % ^^A% \end{listing}
- % ^^A% \begin{listing}[Controlling the mode]
- % ^^A% {label=listing:mode}
- % ^^A% \Ccool{ X = x, Y = y }*\\
- % ^^A% \Ccool{ X = x, Y = y, Z = z }*\\[1em]
- % ^^A% \CcoolOption[ Outer = ####1 ]
- % ^^A% \Ccool{ X = x, Y = y }*\\
- % ^^A% \Ccool{ X = x, Y = y, Z = z }*\\[1em]
- % ^^A% \CcoolOption[ Outer ]
- % ^^A% \Ccool{ X = x, Y = y }*\\
- % ^^A% \Ccool{ X = x, Y = y, Z = z }*
- % ^^A% {Symptom:} Inconsistent separators
- % ^^A% {Workaround:} Put \CcoolOption in listing:se
- % ^^A% \end{listing}
- % ^^A% }
- % }
- ]
- {label=listing:se}
- % ^^A--->
- \CcoolOption[ Separ={{\ \char`@\ }{\ \%\ }{\ \char`@\ }} ]
- \Ccool{ X = x, Y = y }*[\\]
- { X = x, Y = y }*s{{~\&~}}[\\]
- { X = x, Y = y }*s{{,~}{~\&~}}[\\[1em]]
- { X = x, Y = y, Z = z }*[\\]
- { X = x, Y = y, Z = z }*s{{~\&~}}[\\]
- { X = x, Y = y, Z = z }*s{{,~}{\&~}}[\\]
- { X = x, Y = y, Z = z }*s{{~\&~}{,~}{,~\&~}}\\
- % ^^A<---
- \CcoolOption
- \CcoolClear
-\end{listing}
-% \iffalse
-%</guardlisting>
-% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:hw:i}. Hello, world! (for testing's sake)}
-% \iffalse
-%<*guardlisting>
-% \fi
-\begin{listing}[Hello, world! (testing)]
- {label=listing:hw:i}
- \CcoolOption[ Write = \BooleanTrue ]
- % ^^A--->
- \CcoolOption[Separ = {{}{.}{.}}, Outer = {####1}]
- \Ccool
- <Test>{ KeyA = {.}, KeyB = {!}, KeyC = {\%} }[]
- <Test>{ KeyD = {d}, KeyE = {\%} }[]
- <Test>c{\{#1\}}{ KeyF = {H}, KeyG = {e}, KeyH = {l} }*[]
- <Test>{ KeyI = {\%}, KeyJ = {\%}, KeyK = {\%} }[.\{l\}.\{o\}]
- <Test>{ KeyL = {l}, KeyM = {\char`[}, KeyN = {\char`]} }[]
- <Test>{ KeyO = {o}, KeyP = {\%}, KeyQ = {\%} }[{,\ }]
- <Test>{ KeyR = {w}, KeyS = {o}, KeyT = {r} }*
- s{{}{}{}}c{{\char`[}#1}[]
- <Test>{ KeyU = {\%}, KeyV = {\%}, KeyW = {\%} }[]
- <Test>{ KeyX = {\%}, KeyY = {\%}, KeyZ = {\KeyB<Test>} }\nobreak
- \KeyL<Test>\KeyD<Test>\KeyZ<Test>\KeyN<Test>\\
- % ^^A<---
- \CcoolOption
- \CcoolClear
-\end{listing}
-% \iffalse
-%</guardlisting>
-% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}
-% {\ref{listing:hw:ii}. \docreflist{hw:i} read from file}
-% \iffalse
-%<*guardlisting>
-% \fi
-\begin{listing}[\docreflist{hw:i} read from file]
- {label=listing:hw:ii}
- % ^^A--->
- \CcoolRead
- \KeyF<Test>\KeyA<Test>\nobreak
- \KeyG<Test>\KeyA<Test>\nobreak
- \KeyH<Test>\KeyA<Test>\nobreak
- \KeyH<Test>\KeyA<Test>\nobreak
- {\{}\nobreak\KeyO<Test>{\}},{\ }\nobreak
- \KeyM<Test>\KeyR<Test>\nobreak
- \KeyO<Test>\nobreak
- \KeyT<Test>\nobreak
- \KeyL<Test>\nobreak
- \KeyD<Test>\nobreak
- \KeyZ<Test>\nobreak
- \KeyN<Test>\nobreak
- % ^^A<---
- \CcoolClear
-\end{listing}
-% \iffalse
-%</guardlisting>
-% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:proba:i}. Probability space}
-% \iffalse
-%<*guardlisting>
-% \fi
-\begin{listing}[Probability space]
- {label=listing:proba:i}
- \CcoolOption[ Write = \BooleanTrue ]
- % ^^A--->
- \Ccool[Let~]
- { Space = \Omega, Field = \mathcal{F}, Meas = \mathcal{P} }
- *s{{,}}c{$\{#1\}$}
- [~denote the probability space, where~]{ PowerSet = { 2^{\Space} } }
- [$\Field\subset \PowerSet$.]
- {}
- % ^^A<---
- \CcoolClear
- \CcoolOption
-\end{listing}
-% \iffalse
-%</guardlisting>
-% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:proba:ii}. \docreflist{proba:i} read from file}
-% \iffalse
-%<*guardlisting>
-% \fi
-\begin{listing}[\docreflist{proba:i} read from file]
- {label=listing:proba:ii}
- % ^^A--->
- \CcoolRead \tab $\Omega$ $\Field$ $\Meas$
- % ^^A<---
- \CcoolClear
+\begingroup
+ \Ccool<foo>c{\mathbb{#1}}{ Nat = {N}, Real = {R} }
+ [Let $\Nat<foo>$ and $\Real<foo>$ denote the natural and real numbers.]{}
+\endgroup
\end{listing}
% \iffalse
%</guardlisting>
% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:mvt:i}. Mittelwertsatz f\"ur \texorpdfstring{$n$} Variable. }
+% \phantomsection\addcontentsline{toc}{section}{\textless}
+%
+% \changes{v3.2}
+% {2021/09/20}
+% {\cs[no-index]{texorpdfstring}~was~used~with~one~argument~instead~of~two~in~listing~titles,~so~removed~it.}
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:mvt:i}. Mittelwertsatz f\"ur \texorpdfstring{$n$}{n} Variable. }
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[{Mittelwertsatz f\"ur $n$ Variable\cite[17.3]{tcolbox}}]
+\begin{listing}[{Mittelwertsatz f\"ur $n$ Variable\cite[17.3]{tcolorbox}}]
{label=listing:mvt:i}
+ \begingroup
\CcoolOption[ Write = \BooleanTrue ]
- % ^^A--->
\selectlanguage{german}
\newtheorem{theorem}{Theorem}
\AfterEndEnvironment{theorem}{\CcoolHook}
@@ -1059,84 +863,65 @@ english
\end{theorem}]
{}
(Check: $\N$, $\Punkt$)
- % ^^A<---
- \CcoolClear
- \CcoolOption
+ \endgroup
+\CcoolOption
\end{listing}
% \iffalse
%</guardlisting>
% \fi
%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:mvt:ii}. \docreflist{mvt:i} read from file}
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:mvt:ii}. Listing~\ref{listing:mvt:i} read from file}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[\docreflist{mvt:i} read from file]
+\begin{listing}[Listing~\ref{listing:mvt:i} read from file]
{label=listing:mvt:ii}
- % ^^A--->
- \CcoolRead \tab $\N$ $\R$ $\OffMenge$ $\Ci$ $\Strecke$
- % ^^A<---
+ \CcoolRead ~$\N$ $\R$ $\OffMenge$ $\Ci$ $\Strecke$
\CcoolClear
\end{listing}
% \iffalse
%</guardlisting>
% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:poly:real:i}. Families of polynomial functions}
+%
+% \changes{v3.2}
+% {2021/09/20}
+% {Removed~listing~`Hello, world! (for testing's sake)'.~That~should~be~for~l3build}
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:proba:i}. Probability space}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[Families of polynomial functions]
- {label=listing:poly:real:i}
- \CcoolOption[ Write = \BooleanTrue ]
- % ^^A--->
- \Ccool c{\mathbb{#1}}{ Nat = {N}, Real = {R} }
- [Let~]
- { PolyR = \CcoolLambda[o]{\Real\IfValueT{#1}{_#1}[X] } }
- [$\PolyR[n]$ and $\PolyR$, denote the families of polynomial functions on $\Real$, of order $n$ et and their union over $n \in \Nat$, respectively. ]
+\begin{listing}[Probability space]
+ {label=listing:proba:i}
+ \begingroup
+ \Ccool[Let~]
+ { Space = \Omega, Field = \mathcal{F}, Meas = \mathcal{P} }
+ *s{{,}}c{$\{#1\}$}
+ [~denote the probability space, where~]{ PowerSet = { 2^{\Space} } }
+ [$\Field\subset \PowerSet$.]
{}
- % ^^A<---
- \CcoolClear
- \CcoolOption
+ \endgroup
\end{listing}
% \iffalse
%</guardlisting>
% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:poly:real:ii}. \docreflist{poly:real:i} read from file}
-% \iffalse
-%<*guardlisting>
-% \fi
-\begin{listing}[\docreflist{poly:real:i} read from file]
- {label=listing:poly:real:ii}
- % ^^A--->
- \CcoolRead \tab $\PolyR[n]$ et $\PolyR$
- % ^^A<---
- \CcoolClear
-\end{listing}
-% \iffalse
-%</guardlisting>
-% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:poly:arb:i}. Same as \docreflist{poly:real:i}, but arbitrary number system}
+%
+% \changes{v3.2}
+% {2021/09/20}
+% {Updated~listings~with~\cs{LambdaX}~in~place~of~\cs{CcoolLambda}}
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:poly:real:i}. Families of polynomial functions}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[Same as \docreflist{poly:real:i}, but arbitrary number system]
- {label=listing:poly:arb:i}
+\begin{listing}[Families of polynomial functions]
+ {label=listing:poly:real:i}
\CcoolOption[ Write = \BooleanTrue ]
- % ^^A--->
- \selectlanguage{french}
- \Ccool c{\mathbb{#1}}{ Corps = {K}, Nat = {N}, Reel = {R} }
- [Soient~]
- {
- Poly = \CcoolLambda[om]{#2\IfValueT{#1}{_#1}[X] },
- PolyR = \CcoolLambda[o]{\Poly[#1]{\Reel}}
- }
- [$\Poly[n]{\Corps}$ et $\Poly{\Corps}$, les familles de polyn\^omes sur $\Corps$, de degr\'e $n$ et leur union pour $n \in \Nat$, respectivement. En particulier,
- ils sont d\'enot\'es $\PolyR[n]$ et $\PolyR$, pour $\Corps=\Reel$.]
+ \Ccool c{\mathbb{#1}}{ Nat = {N}, Real = {R} }
+ [Let~]
+ { PolyR = \LambdaX[o]{\Real\IfValueT{#1}{_#1}[X] } }
+ [$\PolyR[n]$ and $\PolyR$, denote the families of polynomial functions on $\Real$, of order $n$ et and their union over $n \in \Nat$, respectively. ]
{}
- % ^^A<---
\CcoolClear
\CcoolOption
\end{listing}
@@ -1144,33 +929,32 @@ english
%</guardlisting>
% \fi
%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:poly:real:ii}. \docreflist{poly:arb:i} read from file}
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:poly:real:ii}. Listing~\ref{listing:poly:real:i} read from file}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[\docreflist{poly:arb:i} read from file]
- {label=listing:poly:arb:ii}
- % ^^A--->
- \CcoolRead \tab $\PolyR[n]$ et $\PolyR$
- % ^^A<---
- \CcoolClear
+\begin{listing}[\ref{listing:poly:real:i} read from file]
+ {label=listing:poly:real:ii}
+ \begingroup
+ \CcoolRead $\PolyR[n]$ et $\PolyR$
+ \endgroup
\end{listing}
% \iffalse
%</guardlisting>
% \fi
-%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:fonc:i}. Fonction et fonctionelle}
+%
+% \changes{v3.2}
+% {2021/09/20}
+% {Updated~listing~`Fonction~et~fonctionelle',~with~use~of~parameter}
% \iffalse
%<*guardlisting>
% \fi
\begin{listing}[Fonction et fonctionelle]
{label=listing:fonc:i}
\CcoolOption[ Write = \BooleanTrue ]
- % ^^A--->
\selectlanguage{french}
- \Ccool{ EvalAt = \CcoolLambda{(#1)}, ApplyOp = \CcoolLambda[mm]{#1[#2]} }
- [Supposons une fonction $f\EvalAt{t}$, et \'etudions le probl\`eme o\`u la fonctionnelle $\ApplyOp{S}{f}$ est donn\'ee par\dots]{}
- % ^^A<---
+ \Ccool<eval>{ fun = \LambdaX{(#1)} }[]<op>{ fun = \LambdaX[mm]{#1[#2]} }
+ [Supposons une fonction $f\fun<eval>{t}$, et \'etudions le probl\`eme o\`u la fonctionnelle $\fun<op>{S}{f}$ est donn\'ee par\dots]{}
\CcoolClear
\CcoolOption
\end{listing}
@@ -1178,29 +962,27 @@ english
%</guardlisting>
% \fi
%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:fonc:ii}. \docreflist{fonc:i} read from file}
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:fonc:ii}. Listing~\ref{listing:fonc:i} read from file}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[\docreflist{fonc:i} read from file]
+\begin{listing}[\ref{listing:fonc:i} read from file]
{label=listing:fonc:ii}
- % ^^A--->
- \CcoolRead \tab $f\EvalAt{t}$, $\ApplyOp{S}{f}$
- % ^^A<---
+ \CcoolRead $\fun<eval>{t}$, $\fun<op>{S}{f}$
\CcoolClear
\end{listing}
% \iffalse
%</guardlisting>
% \fi
-%
+%
% \phantomsection\addcontentsline{toc}{section}{\ref{listing:cusum:i}. CUSUM statistic.}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[CUSUM statistic\cite{ccool-thesis}]
+\begin{listing}[CUSUM statistic\cite{oh-2005}]
{label=listing:cusum:i}
+ \begingroup
\CcoolOption[ Write = \BooleanTrue ]
- % ^^A--->
\newtheorem{definition}{Definition}
\AfterEndEnvironment{definition}{\CcoolHook}
\Ccool{
@@ -1208,7 +990,7 @@ english
Time = { t },
Process = { \xi },
StopT = { T },
- EvalAt = \CcoolLambda{(#1)}
+ EvalAt = \LambdaX{(#1)}
}
[The CUSUM statistic process and the corresponding one-sided CUSUM stopping time are defined as follows:
\begin{definition}\label{the CUSUM statistic}. Let~]
@@ -1242,425 +1024,49 @@ english
\end{definition}\par]{}
(Check: $\Scale$, $\CUSUM$)
- % ^^A<---
- \CcoolClear
+ \endgroup
\CcoolOption
% \end{listing}
% \iffalse
%</guardlisting>
% \fi
%
-% \phantomsection\addcontentsline{toc}{section}{\ref{listing:cusum:ii}. \docreflist{cusum:i} read from file}
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:cusum:ii}. Listing~\ref{listing:cusum:i} read from file}
% \iffalse
%<*guardlisting>
% \fi
-\begin{listing}[\docreflist{cusum:i} read from file]
+\begin{listing}[Listing~\ref{listing:cusum:i} read from file]
{label=listing:cusum:ii}
- % ^^A--->
- \CcoolRead \tab $\Time $ $\Process$ $\Scale$ $\Real$ $\CUSUMthresh$ $\LogWald$ $\CUSUMst$ $\CUSUM$ $\LogWaldInf$
- % ^^A<---
- \CcoolClear
+ \begingroup
+ \CcoolRead $\Time$ $\Process$ $\Scale$ $\Real$ $\CUSUMthresh$ $\LogWald$ $\CUSUMst$ $\CUSUM$ $\LogWaldInf$
+ \endgroup
\end{listing}
% \iffalse
%</guardlisting>
% \fi
-%
-% \clearpage
-% \part{Other}\label{part:other}
-%
-% \section{Acknowledgment}\label{other:acknowl}
-%
-% This work has benefited from Q\&A's from the \LaTeX community\cite{user-erw}\cite{p158966}.
-% Specific attributions are made throughout this document.
-%
-% \section{Genealogy}\label{other:geneal}
-%
-% \textquote
-% [\pkg{cool}\cite{cool}]
-% {Give commands the ability to contain the mathematical meaning while retaining the typesetting versatility}.
-% The addition of `c', in \pkg{ccool}, is for \emph{custom}. With hinsdight it is restrictive to
-% describe \pkg{ccool} as a tool for encoding mathematical convention.
-%
-% \section{Install}\label{other:install}
-% \begin{enumerate}[label=\emph{\arabic*)}]
-% \item Compile \file{ccool.dtx} (under Unix, \texttt{\$pdflatex ccool.dtx})
-% \item Put the generated \file{ccool.sty} in the search path of the \LaTeX engine
-%^^A \NB{todo}{\pkg{l3buid} install}
-% \end{enumerate}
-%
-% \section{Issue}\label{other:issue}
-%
-% Listed under:
-% \begin{enumerate}[label={\emph{\alph*)}}]
-% \item \env{NOTE} or \cs{NB}, tagged either \texttt{bug} or \texttt{fixed}, inside \jobname|.dtx|
-% \end{enumerate}
-%
-% \section{Support}\label{other:support}
-%
-% This package is available from \url{https://www.ctan.org/pkg/ccool} and \url{https://github.com/rogard/ccool}.
-%
-% \section{Testing}\label{other:testing}
-%
-% \subsection{Technicality}
-% Not possible to compile-check the expansion of a certain class of macros against predefined values\cite{a-534100}.
-% Instead, one can
-% \begin{enumerate}[label={\emph{\alph*)}}]
-% \item Follow the steps in \autoref{other:install} on one's own machine to generate \jobname|.pdf|
-% \item Visually check \autoref{part:listing}, against that \href{https://github.com/rogard/ccool}{of the repository}, for the same version.
-% \end{enumerate}
-% Also see:
-% \begin{enumerate}[label={\emph{\alph*)}}]
-% \setcounter{enumi}{2}
-% \item Also see: \autoref{other:todo}~\ref{todo:regtest}
-% \end{enumerate}
-%
-% \subsection{Platform}
-% \begin{enumerate}[label=\emph{\roman*)}]
-% \item
-% ^^A uname -a
-% \begin{Verbatim}[breaklines=true]
-% Linux laptop 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
-% \end{Verbatim}
-% \label{plat:lin}
-% \end{enumerate}
-%
-% \subsection{Engine}
-% \begin{enumerate}[label=\emph{\alph*)}]
-% \item
-% \begin{Verbatim}[breaklines=true]
-% pdfTeX 3.14159265-2.6-1.40.20 (TeX Live 2019)
-% \end{Verbatim}
-% \label{eng:tlxviiii:pdf}
-% \item
-% \begin{Verbatim}[breaklines=true]
-% pdfTeX 3.14159265-2.6-1.40.21 (TeX Live 2020)
-% \end{Verbatim}
-% \label{eng:tlxx:pdf}
-% \item
-% \begin{Verbatim}[breaklines=true]
-% LuaHBTeX, Version 1.12.0 (TeX Live 2020)
-% \end{Verbatim}
-% \label{eng:tlxx:lua}
-% \item
-% \begin{Verbatim}[breaklines=true]
-% XeTeX 3.14159265-2.6-0.999992 (TeX Live 2020)
-% \end{Verbatim}
-% \label{eng:tlxx:xe}
-% \end{enumerate}
-%
-% \subsection{Results}
-%
-% \begin{enumerate}[label=\emph{\arabic*)}]
-% \item \pkg{ccool} \docvers{1}{8} compiles satisfactorily on platform \ref{plat:lin} and engine \ref{eng:tlxviiii:pdf}
-% \item \pkg{ccool} \docvers{1}{8} compiles satisfactorily on platform \ref{plat:lin} and engine \ref{eng:tlxx:pdf}
-% \item \pkg{ccool} \docvers{1}{9} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf} and \ref{eng:tlxx:lua}
-% \item \pkg{ccool} \docvers{2}{0} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
-% \item \pkg{ccool} \docvers{2}{1} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
-% \item \pkg{ccool} \docvers{2}{3} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
-% \item \pkg{ccool} \docvers{2}{7} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
-% \item \pkg{ccool} \docvers{2}{8} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
-% \end{enumerate}
-%
-% \subsection{Other}
-% Check \cite{ccool-thesis} for testing \pkg{ccool} with \cls{llncs}
-%
-% \section{To do}\label{other:todo}
-%
-% \begin{enumerate}[label=\emph{\alph*)}]
-% \item Regression testing using \cite[Section 3.2—Specifying expectations]{l3build}. \label{todo:regtest}
-% \end{enumerate}
-% Also see:
-% \begin{enumerate}[label=\emph{\alph*)}]
-% \setcounter{enumi}{1}
-% \item \env{NOTE} or \cs{NB} tagged \texttt{abandon\docpipe{}done\docpipe{}todo} inside \jobname|.dtx|
-% \end{enumerate}
-%
-% \DocPhantomSection*{section}{References}{other:bib}
-% \begin{thebibliography}{1}
-% \bibitem{cool} Nick Setzer {\em The \pkg{cool} package}, 2005, \url{https://www.ctan.org/pkg/cool}
-% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces}, 2019,
-% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
-% \bibitem{l3build} The \LaTeX3 Project Team {\em The \pkg{l3build} package}, 2020,
-% \url{http://mirror.utexas.edu/ctan/macros/latex/contrib/l3build/l3build.pdf}
-% \bibitem{tcolbox} Thomas F. Sturm {\em The \pkg{tcolorbox} package}, 2019,
-% \url{http://www.texdoc.net/texmf-dist/doc/latex/tcolorbox/tcolorbox.pdf}
-% \bibitem{xparse} The \LaTeX3 Project Team {\em The \pkg{xparse} package}, 2020,
-% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3packages/xparse.pdf}
-% \bibitem{ccool-thesis} Erwann Rogard and Olympia Hadjiliadis {\em Typesetting a math thesis with \pkg{ccool}}, 2020,
-% \url{https://github.com/rogard/ccool/blob/master/thesis.pdf}
-% \bibitem{user-erw} \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions}
-% \bibitem{a-534100} \href{https://tex.stackexchange.com/users/73/joseph-wright}{@{}joseph-wright}'s answer to
-% ``Checking a function's expansion against a string'', \url{https://tex.stackexchange.com/a/534100}
-% \bibitem{a-536597} \href{https://tex.stackexchange.com/users/73317/frougon}{@{}frougon}'s answer to ``Journaling calls to a function \textdel{taking inline code as argument}'', \url{https://tex.stackexchange.com/a/536620}
-% \bibitem{p158966}\cs{Ccool}, extension à \LaTeX~à vocation mathématique, \url{http://forum.mathematex.net/latex-f6/ccool-extension-latex-a-vocation-mathematique-t17314.html}
-% \bibitem{a-547018} \href{https://tex.stackexchange.com/users/5735/javier-bezos}{@{}Javier Bezos}'s answer to~\url{https://tex.stackexchange.com/a/547018/112708}
-% \end{thebibliography}
-%
-% \changes{\docvers{1}{0}}
-% {2020/03/08}
-% {Initial version}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Rearrange: much of the implementation}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Replace: \Arg{kvl_{2}}~by~\docpard{\meta{kvl_{2}}}~given that option type \texttt{G} not recommended\cite{xparse}}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Replace: \cs{OopsOptions}~by~\cs{OopsOption}}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Replace: \docarg{GenericObject}~by~\docarg{Name}}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Replace: \docarg{Separators}~by~\docarg{Separ}}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Add:\cs{OopsTest}}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Add:\cs{OopsRestore}}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Add: \docarg{Save}}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Delete: Listing 1-5 from \docvers{1}{0}}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Add: Listing~1., 2., 3., 4., 6., and 9.}
-% \changes{\docvers{1}{1}}
-% {2020/04/04}
-% {Fix: apparent anomaly in \docvers{1}{0}'s Listing~4, see \docreflist{hw:i}}
-% \changes{\docvers{1}{2}}
-% {2020/04/06}
-% {Add: optional \pkgparex to \cs{OopsNew} as instruction to expand \pkgparkvl}
-% \changes{\docvers{1}{2}}
-% {2020/04/06}
-% {Replace: \cs{OopsClear}\Arg{\pkgparpa} by \cs{OopsClear}\docparo{\meta{\doccceptkvl}}}
-% \changes{\docvers{1}{2}}
-% {2020/04/06}
-% {Delete: \meta{kvl_{2}}~and~\meta{code_{2}}}
-% \changes{\docvers{1}{2}}
-% {2020/04/06}
-% {Delete: \cs{OopsTest}}
-% \changes{\docvers{1}{2}}
-% {2020/04/06}
-% {Delete: Listing~2-3 from \docvers{1}{1}.}
-% \changes{\docvers{1}{2}}
-% {2020/04/06}
-% {Replace: \cs{Save} by \cs{Write}}
-% \changes{\docvers{1}{2}}
-% {2020/04/06}
-% {Replace: \cs{Restore} by \cs{Read}}
-% \changes{\docvers{1}{3}}
-% {2020/04/06}
-% {Replace: \cs{OopsNew} by \cs{Oops}}
-% \changes{\docvers{1}{3}}
-% {2020/04/06}
-% {Replace: \Arg{\pkgparpa} and \docparo{\meta{\pkgparpa}} by \docpard{\meta{\pkgparpa}} }
-% \changes{\docvers{1}{4}}
-% {2020/04/10}
-% {Replace: \docpare{s}{\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}
-% by \docpare{s}{\Arg{\pkgparsi}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}}
-% \changes{\docvers{1}{4}}
-% {2020/04/10}
-% {Add:optional \pkgparap to \cs{OopsNew} to make side effects presist beyond local group}
-% \changes{\docvers{1}{4}}
-% {2020/04/10}
-% {Add: \cs{OopsHook}}
-% \changes{\docvers{1}{4}}
-% {2020/04/10}
-% {Delete: Listing~1., and 2. }
-% \changes{\docvers{1}{4}}
-% {2020/04/10}
-% {Add: Listing~1., 2., and 3. }
-% \changes{\docvers{1}{4}}
-% {2020/04/10}
-% {Add: \docarg{Expans} (for debugging' sake, but...) }
-% \changes{\docvers{1}{4}}
-% {2020/04/10}
-% {Add: \autoref{usage:dosdont} }
-% \changes{\docvers{1}{4}}
-% {2020/04/10}
-% {Add: \cs{OopsDebug} }
-% \changes{\docvers{1}{5}}
-% {2020/04/10}
-% {Delete: dependence on \pkg{datetime} }
-% \changes{\docvers{1}{5}}
-% {2020/04/10}
-% {Add: \pkgoptfi }
-% \changes{\docvers{1}{6}}
-% {2020/04/10}
-% {Rename: \pkg{oops} to \pkg{ccool} (better describes the purpose) }
-% \changes{\docvers{1}{6}}
-% {2020/04/10}
-% {Rename: \cs{Oops} to \cs{Ccool}}
-% \changes{\docvers{1}{6}}
-% {2020/04/10}
-% {Rename: \cs{OopsClear} to \cs{CcoolClear}}
-% \changes{\docvers{1}{6}}
-% {2020/04/10}
-% {Rename: \cs{OopsDebug} to \cs{CcoolDebug}}
-% \changes{\docvers{1}{6}}
-% {2020/04/10}
-% {Rename: \cs{OopsHook} to \cs{CcoolHook}}
-% \changes{\docvers{1}{6}}
-% {2020/04/10}
-% {Rename: \cs{OopsOption} to \cs{CcoolOption}}
-% \changes{\docvers{1}{6}}
-% {2020/04/10}
-% {Rename: \cs{OopsRead} to \cs{CcoolRead}}
-% \changes{\docvers{1}{6}}
-% {2020/04/10}
-% {Add: Listing showing part of the preamble }
-% \changes{\docvers{1}{7}}
-% {2020/04/11}
-% {Add: \docreflist{cusum:i} (CUSUM) }
-% \changes{\docvers{1}{7}}
-% {2020/04/11}
-% {Add: Legends to listings }
-% \changes{\docvers{1}{7}}
-% {2020/04/11}
-% {Delete: \cs{CcoolDebug} }
-% \changes{\docvers{1}{7}}
-% {2020/04/11}
-% {Delete: Listing~5 from \docvers{1}{6} }
-% \changes{\docvers{1}{8}}
-% {2020/04/12}
-% {Add: \hyperref[usage:cs:lambda]{\cs{CcoolLambda}} }
-% \changes{\docvers{1}{8}}
-% {2020/04/12}
-% {Add: \docreflist{fonc:i}, \docreflist{fonc:ii} }
-% \changes{\docvers{1}{8}}
-% {2020/04/12}
-% {Add: \cs{CcoolVers} }
-% \changes{\docvers{1}{8}}
-% {2020/04/12}
-% {Add: \docreflist{vers} }
-% \changes{\docvers{1}{9}}
-% {2020/04/14}
-% {Add: support for \LuaTeX }
-% \changes{\docvers{1}{9}}
-% {2020/04/14}
-% {Move: from \autoref{part:usage} to \autoref{part:impl}, what is now that part's \autoref{impl:frontend}}
-% \changes{\docvers{2}{0}}
-% {2020/04/15}
-% {Delete: \pkgoptfi's dependency on \pkg{texosquery} and \cs{pdfcreationdate}}
-% \changes{\docvers{2}{0}}
-% {2020/04/15}
-% {Add: support for \XeTeX}
-% \changes{\docvers{2}{0}}
-% {2020/04/15}
-% {Update: \cs{RequirePackage}, \cs{NeedsTeXFormat}'s second argument / TeX Live 2020}
-% \changes{\docvers{2}{1}}
-% {2020/04/17}
-% {Replace: \hyperref[usage:cs:lambda]{\cs{CcoolLambda}}'s optional integer argument (number of \texttt{m}'s)
-% by a standard argument list}
-% \changes{\docvers{2}{1}}
-% {2020/04/17}
-% {Replace: \hyperref[ccool:pa]{\meta{\pkgparpa}}'s position within \cs{Ccool}'s argument list, from first to second. Greater versatility }
-% \changes{\docvers{2}{1}}
-% {2020/04/17}
-% {Replace: as~the~default~of~\pkgoptpa,~\docarg{Math}~by~\pkgoptpad}
-% \changes{\docvers{2}{1}}
-% {2020/04/17}
-% {Replace: \docccept{\doccceptgopt}~\docarg{Name} by \nameref{usage:opt:pa} }
-% \changes{\docvers{2}{1}}
-% {2020/04/17}
-% {Add:Listings 3, 4, 5, 6, 7, 8, and 9}
-% \changes{\docvers{2}{2}}
-% {2020/04/20}
-% {Remove: \% from listings}
-% \changes{\docvers{2}{2}}
-% {2020/04/20}
-% {Replace: part of the abstract's with more straighforward descriptions based on input from forum participtants}
-% \changes{\docvers{2}{3}}
-% {2020/05/16}
-% {Replace: for \cs{Ccool}, \docpare{i}{} by \docpare{c}{}}
-% \changes{\docvers{2}{3}}
-% {2020/05/16}
-% {Rearranged: \nameref{usage:cs:ccool}'s subsections. Previously, by argument. Now, by feature. }
-% \changes{\docvers{2}{3}}
-% {2020/05/16}
-% {Replace: In \docstep{key}, the created command's implementation, from \cs{ProvideDocumentCommand} to \cs{DeclareDocumentCommand}}
-% \changes{\docvers{2}{3}}
-% {2020/05/16}
-% {Complete: \docreflist{poly:real:i}}
-% \changes{\docvers{2}{3}}
-% {2020/05/16}
-% {Add: \docreflist{poly:real:ii}, \docreflist{poly:arb:i}, and \docreflist{poly:arb:ii}}
-% \changes{\docvers{2}{3}}
-% {2020/05/16}
-% {Remove: Listing showing part of the preamble }
-% \changes{\docvers{2}{4}}
-% {2020/05/16}
-% {Fix: minor error in the listings (\cs{Real} rather than \cs{Reel}, hitherto unnoticed). }
-% \changes{\docvers{2}{4}}
-% {2020/05/16}
-% {Remove: examples from \autoref{part:usage},~\nameref{usage:cs:ccool}, as redundant with \autoref{part:listing}~\docreflist{numbrsys:base}-\ref{listing:numbrsys:pa}}
-% \changes{\docvers{2}{5}}
-% {2020/05/21}
-% {Modify: behavior of \autoref{part:usage}~\nameref{ccool:ex}, rely on \pkg{erw-l3}'s \cs{erw_seq_use:Nn} }
-%
-% \changes{\docvers{2}{5}}
-% {2020/05/21}
-% {Modify: \nameref{impl:opt:fi}, rely on \pkg{erw-l3}'s \cs{erw_jobnametimestamp:} }
-%
-% \changes{\docvers{2}{6}}
-% {2020/05/22}
-% {Modify: \nameref{impl:cs:lambda}, rely on \pkg{erw-l3}'s \cs{erw_lambda:nnn} }
-%
-% \changes{\docvers{2}{7}}
-% {2020/05/28}
-% {Add: \docccept{\doccceptgopt}~\nameref{usage:opt:an} }
-%
-% \changes{\docvers{2}{7}}
-% {2020/05/28}
-% {Add: \doclist{lang} }
-%
-% \changes{\docvers{2}{7}}
-% {2020/05/28}
-% {Modify: \nameref{usage:opt:se}'s default rely on \pkg{babel} and \pkg{amsmath}, if applicable}
-%
-% \changes{\docvers{2}{7}}
-% {2020/05/28}
-% {Modify: \nameref{usage:cs:option}'s \docxparsem by \docxparseo}
-%
-% \changes{\docvers{2}{8}}
-% {2020/05/28}
-% {Fix: conflict between \cs{usepackage}\docparo{spanish}\docparm{babel} and \nameref{ccool:pa} }
-%
-% \changes{\docvers{2}{9}}
-% {2020/06/03}
-% {Miscellaneous }
%
-% \changes{\docvers{3}{0}}
-% {2020/06/04}
-% {Miscellaneous }
-%
-% \changes{\docvers{3}{1}}
-% {2020/10/10}
-% {Replaced: \doclist{thisdeps}'s content, from exhaustive dependencies to those explicit with \cs{usepackage}}
-%
-% \PrintChanges
-% \PrintIndex
-% \clearpage
-% \StopEventually{
-% ^^A \PrintChanges
-% ^^A \PrintIndex
+% \StopEventually{
+% \clearpage
+% \PrintChanges
+% \PrintIndex %^^A https://tex.stackexchange.com/q/610349/112708
% }
-% \end{documentation}
+%
+%\end{documentation}
% \begin{implementation}
-% \selectlanguage{english}
% \part{Implementation}\label{part:impl}
-%
% \section{Opening}
% \begin{macrocode}
%<*package>
%<@@=ccool>
\ExplSyntaxOn
% \end{macrocode}
+% \changes{v3.2}
+% {2021/09/20}
+% {Removed~dependence~on~\pkg{erw-l3}.}
+% \changes{v3.2}
+% {2021/09/20}
+% {Added~dependence~on~\pkg{lambdax}.}
+%
% \section{\textsf{aux}}
% \begin{macro}{\@@_aux_inner_set:n}
% \begin{arguments}
@@ -1786,18 +1192,22 @@ english
}
% \end{macrocode}
% \end{macro}
+% \begin{macrocode}
+\cs_new:Nn\@@_aux_merge:nn{#1#2}
+% \end{macrocode}
% \section{\textsf{lang}}
% \begin{macrocode}
\prop_new:N \g@@_lang_and_prop
% \end{macrocode}
% \begin{macro}{\@@_lang_and_update:n}
% \begin{macrocode}
+% \changes{v3.2}
+% {2021/09/20}
+% {Replace~\cs[no-index]{erw_prop_keyval:Nn}~by~\cs[no-index]{prop_set_from_keyval:Nn}}
\cs_new_protected:Nn \@@_lang_and_update:n
{
- \erw_prop_keyval_parse:NNNn
+ \prop_set_from_keyval:Nn
\g@@_lang_and_prop
- \erw_keyval_error:Nn
- \prop_gput:Nnn
{ #1 }
}
\cs_generate_variant:Nn \@@_lang_and_update:n { e }
@@ -1973,6 +1383,7 @@ english
% \section{\textsf{make_ccool}}
% \begin{macro}{\@@_make_ccool_exp:nnn}
% \begin{macrocode}
+% ^^A \erw_seq_use:Nn
\cs_new_protected:Nn \@@_make_ccool_exp:nnn
{
\@@_aux_val:Nn \g@@_aux_key_seq {#1}
@@ -1980,7 +1391,7 @@ english
\@@_aux_outer:n
{
\exp_args:NNf
- \erw_seq_use:Nn
+ \@@_seq_use:Nn
\g@@_aux_val_seq
{#2}
}
@@ -2251,6 +1662,44 @@ english
}
% \end{macrocode}
% \end{macro}
+% \section{\textsf{seq_use}}
+% \begin{macro}{\@@_seq_from_prop:NNn}
+% \begin{macrocode}
+% \changes{v3.2}
+% {2021/09/20}
+% {Added~\cs[no-index]{__ccool_seq_use:Nn}~in~replacement~of~\cs[no-index][erw_seq_use:Nn]}
+\msg_new:nnn{@@}{separ}{#1~expects~1~to~3~items,~#2}
+\cs_new:Nn \@@_seq_use:Nn
+{
+ \exp_last_unbraced:NNf
+ \seq_use:Nnnn #1
+ \@@_tl_separators:n{#2}
+}
+\cs_new:Nn \@@_tl_separators:n
+{ \@@_tl_separators:en{ \tl_count:n{#1} }{#1} }
+\cs_new:Nn \@@_tl_separators:nn
+{ \int_case:nnTF {#1}
+ { {1}
+ { \prg_replicate:nn{ 3 }{#2} }
+ {2}
+ {
+ { \use_ii:nn #2 }
+ { \use_i:nn #2 }
+ { \use_i:nn #2 \use_ii:nn #2 }
+ }
+ {3}{#2}
+ }
+ { \c_empty_tl }
+ {
+ \msg_error:nnnn { @@ }
+ { separ }
+ { \@@_tl_separators:nn }
+ {#2}
+ }
+}
+\cs_generate_variant:Nn \@@_tl_separators:nn { e }
+% \end{macrocode}
+% \end{macro}
% \section{Front-end}\label{impl:frontend}
% \DocPhantomSection*{subsection}{\cs{CcoolClear}}{impl:cs:clear}
% \begin{macro}{\CcoolClear}
@@ -2272,10 +1721,10 @@ english
% \begin{macro}{\CcoolLambda}
% \NB{todo}{allow only m- or o-type arguments}
% \begin{macrocode}
+% \changes{v3.2}
+% {2021/09/20}{\cs[CcoolLambda]'s~implementation~switched~from~\pkg{erw-l3}~to~\pkg{lambdax};~kept~only~for~backward~compat.}
\ProvideDocumentCommand \CcoolLambda { O{m} m }
-{
- \erw_lambda:nnn \DeclareDocumentCommand { #1 } { #2 }
-}
+{ \lambdax:nn{#1}{#2} }
% \end{macrocode}
% \end{macro}
% \DocPhantomSection*{subsection}{\cs{CcoolOption}}{impl:cs:option}
@@ -2294,50 +1743,50 @@ english
\keys_define:nn { @@ }
{
% \end{macrocode}
-% \DocPhantomSection*{subsubsection}{\pkgoptan}{impl:opt:an}
-% \DescribeOption{\pkgoptan}
% \begin{macrocode}
And .code:n = { \@@_lang_and_update:e{ #1 } },
And .default:n = { \c@@_lang_and_tl },
And .initial:n = { \c@@_lang_and_tl },
% \end{macrocode}
-% \DocPhantomSection*{subsubsection}{\pkgoptex}{impl:opt:ex}
-% \DescribeOption{\pkgoptex}
% \begin{macrocode}
Expans .multichoices:nn = { eo, ee, ex, xo, xe, xx }
{ \tl_gset_eq:NN \g@@_option_expans_tl \l_keys_choice_tl },
Expans .default:n = { xo },
Expans .initial:n = { xo },
% \end{macrocode}
-% \DocPhantomSection*{subsubsection}{\pkgoptfi}{impl:opt:fi}
-% \DescribeOption{\pkgoptfi}
% \begin{macrocode}
-File .code:n = {
- \tl_gset:Nx \g@@_log_file_tl{#1}
-},
-File .default:n = { \erw_sys_jobnametimestamp: },
-File .initial:n = { \erw_sys_jobnametimestamp: },
+% \changes{v3.2}
+% {2021/09/20}
+% {Removed~module~key~File's~relianced~on~a~timestamp~(clumsy)}
+File .code:n = { \tl_gset:Nx \g@@_log_file_tl{#1} } }
+\cs_new_protected:Nn
+\@@_keys_define_file:n
+{\keys_define:nn { @@ }
+ {File .code:n = { \tl_gset:Nx \g@@_log_file_tl{#1} },
+ File .default:n = { #1 },
+ File .initial:n = { #1 } } }
+\cs_generate_variant:Nn\@@_keys_define_file:n{e}
+\@@_keys_define_file:e
+{\exp_args:Ne\@@_aux_merge:nn{\c_sys_jobname_str}{_ccool_log}}
% \end{macrocode}
-% \DocPhantomSection*{subsubsection}{\pkgoptin}{impl:opt:in}
-% \DescribeOption{\pkgoptin}
% \begin{macrocode}
-Inner .code:n={
- \@@_option_inner:n{#1}
- \exp_last_unbraced:Nf
- \@@_make_ccool:nnnn
- {
- { \g@@_option_param_tl }
- { \g@@_option_inner_tl }
- { \g@@_option_separ_tl }
- { \g@@_option_outer_tl }
- }
-},
+\keys_define:nn { @@ }
+{
+ Inner .code:n={
+ \@@_option_inner:n{#1}
+ \exp_last_unbraced:Nf
+ \@@_make_ccool:nnnn
+ {
+ { \g@@_option_param_tl }
+ { \g@@_option_inner_tl }
+ { \g@@_option_separ_tl }
+ { \g@@_option_outer_tl }
+ }
+ },
Inner .value_required:n = false,
Inner .default:n = {####1},
Inner .initial:n = {####1},
% \end{macrocode}
-% \DocPhantomSection*{subsubsection}{\pkgoptpa}{impl:opt:pa}
-% \DescribeOption{\pkgoptpa}
% \begin{macrocode}
Param .code:n={
\@@_option_param:n{#1}
@@ -2354,8 +1803,6 @@ Param .value_required:n = false,
Param .default:n = { Default },
Param .initial:n = { Default },
% \end{macrocode}
-% \DocPhantomSection*{subsubsection}{\pkgoptou}{impl:opt:ou}
-% \DescribeOption{\pkgoptou}
% \begin{macrocode}
Outer .code:n={
\@@_option_outer:n{#1}
@@ -2372,8 +1819,6 @@ Outer .value_required:n = false,
Outer .default:n = { \ensuremath{####1} },
Outer .initial:n = { \ensuremath{####1} },
% \end{macrocode}
-% \DocPhantomSection*{subsubsection}{\pkgoptse}{impl:opt:se}
-% \DescribeOption{\pkgoptse}
% \begin{macrocode}
Separ .code:n={
\@@_option_separ:n{#1}
@@ -2390,8 +1835,6 @@ Separ .value_required:n = false,
Separ .default:n = { \c@@_option_separ_default_tl },
Separ .initial:n = { \c@@_option_separ_default_tl },
% \end{macrocode}
-% \DocPhantomSection*{subsubsection}{\pkgoptwr}{impl:opt:wr}
-% \DescribeOption{\pkgoptwr}
% \begin{macrocode}
Write .code:n = {
\bool_if:nTF{#1}
@@ -2405,7 +1848,6 @@ Write .initial:n = \BooleanFalse
% \begin{macrocode}
}
% \end{macrocode}
-% \DocPhantomSection*{subsection}{\cs{CcoolRead}}{impl:cs:read}
% \begin{macro}{\CcoolRead}
% \begin{macrocode}
\NewDocumentCommand{\CcoolRead}
@@ -2417,7 +1859,6 @@ Write .initial:n = \BooleanFalse
}
% \end{macrocode}
% \end{macro}
-% \DocPhantomSection*{subsection}{\cs{CcoolVers}}{impl:cs:vers}
% \begin{macro}{\CcoolVers}
% \begin{macrocode}
\NewDocumentCommand{\CcoolVers}
@@ -2426,13 +1867,10 @@ Write .initial:n = \BooleanFalse
% \end{macrocode}
% \end{macro}
% \section{Closing}
-%
% \begin{macrocode}
\ExplSyntaxOff
%</package>
% \end{macrocode}
-%
% \end{implementation}
-%
% \Finale
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/ccool/ccool.ins b/macros/latex/contrib/ccool/ccool.ins
new file mode 100644
index 0000000000..7b35314b55
--- /dev/null
+++ b/macros/latex/contrib/ccool/ccool.ins
@@ -0,0 +1,64 @@
+%%
+%% This is file `ccool.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ccool.dtx (with options: `install')
+%% -----------------------------------------------------------------------------
+%% ccool --- (Custom) COntext Oriented LaTeX
+%% Released under the LaTeX Project Public License v1.3c or later
+%% See http://www.latex-project.org/lppl.txt
+%% ----------------------------------------------------------------------------
+%%
+\input l3docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+-----------------------------------------------------------------------------
+ccool --- (Custom) COntext Oriented LaTeX
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+Copyright (C) 2020-2021 by Erwann Rogard
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Erwann Rogard.
+
+This work consists of the file ccool.dtx and the derived files:
+ccool.sty, and ccool.pdf.
+
+\endpostamble
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+ \endbatchfile
+%%
+%% Copyright (C) 2020-2021 by Erwann Rogard
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License (LPPL), either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in the file:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work is "maintained" (as per LPPL maintenance status) by
+%% Erwann Rogard.
+%%
+%% This work consists of the file ccool.dtx and the derived files:
+%% ccool.sty, and ccool.pdf.
+%%
+%%
+%% End of file `ccool.ins'.
diff --git a/macros/latex/contrib/ccool/ccool.pdf b/macros/latex/contrib/ccool/ccool.pdf
index b5263ecc37..b9b0a13651 100644
--- a/macros/latex/contrib/ccool/ccool.pdf
+++ b/macros/latex/contrib/ccool/ccool.pdf
Binary files differ
diff --git a/macros/latex/contrib/debate/DEPENDS.txt b/macros/latex/contrib/debate/DEPENDS.txt
new file mode 100644
index 0000000000..a468679b1f
--- /dev/null
+++ b/macros/latex/contrib/debate/DEPENDS.txt
@@ -0,0 +1,3 @@
+hard xcolor
+hard tcolorbox
+hard xkeyval
diff --git a/macros/latex/contrib/debate/README.md b/macros/latex/contrib/debate/README.md
new file mode 100644
index 0000000000..3d8d0294c0
--- /dev/null
+++ b/macros/latex/contrib/debate/README.md
@@ -0,0 +1,29 @@
+[![make](https://github.com/yegor256/debate/actions/workflows/latexmk.yml/badge.svg)](https://github.com/yegor256/debate/actions/workflows/latexmk.yml)
+[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/yegor256/debate/blob/master/LICENSE.txt)
+
+This LaTeX package helps you organize debates between a few reviewers
+right inside the text of your document.
+
+First, [install it](https://en.wikibooks.org/wiki/LaTeX/Installing_Extra_Packages)
+from [CTAN](https://ctan.org/pkg/debate)
+and then use in the preamble:
+
+```tex
+\documentclass{article}
+\usepackage{debate}
+\begin{document}
+I think apples are tastier
+ \debate[jeff]{I don't think it's true!}
+ \debate[anna]{It is indeed true!}
+than pears!
+\end{document}
+```
+
+The full example and all commands are available in the
+[`debate.tex`](https://github.com/yegor256/debate/blob/master/debate.tex) file.
+
+If you want to contribute yourself, make a fork, then create a branch,
+then run `make` in the root directory.
+It should compile everything without errors. If not, submit an issue and wait.
+Otherwise, make your changes and then run `make` again. If the build is
+still clean, submit a pull request.
diff --git a/macros/latex/contrib/debate/debate.pdf b/macros/latex/contrib/debate/debate.pdf
new file mode 100644
index 0000000000..07c667fe77
--- /dev/null
+++ b/macros/latex/contrib/debate/debate.pdf
Binary files differ
diff --git a/macros/latex/contrib/debate/debate.sty b/macros/latex/contrib/debate/debate.sty
new file mode 100644
index 0000000000..723168bc9a
--- /dev/null
+++ b/macros/latex/contrib/debate/debate.sty
@@ -0,0 +1,52 @@
+% (The MIT License)
+%
+% Copyright (c) 2021 Yegor Bugayenko
+%
+% Permission is hereby granted, free of charge, to any person obtaining a copy
+% of this software and associated documentation files (the 'Software'), to deal
+% in the Software without restriction, including without limitation the rights
+% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+% copies of the Software, and to permit persons to whom the Software is
+% furnished to do so, subject to the following conditions:
+%
+% The above copyright notice and this permission notice shall be included in all
+% copies or substantial portions of the Software.
+%
+% THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+% SOFTWARE.
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{debate}[2021/09/24 0.1.0 Debates Between Reviewers]
+
+\RequirePackage{xcolor}
+\RequirePackage[most]{tcolorbox}
+
+\RequirePackage{xkeyval}
+\makeatletter
+\newif\ifdebate@hide
+\DeclareOptionX{hide}{\debate@hidetrue}
+\ProcessOptionsX\relax
+\makeatother
+
+\makeatletter\newcommand\debate[2][Author]{%
+ \ifdebate@hide%
+ #1%
+ \else%
+ {%
+ \begin{tcolorbox}[frame hidden,sharp corners,enhanced,borderline west={1pt}{0pt}{red},interior hidden,boxsep=0pt,left=0pt,right=0pt,top=0pt,bottom=0pt,beforeafter skip balanced=0pt]
+ \sffamily\color{gray}%
+ \raggedright%
+ \addtolength\leftskip{18pt}\setlength\parskip{0pt}\setlength\parindent{0pt}%
+ \textcolor{red}{\bfseries\scshape #1}: #2
+ \end{tcolorbox}
+ \vspace{-\parskip}
+ }%
+ \fi%
+}\makeatother
+
+\endinput
diff --git a/macros/latex/contrib/debate/debate.tex b/macros/latex/contrib/debate/debate.tex
new file mode 100644
index 0000000000..09474d184e
--- /dev/null
+++ b/macros/latex/contrib/debate/debate.tex
@@ -0,0 +1,77 @@
+% (The MIT License)
+%
+% Copyright (c) 2021 Yegor Bugayenko
+%
+% Permission is hereby granted, free of charge, to any person obtaining a copy
+% of this software and associated documentation files (the 'Software'), to deal
+% in the Software without restriction, including without limitation the rights
+% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+% copies of the Software, and to permit persons to whom the Software is
+% furnished to do so, subject to the following conditions:
+%
+% The above copyright notice and this permission notice shall be included in all
+% copies or substantial portions of the Software.
+%
+% THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+% SOFTWARE.
+
+\documentclass[12pt]{article}
+\usepackage[T1]{fontenc}
+\usepackage[tt=false,type1=true]{libertine}
+\usepackage{multicol}
+\usepackage{debate}
+\usepackage{ffcode}
+\usepackage{xcolor}
+\usepackage{microtype}
+\title{\ff{debate}: \LaTeX{} Package \\ for Debates Between Reviewers}
+\author{Yegor Bugayenko}
+\date{0.1.0 2021/09/24}
+\begin{document}
+\pagenumbering{gobble}
+\raggedbottom
+\setlength{\parindent}{0pt}
+\setlength{\columnsep}{32pt}
+\setlength{\parskip}{6pt}
+\maketitle
+
+This package helps you organize debates between a few people
+right inside your documents:
+
+\begin{multicols}{2}
+\scriptsize
+\raggedcolumns
+\begin{verbatim}
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\usepackage{debate}
+\begin{document}
+I think apples are tastier
+\debate[Jeff]{I don't think it's true!}
+\debate[Anna]{It is indeed true!}
+than pears!
+
+And I don't want to argue with me.
+\end{document}
+\end{verbatim}
+
+\columnbreak
+
+I think apples are tastier
+\debate[Jeff]{I don't think it's true!}
+\debate[Anna]{It is indeed true!}
+than pears!
+
+And I don't want to argue with me.
+\end{multicols}
+
+You can hide them all using \ff{hide} package option.
+
+More details about this package you can find
+in the \ff{yegor256/debate} GitHub repository.
+
+\end{document} \ No newline at end of file
diff --git a/macros/luatex/latex/yamlvars/README.md b/macros/luatex/latex/yamlvars/README.md
new file mode 100644
index 0000000000..f901e1ef35
--- /dev/null
+++ b/macros/luatex/latex/yamlvars/README.md
@@ -0,0 +1,32 @@
+# YAMLvars -- parse a YAML document and create LaTeX definitons
+
+This LuaLaTeX package provides a YAML parser and some functions to declare and define LaTeX definitions using YAML files.
+
+
+
+# License
+
+Copyright (C) 2021 Kale Ewasiuk
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+
diff --git a/macros/luatex/latex/yamlvars/YAMLvars.lua b/macros/luatex/latex/yamlvars/YAMLvars.lua
new file mode 100644
index 0000000000..11f75edda3
--- /dev/null
+++ b/macros/luatex/latex/yamlvars/YAMLvars.lua
@@ -0,0 +1,369 @@
+--% Kale Ewasiuk (kalekje@gmail.com)
+--% 2021-09-24
+--%
+--% Copyright (C) 2021 Kale Ewasiuk
+--%
+--% Permission is hereby granted, free of charge, to any person obtaining a copy
+--% of this software and associated documentation files (the "Software"), to deal
+--% in the Software without restriction, including without limitation the rights
+--% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+--% copies of the Software, and to permit persons to whom the Software is
+--% furnished to do so, subject to the following conditions:
+--%
+--% The above copyright notice and this permission notice shall be included in
+--% all copies or substantial portions of the Software.
+--%
+--% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+--% ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+--% TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+--% PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+--% SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+--% ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+--% ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+--% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+--% OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+-- tinyyaml license
+--MIT License
+--
+--Copyright (c) 2017 peposso
+--
+--Permission is hereby granted, free of charge, to any person obtaining a copy
+--of this software and associated documentation files (the "Software"), to deal
+--in the Software without restriction, including without limitation the rights
+--to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+--copies of the Software, and to permit persons to whom the Software is
+--furnished to do so, subject to the following conditions:
+--
+--The above copyright notice and this permission notice shall be included in all
+--copies or substantial portions of the Software.
+--
+--THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+--IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+--FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+--AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+--LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+--OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+--SOFTWARE.
+
+
+
+YAMLvars = {} -- self table
+YAMLvars.xfm = {}
+YAMLvars.prc = {}
+
+YAMLvars.varsvals = {}
+YAMLvars.varspecs = {}
+
+YAMLvars.prcDefault = 'gdef'
+YAMLvars.dftDefault = nil
+YAMLvars.xfmDefault = {}
+
+YAMLvars.allowUndeclared = false
+
+YAMLvars.tabmidrule = 'hline'
+
+YAMLvars.yaml = require('tinyyaml')
+
+
+-- xfm functions (transforms) -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+function YAMLvars.xfm.addxspace(var, val)
+ return val .. '\\xspace'
+end
+
+function YAMLvars.xfm.tab2arr(var, val)
+ return pl.array2d.from_table(val)
+end
+
+function YAMLvars.xfm.arrsort2ZA(var, val)
+ return pl.array2d.sortOP(val, pl.operator.strgt)
+end
+
+function YAMLvars.xfm.addrule2arr(var, val)
+ return pl.array2d.map_slice2(_1..'\\\\\\'.. YAMLvars.tabmidrule..' ', val, 1,-1,-2,-1) -- todo make gmidrule
+end
+
+function YAMLvars.xfm.arr2tabular(var, val)
+ return pl.array2d.toTeX(val)..'\\\\'
+end
+
+
+function YAMLvars.xfm.arr2itemize(var, val)
+ return pl.List(val):map('\\item '.._1):join(' ')
+end
+
+
+function YAMLvars.xfm.arrsortAZ(var, val)
+ return pl.List(val):sort(pl.operator.strlt)
+end
+
+function YAMLvars.xfm.arrsortZA(var, val)
+ return pl.List(val):sort(pl.operator.strgt)
+end
+
+local function complastname(a, b)
+ a = a:split(' ')
+ b = b:split(' ')
+ a = a[#a]
+ b = b[#b]
+ return a < b
+end
+
+function YAMLvars.xfm.arrsortlastnameAZ(var, val)
+ val = pl.List(val):sort(complastname)
+ return val
+end
+
+function YAMLvars.xfm.list2nl(var, val)
+ val = pl.array2d.map_slice1(_1..'\\\\', val, 1,-2)
+ return table.concat(val, '')
+ --return pl.tablex.reduce(_1.._2, val, '')
+end
+
+function YAMLvars.xfm.lb2nl(var, val)
+ val, _ = val:gsub('\n','\\\\ ')
+ return val
+end
+
+function YAMLvars.xfm.lowercase(var, val)
+ return val:lower()
+end
+
+
+function YAMLvars.xfm.markdown(var, val)
+ --return '\\begin{markdown} '..val..'\n \\end{markdown}'
+ help_wrt(val, md)
+ return [[begin markdown ..val..
+
+ par end markdown]]
+end
+
+
+
+-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+-- prc functions (processing) -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+function YAMLvars.prc.gdef(var, val)
+ token.set_macro(var, val, 'global')
+end
+
+function YAMLvars.prc.yvdef(var, val)
+ token.set_macro('yv--'..var, val, 'global')
+end
+
+function YAMLvars.prc.PDFtitle(var, val)
+ tex.print('\\hypersetup{pdftitle={'..val..'}}')
+ --tex.print('\\setPDFtitle{'..val..'}')
+end
+
+function YAMLvars.prc.PDFauthor(var, val)
+ tex.print('\\hypersetup{pdfauthor={'..val..'}}')
+ --tex.print('\\setPDFauthor{'..val..'}')
+end
+
+
+function YAMLvars.prc.setheader(val, rl)
+ local _, count = string.gsub(val, '\\\\', '')
+ if count == 0 then
+ val = '{\\ }\\\\'..val
+ end
+ val = '\\setstretch{0.8}'..val
+ tex.print('\\'..rl..'ohead{'..val..'}')
+end
+
+function YAMLvars.prc.rhead(var, val)
+ YAMLvars.prc.setheader(val, 'r')
+end
+
+function YAMLvars.prc.lhead(var, val)
+ YAMLvars.prc.setheader(val, 'l')
+end
+
+function YAMLvars.prc.title(var, val)
+ token.set_macro('@title', val, 'global')
+end
+
+function YAMLvars.prc.author(var, val)
+ token.set_macro('@author', val, 'global')
+end
+
+function YAMLvars.prc.date(var, val)
+ token.set_macro('@date', val, 'global')
+end
+
+
+-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+
+
+local function prvcmd(cs, val) -- provide command via lua
+ if token.is_defined(cs) then
+ tex.print('\\PackageError{YAMLvars}{Variable '..cs..' already defined, could not declare}{}')
+ else
+ token.set_macro(cs, val, 'global')
+ end
+end
+
+local function deccmd(cs, def)
+ if def == nil then
+ prvcmd(cs, '\\PackageError{YAMLvars}{Variable "'..cs..'" was declared and used but, not set}{}')
+ else
+ prvcmd(cs, def)
+ end
+end
+
+local function getYAMLfile(y)
+ local f = io.open(y,"r")
+ if f ~= nil then
+ y = f:read('*a')
+ io.close(f)
+ return y
+ else
+ tex.print('\\PackageError{YAMLvars}{YAML file "'..y..'" not found}{}')
+ return 'YAMLvars: FileNotFound'
+ end
+end
+
+
+function YAMLvars.declareYAMLvarsStr(y)
+ local t = YAMLvars.yaml.parse(y)
+ for var, specs in pairs(t) do
+ YAMLvars.varspecs[var] = {xfm=YAMLvars.xfrmDefault,prc=YAMLvars.prcDefault,dft=YAMLvars.dftDefault}
+ if type(specs) == 'string' then
+ specs = {xfm={specs}}
+ end
+ if specs['xfm'] == nil then specs['xfm'] = {} end
+ for s, p in pairs(specs) do
+ if s == 'xfm' and type(p) ~= 'table' then p = {p} end
+ YAMLvars.varspecs[var][s] = p -- set property of var
+ end
+ if YAMLvars.varspecs[var]['prc'] == 'gdef' then
+ deccmd(var, YAMLvars.varspecs[var]['dft'])
+ elseif YAMLvars.varspecs[var]['prc'] == 'yvdef' then
+ deccmd('yv--'..var, YAMLvars.varspecs[var]['dft'])
+ end
+ end
+end
+
+function YAMLvars.declareYAMLvarsFile(y)
+ YAMLvars.declareYAMLvarsStr(getYAMLfile(y))
+end
+
+function YAMLvars.parseYAMLvarsStr(y)
+ YAMLvars.varsvals = YAMLvars.yaml.parse(y)
+ for var, val in pairs(YAMLvars.varsvals) do
+ if YAMLvars.varspecs[var] == nil then
+ if YAMLvars.allowUndeclared then
+ if YAMLvars.prcDefault == 'yvdef' then
+ YAMLvars.prc.yvdef(var, val)
+ else
+ prvcmd(var, val)
+ end
+ else
+ tex.print('\\PackageError{YAMLvars}{Variable "'..var..'" set but not declared}{}')
+ end
+ else
+ --if string.sub(val, 1, 2) == '~' then -- todo
+ -- val = t[string.sub(val, 2, #val)] -- use other val
+ --end
+ for _, func in pairs(YAMLvars.varspecs[var]['xfm']) do --apply cleaning functions
+ local f = YAMLvars.xfm[func]
+ if f == nil then
+ tex.print('\\PackageWarning{YAMLvars}{xfm function "'..func..'" not defined, skipping}{}')
+ else
+ val = f(var, val)
+ end
+ end
+ f = YAMLvars.prc[YAMLvars.varspecs[var]['prc']]
+ if f == nil then
+ tex.print('\\PackageError{YAMLvars}{prc function "'..YAMLvars.varspecs[var]['prc']..'" not defined}{}')
+ end
+ f(var, val) -- prc the value of the variable
+ end
+ end
+end
+
+function YAMLvars.parseYAMLvarsFile(y)
+ YAMLvars.parseYAMLvarsStr(getYAMLfile(y))
+end
+
+
+
+function YAMLvars.print_varspecs()
+ local pretty = require('pl.pretty')
+ texio.write_nl('VVVVVV Var specifications:')
+ texio.write_nl(pretty.write(YAMLvars.varspecs))
+end
+
+
+
+-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+-- https://tex.stackexchange.com/questions/38150/in-lualatex-how-do-i-pass-the-content-of-an-environment-to-lua-verbatim
+recordedbuf = ""
+function readbuf(buf)
+ i,j = string.find(buf, '\\end{%w+}')
+ if i==nil then -- if not ending an environment
+ recordedbuf = recordedbuf .. buf .. "\n"
+ return ""
+ else
+ return nil
+ end
+end
+
+function startrecording()
+ recordedbuf = ""
+ luatexbase.add_to_callback('process_input_buffer', readbuf, 'readbuf')
+end
+
+function stoprecording()
+ luatexbase.remove_from_callback('process_input_buffer', 'readbuf')
+ recordedbuf = recordedbuf:gsub("\\end{%w+}\n","")
+end
+
+
+
+function YAMLvars.doYAMLfiles(t)
+ if #t == 2 then
+ YAMLvars.declareYAMLvarsFile(t[1])
+ YAMLvars.parseYAMLvarsFile(t[2])
+ elseif #t == 1 then
+ YAMLvars.parseYAMLvarsFile(t[1])
+ else
+ tex.print('\\PackageWarning{YAMLvars}{No .yaml files found in CLI args"}{}')
+ end
+end
+
+function YAMLvars.getYAMLcli()
+ local t = {}
+ if arg then
+ for i,v in pairs(arg) do
+ if v:find('.*%.yaml$') then
+ t[#t+1] = v
+ end
+ end
+ end
+ help_wrt(t)
+ return t
+ end
+
+
+return YAMLvars
+
+
+
+ --clean = clean or true
+ --if clean then -- clean first part of yaml string
+ -- y = clean_tex_spaces(y)
+ --end
+--local function clean_tex_spaces(s)
+-- help_wrt(s)
+-- if s:sub(1,2) == '%s' then
+-- s, _ = s:gsub('%s+','',1)
+-- end
+-- s, _ = s:gsub('\\par ','\n\n')
+-- return s
+--end \ No newline at end of file
diff --git a/macros/luatex/latex/yamlvars/YAMLvars.pdf b/macros/luatex/latex/yamlvars/YAMLvars.pdf
new file mode 100644
index 0000000000..1d3b1ed2b7
--- /dev/null
+++ b/macros/luatex/latex/yamlvars/YAMLvars.pdf
Binary files differ
diff --git a/macros/luatex/latex/yamlvars/YAMLvars.sty b/macros/luatex/latex/yamlvars/YAMLvars.sty
new file mode 100644
index 0000000000..fdc39fa3b0
--- /dev/null
+++ b/macros/luatex/latex/yamlvars/YAMLvars.sty
@@ -0,0 +1,59 @@
+% Kale Ewasiuk (kalekje@gmail.com)
+% 2021-09-24
+%
+% Copyright (C) 2021 Kale Ewasiuk
+%
+% Permission is hereby granted, free of charge, to any person obtaining a copy
+% of this software and associated documentation files (the "Software"), to deal
+% in the Software without restriction, including without limitation the rights
+% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+% copies of the Software, and to permit persons to whom the Software is
+% furnished to do so, subject to the following conditions:
+%
+% The above copyright notice and this permission notice shall be included in
+% all copies or substantial portions of the Software.
+%
+% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+% ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+% TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+% PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+% SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+% ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+% ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+% OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{YAMLvars}[2021]
+
+\RequirePackage{luacode}
+
+\luadirect{YAMLvars = require('YAMLvars')}
+
+\DeclareOption{useyv}{
+ \gdef\yv#1{\csname yv--#1\endcsname}
+ \luadirect{YAMLvars.prcDefault = 'yvdef'}
+}
+\DeclareOption{parseCLI}{
+ \AtBeginDocument{\luadirect{YAMLvars.doYAMLfiles(YAMLvars.getYAMLcli())}}
+}
+\DeclareOption{allowundeclared}{
+ \luadirect{YAMLvars.allowUndeclared = true}
+}
+
+\DeclareOption*{\PackageWarning{YAMLvars}{Unknown option: '\CurrentOption'}{}}
+\ProcessOptions\relax
+
+
+\newcommand{\declareYAMLvarsFile}[1]{\luadirect{YAMLvars.declareYAMLvarsFile(\luastring{#1})}}
+\newcommand{\parseYAMLvarsFile}[1]{\luadirect{YAMLvars.parseYAMLvarsFile(\luastring{#1})}}
+
+
+\newenvironment{declareYAMLvars}{\luadirect{startrecording()}}{\luadirect{stoprecording()}
+\luadirect{YAMLvars.declareYAMLvarsStr(recordedbuf)}
+}
+
+\newenvironment{parseYAMLvars}{\luadirect{startrecording()}}{\luadirect{stoprecording()}
+\luadirect{YAMLvars.parseYAMLvarsStr(recordedbuf)}
+} \ No newline at end of file
diff --git a/macros/luatex/latex/yamlvars/YAMLvars.tex b/macros/luatex/latex/yamlvars/YAMLvars.tex
new file mode 100644
index 0000000000..e97b325df3
--- /dev/null
+++ b/macros/luatex/latex/yamlvars/YAMLvars.tex
@@ -0,0 +1,264 @@
+% Kale Ewasiuk (kalekje@gmail.com)
+% 2021-09-24
+%
+% Copyright (C) 2021 Kale Ewasiuk
+%
+% Permission is hereby granted, free of charge, to any person obtaining a copy
+% of this software and associated documentation files (the "Software"), to deal
+% in the Software without restriction, including without limitation the rights
+% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+% copies of the Software, and to permit persons to whom the Software is
+% furnished to do so, subject to the following conditions:
+%
+% The above copyright notice and this permission notice shall be included in
+% all copies or substantial portions of the Software.
+%
+% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+% ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+% TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+% PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+% SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
+% ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+% ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+% OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+\documentclass{article}
+\usepackage{url}
+\usepackage{YAMLvars}
+\setlength{\parindent}{0ex}
+\setlength{\parskip}{0.75em}
+
+\begin{document}
+
+{\noindent\huge\bfseries YAMLvars \LARGE -- a YAML variable parser for LuaLaTeX}\\
+ 2021-09-24, Kale Ewasiuk, \url{kalekje@gmail.com}
+
+YAMLvars is a LuaLaTeX-based package to help make definitions or produce LaTeX code using a YAML file.
+This package might be useful for you if you want to batch create docummnts
+by pushing various sets YAML data to a fixed LaTeX template,
+or just find it easier to read document metadata from a YAML file compared to the
+standard title, author, etc. commands.
+
+\section{Package Options}
+\leavevmode\llap{\texttt{useyv}\ \ \ }By default, when you specify a YAML variable, it will be defined using \texttt{gdef}
+(only if it wasn't defined previously).
+If you use this setting, unless otherwise specified, YAML variables will be accessible under
+the \texttt{\textbackslash yv\{<var>\}} command.
+This also allows numbers and symbols in the variable names.
+Note that internally, the variables are stored in the command sequence
+\texttt{yv--<var>}.
+
+\leavevmode\llap{\texttt{parseCLI}\ \ \ }If this option is enabled, any arguments passed to your lualatex compile
+command that end in ``.yaml'' will be used, separated by a space.
+If two yaml files are passed, the first one will be the declaration file,
+and the second will be the parsing file.
+They will be used at the beginning of the document.
+If one yaml file is passed, it will be treated as a parsing file, so you should
+declare the variables somewhere in the preamble.
+This option is offered to help with automation scripts.
+An example is showin in Section \ref{example}.
+
+\leavevmode\llap{\texttt{allowundeclared}\ \ \ }%
+It might be helpful to define something in your YAML parsing doc without declaring it.
+If you want this flexibility, use this setting. Note that eisting definitions will not be overwritten and an error
+will br thrown if the name exists.
+
+\section{Dependencies}
+This package contains the \texttt{tinyyaml} Lua package.
+If you want to use it for other purposes, you can bring it into Lua by either:
+\begin{verbatim}
+\directlua{yaml = YAMLvars.yaml} or
+\directlua{yaml = require('tinyyaml')}
+\end{verbatim}
+The distribution: \url{https://github.com/peposso/lua-tinyyaml}\\
+The YAML specification: \url{https://yaml.org/spec/}\\
+
+Many of the ``transform'' and ``processing'' functions built-in to this package rely on other packages.
+\texttt{penlight},
+\texttt{xspace},
+\texttt{hyperref} for example.
+
+\section{Declaring variables}
+A declaration file can either be parsed with the command \texttt{declareYAMLvarsFile} command,
+or, if you want to do it \LaTeX, you can put the YAML code in the \texttt{declareYAMLvars} environment.
+It is a declaring YAML docuemnt is (like all YAML) key-value ditionary:
+The top level key is the name of the variable to be defined/used.
+If the value of the top level is a string: it's interpreted as a single transform function to be applied.
+Otherwise, it must
+be a table that contains at least one of the following keys:\\
+\texttt{xfm} (transform, may be a string or list of strings),\\
+\texttt{prc} (processing, must be a single string), or \\
+\texttt{dft} (default value, if being defined. Must be a string).
+
+The default value for variables is the Lua \texttt{nil}.
+YAMLvars will first check if the definition exists, if so, an error will be thrown
+so that we avoid overwriting.
+If the token is available, it is set to a package error, so that if the variable no defined later on, an error will
+tell the user they forgot to set it.
+This will be overwritten when you parse the variables and assign a value to it.
+
+You can change the default \texttt{xfm}, \texttt{prc}, or \texttt{dft} by changing
+the value (in Lua): \texttt{YAMLvars.xfmDefault = ''} etc.
+
+Here is an example of a declaration document.
+\begin{verbatim}
+\begin{declareYAMLvars}
+Location: addxspace # sets xfm=addxspace
+People: [arrsortlastnameAZ, list2nl] # BAD! don't do.
+People:
+ xfm: [arrsortlastnameAZ, list2nl] # Correct way
+Company:
+ dft: Amazon # Change default only
+Revisions:
+ dft: '1 & \today & initial version \\'
+ xfm: [sortZA, list2tab]
+Rhead:
+ prc: setRightHead
+\end{declareYAMLvars}
+\end{verbatim}
+
+
+
+\section{Parsing variables}
+A YAML file to be parsed will contain the variables as the top level keys, similar to declaring.
+The value can be anything you want; as long as you have applied appropriate transform and declaring
+functions to it so that it can be useful. For example, a value specified as a YAML list will first be
+interpreted as a Lua table (with numeric indexes/keys). You could declare a series of transforms functions
+to sort this table, map functions, and convert it to a series of \LaTeX \texttt{\textbackslash item}s.
+
+Here is an example of a parsing document.
+
+
+\begin{verbatim}
+\begin{declareYAMLvars}
+Location: Planet Earth
+People: # a YAML list
+ - Some One # turns into Lua table
+ - No Body
+# company assumed Amazon if not set here
+Rhead: \today
+\end{declareYAMLvars}
+\end{verbatim}
+
+
+ \section{xfm -- Transform Functions}
+These functions accept two arguments: \texttt{(var, val)} where \texttt{var} is the variable (or key) and val is the value.
+The transforms are specified as a list and are iteratively applied to the val.
+Usually, the final \texttt{xfm} function should produce a string so it can be defined.
+
+Hint: if for some reason, your \texttt{xfm} and \texttt{prc} depends on other variables,
+you can access them within the function
+with \texttt{YAMLvars.varsvals}
+
+\subsection{Defining your own transform functions}
+After the package is loaded, you may add your function (somewhere in Lua)
+by adding it to the \texttt{YAMLvars.xfm} table.
+For example, if you wanted to wrap a variable's value with ``xxx'', here's how you could do that.
+\begin{verbatim}
+function myfunction(var, val)
+ return 'xxx'..val..'xxx'
+end
+YAMLvars.xfm['addmyfunction'] = myfunction
+\end{verbatim}
+
+ \section{prc -- Processing Functions}
+Like the transform functions, the processing function must accept \texttt{(var, val)}.
+Only one processing function is applied to the final (var, val) after the transforms are done.
+
+This package includes \texttt{gdef} to set a definition, \texttt{yvdef} to define a variable under the \texttt{yv} command.
+\texttt{title, author, date} to set \texttt{\textbackslash @title, \textbackslash @author, \textbackslash @date},
+respectively
+
+ \section{Example}\label{example}
+
+ Suppose you had a number of bills of sales in yaml format and wanted to produce some nice pdfs.
+ The following code shows how this could be done.
+
+ \pagebreak
+ \vspace*{-5em}
+ \subsection{The main tex template}
+ \begin{verbatim}
+ %% main.tex
+\documentclass{article}
+\usepackage[paperheight=4in,paperwidth=3in,margin=0.25in]{geometry}
+\usepackage[pl,func,extras]{penlight}
+\usepackage[useyv,parseCLI]{YAMLvars} % using command line option to make files
+\usepackage{hyperref}
+\usepackage{xspace}
+\usepackage{luacode}
+
+\setlength{\parindent}{0ex}
+\setlength{\parskip}{0.75em}
+
+\begin{luacode*} -- adding a custom function, put hfill between k-v pairs
+ function YAMLvars.xfm.kv2hfill(var, val)
+ local t = {}
+ for k, v in pairs(val) do
+ t[#t+1] = k..'\\hfill '..tostring(v)
+ end
+ return t
+ end
+\end{luacode*}
+
+
+%! language = yaml
+\begin{declareYAMLvars}
+Customer: addxspace
+Date: addxspace
+Items:
+ xfm: [kv2hfill, arr2itemize]
+\end{declareYAMLvars}
+
+\begin{document}
+ Bill of sale for: \hfill \yv{Customer}\\
+ Purchased: \hfill \yv{Date}\\
+ \begin{itemize}
+ \item[] ITEM \hfill PRICE
+ \yv{Items} % the yaml variable
+ \begin{luacode*}
+ totalcost = pl.tablex.reduce('+',
+ pl.tablex.values(YAMLvars.varsvals['Items']), 0)
+ tex.print('\\item[] TOTAL:\\hfill'..tostring(totalcost))
+ \end{luacode*}
+ \end{itemize}
+\end{document}
+ \end{verbatim}
+
+ \subsection{The lua automation script}
+ \begin{verbatim}
+--automate.lua
+for f in io.popen('dir .'):lines() do -- get all files and info in cwd
+ local i, j = f:find('%S*%.yaml') -- find fnames
+ if i ~= nil then
+ f = f:sub(i,j) -- extract .yaml file name (no space in fname allowed)
+ os.execute('lualatex -output-format=pdf main.tex '.. f)
+ -- compile w/ yaml file as arg
+ local fnew = f:gsub('yaml', 'pdf') -- file name for output pdf
+ os.remove(fnew) -- delete if it exists already
+ os.rename('main.pdf', fnew) -- change main.pdf to same as yaml file name
+ end
+end
+ \end{verbatim}
+
+\subsection{The yaml data files}
+ \begin{verbatim}
+# sale1.yaml
+Customer: Someone Cold
+Date: January 2, 2021
+Items:
+ Toque: 12
+ Mitts: 5.6
+ Boots: 80
+
+# sale2.yaml
+Customer: Someone Warm
+Date: July 1, 2021
+Items:
+ Beer (24 pk): 24
+ Sunscreen: 5
+ Hat: 12
+ \end{verbatim}
+\end{document}
+
diff --git a/macros/luatex/latex/yamlvars/tinyyaml.lua b/macros/luatex/latex/yamlvars/tinyyaml.lua
new file mode 100644
index 0000000000..b1a6470863
--- /dev/null
+++ b/macros/luatex/latex/yamlvars/tinyyaml.lua
@@ -0,0 +1,816 @@
+-------------------------------------------------------------------------------
+-- tinyyaml - YAML subset parser
+-------------------------------------------------------------------------------
+
+local table = table
+local string = string
+local schar = string.char
+local ssub, gsub = string.sub, string.gsub
+local sfind, smatch = string.find, string.match
+local tinsert, tconcat, tremove = table.insert, table.concat, table.remove
+local setmetatable = setmetatable
+local pairs = pairs
+local type = type
+local tonumber = tonumber
+local math = math
+local getmetatable = getmetatable
+local error = error
+
+local UNESCAPES = {
+ ['0'] = "\x00", z = "\x00", N = "\x85",
+ a = "\x07", b = "\x08", t = "\x09",
+ n = "\x0a", v = "\x0b", f = "\x0c",
+ r = "\x0d", e = "\x1b", ['\\'] = '\\',
+};
+
+-------------------------------------------------------------------------------
+-- utils
+local function select(list, pred)
+ local selected = {}
+ for i = 0, #list do
+ local v = list[i]
+ if v and pred(v, i) then
+ tinsert(selected, v)
+ end
+ end
+ return selected
+end
+
+local function startswith(haystack, needle)
+ return ssub(haystack, 1, #needle) == needle
+end
+
+local function ltrim(str)
+ return smatch(str, "^%s*(.-)$")
+end
+
+local function rtrim(str)
+ return smatch(str, "^(.-)%s*$")
+end
+
+local function trim(str)
+ return smatch(str, "^%s*(.-)%s*$")
+end
+
+-------------------------------------------------------------------------------
+-- Implementation.
+--
+local class = {__meta={}}
+function class.__meta.__call(cls, ...)
+ local self = setmetatable({}, cls)
+ if cls.__init then
+ cls.__init(self, ...)
+ end
+ return self
+end
+
+function class.def(base, typ, cls)
+ base = base or class
+ local mt = {__metatable=base, __index=base}
+ for k, v in pairs(base.__meta) do mt[k] = v end
+ cls = setmetatable(cls or {}, mt)
+ cls.__index = cls
+ cls.__metatable = cls
+ cls.__type = typ
+ cls.__meta = mt
+ return cls
+end
+
+
+local types = {
+ null = class:def('null'),
+ map = class:def('map'),
+ omap = class:def('omap'),
+ pairs = class:def('pairs'),
+ set = class:def('set'),
+ seq = class:def('seq'),
+ timestamp = class:def('timestamp'),
+}
+
+local Null = types.null
+function Null.__tostring() return 'yaml.null' end
+function Null.isnull(v)
+ if v == nil then return true end
+ if type(v) == 'table' and getmetatable(v) == Null then return true end
+ return false
+end
+local null = Null()
+
+function types.timestamp:__init(y, m, d, h, i, s, f, z)
+ self.year = tonumber(y)
+ self.month = tonumber(m)
+ self.day = tonumber(d)
+ self.hour = tonumber(h or 0)
+ self.minute = tonumber(i or 0)
+ self.second = tonumber(s or 0)
+ if type(f) == 'string' and sfind(f, '^%d+$') then
+ self.fraction = tonumber(f) * math.pow(10, 3 - #f)
+ elseif f then
+ self.fraction = f
+ else
+ self.fraction = 0
+ end
+ self.timezone = z
+end
+
+function types.timestamp:__tostring()
+ return string.format(
+ '%04d-%02d-%02dT%02d:%02d:%02d.%03d%s',
+ self.year, self.month, self.day,
+ self.hour, self.minute, self.second, self.fraction,
+ self:gettz())
+end
+
+function types.timestamp:gettz()
+ if not self.timezone then
+ return ''
+ end
+ if self.timezone == 0 then
+ return 'Z'
+ end
+ local sign = self.timezone > 0
+ local z = sign and self.timezone or -self.timezone
+ local zh = math.floor(z)
+ local zi = (z - zh) * 60
+ return string.format(
+ '%s%02d:%02d', sign and '+' or '-', zh, zi)
+end
+
+
+local function countindent(line)
+ local _, j = sfind(line, '^%s+')
+ if not j then
+ return 0, line
+ end
+ return j, ssub(line, j+1)
+end
+
+local function parsestring(line, stopper)
+ stopper = stopper or ''
+ local q = ssub(line, 1, 1)
+ if q == ' ' or q == '\t' then
+ return parsestring(ssub(line, 2))
+ end
+ if q == "'" then
+ local i = sfind(line, "'", 2, true)
+ if not i then
+ return nil, line
+ end
+ return ssub(line, 2, i-1), ssub(line, i+1)
+ end
+ if q == '"' then
+ local i, buf = 2, ''
+ while i < #line do
+ local c = ssub(line, i, i)
+ if c == '\\' then
+ local n = ssub(line, i+1, i+1)
+ if UNESCAPES[n] ~= nil then
+ buf = buf..UNESCAPES[n]
+ elseif n == 'x' then
+ local h = ssub(i+2,i+3)
+ if sfind(h, '^[0-9a-fA-F]$') then
+ buf = buf..schar(tonumber(h, 16))
+ i = i + 2
+ else
+ buf = buf..'x'
+ end
+ else
+ buf = buf..n
+ end
+ i = i + 1
+ elseif c == q then
+ break
+ else
+ buf = buf..c
+ end
+ i = i + 1
+ end
+ return buf, ssub(line, i+1)
+ end
+ if q == '{' or q == '[' then -- flow style
+ return nil, line
+ end
+ if q == '|' or q == '>' then -- block
+ return nil, line
+ end
+ if q == '-' or q == ':' then
+ if ssub(line, 2, 2) == ' ' or ssub(line, 2, 2) == '\n' or #line == 1 then
+ return nil, line
+ end
+ end
+ local buf = ''
+ while #line > 0 do
+ local c = ssub(line, 1, 1)
+ if sfind(stopper, c, 1, true) then
+ break
+ elseif c == ':' and (ssub(line, 2, 2) == ' ' or ssub(line, 2, 2) == '\n' or #line == 1) then
+ break
+ elseif c == '#' and (ssub(buf, #buf, #buf) == ' ') then
+ break
+ else
+ buf = buf..c
+ end
+ line = ssub(line, 2)
+ end
+ return rtrim(buf), line
+end
+
+local function isemptyline(line)
+ return line == '' or sfind(line, '^%s*$') or sfind(line, '^%s*#')
+end
+
+local function equalsline(line, needle)
+ return startswith(line, needle) and isemptyline(ssub(line, #needle+1))
+end
+
+local function compactifyemptylines(lines)
+ -- Appends empty lines as "\n" to the end of the nearest preceding non-empty line
+ local compactified = {}
+ local lastline = {}
+ for i = 1, #lines do
+ local line = lines[i]
+ if isemptyline(line) then
+ if #compactified > 0 and i < #lines then
+ tinsert(lastline, "\n")
+ end
+ else
+ if #lastline > 0 then
+ tinsert(compactified, tconcat(lastline, ""))
+ end
+ lastline = {line}
+ end
+ end
+ if #lastline > 0 then
+ tinsert(compactified, tconcat(lastline, ""))
+ end
+ return compactified
+end
+
+local function checkdupekey(map, key)
+ if map[key] ~= nil then
+ -- print("found a duplicate key '"..key.."' in line: "..line)
+ local suffix = 1
+ while map[key..'_'..suffix] do
+ suffix = suffix + 1
+ end
+ key = key ..'_'..suffix
+ end
+ return key
+end
+
+local function parseflowstyle(line, lines)
+ local stack = {}
+ while true do
+ if #line == 0 then
+ if #lines == 0 then
+ break
+ else
+ line = tremove(lines, 1)
+ end
+ end
+ local c = ssub(line, 1, 1)
+ if c == '#' then
+ line = ''
+ elseif c == ' ' or c == '\t' or c == '\r' or c == '\n' then
+ line = ssub(line, 2)
+ elseif c == '{' or c == '[' then
+ tinsert(stack, {v={},t=c})
+ line = ssub(line, 2)
+ elseif c == ':' then
+ local s = tremove(stack)
+ tinsert(stack, {v=s.v, t=':'})
+ line = ssub(line, 2)
+ elseif c == ',' then
+ local value = tremove(stack)
+ if value.t == ':' or value.t == '{' or value.t == '[' then error() end
+ if stack[#stack].t == ':' then
+ -- map
+ local key = tremove(stack)
+ key.v = checkdupekey(stack[#stack].v, key.v)
+ stack[#stack].v[key.v] = value.v
+ elseif stack[#stack].t == '{' then
+ -- set
+ stack[#stack].v[value.v] = true
+ elseif stack[#stack].t == '[' then
+ -- seq
+ tinsert(stack[#stack].v, value.v)
+ end
+ line = ssub(line, 2)
+ elseif c == '}' then
+ if stack[#stack].t == '{' then
+ if #stack == 1 then break end
+ stack[#stack].t = '}'
+ line = ssub(line, 2)
+ else
+ line = ','..line
+ end
+ elseif c == ']' then
+ if stack[#stack].t == '[' then
+ if #stack == 1 then break end
+ stack[#stack].t = ']'
+ line = ssub(line, 2)
+ else
+ line = ','..line
+ end
+ else
+ local s, rest = parsestring(line, ',{}[]')
+ if not s then
+ error('invalid flowstyle line: '..line)
+ end
+ tinsert(stack, {v=s, t='s'})
+ line = rest
+ end
+ end
+ return stack[1].v, line
+end
+
+local function parseblockstylestring(line, lines, indent)
+ if #lines == 0 then
+ error("failed to find multi-line scalar content")
+ end
+ local s = {}
+ local firstindent = -1
+ local endline = -1
+ for i = 1, #lines do
+ local ln = lines[i]
+ local idt = countindent(ln)
+ if idt <= indent then
+ break
+ end
+ if ln == '' then
+ tinsert(s, '')
+ else
+ if firstindent == -1 then
+ firstindent = idt
+ elseif idt < firstindent then
+ break
+ end
+ tinsert(s, ssub(ln, firstindent + 1))
+ end
+ endline = i
+ end
+
+ local striptrailing = true
+ local sep = '\n'
+ local newlineatend = true
+ if line == '|' then
+ striptrailing = true
+ sep = '\n'
+ newlineatend = true
+ elseif line == '|+' then
+ striptrailing = false
+ sep = '\n'
+ newlineatend = true
+ elseif line == '|-' then
+ striptrailing = true
+ sep = '\n'
+ newlineatend = false
+ elseif line == '>' then
+ striptrailing = true
+ sep = ' '
+ newlineatend = true
+ elseif line == '>+' then
+ striptrailing = false
+ sep = ' '
+ newlineatend = true
+ elseif line == '>-' then
+ striptrailing = true
+ sep = ' '
+ newlineatend = false
+ else
+ error('invalid blockstyle string:'..line)
+ end
+ local _, eonl = s[#s]:gsub('\n', '\n')
+ s[#s] = rtrim(s[#s])
+ if striptrailing then
+ eonl = 0
+ end
+ if newlineatend then
+ eonl = eonl + 1
+ end
+ for i = endline, 1, -1 do
+ tremove(lines, i)
+ end
+ return tconcat(s, sep)..string.rep('\n', eonl)
+end
+
+local function parsetimestamp(line)
+ local _, p1, y, m, d = sfind(line, '^(%d%d%d%d)%-(%d%d)%-(%d%d)')
+ if not p1 then
+ return nil, line
+ end
+ if p1 == #line then
+ return types.timestamp(y, m, d), ''
+ end
+ local _, p2, h, i, s = sfind(line, '^[Tt ](%d+):(%d+):(%d+)', p1+1)
+ if not p2 then
+ return types.timestamp(y, m, d), ssub(line, p1+1)
+ end
+ if p2 == #line then
+ return types.timestamp(y, m, d, h, i, s), ''
+ end
+ local _, p3, f = sfind(line, '^%.(%d+)', p2+1)
+ if not p3 then
+ p3 = p2
+ f = 0
+ end
+ local zc = ssub(line, p3+1, p3+1)
+ local _, p4, zs, z = sfind(line, '^ ?([%+%-])(%d+)', p3+1)
+ if p4 then
+ z = tonumber(z)
+ local _, p5, zi = sfind(line, '^:(%d+)', p4+1)
+ if p5 then
+ z = z + tonumber(zi) / 60
+ end
+ z = zs == '-' and -tonumber(z) or tonumber(z)
+ elseif zc == 'Z' then
+ p4 = p3 + 1
+ z = 0
+ else
+ p4 = p3
+ z = false
+ end
+ return types.timestamp(y, m, d, h, i, s, f, z), ssub(line, p4+1)
+end
+
+local function parsescalar(line, lines, indent)
+ line = trim(line)
+ line = gsub(line, '^%s*#.*$', '') -- comment only -> ''
+ line = gsub(line, '^%s*', '') -- trim head spaces
+
+ if line == '' or line == '~' then
+ return null
+ end
+
+ local ts, _ = parsetimestamp(line)
+ if ts then
+ return ts
+ end
+
+ local s, _ = parsestring(line)
+ -- startswith quote ... string
+ -- not startswith quote ... maybe string
+ if s and (startswith(line, '"') or startswith(line, "'")) then
+ return s
+ end
+
+ if startswith('!', line) then -- unexpected tagchar
+ error('unsupported line: '..line)
+ end
+
+ if equalsline(line, '{}') then
+ return {}
+ end
+ if equalsline(line, '[]') then
+ return {}
+ end
+
+ if startswith(line, '{') or startswith(line, '[') then
+ return parseflowstyle(line, lines)
+ end
+
+ if startswith(line, '|') or startswith(line, '>') then
+ return parseblockstylestring(line, lines, indent)
+ end
+
+ -- Regular unquoted string
+ line = gsub(line, '%s*#.*$', '') -- trim tail comment
+ local v = line
+ if v == 'null' or v == 'Null' or v == 'NULL'then
+ return null
+ elseif v == 'true' or v == 'True' or v == 'TRUE' then
+ return true
+ elseif v == 'false' or v == 'False' or v == 'FALSE' then
+ return false
+ elseif v == '.inf' or v == '.Inf' or v == '.INF' then
+ return math.huge
+ elseif v == '+.inf' or v == '+.Inf' or v == '+.INF' then
+ return math.huge
+ elseif v == '-.inf' or v == '-.Inf' or v == '-.INF' then
+ return -math.huge
+ elseif v == '.nan' or v == '.NaN' or v == '.NAN' then
+ return 0 / 0
+ elseif sfind(v, '^[%+%-]?[0-9]+$') or sfind(v, '^[%+%-]?[0-9]+%.$')then
+ return tonumber(v) -- : int
+ elseif sfind(v, '^[%+%-]?[0-9]+%.[0-9]+$') then
+ return tonumber(v)
+ end
+ return s or v
+end
+
+local parsemap; -- : func
+
+local function parseseq(line, lines, indent)
+ local seq = setmetatable({}, types.seq)
+ if line ~= '' then
+ error()
+ end
+ while #lines > 0 do
+ -- Check for a new document
+ line = lines[1]
+ if startswith(line, '---') then
+ while #lines > 0 and not startswith(lines, '---') do
+ tremove(lines, 1)
+ end
+ return seq
+ end
+
+ -- Check the indent level
+ local level = countindent(line)
+ if level < indent then
+ return seq
+ elseif level > indent then
+ error("found bad indenting in line: ".. line)
+ end
+
+ local i, j = sfind(line, '%-%s+')
+ if not i then
+ i, j = sfind(line, '%-$')
+ if not i then
+ return seq
+ end
+ end
+ local rest = ssub(line, j+1)
+
+ if sfind(rest, '^[^\'\"%s]*:%s*$') or sfind(rest, '^[^\'\"%s]*:%s+.') then
+ -- Inline nested hash
+ -- There are two patterns need to match as inline nested hash
+ -- first one should have no other characters except whitespace after `:`
+ -- and the second one should have characters besides whitespace after `:`
+ --
+ -- value:
+ -- - foo:
+ -- bar: 1
+ --
+ -- and
+ --
+ -- value:
+ -- - foo: bar
+ --
+ -- And there is one pattern should not be matched, where there is no space after `:`
+ -- in below, `foo:bar` should be parsed into a single string
+ --
+ -- value:
+ -- - foo:bar
+ local indent2 = j
+ lines[1] = string.rep(' ', indent2)..rest
+ tinsert(seq, parsemap('', lines, indent2))
+ elseif sfind(rest, '^%-%s+') then
+ -- Inline nested seq
+ local indent2 = j
+ lines[1] = string.rep(' ', indent2)..rest
+ tinsert(seq, parseseq('', lines, indent2))
+ elseif isemptyline(rest) then
+ tremove(lines, 1)
+ if #lines == 0 then
+ tinsert(seq, null)
+ return seq
+ end
+ if sfind(lines[1], '^%s*%-') then
+ local nextline = lines[1]
+ local indent2 = countindent(nextline)
+ if indent2 == indent then
+ -- Null seqay entry
+ tinsert(seq, null)
+ else
+ tinsert(seq, parseseq('', lines, indent2))
+ end
+ else
+ -- - # comment
+ -- key: value
+ local nextline = lines[1]
+ local indent2 = countindent(nextline)
+ tinsert(seq, parsemap('', lines, indent2))
+ end
+ elseif rest then
+ -- Array entry with a value
+ tremove(lines, 1)
+ tinsert(seq, parsescalar(rest, lines))
+ end
+ end
+ return seq
+end
+
+local function parseset(line, lines, indent)
+ if not isemptyline(line) then
+ error('not seq line: '..line)
+ end
+ local set = setmetatable({}, types.set)
+ while #lines > 0 do
+ -- Check for a new document
+ line = lines[1]
+ if startswith(line, '---') then
+ while #lines > 0 and not startswith(lines, '---') do
+ tremove(lines, 1)
+ end
+ return set
+ end
+
+ -- Check the indent level
+ local level = countindent(line)
+ if level < indent then
+ return set
+ elseif level > indent then
+ error("found bad indenting in line: ".. line)
+ end
+
+ local i, j = sfind(line, '%?%s+')
+ if not i then
+ i, j = sfind(line, '%?$')
+ if not i then
+ return set
+ end
+ end
+ local rest = ssub(line, j+1)
+
+ if sfind(rest, '^[^\'\"%s]*:') then
+ -- Inline nested hash
+ local indent2 = j
+ lines[1] = string.rep(' ', indent2)..rest
+ set[parsemap('', lines, indent2)] = true
+ elseif sfind(rest, '^%s+$') then
+ tremove(lines, 1)
+ if #lines == 0 then
+ tinsert(set, null)
+ return set
+ end
+ if sfind(lines[1], '^%s*%?') then
+ local indent2 = countindent(lines[1])
+ if indent2 == indent then
+ -- Null array entry
+ set[null] = true
+ else
+ set[parseseq('', lines, indent2)] = true
+ end
+ end
+
+ elseif rest then
+ tremove(lines, 1)
+ set[parsescalar(rest, lines)] = true
+ else
+ error("failed to classify line: "..line)
+ end
+ end
+ return set
+end
+
+function parsemap(line, lines, indent)
+ if not isemptyline(line) then
+ error('not map line: '..line)
+ end
+ local map = setmetatable({}, types.map)
+ while #lines > 0 do
+ -- Check for a new document
+ line = lines[1]
+ if startswith(line, '---') then
+ while #lines > 0 and not startswith(lines, '---') do
+ tremove(lines, 1)
+ end
+ return map
+ end
+
+ -- Check the indent level
+ local level, _ = countindent(line)
+ if level < indent then
+ return map
+ elseif level > indent then
+ error("found bad indenting in line: ".. line)
+ end
+
+ -- Find the key
+ local key
+ local s, rest = parsestring(line)
+
+ -- Quoted keys
+ if s and startswith(rest, ':') then
+ local sc = parsescalar(s, {}, 0)
+ if sc and type(sc) ~= 'string' then
+ key = sc
+ else
+ key = s
+ end
+ line = ssub(rest, 2)
+ else
+ error("failed to classify line: "..line)
+ end
+
+ key = checkdupekey(map, key)
+ line = ltrim(line)
+
+ if ssub(line, 1, 1) == '!' then
+ -- ignore type
+ local rh = ltrim(ssub(line, 3))
+ local typename = smatch(rh, '^!?[^%s]+')
+ line = ltrim(ssub(rh, #typename+1))
+ end
+
+ if not isemptyline(line) then
+ tremove(lines, 1)
+ line = ltrim(line)
+ map[key] = parsescalar(line, lines, indent)
+ else
+ -- An indent
+ tremove(lines, 1)
+ if #lines == 0 then
+ map[key] = null
+ return map;
+ end
+ if sfind(lines[1], '^%s*%-') then
+ local indent2 = countindent(lines[1])
+ map[key] = parseseq('', lines, indent2)
+ elseif sfind(lines[1], '^%s*%?') then
+ local indent2 = countindent(lines[1])
+ map[key] = parseset('', lines, indent2)
+ else
+ local indent2 = countindent(lines[1])
+ if indent >= indent2 then
+ -- Null hash entry
+ map[key] = null
+ else
+ map[key] = parsemap('', lines, indent2)
+ end
+ end
+ end
+ end
+ return map
+end
+
+
+-- : (list<str>)->dict
+local function parsedocuments(lines)
+ lines = compactifyemptylines(lines)
+
+ if sfind(lines[1], '^%%YAML') then tremove(lines, 1) end
+
+ local root = {}
+ local in_document = false
+ while #lines > 0 do
+ local line = lines[1]
+ -- Do we have a document header?
+ local docright;
+ if sfind(line, '^%-%-%-') then
+ -- Handle scalar documents
+ docright = ssub(line, 4)
+ tremove(lines, 1)
+ in_document = true
+ end
+ if docright then
+ if (not sfind(docright, '^%s+$') and
+ not sfind(docright, '^%s+#')) then
+ tinsert(root, parsescalar(docright, lines))
+ end
+ elseif #lines == 0 or startswith(line, '---') then
+ -- A naked document
+ tinsert(root, null)
+ while #lines > 0 and not sfind(lines[1], '---') do
+ tremove(lines, 1)
+ end
+ in_document = false
+ -- XXX The final '-+$' is to look for -- which ends up being an
+ -- error later.
+ elseif not in_document and #root > 0 then
+ -- only the first document can be explicit
+ error('parse error: '..line)
+ elseif sfind(line, '^%s*%-') then
+ -- An array at the root
+ tinsert(root, parseseq('', lines, 0))
+ elseif sfind(line, '^%s*[^%s]') then
+ -- A hash at the root
+ local level = countindent(line)
+ tinsert(root, parsemap('', lines, level))
+ else
+ -- Shouldn't get here. @lines have whitespace-only lines
+ -- stripped, and previous match is a line with any
+ -- non-whitespace. So this clause should only be reachable via
+ -- a perlbug where \s is not symmetric with \S
+
+ -- uncoverable statement
+ error('parse error: '..line)
+ end
+ end
+ if #root > 1 and Null.isnull(root[1]) then
+ tremove(root, 1)
+ return root
+ end
+ return root
+end
+
+--- Parse yaml string into table.
+local function parse(source)
+ local lines = {}
+ for line in string.gmatch(source .. '\n', '(.-)\r?\n') do
+ tinsert(lines, line)
+ end
+
+ local docs = parsedocuments(lines)
+ if #docs == 1 then
+ return docs[1]
+ end
+
+ return docs
+end
+
+return {
+ version = 0.1,
+ parse = parse,
+}