summaryrefslogtreecommitdiff
path: root/macros/latex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-01-20 03:01:12 +0000
committerNorbert Preining <norbert@preining.info>2024-01-20 03:01:12 +0000
commit2fd07558ccd8d3c8e354f8ea0b342ef7ac1e87a3 (patch)
treedfa08a4c648cc5f7b4c8e5a55fcae40546d96d7d /macros/latex
parent849336321485cc972b028c23f8276fa6bdf4818e (diff)
CTAN sync 202401200301
Diffstat (limited to 'macros/latex')
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/README.md90
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/beamerthemebernoulli.sty605
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/demo-bernoulli.pdfbin0 -> 128620 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/demo-bernoulli.tex176
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/beamerthemedirichlet.sty402
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/demo-dirichlet.pdfbin0 -> 200517 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/demo-dirichlet.tex171
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/beamerthemefermat.sty433
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/demo-fermat.pdfbin0 -> 152297 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/demo-fermat.tex171
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/beamerthemegauss.sty678
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/demo-gauss.pdfbin0 -> 131046 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/demo-gauss.tex175
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/beamerthemelagrange.sty379
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/demo-lagrange.pdfbin0 -> 22042 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/demo-lagrange.tex71
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/beamerthememobius.sty291
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/demo-mobius.pdfbin0 -> 153655 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/demo-mobius.tex171
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/beamerthemeriemann.sty945
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/demo-riemann.pdfbin0 -> 98512 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/demo-riemann.tex178
-rw-r--r--macros/latex/contrib/csvsimple/CHANGES.md32
-rw-r--r--macros/latex/contrib/csvsimple/README.md4
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-doc.sty10
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-example.pdfbin72044 -> 72044 bytes
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-example.tex4
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-l3.pdfbin933300 -> 937516 bytes
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-l3.sty296
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-l3.tex459
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-legacy.pdfbin690985 -> 690987 bytes
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-legacy.sty6
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple-legacy.tex4
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple.pdfbin295804 -> 295559 bytes
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple.sty17
-rw-r--r--macros/latex/contrib/csvsimple/csvsimple.tex4
-rw-r--r--macros/latex/contrib/easybook/easybook.dtx21
-rw-r--r--macros/latex/contrib/easybook/easybook.pdfbin599049 -> 599111 bytes
-rw-r--r--macros/latex/contrib/easybook/easybook.tex7
-rw-r--r--macros/latex/contrib/metalogox/README.txt4
-rw-r--r--macros/latex/contrib/metalogox/metalogox.dtx117
-rw-r--r--macros/latex/contrib/metalogox/metalogox.pdfbin385859 -> 400460 bytes
-rw-r--r--macros/latex/contrib/tagpdf/README.md4
-rw-r--r--macros/latex/contrib/tagpdf/ex-AF-file.pdf56
-rw-r--r--macros/latex/contrib/tagpdf/ex-alt-actualtext.pdfbin34295 -> 34295 bytes
-rw-r--r--macros/latex/contrib/tagpdf/ex-attribute.pdf14
-rw-r--r--macros/latex/contrib/tagpdf/ex-formula-problem.pdf14
-rw-r--r--macros/latex/contrib/tagpdf/ex-list.pdf14
-rw-r--r--macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.pdf14
-rw-r--r--macros/latex/contrib/tagpdf/ex-softhyphen.pdf14
-rw-r--r--macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf14
-rw-r--r--macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf14
-rw-r--r--macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf50
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-backend.dtx17
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-checks.dtx26
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-code.pdfbin1646817 -> 1660867 bytes
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-data.dtx21
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx8
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx8
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx6
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-roles.dtx6
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-space.dtx6
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-struct.dtx70
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-tree.dtx6
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-user.dtx117
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf.dtx8
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf.ins4
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf.pdfbin1085167 -> 1085218 bytes
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf.tex60
-rw-r--r--macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty2
70 files changed, 5866 insertions, 628 deletions
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/README.md b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/README.md
new file mode 100644
index 0000000000..816f6206b3
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/README.md
@@ -0,0 +1,90 @@
+# The `concrete` bundle: A collection of flat beamer themes for LaTeX presentations
+
+```
+Author: Jianrui Lyu <tolvjr@163.com>
+Website: https://github.com/lvjr/concrete
+License: The LaTeX Project Public License 1.3c
+```
+
+## 1\. Introduction
+
+The `concrete` bundle provides a collection of flat beamer themes for making LaTeX presentations, especially for academic and scientific presentations.
+
+It consists of the following seven beamer themes:
+
+- light background themes
+ - beamer theme bernoulli
+ - beamer theme fermat
+ - beamer theme lagrange
+ - beamer theme riemann
+- dark background themes
+ - beamer theme dirichlet
+ - beamer theme gauss
+ - beamer theme mobius
+
+## 2\. Usage
+
+After installing this bundle, you can write a document like this:
+
+```
+\documentclass[xcolor={rgb}]{beamer}
+\usetheme{bernoulli}
+\begin{document}
+
+\title{Beamer Theme Bernoulli}
+\subtitle{A nice theme for LaTeX presentations}
+\author{Author Name}
+\institute{Institute Name}
+
+\begin{frame}[plain]
+\titlepage
+\end{frame}
+
+\section{Section One}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Two}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\end{document}
+```
+
+Note that you **NEED** to add `xcolor={rgb}` option in loading `beamer` class. You can also have a look at the demo files included in this bundle.
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/beamerthemebernoulli.sty b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/beamerthemebernoulli.sty
new file mode 100644
index 0000000000..2bb3d431d8
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/beamerthemebernoulli.sty
@@ -0,0 +1,605 @@
+% -*- coding: utf-8 -*-
+% ----------------------------------------------------------------------------
+% Author: Jianrui Lyu <tolvjr@163.com>
+% Website: https://github.com/lvjr/concrete
+% License: The LaTeX Project Public License 1.3c
+% ----------------------------------------------------------------------------
+
+\ProvidesPackage{beamerthemebernoulli}[2024-01-19 v2024A Beamer Theme Bernoulli]
+
+\makeatletter
+
+% compatible with old versions of beamer
+\providecommand{\beamer@endinputifotherversion}[1]{}
+
+\RequirePackage{tikz,etoolbox,adjustbox}
+\usetikzlibrary{positioning}
+
+\mode<presentation>
+
+\setbeamersize{text margin left=8mm,text margin right=8mm}
+
+%% ----------------- background canvas and background ----------------
+
+\defbeamertemplate{background}{line}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[xstep=\paperwidth,ystep=1mm,color=tcolor] (0,0) grid (\paperwidth,\paperheight);
+ \end{tikzpicture}%
+}
+
+\defbeamertemplate{background}{linear}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[pattern=horizontal lines, pattern color=tcolor]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \end{tikzpicture}%
+}
+
+\defbeamertemplate{background}{lattice}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[step=1mm,color=tcolor] (0,0) grid (\paperwidth,\paperheight);
+ \end{tikzpicture}%
+}
+
+% need "text badly ragged" option for correct space skips
+% see http://tex.stackexchange.com/a/132748/8956
+\gdef\my@background@title{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \fill[fill=fcolor]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \node[above right,text width=0.76\paperwidth,text badly ragged,fill=white,
+ inner sep=0.02\paperwidth,minimum height=0.2\paperheight]
+ (one) at (0.1\paperwidth,0.5\paperheight) {%
+ \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\[5pt]\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
+ \insertsubtitle\\
+ \fi
+ };
+ \node[below right,text width=0.76\paperwidth,text badly ragged,
+ inner sep=0.02\paperwidth,minimum height=0.2\paperheight]
+ (two) at (0.1\paperwidth,0.5\paperheight) {%
+ \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor\\%
+ \ifx\insertinstitute\@empty\else
+ \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute\\%
+ \fi
+ \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate\\%
+ };
+ \fill[fcolor!70!white]
+ (one.north west) -- ++(-0.1\paperwidth,0.1\paperwidth) node[coordinate](nw){}
+ -- +(\paperwidth,0) node[coordinate](ne){} -- (one.north east) -- cycle;
+ \fill[fcolor!50!scolor]
+ (two.south west) -- ++(-0.1\paperwidth,-0.1\paperwidth) node[coordinate](sw){}
+ -- +(\paperwidth,0) node[coordinate](se){} -- (two.south east) -- cycle;
+ \fill[fcolor!70!scolor]
+ (one.north west) -- (two.south west) -- (sw) -- (nw) -- cycle
+ (one.north east) -- (two.south east) -- (se) -- (ne) -- cycle;
+ \draw<beamer:0>[thick,densely dashed,dcolor]
+ (one.north west) -- (one.south west) -- (one.south east) -- (one.north east) -- cycle
+ (two.north west) -- (two.south west) -- (two.south east) -- (two.north east);
+ \draw<beamer:0>[thick,dcolor]
+ (one.north west) -- (nw) -- (ne) -- (one.north east)
+ (two.south west) -- (sw) -- (se) -- (two.south east);
+ \draw<beamer:0>[very thick,dcolor] (sw) -- (nw) (se) -- (ne);
+ \end{tikzpicture}
+}
+
+\newcommand{\maincontents}{Main Contents}
+
+\gdef\my@background@section{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \node[right,text width=0.76\paperwidth,text badly ragged,inner xsep=0.02\paperwidth,
+ inner ysep=0.04\paperwidth,minimum height=0.2\paperheight]
+ (main) at (0.1\paperwidth,0.5\paperheight) {%
+ \begin{minipage}{0.76\paperwidth}
+ \usebeamertemplate{section page content}%
+ \end{minipage}%
+ };
+ \path (main.north west) +(-0.1\paperwidth,0)
+ node[above right,minimum width=\paperwidth,minimum height=0.1\paperheight,
+ text width=0.76\paperwidth,inner xsep=0.12\paperwidth,
+ text badly ragged,fill=fcolor,text=dcolor] (top)
+ {\usebeamerfont{section in toc}\maincontents};
+ \path (main.south west) +(-0.1\paperwidth,0)
+ node[below right,minimum width=\paperwidth,minimum height=0.1\paperheight,
+ fill=fcolor!50!scolor] (bot) {};
+ \draw<beamer:0> (top.north west) -- (top.north east)
+ (top.south west) -- (top.south east);
+ \draw<beamer:0> (bot.north west) -- (bot.north east)
+ (bot.south west) -- (bot.south east);
+ \end{tikzpicture}
+}
+
+\gdef\my@background@subsection{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \node[right,text width=0.76\paperwidth,text badly ragged,inner xsep=0.02\paperwidth,
+ inner ysep=0.04\paperwidth,minimum height=0.2\paperheight]
+ (main) at (0.1\paperwidth,0.5\paperheight) {%
+ \begin{minipage}{0.76\paperwidth}
+ \usebeamertemplate{subsection page content}%
+ \end{minipage}
+ };
+ \path (main.north west) +(-0.1\paperwidth,0)
+ node[above right,minimum width=\paperwidth,minimum height=0.08\paperheight,
+ text width=0.76\paperwidth,inner xsep=0.12\paperwidth,
+ text badly ragged,fill=fcolor,text=dcolor] (top)
+ {\usebeamerfont{subsection in toc}\maincontents};
+ \path (main.south west) +(-0.1\paperwidth,0)
+ node[below right,minimum width=\paperwidth,minimum height=0.08\paperheight,
+ fill=fcolor!50!scolor] (bot) {};
+ \draw<beamer:0> (top.north west) -- (top.north east)
+ (top.south west) -- (top.south east);
+ \draw<beamer:0> (bot.north west) -- (bot.north east)
+ (bot.south west) -- (bot.south east);
+ \end{tikzpicture}
+}
+
+%% -------------------------- title page -----------------------------
+
+\defbeamertemplate{title page}{snake}
+{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@title
+ \end{adjustbox}%
+}
+
+%% ----------------------- section and subsection --------------------
+
+\def\sectionintocskip{0.5em}
+\patchcmd{\beamer@sectionintoc}{\vskip1.5em}{\vskip\sectionintocskip}{}{}
+
+% create new template for section
+\defbeamertemplate{section}{simple}{%
+ \insertsectionnumber.\hspace*{1ex}\insertsection%
+}
+
+\defbeamertemplate{at begin section}{normal}{%
+ \frame{\sectionpage}
+}
+\defbeamertemplate{at begin section}{plain}{%
+ \frame[plain]{\sectionpage}
+}
+\AtBeginSection[]{\usebeamertemplate{at begin section}}
+
+\defbeamertemplate{section page}{snake}{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@section
+ \end{adjustbox}%
+}
+
+\defbeamertemplate{section page content}{simple}{
+ \begin{beamercolorbox}[wd=\textwidth,center]{section title}%
+ \usebeamerfont{section title}
+ \usebeamertemplate{section}%
+ \end{beamercolorbox}
+}
+\defbeamertemplate{section page content}{level}{
+ \tableofcontents[sectionstyle=show/shaded,subsectionstyle=hide]%
+}
+
+% create new template for subsection
+\defbeamertemplate{subsection}{simple}{%
+ \insertsectionnumber.\insertsubsectionnumber\hspace*{2ex}\insertsubsection%
+}
+
+\defbeamertemplate{at begin subsection}{normal}{%
+ \frame{\subsectionpage}
+}
+\defbeamertemplate{at begin subsection}{plain}{%
+ \frame[plain]{\subsectionpage}
+}
+\AtBeginSubsection[]{\usebeamertemplate{at begin subsection}}
+
+\defbeamertemplate{subsection page}{snake}{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@subsection
+ \end{adjustbox}%
+}
+
+\defbeamertemplate{subsection page content}{simple}{
+ \begin{beamercolorbox}[wd=\textwidth,center]{subsection title}%
+ \usebeamerfont{subsection title}%
+ \usebeamertemplate{subsection}%
+ \end{beamercolorbox}%
+}
+\defbeamertemplate{subsection page content}{level}{%
+ \tableofcontents[sectionstyle=hide,subsectionstyle=show/shaded/hide]%
+}
+\defbeamertemplate{subsection in toc}{triangle}{%
+ \leavevmode\leftskip=2.5em\scriptsize\raise1.25pt%
+ \rlap{\hskip-1.5em\donotcoloroutermaths$\blacktriangleright$}%
+ \normalsize\inserttocsubsection\par
+}
+
+%% ---------------------- headline and footline ----------------------
+
+\defbeamertemplate{footline left}{author}{%
+ \insertshortauthor
+}
+
+\defbeamertemplate{footline center}{title}{%
+ \insertshorttitle
+}
+
+\defbeamertemplate{footline right}{number}{%
+ \Acrobatmenu{GoToPage}{\insertframenumber{}/\inserttotalframenumber}%
+}
+\defbeamertemplate{footline right}{normal}{%
+ \hyperlinkframeendprev{$\vartriangle$}
+ \Acrobatmenu{GoToPage}{\insertframenumber{}/\inserttotalframenumber}
+ \hyperlinkframestartnext{$\triangledown$}%
+}
+
+\defbeamertemplate{footline}{simple}{%
+ \hbox{%
+ \begin{beamercolorbox}[wd=.2\paperwidth,ht=2.25ex,dp=1ex,left]{footline}%
+ \usebeamerfont{footline}\kern\beamer@leftmargin
+ \usebeamertemplate{footline left}%
+ \end{beamercolorbox}%
+ \begin{beamercolorbox}[wd=.6\paperwidth,ht=2.25ex,dp=1ex,center]{footline}%
+ \usebeamerfont{footline}\usebeamertemplate{footline center}%
+ \end{beamercolorbox}%
+ \begin{beamercolorbox}[wd=.2\paperwidth,ht=2.25ex,dp=1ex,right]{footline}%
+ \usebeamerfont{footline}\usebeamertemplate{footline right}%
+ \kern\beamer@rightmargin
+ \end{beamercolorbox}%
+ }%
+}
+
+\defbeamertemplate{footline}{sectioning}{%
+ % default height is 0.4pt, which is ignored by adobe reader, so we increase it by 0.2pt
+ {\usebeamercolor[fg]{separator line}\hrule height 0.6pt}%
+ \hbox{%
+ \begin{beamercolorbox}[wd=.8\paperwidth,ht=2.25ex,dp=1ex,left]{footline}%
+ \usebeamerfont{footline}\kern\beamer@leftmargin\insertshorttitle
+ \ifx\insertsection\@empty\else\qquad$\vartriangleright$\qquad\insertsection\fi
+ \ifx\insertsubsection\@empty\else\qquad$\vartriangleright$\qquad\insertsubsection\fi
+ \end{beamercolorbox}%
+ \begin{beamercolorbox}[wd=.2\paperwidth,ht=2.25ex,dp=1ex,right]{footline}%
+ \usebeamerfont{footline}\usebeamertemplate{footline right}%
+ \kern\beamer@rightmargin
+ \end{beamercolorbox}%
+ }%
+}
+
+% customize mini frames template to get both a progress and navigation bar
+
+\newcommand{\my@bigsize}{9}
+\newcommand{\my@medsize}{7}
+\newcommand{\my@smallsize}{5}
+\let\my@box@size=\my@bigsize
+
+\newlength{\my@tempsize}
+
+\newcounter{my@sectnum}
+
+\newcommand{\my@lastdigit}[1]{%
+ \loop\ifnum\value{#1}>9\addtocounter{#1}{-10}\repeat
+ \arabic{#1}%
+}
+
+\newcommand\my@fixedbox[2]{%
+ \makebox[#1]{\rule[-1ex]{0pt}{3.25ex}#2}%
+}
+
+\newcommand\my@colorbox[3]{%
+ {\setlength{\fboxsep}{0pt}\colorbox{#1}{\my@fixedbox{#2}{#3}}}%
+}
+
+\newcommand{\my@navbox}[1][]{%
+ % see http://tex.stackexchange.com/a/53091/8956
+ \if\relax\detokenize{#1}\relax
+ \def\my@tempbox{\my@fixedbox}%
+ \else
+ \def\my@tempbox{\my@colorbox{#1}}%
+ \fi
+ \ifx\my@box\my@bigbox
+ \def\my@temptext{\my@lastdigit{my@sectnum}}%
+ \fi
+ \ifx\my@box\my@medbox
+ \def\my@temptext{$\diamond$}%
+ \fi
+ \ifx\my@box\my@smallbox
+ \def\my@temptext{$-$}%
+ \fi
+ \my@tempbox{\my@tempsize}{\my@temptext}%
+}
+
+\defbeamertemplate{navigation box}{home}{%
+ \setlength{\my@tempsize}{\my@box@size pt}%
+ \my@colorbox{filler2}{\my@tempsize}{$\equiv$}%
+}
+
+\defbeamertemplate{navigation box}{done}{%
+ \setlength{\my@tempsize}{\my@box@size pt}%
+ \my@navbox[filler2]%
+}
+
+\defbeamertemplate{navigation box}{todo}{%
+ \setlength{\my@tempsize}{\my@box@size pt}%
+ \my@navbox
+}
+
+\newcommand{\my@bigbox}{\global\let\my@box@size=\my@bigsize\usebeamertemplate{navigation box}}
+\newcommand{\my@medbox}{\global\let\my@box@size=\my@medsize\usebeamertemplate{navigation box}}
+\newcommand{\my@smallbox}{\global\let\my@box@size=\my@smallsize\usebeamertemplate{navigation box}}
+\let\my@medbox@orig=\my@medbox
+\let\my@smallbox@orig=\my@smallbox
+\let\my@box=\my@bigbox
+
+\newcounter{my@subsectionnumber}
+\newcounter{my@normalframenumber}
+
+\AtBeginDocument{%
+ \pretocmd{\subsection}{\refstepcounter{my@subsectionnumber}}{}{}%
+ \patchcmd{\beamer@writeslidentry}{\addtocontents}{\stepcounter{my@normalframenumber}\addtocontents}{}{}%
+}
+
+\AtEndDocument{%
+ \immediate\write\@auxout{%
+ \noexpand\gdef\noexpand\my@totalsectionnumber{\the\c@section}%
+ \noexpand\gdef\noexpand\my@totalsubsectionnumber{\the\c@my@subsectionnumber}%
+ \noexpand\gdef\noexpand\my@normalframenumber{\the\c@my@normalframenumber}%
+ }%
+}
+
+\def\my@totalsectionnumber{0}
+\def\my@totalsubsectionnumber{0}
+\def\my@normalframenumber{50} % use it instead of \inserttotalframenumber
+
+\newlength{\my@progress@width}
+\setlength{\my@progress@width}{\dimexpr0.8\paperwidth-\beamer@leftmargin\relax}
+
+\newlength{\my@slidebox@width}
+
+\def\my@scale@subsection{1}
+\def\my@scale@slide{1}
+
+\newcommand{\my@adjustbox}{%
+ \ifnum\my@normalframenumber>80\relax
+ \gdef\my@scale@subsection{0.7}%
+ \else
+ \ifnum\my@normalframenumber>45\relax
+ \gdef\my@scale@subsection{0.9}%
+ \fi\fi
+ \pgfmathsetlength{\global\my@slidebox@width}{%
+ (\my@progress@width - 2pt - 1pt*\my@bigsize*(\my@totalsectionnumber+1)%
+ - 1pt*\my@medsize*\my@scale@subsection*\my@totalsubsectionnumber) / %
+ max(1,\my@normalframenumber-\my@totalsectionnumber-\my@totalsubsectionnumber-1)%
+ }%
+ \pgfmathsetlength{\global\my@slidebox@width}{%
+ min(\my@slidebox@width,1pt*\my@smallsize)%
+ }%
+ \gdef\my@scale@slide{\strip@pt\dimexpr
+ \my@slidebox@width/\my@smallsize
+ \relax}%
+ \gdef\my@medbox{\scalebox{\my@scale@subsection}[1]{\my@medbox@orig}}%
+ \gdef\my@smallbox{\scalebox{\my@scale@slide}[1]{\my@smallbox@orig}}%
+ % only adjust boxes once
+ \global\let\my@adjustbox=\relax
+}
+
+\renewcommand{\sectionentry}[5]{\global\let\my@box=\my@bigbox\setcounter{my@sectnum}{#1}}
+
+\pretocmd{\beamer@setuplinks}{\renewcommand{\beamer@subsectionentry}[5]{}}{}{}
+\apptocmd{\beamer@setuplinks}{\global\let\beamer@subsectionentry\mybeamer@subsectionentry}{}{}
+
+\newcommand{\mybeamer@subsectionentry}[5]{\global\let\my@box=\my@medbox}
+
+\renewcommand{\slideentry}[6]{%
+ \def\my@temp@i{1/1}%
+ \def\my@temp@ii{#4}%
+ \ifx\my@temp@i\my@temp@ii % title page
+ \setbeamertemplate{navigation box}[home]%
+ \else
+ \setbeamertemplate{navigation box}[done]%
+ \fi
+ \ifnum\c@section<#1%
+ \setbeamertemplate{navigation box}[todo]%
+ \else
+ \ifnum\c@section=#1\ifnum\c@subsection<#2%
+ \setbeamertemplate{navigation box}[todo]%
+ \else
+ \ifnum\c@subsection=#2\ifnum\c@subsectionslide<#3%
+ \setbeamertemplate{navigation box}[todo]%
+ \fi\fi
+ \fi\fi
+ \fi
+ \ifx\my@temp@i\my@temp@ii % title page
+ \beamer@link(#4){\my@bigbox}%
+ \else
+ \beamer@link(#4){\my@box}%
+ \fi
+ \global\let\my@box=\my@smallbox
+}
+
+\defbeamertemplate{footline}{progress}{%
+ % default height is 0.4pt, which is ignored by adobe reader, so we increase it by 0.2pt
+ {\usebeamercolor[fg]{separator line}\hrule height 0.6pt}%
+ \begin{beamercolorbox}[wd=\paperwidth,ht=2.25ex,dp=1ex]{footline}%
+ \usebeamerfont{footline}%
+ \kern\beamer@leftmargin
+ \my@adjustbox\dohead%
+ \hfill\usebeamertemplate{footline right}%
+ \kern\beamer@rightmargin
+ \end{beamercolorbox}%
+}
+
+%% ------------------------- frame title -----------------------------
+
+\newcommand{\insertframetitlemark}{}
+
+\defbeamertemplate{frametitle}{simple}[1][]
+{%
+ \nointerlineskip
+ \begin{beamercolorbox}[wd=\paperwidth,sep=0pt,leftskip=\beamer@leftmargin,%
+ rightskip=\beamer@rightmargin,#1]{frametitle}
+ \usebeamerfont{frametitle}%
+ \rule[-3.6mm]{0pt}{12mm}\insertframetitle
+ \ifx\insertframetitlemark\@empty\else\hfill
+ {\usebeamercolor{normal text}\color{fg!30!bg}\insertframetitlemark}%
+ \fi
+ \rule[-3.6mm]{0pt}{12mm}\par
+ \end{beamercolorbox}
+}
+
+%% ------------------- block and theorem -----------------------------
+
+\defbeamertemplate{theorem begin}{simple}
+{%
+ \upshape%\bfseries\inserttheoremheadfont
+ {\usebeamercolor[fg]{theoremname}%
+ \inserttheoremname\inserttheoremnumber
+ \ifx\inserttheoremaddition\@empty\else\ (\inserttheoremaddition)\fi%
+ %\inserttheorempunctuation
+ }%
+ \quad\normalfont
+}
+\defbeamertemplate{theorem end}{simple}{\par}
+
+\defbeamertemplate{proof begin}{simple}
+{%
+ %\bfseries
+ {\usebeamercolor[fg]{proofname}\insertproofname}%
+ \quad\normalfont
+}
+\defbeamertemplate{proof end}{simple}{\par}
+
+%% --------------------------- font theme ----------------------------
+
+\setbeamerfont{title}{size=\LARGE}
+\setbeamerfont{subtitle}{size=\large}
+\setbeamerfont{author}{size=\normalsize}
+\setbeamerfont{institute}{size=\normalsize}
+\setbeamerfont{date}{size=\normalsize}
+\setbeamerfont{section in toc}{size=\large}
+\setbeamerfont{subsection in toc}{size=\large}
+\setbeamerfont{frametitle}{size=\large}
+\setbeamerfont{block title}{size=\normalsize}
+
+\usefonttheme{professionalfonts}
+%\usepackage{arev}
+
+%\setlength{\parskip}{5pt plus 1pt minus 1pt}
+
+%% ---------------------------- color theme --------------------------
+
+% always use rgb colors in pdf files
+\substitutecolormodel{hsb}{rgb}
+
+\definecolor{red99}{Hsb}{0,0.9,0.9}
+\definecolor{yellow86}{Hsb}{60,0.8,0.6}
+\definecolor{cyan19}{Hsb}{180,0.1,0.9}
+\definecolor{cyan95}{Hsb}{189,0.88,0.49}
+\definecolor{blue77}{Hsb}{240,0.7,0.7}
+\definecolor{blue99}{Hsb}{240,0.9,0.9}
+\definecolor{magenta88}{Hsb}{300,0.8,0.8}
+
+\colorlet{text1}{black}
+\colorlet{back1}{white}
+\colorlet{accent1}{cyan95}
+\colorlet{accent2}{blue99}
+\colorlet{accent3}{red99}
+\colorlet{accent4}{yellow86}
+\colorlet{accent5}{magenta88}
+\colorlet{filler1}{accent1!40!back1}
+\colorlet{filler2}{accent2!40!back1}
+\colorlet{filler3}{accent3!40!back1}
+\colorlet{filler4}{accent4!40!back1}
+\colorlet{filler5}{accent5!40!back1}
+\colorlet{tcolor}{text1!10!back1} % texture color
+\colorlet{dcolor}{white} % draw color
+\colorlet{fcolor}{cyan95} % fill color
+\colorlet{scolor}{black} % shade color
+
+\setbeamercolor{normal text}{bg=back1,fg=text1}
+\setbeamercolor{structure}{fg=cyan95}
+\setbeamercolor{local structure}{fg=blue99}
+\setbeamercolor{footline}{bg=,fg=black}
+\setbeamercolor{title}{use=structure,fg=structure.fg}
+\setbeamercolor{subtitle}{fg=text1}
+\setbeamercolor{author}{fg=white}
+\setbeamercolor{institute}{fg=white}
+\setbeamercolor{date}{fg=white}
+\setbeamercolor{section in toc}{parent=title}
+\setbeamercolor{subsection in toc}{parent=title}
+\setbeamercolor{section in toc shaded}{parent=normal text}
+\setbeamercolor{subsection in toc shaded}{parent=normal text}
+\setbeamercolor{frametitle}{parent=title}
+\setbeamercolor{separator line}{fg=accent2}
+\setbeamercolor{theoremname}{parent=subtitle}
+\setbeamercolor{proofname}{parent=subtitle}
+\setbeamercolor{block title}{fg=accent1,bg=gray}
+\setbeamercolor{block body}{bg=lightgray}
+\setbeamercolor{block title example}{fg=accent2,bg=gray}
+\setbeamercolor{block body example}{bg=lightgray}
+\setbeamercolor{block title alerted}{fg=accent3,bg=gray}
+\setbeamercolor{block body alerted}{bg=lightgray}
+
+%% ------------------------ select templates -------------------------
+
+\setbeamertemplate{background canvas}[default]
+\setbeamertemplate{background}[line]
+\setbeamertemplate{footline}[progress]
+\setbeamertemplate{footline left}[author]
+\setbeamertemplate{footline center}[title]
+\setbeamertemplate{footline right}[number]
+\setbeamertemplate{title page}[snake]
+\setbeamertemplate{at begin section}[plain]
+\setbeamertemplate{at begin subsection}[plain]
+\setbeamertemplate{section page}[snake]
+\setbeamertemplate{section page content}[level]
+\setbeamertemplate{subsection page}[snake]
+\setbeamertemplate{subsection page content}[level]
+\setbeamertemplate{theorem begin}[default]
+\setbeamertemplate{theorem end}[default]
+\setbeamertemplate{proof begin}[default]
+\setbeamertemplate{proof end}[default]
+\setbeamertemplate{frametitle}[simple]
+\setbeamertemplate{navigation symbols}{}
+\setbeamertemplate{section}[simple]
+\setbeamertemplate{subsection}[simple]
+\setbeamertemplate{section in toc}[sections numbered]
+\setbeamertemplate{subsection in toc}[subsections numbered]
+\setbeamertemplate{section in toc shaded}[default][100]
+\setbeamertemplate{subsection in toc shaded}[default][100]
+\setbeamertemplate{itemize items}[default]
+\setbeamertemplate{enumerate items}[default]
+
+%% ----------------------- handout mode ------------------------------
+
+\mode<handout>{
+ \setbeamertemplate{background canvas}{}
+ \setbeamertemplate{background}{}
+ \setbeamertemplate{footline}[sectioning]
+ \colorlet{dcolor}{darkgray}
+ \colorlet{fcolor}{white}
+ \colorlet{scolor}{white}
+ \setbeamercolor{normal text}{fg=black, bg=white}
+ \setbeamercolor{title}{fg=accent1}
+ \setbeamercolor{subtitle}{fg=accent1!70!gray}
+ \setbeamercolor{author}{fg=black}
+ \setbeamercolor{institute}{fg=black}
+ \setbeamercolor{date}{fg=black}
+ \setbeamercolor{section in toc}{fg=accent1!90!gray}
+ \setbeamercolor{subsection in toc}{fg=accent1!80!gray}
+ \setbeamercolor{section in toc shaded}{fg=lightgray}
+ \setbeamercolor{subsection in toc shaded}{fg=lightgray}
+ \setbeamercolor{frametitle}{fg=accent1!70!gray,bg=}
+ \setbeamercolor{theoremname}{fg=accent1!60!gray}
+ \setbeamercolor{proofname}{fg=accent1!60!gray}
+ \setbeamercolor{footline}{bg=white,fg=black}
+}
+
+\mode
+<all>
+
+\makeatother
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/demo-bernoulli.pdf b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/demo-bernoulli.pdf
new file mode 100644
index 0000000000..6fb2d5bba5
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/demo-bernoulli.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/demo-bernoulli.tex b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/demo-bernoulli.tex
new file mode 100644
index 0000000000..08da497114
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/bernoulli/demo-bernoulli.tex
@@ -0,0 +1,176 @@
+% -*- coding: utf-8 -*-
+
+\documentclass[11pt,xcolor={rgb}]{beamer}
+
+\usetheme{bernoulli}
+
+% remove these two lines to hide footlines in (sub)section pages
+\setbeamertemplate{at begin section}[normal]
+\setbeamertemplate{at begin subsection}[normal]
+
+\usepackage{arev}
+
+\begin{document}
+
+\title{Beamer Theme Bernoulli}
+\subtitle{A nice theme for LaTeX presentations}
+\author{Author Name}
+\institute{Institute Name}
+
+\begin{frame}[plain]
+\titlepage
+\end{frame}
+
+\section{Section One}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Two}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Three}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\end{document}
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/beamerthemedirichlet.sty b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/beamerthemedirichlet.sty
new file mode 100644
index 0000000000..d9590b9b01
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/beamerthemedirichlet.sty
@@ -0,0 +1,402 @@
+% -*- coding: utf-8 -*-
+% ----------------------------------------------------------------------------
+% Author: Jianrui Lyu <tolvjr@163.com>
+% Website: https://github.com/lvjr/concrete
+% License: The LaTeX Project Public License 1.3c
+% ----------------------------------------------------------------------------
+
+\ProvidesPackage{beamerthemedirichlet}[2024-01-19 v2024A Beamer Theme Dirichlet]
+
+\makeatletter
+
+% compatible with old versions of beamer
+\providecommand{\beamer@endinputifotherversion}[1]{}
+
+\RequirePackage{tikz,adjustbox}
+\usetikzlibrary{decorations.pathmorphing,calc}
+
+\mode<presentation>
+
+\setbeamersize{text margin left=8mm,text margin right=8mm}
+
+%% ----------------- background canvas and background ----------------
+
+\defbeamertemplate{background}{dirichlet}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \foreach \i in {0,16,...,128} \foreach \j in {0,16,...,96} {
+ \path[draw=blue77!90!black] (\i mm,\j mm) circle (16mm);
+ }
+ \end{tikzpicture}%
+}
+
+% need "text badly ragged" option for correct space skips
+% see http://tex.stackexchange.com/a/132748/8956
+\gdef\my@background@title
+{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[fill=fcolor]
+ (0,0.25\paperheight) -- (0,0) -- (\paperwidth,0) -- (\paperwidth,0.25\paperheight)
+ decorate[decoration={snake,segment length=3.15mm}] { -- cycle };
+ \path[draw=dcolor,thick] (\paperwidth,0.25\paperheight)
+ decorate[decoration={snake,segment length=3.15mm}] { -- (0,0.25\paperheight) };
+ \path[fill=fcolor]
+ (0,0.85\paperheight) -- (0,\paperheight) -- (\paperwidth,\paperheight) -- (\paperwidth,0.85\paperheight)
+ decorate[decoration={snake,segment length=3.15mm}] { -- cycle };
+ \path[draw=dcolor,thick] (\paperwidth,0.85\paperheight)
+ decorate[decoration={snake,segment length=3.15mm}] { -- (0,0.85\paperheight) };
+ \node[text width=0.9\paperwidth,text badly ragged] at (0.5\paperwidth,0.925\paperheight) {%
+ \begin{minipage}[c][0.15\paperheight]{0.9\paperwidth}%
+ \centering
+ \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate
+ \end{minipage}
+ };
+ \node[text width=0.9\paperwidth,text badly ragged] at (0.5\paperwidth,0.55\paperheight) {%
+ \begin{minipage}[c][0.6\paperheight]{0.9\paperwidth}
+ \centering
+ \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\[5pt]\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
+ \insertsubtitle
+ \fi
+ \end{minipage}
+ };
+ \node[text width=0.9\paperwidth,text badly ragged] at (0.5\paperwidth,0.125\paperheight) {%
+ \begin{minipage}[c][0.25\paperheight]{0.9\paperwidth}
+ \centering
+ \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor\\[3pt]
+ \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+\gdef\my@background@section
+{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[fill=fcolor]
+ (0,0.1\paperheight) -- (0,0) -- (\paperwidth,0) -- (\paperwidth,0.1\paperheight)
+ to[bend right=10] ($(0,0.1\paperheight)$);
+ \path[draw=dcolor,thick] (\paperwidth,0.1\paperheight) to[bend right=10] ($(0,0.1\paperheight)$);
+ \node[text width=\textwidth,text badly ragged] at (0.5\paperwidth,0.6\paperheight) {%
+ \begin{minipage}[c]{\textwidth}
+ \usebeamertemplate{section page content}%
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+\gdef\my@background@subsection
+{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[fill=fcolor]
+ (0,0.1\paperheight) -- (0,0) -- (\paperwidth,0) -- (\paperwidth,0.1\paperheight)
+ to[bend right=10] ($(0,0.1\paperheight)$);
+ \path[draw=dcolor,thick] (\paperwidth,0.1\paperheight) to[bend right=10] ($(0,0.1\paperheight)$);
+ \node[text width=\textwidth,text badly ragged] at (0.5\paperwidth,0.6\paperheight) {%
+ \begin{minipage}[c]{\textwidth}
+ \usebeamertemplate{subsection page content}%
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+%% -------------------------- title page -----------------------------
+
+\defbeamertemplate{title page}{snake}
+{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@title
+ \end{adjustbox}%
+}
+
+%% ----------------------- section and subsection --------------------
+
+% create new template for section
+\defbeamertemplate{section}{simple}{%
+ \insertsectionnumber.\hspace*{1ex}\insertsection%
+}
+
+\AtBeginSection[]{\begin{frame}{\sectionpage}\end{frame}}
+
+\defbeamertemplate{section page}{snake}{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@section
+ \end{adjustbox}%
+}
+
+\defbeamertemplate{section page content}{simple}{
+ \begin{beamercolorbox}[wd=\textwidth,center]{section title}%
+ \usebeamerfont{section title}
+ \usebeamertemplate{section}%
+ \end{beamercolorbox}
+}
+
+% create new template for subsection
+\defbeamertemplate{subsection}{simple}{%
+ \insertsectionnumber.\insertsubsectionnumber\hspace*{2ex}\insertsubsection%
+}
+
+\AtBeginSubsection[]{\begin{frame}{\subsectionpage}\end{frame}}
+
+\defbeamertemplate{subsection page}{snake}{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@subsection
+ \end{adjustbox}%
+}
+
+\defbeamertemplate{subsection page content}{simple}{
+ \begin{beamercolorbox}[wd=\textwidth,center]{subsection title}%
+ \usebeamerfont{subsection title}%
+ \usebeamertemplate{subsection}%
+ \end{beamercolorbox}%
+}
+\defbeamertemplate{subsection page content}{dirichlet}{%
+ \noindent
+ \begin{minipage}{0.5\textwidth}
+ \usebeamerfont{section title}%
+ \usebeamertemplate{section}%
+ \end{minipage}%
+ \begin{minipage}{0.5\textwidth}
+ \tableofcontents[sectionstyle=hide,subsectionstyle=show/shaded/hide]
+ \end{minipage}%
+}
+
+\defbeamertemplate{subsection in toc}{dirichlet}{%
+ \leavevmode
+ \smash{\color{text1}\hspace{-1pt}\rule[-0.6em]{2pt}{2em}}\quad
+ $\circ$ \inserttocsubsection\par
+}
+
+%% ---------------------- headline and footline ----------------------
+
+\newif\ifmy@subsection \my@subsectionfalse
+
+\newcommand{\my@sectionentry}[5]{%
+ \hfill
+ \ifnum\c@section=#1%
+ \usebeamercolor{headline highlight}%
+ \else%
+ \usebeamercolor{headline}%
+ \fi%
+ \hyperlink{Navigation#3}{%
+ \colorbox{bg}{%
+ \hspace{0.2em}\rule[-1ex]{0pt}{3.25ex}\color{fg}#2\hspace{0.2em}%
+ }%
+ }%
+ \let\slideentry=\my@slideentry
+}
+
+\newcommand{\my@subsectionentry}[5]{\my@subsectiontrue}
+
+\newcommand{\my@slideentry}[6]{%
+ \ifmy@subsection
+ \usebeamercolor{headline}%
+ \def\my@box{$\circ$}%
+ \ifnum\c@section=#1%
+ \usebeamercolor{headline highlight}%
+ \ifnum\c@subsection=#2%
+ \def\my@box{$\bullet$}%
+ \fi
+ \fi
+ \beamer@link(#4){%
+ \colorbox{bg}{%
+ \rule[-1ex]{0pt}{3.25ex}\hspace{0.1em}\color{fg}\my@box\hspace{0.1em}%
+ }%
+ }%
+ \my@subsectionfalse
+ \fi
+}
+
+\defbeamertemplate{headline}{dirichlet}{%
+ \begin{beamercolorbox}[wd=\paperwidth,ht=2.25ex,dp=1ex]{headline}%
+ \usebeamerfont{headline}%
+ \kern\beamer@leftmargin
+ \setlength{\fboxsep}{0pt}%
+ \let\sectionentry=\my@sectionentry
+ \let\beamer@subsectionentry=\my@subsectionentry
+ \hskip 0pt plus -1fill\dohead
+ \hskip 0pt plus 9fill\relax
+ \Acrobatmenu{GoToPage}{\insertframenumber{}/\inserttotalframenumber}%
+ \kern\beamer@rightmargin
+ \end{beamercolorbox}%
+ % default height is 0.4pt, which is ignored by adobe reader, so we increase it by 0.2pt
+ {\color{dcolor}\hrule height 0.6pt}%
+}
+
+%% ------------------------- frame title -----------------------------
+
+\defbeamertemplate{frametitle}{simple}{%
+ \nointerlineskip
+ \begin{beamercolorbox}[wd=\paperwidth,sep=0pt,leftskip=\beamer@leftmargin,%
+ rightskip=\beamer@rightmargin]{frametitle}
+ \usebeamerfont{frametitle}%
+ \rule[-3.6mm]{0pt}{12mm}\insertframetitle\rule[-3.6mm]{0pt}{12mm}\par
+ \end{beamercolorbox}
+}
+
+%% ------------------- block and theorem -----------------------------
+
+\defbeamertemplate{theorem begin}{simple}
+{%
+ \upshape%\bfseries\inserttheoremheadfont
+ {\usebeamercolor[fg]{theoremname}%
+ \inserttheoremname\inserttheoremnumber
+ \ifx\inserttheoremaddition\@empty\else\ (\inserttheoremaddition)\fi%
+ %\inserttheorempunctuation
+ }%
+ \quad\normalfont
+}
+\defbeamertemplate{theorem end}{simple}{\par}
+
+\defbeamertemplate{proof begin}{simple}
+{%
+ %\bfseries
+ {\usebeamercolor[fg]{proofname}\insertproofname}%
+ \quad\normalfont
+}
+\defbeamertemplate{proof end}{simple}{\par}
+
+%% --------------------------- font theme ----------------------------
+
+\setbeamerfont{title}{size=\LARGE}
+\setbeamerfont{subtitle}{size=\large}
+\setbeamerfont{author}{size=\large}
+\setbeamerfont{institute}{size=\normalsize}
+\setbeamerfont{date}{size=\large}
+\setbeamerfont{section in toc}{size=\Large}
+\setbeamerfont{subsection in toc}{size=\large}
+\setbeamerfont{headline}{size=\scriptsize}
+\setbeamerfont{frametitle}{size=\large}
+\setbeamerfont{block title}{size=\normalsize}
+
+\usefonttheme{professionalfonts}
+%\usepackage{arev}
+
+%\setlength{\parskip}{5pt plus 1pt minus 1pt}
+
+%% ---------------------------- color theme --------------------------
+
+% always use rgb colors in pdf files
+\substitutecolormodel{hsb}{rgb}
+
+\definecolor{red69}{Hsb}{0,0.6,0.9}
+\definecolor{yellow69}{Hsb}{60,0.6,0.9}
+\definecolor{yellow99}{Hsb}{60,0.9,0.9}
+\definecolor{green69}{Hsb}{120,0.6,0.9}
+\definecolor{cyan69}{Hsb}{180,0.6,0.9}
+\definecolor{azure53}{Hsb}{210,0.5,0.3}
+\definecolor{blue77}{Hsb}{240,0.7,0.7}
+\definecolor{blue88}{Hsb}{240,0.8,0.8}
+\definecolor{blue97}{Hsb}{240,0.9,0.7}
+\definecolor{magenta69}{Hsb}{300,0.6,0.9}
+\definecolor{purple94}{Hsb}{330,0.9,0.4}
+
+\colorlet{text1}{white}
+\colorlet{back1}{blue77}
+\colorlet{accent1}{yellow69}
+\colorlet{accent2}{green69}
+\colorlet{accent3}{red69}
+\colorlet{accent4}{cyan69}
+\colorlet{accent5}{magenta69}
+\colorlet{filler1}{accent1!40!back1}
+\colorlet{filler2}{accent2!40!back1}
+\colorlet{filler3}{accent3!40!back1}
+\colorlet{filler4}{accent4!40!back1}
+\colorlet{filler5}{accent5!40!back1}
+\colorlet{dcolor}{white}
+\colorlet{fcolor}{azure53}
+
+\setbeamercolor{normal text}{bg=blue77,fg=white}
+\setbeamercolor{structure}{fg=yellow99}
+\setbeamercolor{local structure}{fg=accent2}
+\setbeamercolor{headline}{bg=azure53,fg=white}
+\setbeamercolor{headline highlight}{parent=headline,bg=purple94}
+\setbeamercolor{navigation symbols}{bg=purple94}
+\setbeamercolor{navigation symbols dimmed}{fg=purple94}
+\setbeamercolor{title}{use=structure,fg=structure.fg}
+\setbeamercolor{subtitle}{fg=white}
+\setbeamercolor{author}{fg=white}
+\setbeamercolor{institute}{fg=white}
+\setbeamercolor{date}{fg=white}
+\setbeamercolor{section in toc}{parent=title}
+\setbeamercolor{subsection in toc}{parent=title}
+\setbeamercolor{section in toc shaded}{parent=normal text}
+\setbeamercolor{subsection in toc shaded}{parent=normal text}
+\setbeamercolor{frametitle}{parent=title}
+\setbeamercolor{theoremname}{parent=subtitle}
+\setbeamercolor{proofname}{parent=subtitle}
+\setbeamercolor{block title}{fg=accent1,bg=back1!50!gray}
+\setbeamercolor{block body}{bg=back1!50!lightgray}
+\setbeamercolor{block title example}{fg=accent2,bg=back1!50!gray}
+\setbeamercolor{block body example}{bg=back1!50!lightgray}
+\setbeamercolor{block title alerted}{fg=accent3,bg=back1!50!gray}
+\setbeamercolor{block body alerted}{bg=back1!50!lightgray}
+
+%% ------------------------ select templates -------------------------
+
+\setbeamertemplate{background canvas}[default]
+\setbeamertemplate{background}[dirichlet]
+\setbeamertemplate{title page}[snake]
+\setbeamertemplate{section page}[snake]
+\setbeamertemplate{section page content}[simple]
+\setbeamertemplate{subsection page}[snake]
+\setbeamertemplate{subsection page content}[dirichlet]
+\setbeamertemplate{section}[simple]
+\setbeamertemplate{subsection}[simple]
+\setbeamertemplate{section in toc}[sections numbered]
+\setbeamertemplate{subsection in toc}[dirichlet]
+\setbeamertemplate{section in toc shaded}[default][100]
+\setbeamertemplate{subsection in toc shaded}[default][100]
+\setbeamertemplate{navigation symbols}{}
+\setbeamertemplate{headline}[dirichlet]
+\setbeamertemplate{frametitle}[simple]
+\setbeamertemplate{theorem begin}[default]
+\setbeamertemplate{theorem end}[default]
+\setbeamertemplate{proof begin}[default]
+\setbeamertemplate{proof end}[default]
+\setbeamertemplate{itemize items}[default]
+\setbeamertemplate{enumerate items}[default]
+
+%% ----------------------- handout mode ------------------------------
+
+\mode<handout>{
+ \setbeamertemplate{background canvas}{}
+ \setbeamertemplate{background}{}
+ \setbeamertemplate{subsection page content}[simple]
+ \colorlet{text1}{black}
+ \colorlet{back1}{white}
+ \colorlet{accent1}{blue!90!black}
+ \colorlet{accent2}{teal!70!black}
+ \colorlet{accent3}{red!50!black}
+ \colorlet{dcolor}{gray}
+ \colorlet{fcolor}{white}
+ \setbeamercolor{normal text}{fg=black, bg=white}
+ \setbeamercolor{title}{fg=blue}
+ \setbeamercolor{subtitle}{fg=black}
+ \setbeamercolor{author}{fg=black}
+ \setbeamercolor{institute}{fg=black}
+ \setbeamercolor{date}{fg=black}
+ \setbeamercolor{section in toc}{fg=blue!90!gray}
+ \setbeamercolor{subsection in toc}{fg=blue!80!gray}
+ \setbeamercolor{section in toc shaded}{fg=lightgray}
+ \setbeamercolor{subsection in toc shaded}{fg=lightgray}
+ \setbeamercolor{section title}{fg=blue!90!gray}
+ \setbeamercolor{subsection title}{fg=blue!80!gray}
+ \setbeamercolor{headline}{bg=white,fg=black}
+ \setbeamercolor{headline highlight}{fg=blue!90!gray,bg=white}
+ \setbeamercolor{frametitle}{fg=blue!70!gray,bg=}
+ \setbeamercolor{theoremname}{fg=blue!60!gray}
+ \setbeamercolor{proofname}{fg=blue!60!gray}
+}
+
+\mode
+<all>
+
+\makeatother
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/demo-dirichlet.pdf b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/demo-dirichlet.pdf
new file mode 100644
index 0000000000..ed4fba2bde
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/demo-dirichlet.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/demo-dirichlet.tex b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/demo-dirichlet.tex
new file mode 100644
index 0000000000..24cb9ca62e
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/dirichlet/demo-dirichlet.tex
@@ -0,0 +1,171 @@
+% -*- coding: utf-8 -*-
+
+\documentclass[12pt,xcolor={rgb}]{beamer}
+
+\usetheme{dirichlet}
+
+\usepackage{arev}
+
+\begin{document}
+
+\title{Beamer Theme Dirichlet}
+\author{Author Name}
+\institute{Institute Name}
+
+\begin{frame}[plain]
+\titlepage
+\end{frame}
+
+\section{Section One}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Two}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Three}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\end{document}
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/beamerthemefermat.sty b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/beamerthemefermat.sty
new file mode 100644
index 0000000000..f4130745a0
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/beamerthemefermat.sty
@@ -0,0 +1,433 @@
+% -*- coding: utf-8 -*-
+% ----------------------------------------------------------------------------
+% Author: Jianrui Lyu <tolvjr@163.com>
+% Website: https://github.com/lvjr/concrete
+% License: The LaTeX Project Public License 1.3c
+% ----------------------------------------------------------------------------
+
+\ProvidesPackage{beamerthemefermat}[2024-01-19 v2024A Beamer Theme Fermat]
+
+\makeatletter
+
+% compatible with old versions of beamer
+\providecommand{\beamer@endinputifotherversion}[1]{}
+
+\RequirePackage{tikz,etoolbox,adjustbox,varwidth,multicol}
+\usetikzlibrary{decorations.pathmorphing}
+
+\mode<presentation>
+
+\setbeamersize{text margin left=8mm,text margin right=8mm}
+
+%% ----------------- background canvas and background ----------------
+
+\defbeamertemplate{background}{line}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[xstep=\paperwidth,ystep=1mm,color=tcolor] (0,0) grid (\paperwidth,\paperheight);
+ \end{tikzpicture}%
+}
+
+\defbeamertemplate{background}{linear}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[pattern=horizontal lines, pattern color=tcolor]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \end{tikzpicture}%
+}
+
+\defbeamertemplate{background}{lattice}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[step=1mm,color=tcolor] (0,0) grid (\paperwidth,\paperheight);
+ \end{tikzpicture}%
+}
+
+% need "text badly ragged" option for correct space skips
+% see http://tex.stackexchange.com/a/132748/8956
+\gdef\my@background@title
+{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \fill[draw=dcolor,fill=fcolor]
+ (0,0.25\paperheight) -- (0,0) -- (\paperwidth,0)
+ -- (\paperwidth,0.25\paperheight) decorate[decoration={snake,segment length=3.15mm}] { -- cycle };
+ \fill[draw=dcolor,fill=fcolor]
+ (0,0.85\paperheight) -- (0,\paperheight) -- (\paperwidth,\paperheight)
+ -- (\paperwidth,0.85\paperheight) decorate[decoration={snake,segment length=3.15mm}] { -- cycle };
+ \node[text width=0.9\paperwidth,text badly ragged] at (0.5\paperwidth,0.925\paperheight) {%
+ \begin{minipage}[c][0.15\paperheight]{0.9\paperwidth}%
+ \centering
+ \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate
+ \end{minipage}
+ };
+ \node[text width=0.9\paperwidth,text badly ragged] at (0.5\paperwidth,0.55\paperheight) {%
+ \begin{minipage}[c][0.6\paperheight]{0.9\paperwidth}
+ \centering
+ \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\[5pt]\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
+ \insertsubtitle
+ \fi
+ \end{minipage}
+ };
+ \node[text width=0.9\paperwidth,text badly ragged] at (0.5\paperwidth,0.125\paperheight) {%
+ \begin{minipage}[c][0.25\paperheight]{0.9\paperwidth}
+ \centering
+ \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor\\[3pt]
+ \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+\gdef\my@background@section
+{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \fill[draw=dcolor,fill=fcolor]
+ (0,0.12\paperheight) -- (0,0) -- (\paperwidth,0)
+ -- (\paperwidth,0.12\paperheight) decorate[decoration={snake,segment length=3.15mm}] { -- cycle };
+ \fill[draw=dcolor,fill=fcolor]
+ (0,0.92\paperheight) -- (0,\paperheight) -- (\paperwidth,\paperheight)
+ -- (\paperwidth,0.92\paperheight) decorate[decoration={snake,segment length=3.15mm}] { -- cycle };
+ \node[text width=0.9\paperwidth,text badly ragged] at (0.5\paperwidth,0.52\paperheight) {%
+ \begin{minipage}[c]{0.9\paperwidth}
+ \usebeamertemplate{section page content}%
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+\gdef\my@background@subsection
+{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \fill[draw=dcolor,fill=fcolor]
+ (0,0.12\paperheight) -- (0,0) -- (\paperwidth,0)
+ -- (\paperwidth,0.12\paperheight) decorate[decoration={snake,segment length=3.15mm}] { -- cycle };
+ \fill[draw=dcolor,fill=fcolor]
+ (0,0.92\paperheight) -- (0,\paperheight) -- (\paperwidth,\paperheight)
+ -- (\paperwidth,0.92\paperheight) decorate[decoration={snake,segment length=3.15mm}] { -- cycle };
+ \node[text width=0.9\paperwidth,text badly ragged] at (0.5\paperwidth,0.52\paperheight) {%
+ \begin{minipage}[c]{0.9\paperwidth}
+ \usebeamertemplate{subsection page content}%
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+%% -------------------------- title page -----------------------------
+
+\defbeamertemplate{title page}{snake}
+{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@title
+ \end{adjustbox}%
+}
+
+%% ----------------------- section and subsection --------------------
+
+\patchcmd{\@vwid@sift}{\PackageWarning{varwidth}{Failed to reprocess entire contents}}{}{}{}
+
+\def\sectionintocskip{0.5em}
+\patchcmd{\beamer@sectionintoc}{\vskip1.5em}{\vskip\sectionintocskip}{}{}
+% patch for centering toc with varwidth package
+\patchcmd{\beamer@sectionintoc}{%
+ \hbox{\vbox{%
+ \def\beamer@breakhere{\\}%
+ \beamer@tocact{\ifnum\c@section=#1\beamer@toc@cs\else\beamer@toc@os\fi}{section in toc}}}%
+}{%
+ \hbox{%
+ \def\beamer@breakhere{}%
+ \beamer@tocact{\ifnum\c@section=#1\beamer@toc@cs\else\beamer@toc@os\fi}{section in toc}}%
+}{}{}
+% patch for centering toc in pdflatex with varwidth package
+\let\my@beamer@subsectionintoc=\beamer@subsectionintoc
+\patchcmd{\my@beamer@subsectionintoc}{%
+ \def\beamer@breakhere{\\}%
+ \beamer@tocact{\ifnum\c@section=#1\ifnum\c@subsection=#2\beamer@toc@css\else\beamer@toc@oss\fi\else\beamer@toc@ooss\fi}
+ {subsection in toc}%
+}{%
+ \def\beamer@breakhere{}%
+ \ifnum\c@section=#1\ifnum\c@subsection=#2%
+ \vskip.5em\hbox{\beamer@tocact\beamer@toc@css{subsection in toc}}%
+ \else
+ \vskip.5em\hbox{\beamer@tocact\beamer@toc@oss{subsection in toc}}%
+ \fi\fi
+}{}{}
+
+% create new template for section
+\defbeamertemplate{section}{simple}{%
+ \insertsectionnumber.\hspace*{1ex}\insertsection%
+}
+
+\defbeamertemplate{at begin section}{normal}{%
+ \frame{\sectionpage}
+}
+\defbeamertemplate{at begin section}{plain}{%
+ \frame[plain]{\sectionpage}
+}
+\AtBeginSection[]{\usebeamertemplate{at begin section}}
+
+\defbeamertemplate{section page}{snake}{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@section
+ \end{adjustbox}%
+}
+
+\defbeamertemplate{section page content}{simple}{
+ \begin{beamercolorbox}[wd=\textwidth,center]{section title}%
+ \usebeamerfont{section title}
+ \usebeamertemplate{section}%
+ \end{beamercolorbox}
+}
+\defbeamertemplate{section page content}{level}{
+ \begin{center}
+ \begin{varwidth}{\textwidth}
+ \tableofcontents[sectionstyle=show/shaded,subsectionstyle=hide]
+ \end{varwidth}
+ \end{center}
+}
+\defbeamertemplate{section page content}{split}{
+ \begin{multicols}{2}
+ \tableofcontents[sectionstyle=show/shaded,subsectionstyle=shaded]
+ \end{multicols}
+}
+
+% create new template for subsection
+\defbeamertemplate{subsection}{simple}{%
+ \insertsectionnumber.\insertsubsectionnumber\hspace*{2ex}\insertsubsection%
+}
+
+\defbeamertemplate{at begin subsection}{normal}{%
+ \frame{\subsectionpage}
+}
+\defbeamertemplate{at begin subsection}{plain}{%
+ \frame[plain]{\subsectionpage}
+}
+\AtBeginSubsection[]{\usebeamertemplate{at begin subsection}}
+
+\defbeamertemplate{subsection page}{snake}{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@subsection
+ \end{adjustbox}%
+}
+
+\defbeamertemplate{subsection page content}{simple}{
+ \begin{beamercolorbox}[wd=\textwidth,center]{subsection title}%
+ \usebeamerfont{subsection title}%
+ \usebeamertemplate{subsection}%
+ \end{beamercolorbox}%
+}
+\defbeamertemplate{subsection page content}{level}{
+ \begin{center}
+ \let\beamer@subsectionintoc=\my@beamer@subsectionintoc
+ \begin{varwidth}{\textwidth}
+ \tableofcontents[sectionstyle=hide,subsectionstyle=show/shaded/hide]
+ \end{varwidth}
+ \end{center}
+}
+\defbeamertemplate{subsection page content}{split}{
+ \begin{multicols}{2}
+ \tableofcontents[sectionstyle=show/shaded,subsectionstyle=show/shaded]
+ \end{multicols}
+}
+
+\defbeamertemplate{subsection in toc}{triangle}{%
+ \leavevmode\leftskip=2.5em\scriptsize\raise1.25pt%
+ \rlap{\hskip-1.5em\donotcoloroutermaths$\blacktriangleright$}%
+ \normalsize\inserttocsubsection\par
+}
+
+%% ---------------------- headline and footline ----------------------
+
+\newif\ifmy@subsection \my@subsectionfalse
+
+\newcommand{\my@sectionentry}[5]{%
+ \hfill
+ \ifnum\c@section=#1%
+ \usebeamercolor{footline highlight}%
+ \else%
+ \usebeamercolor{footline}%
+ \fi%
+ \hyperlink{Navigation#3}{%
+ \colorbox{bg}{%
+ \hspace{0.2em}\rule[-1ex]{0pt}{3.25ex}\color{fg}#2\hspace{0.2em}%
+ }%
+ }%
+ \let\slideentry=\my@slideentry
+}
+
+\newcommand{\my@subsectionentry}[5]{\my@subsectiontrue}
+
+\newcommand{\my@slideentry}[6]{%
+ \ifmy@subsection
+ \usebeamercolor{footline}%
+ \def\my@box{$\circ$}%
+ \ifnum\c@section=#1%
+ \usebeamercolor{footline highlight}%
+ \ifnum\c@subsection=#2%
+ \def\my@box{$\bullet$}%
+ \fi
+ \fi
+ \beamer@link(#4){%
+ \colorbox{bg}{%
+ \rule[-1ex]{0pt}{3.25ex}\hspace{0.1em}\color{fg}\my@box\hspace{0.1em}%
+ }%
+ }%
+ \my@subsectionfalse
+ \fi
+}
+
+\defbeamertemplate{footline}{progress}{%
+ \begin{beamercolorbox}[wd=\paperwidth,ht=0.6pt,sep=0pt]{separator line}
+ \end{beamercolorbox}
+ \nointerlineskip
+ \begin{beamercolorbox}[wd=\paperwidth,ht=2.25ex,dp=1ex]{footline}%
+ \usebeamerfont{footline}%
+ \kern\beamer@leftmargin
+ \setlength{\fboxsep}{0pt}%
+ \let\sectionentry=\my@sectionentry
+ \let\beamer@subsectionentry=\my@subsectionentry
+ \hskip 0pt plus -1fill\dohead
+ \hskip 0pt plus 9fill\relax
+ \Acrobatmenu{GoToPage}{\insertframenumber{}/\inserttotalframenumber}%
+ \kern\beamer@rightmargin
+ \end{beamercolorbox}%
+}
+
+%% ------------------------- frame title -----------------------------
+
+\defbeamertemplate{frametitle}{simple}{%
+ \nointerlineskip
+ \begin{beamercolorbox}[wd=\paperwidth,sep=0pt,leftskip=\beamer@leftmargin,%
+ rightskip=\beamer@rightmargin]{frametitle}
+ \usebeamerfont{frametitle}%
+ \rule[-3.6mm]{0pt}{12mm}\insertframetitle\rule[-3.6mm]{0pt}{12mm}\par
+ \end{beamercolorbox}
+ \nointerlineskip
+ \begin{beamercolorbox}[wd=\paperwidth,ht=0.6pt,sep=0pt]{separator line}
+ \end{beamercolorbox}
+}
+
+%% --------------------------- font theme ----------------------------
+
+\setbeamerfont{title}{size=\LARGE}
+\setbeamerfont{subtitle}{size=\large}
+\setbeamerfont{author}{size=\large}
+\setbeamerfont{institute}{size=\normalsize}
+\setbeamerfont{date}{size=\large}
+\setbeamerfont{section in toc}{size=\large}
+\setbeamerfont{subsection in toc}{size=\large}
+\setbeamerfont{frametitle}{size=\large}
+\setbeamerfont{block title}{size=\normalsize}
+
+\usefonttheme{professionalfonts}
+%\usepackage{arev}
+
+%\setlength{\parskip}{5pt plus 1pt minus 1pt}
+
+%% ---------------------------- color theme --------------------------
+
+% always use rgb colors in pdf files
+\substitutecolormodel{hsb}{rgb}
+
+\definecolor{red99}{Hsb}{0,0.9,0.9}
+\definecolor{brown49}{Hsb}{30,0.4,0.9}
+\definecolor{yellow29}{Hsb}{60,0.2,0.9}
+\definecolor{yellow86}{Hsb}{60,0.8,0.6}
+\definecolor{cyan95}{Hsb}{180,0.9,0.5}
+\definecolor{blue77}{Hsb}{240,0.7,0.7}
+\definecolor{blue99}{Hsb}{240,0.9,0.9}
+\definecolor{magenta88}{Hsb}{300,0.8,0.8}
+
+\colorlet{text1}{black}
+\colorlet{back1}{white}
+\colorlet{accent1}{blue99}
+\colorlet{accent2}{cyan95}
+\colorlet{accent3}{red99}
+\colorlet{accent4}{yellow86}
+\colorlet{accent5}{magenta88}
+\colorlet{filler1}{accent1!40!back1}
+\colorlet{filler2}{accent2!40!back1}
+\colorlet{filler3}{accent3!40!back1}
+\colorlet{filler4}{accent4!40!back1}
+\colorlet{filler5}{accent5!40!back1}
+\colorlet{tcolor}{text1!10!back1}
+\colorlet{dcolor}{cyan95}
+\colorlet{fcolor}{brown49}
+
+\setbeamercolor{normal text}{bg=yellow29,fg=black}
+\setbeamercolor{structure}{fg=blue99}
+\setbeamercolor{local structure}{fg=cyan95}
+\setbeamercolor{footline}{bg=brown49,fg=black}
+\setbeamercolor{footline highlight}{parent=footline,bg=filler2}
+\setbeamercolor{separator line}{bg=accent2}
+\setbeamercolor{title}{use=structure,fg=structure.fg}
+\setbeamercolor{subtitle}{use={structure,normal text},fg=structure.fg!90!normal text.bg}
+\setbeamercolor{section in toc}{parent=title}
+\setbeamercolor{subsection in toc}{parent=subtitle}
+\setbeamercolor{section in toc shaded}{parent=normal text}
+\setbeamercolor{subsection in toc shaded}{parent=normal text}
+\setbeamercolor{frametitle}{fg=text1,bg=brown49}
+\setbeamercolor{theoremname}{parent=subtitle}
+\setbeamercolor{proofname}{parent=subtitle}
+\setbeamercolor{block title}{fg=accent1,bg=gray}
+\setbeamercolor{block body}{bg=lightgray}
+\setbeamercolor{block title example}{fg=accent2,bg=gray}
+\setbeamercolor{block body example}{bg=lightgray}
+\setbeamercolor{block title alerted}{fg=accent3,bg=gray}
+\setbeamercolor{block body alerted}{bg=lightgray}
+
+%% ------------------------ select templates -------------------------
+
+\setbeamertemplate{background canvas}[default]
+\setbeamertemplate{background}[line]
+\setbeamertemplate{footline}[progress]
+\setbeamertemplate{title page}[snake]
+\setbeamertemplate{at begin section}[plain]
+\setbeamertemplate{at begin subsection}[plain]
+\setbeamertemplate{section page}[snake]
+\setbeamertemplate{section page content}[level]
+\setbeamertemplate{subsection page}[snake]
+\setbeamertemplate{subsection page content}[level]
+\setbeamertemplate{frametitle}[simple]
+\setbeamertemplate{navigation symbols}{}
+\setbeamertemplate{section}[simple]
+\setbeamertemplate{subsection}[simple]
+\setbeamertemplate{section in toc}[sections numbered]
+\setbeamertemplate{subsection in toc}[subsections numbered]
+\setbeamertemplate{section in toc shaded}[default][100]
+\setbeamertemplate{subsection in toc shaded}[default][100]
+\setbeamertemplate{itemize items}[default]
+\setbeamertemplate{enumerate items}[default]
+
+%% ----------------------- handout mode ------------------------------
+
+\mode<handout>{
+ \setbeamertemplate{background canvas}{}
+ \setbeamertemplate{background}{}
+ \colorlet{dcolor}{darkgray}
+ \colorlet{fcolor}{white}
+ \setbeamercolor{normal text}{fg=black, bg=white}
+ \setbeamercolor{footline highlight}{bg=,fg=blue99}
+ \setbeamercolor{title}{fg=blue}
+ \setbeamercolor{subtitle}{fg=blue!70!gray}
+ \setbeamercolor{section in toc}{fg=blue!90!gray}
+ \setbeamercolor{subsection in toc}{fg=blue!80!gray}
+ \setbeamercolor{section in toc shaded}{fg=lightgray}
+ \setbeamercolor{subsection in toc shaded}{fg=lightgray}
+ \setbeamercolor{frametitle}{fg=blue!70!gray,bg=}
+ \setbeamercolor{theoremname}{fg=blue!60!gray}
+ \setbeamercolor{proofname}{fg=blue!60!gray}
+ \setbeamercolor{footline}{bg=white,fg=black}
+}
+
+\mode
+<all>
+
+\makeatother
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/demo-fermat.pdf b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/demo-fermat.pdf
new file mode 100644
index 0000000000..1ac68703d3
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/demo-fermat.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/demo-fermat.tex b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/demo-fermat.tex
new file mode 100644
index 0000000000..84d2f31213
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/fermat/demo-fermat.tex
@@ -0,0 +1,171 @@
+% -*- coding: utf-8 -*-
+
+\documentclass[12pt,xcolor={rgb}]{beamer}
+
+\usetheme{fermat}
+
+\usepackage{arev}
+
+\begin{document}
+
+\title{Beamer Theme Fermat}
+\author{Author Name}
+\institute{Institute Name}
+
+\begin{frame}[plain]
+\titlepage
+\end{frame}
+
+\section{Section One}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Two}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Three}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\end{document}
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/beamerthemegauss.sty b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/beamerthemegauss.sty
new file mode 100644
index 0000000000..b6acd9069a
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/beamerthemegauss.sty
@@ -0,0 +1,678 @@
+% -*- coding: utf-8 -*-
+% ----------------------------------------------------------------------------
+% Author: Jianrui Lyu <tolvjr@163.com>
+% Website: https://github.com/lvjr/concrete
+% License: The LaTeX Project Public License 1.3c
+% ----------------------------------------------------------------------------
+
+\ProvidesPackage{beamerthemegauss}[2024-01-19 v2024A Beamer Theme Gauss]
+
+\makeatletter
+
+% compatible with old versions of beamer
+\providecommand{\beamer@endinputifotherversion}[1]{}
+
+\RequirePackage{tikz,etoolbox,fontawesome}
+
+% see https://github.com/xdanaux/fontawesome-latex/issues/12
+% but we don't need to fix it on TeX Live 2022
+%\ifxetex
+% \newfontfamily{\FA}{FontAwesome}[Extension=.otf]
+%\fi
+
+\usetikzlibrary{patterns}
+
+\mode<presentation>
+
+\setbeamersize{text margin left=10.5mm,text margin right=5.5mm}
+
+%% ----------------- background canvas and background ----------------
+
+\def\my@fa#1{#1\space}
+
+\defbeamertemplate{background canvas}{awesome}{%
+ \setlength{\fboxsep}{0pt}%
+ \noindent\colorbox{bg}{%
+ \usebeamertemplate{background texture}%
+ }%
+}
+
+\defbeamertemplate{background texture}{awesome}{%
+ \fontfamily{lmss}\fontsize{17pt}{22pt}\selectfont\color{tcolor}%
+ \hspace{0.008\paperwidth}%
+ \begin{minipage}[c][\paperheight][c]{0.984\paperwidth}
+ \my@fa\faAdjust
+ \my@fa\faAlignCenter
+ \my@fa\faAlignJustify
+ \my@fa\faAlignLeft
+ \my@fa\faAlignRight
+ \my@fa\faAngleDoubleDown
+ \my@fa\faAngleDoubleLeft
+ \my@fa\faAngleDoubleRight
+ \my@fa\faAngleDoubleUp
+ \my@fa\faAngleDown
+ \my@fa\faAngleLeft
+ \my@fa\faAngleRight
+ \my@fa\faAngleUp
+ \my@fa\faAreaChart
+ \my@fa\faArrowCircleODown
+ \my@fa\faArrowCircleOLeft
+ \my@fa\faArrowCircleORight
+ \my@fa\faArrowCircleOUp
+ \my@fa\faArrowDown
+ \my@fa\faArrowLeft
+ \my@fa\faArrowRight
+ \my@fa\faArrowUp
+ \my@fa\faArrows
+ \my@fa\faArrowsH
+ \my@fa\faArrowsV
+ \my@fa\faAsterisk
+ \my@fa\faAt
+ \my@fa\faBackward
+ \my@fa\faBan
+ \my@fa\faBarChart
+ \my@fa\faBars
+ \my@fa\faBold
+ \my@fa\faBolt
+ \my@fa\faBook
+ \my@fa\faBookmarkO
+ \my@fa\faBraille
+ \my@fa\faBullseye
+ \my@fa\faCalendarCheckO
+ \my@fa\faCalendarMinusO
+ \my@fa\faCalendarPlusO
+ \my@fa\faCalendarTimesO
+ \my@fa\faCaretDown
+ \my@fa\faCaretLeft
+ \my@fa\faCaretRight
+ \my@fa\faCaretSquareODown
+ \my@fa\faCaretSquareOLeft
+ \my@fa\faCaretSquareORight
+ \my@fa\faCaretSquareOUp
+ \my@fa\faCheck
+ \my@fa\faCheckCircleO
+ \my@fa\faCheckSquareO
+ \my@fa\faChevronDown
+ \my@fa\faChevronLeft
+ \my@fa\faChevronRight
+ \my@fa\faChevronUp
+ \my@fa\faCircleO
+ \my@fa\faCircleThin
+ \my@fa\faClone
+ \my@fa\faClose
+ \my@fa\faCode
+ \my@fa\faColumns
+ \my@fa\faCommentO
+ \my@fa\faCommentingO
+ \my@fa\faCompress
+ \my@fa\faCrosshairs
+ \my@fa\faDatabase
+ \my@fa\faDesktop
+ \my@fa\faDotCircleO
+ \my@fa\faEject
+ \my@fa\faEllipsisH
+ \my@fa\faEllipsisV
+ \my@fa\faEnvira
+ \my@fa\faEraser
+ \my@fa\faExchange
+ \my@fa\faExclamation
+ \my@fa\faExclamationCircle
+ \my@fa\faExpand
+ \my@fa\faEyedropper
+ \my@fa\faFa
+ \my@fa\faFighterJet
+ \my@fa\faFire
+ \my@fa\faFlagO
+ \my@fa\faFlash
+ \my@fa\faFlask
+ \my@fa\faFolderO
+ \my@fa\faFont
+ \my@fa\faForward
+ \my@fa\faFrownO
+ \my@fa\faGavel
+ \my@fa\faGbp
+ \my@fa\faGear
+ \my@fa\faGenderless
+ \my@fa\faGraduationCap
+ \my@fa\faGratipay
+ \my@fa\faHSquare
+ \my@fa\faHandODown
+ \my@fa\faHandOLeft
+ \my@fa\faHandORight
+ \my@fa\faHandOUp
+ \my@fa\faHandPaperO
+ \my@fa\faHandPeaceO
+ \my@fa\faHandPointerO
+ \my@fa\faHandScissorsO
+ \my@fa\faHashtag
+ \my@fa\faHeader
+ \my@fa\faHeartO
+ \my@fa\faHome
+ \my@fa\faHourglassHalf
+ \my@fa\faImage
+ \my@fa\faInfo
+ \my@fa\faInfoCircle
+ \my@fa\faItalic
+ \my@fa\faLaptop
+ \my@fa\faLeaf
+ \my@fa\faLemonO
+ \my@fa\faLevelDown
+ \my@fa\faLevelUp
+ \my@fa\faLightbulbO
+ \my@fa\faLineChart
+ \my@fa\faListOl
+ \my@fa\faListUl
+ \my@fa\faLocationArrow
+ \my@fa\faLongArrowDown
+ \my@fa\faLongArrowLeft
+ \my@fa\faLongArrowRight
+ \my@fa\faLongArrowUp
+ \my@fa\faMailForward
+ \my@fa\faMailReply
+ \my@fa\faMapO
+ \my@fa\faMehO
+ \my@fa\faMinus
+ \my@fa\faMinusCircle
+ \my@fa\faMinusSquareO
+ \my@fa\faMoonO
+ \my@fa\faMousePointer
+ \my@fa\faNeuter
+ \my@fa\faObjectGroup
+ \my@fa\faObjectUngroup
+ \my@fa\faPagelines
+ \my@fa\faPaintBrush
+ \my@fa\faPaperPlaneO
+ \my@fa\faPaperclip
+ \my@fa\faPauseCircleO
+ \my@fa\faPaw
+ \my@fa\faPencil
+ \my@fa\faPercent
+ \my@fa\faPhoto
+ \my@fa\faPieChart
+ \my@fa\faPlane
+ \my@fa\faPlayCircleO
+ \my@fa\faPlus
+ \my@fa\faPlusCircle
+ \my@fa\faPlusSquareO
+ \my@fa\faProductHunt
+ \my@fa\faPuzzlePiece
+ \my@fa\faQuestion
+ \my@fa\faQuestionCircle
+ \my@fa\faQuestionCircleO
+ \my@fa\faQuoteLeft
+ \my@fa\faQuoteRight
+ \my@fa\faRefresh
+ \my@fa\faRemove
+ \my@fa\faReorder
+ \my@fa\faReply
+ \my@fa\faRocket
+ \my@fa\faRotateLeft
+ \my@fa\faRotateRight
+ \my@fa\faScissors
+ \my@fa\faSearch
+ \my@fa\faSearchMinus
+ \my@fa\faSearchPlus
+ \my@fa\faShare
+ \my@fa\faSignal
+ \my@fa\faSmileO
+ \my@fa\faSort
+ \my@fa\faSortNumericAsc
+ \my@fa\faSortNumericDesc
+ \my@fa\faSpaceShuttle
+ \my@fa\faSquareO
+ \my@fa\faStar
+ \my@fa\faStarHalfO
+ \my@fa\faStarO
+ \my@fa\faStepBackward
+ \my@fa\faStepForward
+ \my@fa\faStickyNoteO
+ \my@fa\faStopCircle
+ \my@fa\faStopCircleO
+ \my@fa\faStrikethrough
+ \my@fa\faSubscript
+ \my@fa\faSunO
+ \my@fa\faSuperscript
+ \my@fa\faTable
+ \my@fa\faTag
+ \my@fa\faTasks
+ \my@fa\faTextHeight
+ \my@fa\faTextWidth
+ \my@fa\faTh
+ \my@fa\faThLarge
+ \my@fa\faThList
+ \my@fa\faThumbTack
+ \my@fa\faThumbsODown
+ \my@fa\faThumbsOUp
+ \my@fa\faTimes
+ \my@fa\faTimesCircle
+ \my@fa\faTimesCircleO
+ \my@fa\faTint
+ \my@fa\faToggleDown
+ \my@fa\faToggleLeft
+ \my@fa\faToggleRight
+ \my@fa\faToggleUp
+ \my@fa\faTree
+ \my@fa\faTv
+ \my@fa\faUnderline
+ \my@fa\faUniversity
+ \my@fa\faUnsorted
+ \my@fa\faUser
+ \my@fa\faWarning
+ \my@fa\faWon
+ \my@fa\faWrench
+ \end{minipage}
+}
+
+\defbeamertemplate{background texture}{line}{%
+ \begin{tikzpicture}[remember picture,overlay]
+ \draw[pattern=horizontal lines, pattern color=tcolor]
+ (current page.south east) rectangle (current page.north west);
+ \end{tikzpicture}%
+}
+\defbeamertemplate{background texture}{grid}{%
+ \begin{tikzpicture}[remember picture,overlay]
+ \draw[step=1mm,color=tcolor]
+ (current page.south east) grid (current page.north west);
+ \end{tikzpicture}%
+}
+
+\gdef\my@background@title{%
+}
+
+\gdef\my@background@section{%
+}
+
+\gdef\my@background@subsection{%
+}
+
+\newcommand{\my@fa@documentstart}{\hyperlinkdocumentstart{\rotatebox{-90}{\faStepBackward}}}
+\newcommand{\my@fa@sectionstart}{\hyperlinksectionstart{\rotatebox{-90}{\faBackward}}}
+\newcommand{\my@fa@subsectionstart}{\hyperlinksubsectionstart{\rotatebox{180}{\fontsize{9}{9}\selectfont\faSortDesc}}}
+\newcommand{\my@fa@frameendprev}{\hyperlinkframeendprev{\faArrowUp}}
+\newcommand{\my@fa@gotopage}{\Acrobatmenu{GoToPage}{\bfseries\insertframenumber}}
+\newcommand{\my@fa@framestartnext}{\hyperlinkframestartnext{\faArrowDown}}
+\newcommand{\my@fa@subsectionstartnext}{\hyperlinksubsectionstartnext{\fontsize{9}{9}\selectfont\faSortDesc}}
+\newcommand{\my@fa@sectionstartnext}{\hyperlinksectionstartnext{\rotatebox{-90}{\faForward}}}
+\newcommand{\my@fa@documentend}{\hyperlinkdocumentend{\rotatebox{-90}{\faStepForward}}}
+
+\gdef\my@background@normal{%
+ \begin{tikzpicture}[font=\fontsize{6}{6}\selectfont]
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[draw=dcolor,fill=fcolor,opacity=0.4]
+ (0.03\paperwidth,0.05\paperheight) rectangle (0.97\paperwidth,0.95\paperheight)
+ (0.7,0.9\paperheight) circle (.2) node{\my@fa@documentstart}
+ (0.7,0.8\paperheight) circle (.2) node{\my@fa@sectionstart}
+ (0.7,0.7\paperheight) circle (.2) node{\my@fa@subsectionstart}
+ (0.7,0.6\paperheight) circle (.2) node{\my@fa@frameendprev}
+ (0.7,0.5\paperheight) circle (.2) node{\my@fa@gotopage}
+ (0.7,0.4\paperheight) circle (.2) node{\my@fa@framestartnext}
+ (0.7,0.3\paperheight) circle (.2) node{\my@fa@subsectionstartnext}
+ (0.7,0.2\paperheight) circle (.2) node{\my@fa@sectionstartnext}
+ (0.7,0.1\paperheight) circle (.2) node{\my@fa@documentend};
+ \end{tikzpicture}
+}
+
+\let\my@background=\my@background@title
+
+\defbeamertemplate{background}{circle}
+{%
+ \my@background
+ \global\let\my@background=\my@background@normal
+}
+
+%% -------------------------- title page -----------------------------
+
+\defbeamertemplate{title page}{circle}{%
+ \nointerlineskip\noindent
+ \hspace{-\beamer@leftmargin}%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[fill=fcolor,opacity=0.4]
+ (0,0.85\paperheight) rectangle (\paperwidth,0.95\paperheight)
+ (0.05\paperwidth,0.9\paperheight) circle (.25)
+ (0.95\paperwidth,0.9\paperheight) circle (.25);
+ \node[text width=0.8\paperwidth,text badly ragged] at (0.5\paperwidth,0.9\paperheight) {%
+ \begin{minipage}[c]{0.8\paperwidth}
+ \centering
+ \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate
+ \end{minipage}
+ };
+ \draw[fill=fcolor,opacity=0.4]
+ (0,0.3\paperheight) rectangle (\paperwidth,0.8\paperheight)
+ (0.05\paperwidth,0.8\paperheight) circle (.25)
+ (0.05\paperwidth,0.7\paperheight) circle (.25)
+ (0.05\paperwidth,0.6\paperheight) circle (.25)
+ (0.05\paperwidth,0.5\paperheight) circle (.25)
+ (0.05\paperwidth,0.4\paperheight) circle (.25)
+ (0.05\paperwidth,0.3\paperheight) circle (.25)
+ (0.95\paperwidth,0.8\paperheight) circle (.25)
+ (0.95\paperwidth,0.7\paperheight) circle (.25)
+ (0.95\paperwidth,0.6\paperheight) circle (.25)
+ (0.95\paperwidth,0.5\paperheight) circle (.25)
+ (0.95\paperwidth,0.4\paperheight) circle (.25)
+ (0.95\paperwidth,0.3\paperheight) circle (.25);
+ \node[text width=0.8\paperwidth,text badly ragged] at (0.5\paperwidth,0.55\paperheight) {%
+ \begin{minipage}[c]{0.8\paperwidth}
+ \centering
+ \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
+ \insertsubtitle
+ \fi
+ \end{minipage}
+ };
+ \draw[fill=fcolor,opacity=0.4]
+ (0,0.05\paperheight) rectangle (\paperwidth,0.25\paperheight)
+ (0.05\paperwidth,0.2\paperheight) circle (.25)
+ (0.05\paperwidth,0.1\paperheight) circle (.25)
+ (0.95\paperwidth,0.2\paperheight) circle (.25)
+ (0.95\paperwidth,0.1\paperheight) circle (.25);
+ \node[text width=0.8\paperwidth,text badly ragged] at (0.5\paperwidth,0.15\paperheight) {%
+ \begin{minipage}[c]{0.8\paperwidth}
+ \centering
+ \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor\\
+ \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+%% ----------------------- section and subsection --------------------
+
+\def\sectionintocskip{0.5em}
+\patchcmd{\beamer@sectionintoc}{\vskip1.5em}{\vskip\sectionintocskip}{}{}
+
+% create new template for section
+\defbeamertemplate{section}{simple}{%
+ \insertsectionnumber.\hspace*{1ex}\insertsection%
+}
+
+\defbeamertemplate{at begin section}{normal}{%
+ \global\let\my@background=\my@background@section
+ \frame{\sectionpage}
+}
+\defbeamertemplate{at begin section}{plain}{%
+ \global\let\my@background=\my@background@section
+ \frame[plain]{\sectionpage}
+}
+\AtBeginSection[]{\usebeamertemplate{at begin section}}
+
+\defbeamertemplate{section page}{simple}{
+ \begin{beamercolorbox}[wd=\textwidth,center]{section title}%
+ \usebeamerfont{section title}
+ \usebeamertemplate{section}%
+ \end{beamercolorbox}
+}
+
+\defbeamertemplate{section page}{circle}{%
+ \nointerlineskip\noindent
+ \hspace{-\beamer@leftmargin}%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[fill=fcolor,opacity=0.4]
+ (0,0.25\paperheight) rectangle (\paperwidth,0.75\paperheight)
+ (1,0.7\paperheight) circle (.25)
+ (1,0.6\paperheight) circle (.25)
+ (1,0.5\paperheight) circle (.25)
+ (1,0.4\paperheight) circle (.25)
+ (1,0.3\paperheight) circle (.25);
+ \node[text width=0.8\paperwidth,right,text badly ragged] at (0.15\paperwidth,0.5\paperheight) {%
+ \tableofcontents[sectionstyle=show/shaded,subsectionstyle=hide]%
+ };
+ \end{tikzpicture}
+}
+
+% create new template for subsection
+\defbeamertemplate{subsection}{simple}{%
+ \insertsectionnumber.\insertsubsectionnumber\hspace*{2ex}\insertsubsection%
+}
+
+\defbeamertemplate{at begin subsection}{normal}{%
+ \global\let\my@background=\my@background@subsection
+ \frame{\subsectionpage}
+}
+\defbeamertemplate{at begin subsection}{plain}{%
+ \global\let\my@background=\my@background@subsection
+ \frame[plain]{\subsectionpage}
+}
+\AtBeginSubsection[]{\usebeamertemplate{at begin subsection}}
+
+\defbeamertemplate{subsection page}{simple}{
+ \begin{beamercolorbox}[wd=\textwidth,center]{subsection title}%
+ \usebeamerfont{subsection title}%
+ \usebeamertemplate{subsection}%
+ \end{beamercolorbox}%
+}
+
+\defbeamertemplate{subsection page}{circle}{%
+ \nointerlineskip\noindent
+ \hspace{-\beamer@leftmargin}%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[fill=fcolor,opacity=0.4]
+ (0,0.25\paperheight) rectangle (\paperwidth,0.75\paperheight)
+ (1,0.7\paperheight) circle (.23)
+ (1,0.6\paperheight) circle (.23)
+ (1,0.5\paperheight) circle (.23)
+ (1,0.4\paperheight) circle (.23)
+ (1,0.3\paperheight) circle (.23);
+ \node[text width=0.8\paperwidth,right,text badly ragged] at (0.15\paperwidth,0.5\paperheight) {%
+ \begin{minipage}[c]{0.8\paperwidth}
+ \tableofcontents[sectionstyle=hide,subsectionstyle=show/shaded/hide]%
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+%% ---------------------- headline and footline ----------------------
+
+\defbeamertemplate{footline left}{title}{%
+ \insertshorttitle
+}
+
+\defbeamertemplate{footline center}{author}{%
+ \insertshortauthor
+}
+
+\defbeamertemplate{footline right}{institute}{%
+ \insertshortinstitute
+}
+
+% make \footheight = 0pt
+\patchcmd{\beamer@calculateheadfoot}{\advance\footheight by 4pt}{}{}{}
+
+\defbeamertemplate{footline}{simple}{%
+ \smash{\raisebox{1ex}{\begin{beamercolorbox}[wd=\paperwidth,ht=2.25ex,dp=1ex]{footline}%
+ \kern0.03\paperwidth
+ \usebeamerfont{footline}%
+ \usebeamertemplate{footline left}%
+ \hspace{0pt plus 1 filll}%
+ \usebeamertemplate{footline center}%
+ \hspace{0pt plus 1 filll}%
+ \usebeamertemplate{footline right}%
+ \kern0.03\paperwidth
+ \end{beamercolorbox}}}%
+}
+
+%% ------------------------- frame title -----------------------------
+
+\defbeamertemplate{frametitle}{gauss}{%
+ \nointerlineskip\vskip0.05\paperheight\vskip0.4pt%
+ \usebeamerfont{frametitle}\usebeamercolor[fg]{frametitle}%
+ \rule[-1ex]{0pt}{3.25ex}\insertframetitle
+ \ifx\insertframesubtitle\@empty\else\hfill
+ \usebeamerfont{framesubtitle}\usebeamercolor[fg]{framesubtitle}%
+ \insertframesubtitle
+ \fi
+ \par\nointerlineskip\usebeamercolor[fg]{separator line}\rule{\textwidth}{0.4pt}%
+}
+
+%% ------------------- block and theorem -----------------------------
+
+\newcommand{\my@block@begin}[1][]{%
+ \par\medskip
+ \begin{beamercolorbox}[colsep=0.75ex]{block title#1}
+ \usebeamerfont*{block title#1}\insertblocktitle%
+ \end{beamercolorbox}%
+ {\parskip0pt\par}%
+ \nointerlineskip
+ \usebeamerfont{block body#1}%
+ \begin{beamercolorbox}[colsep=.75ex,vmode]{block body#1}%
+ \ifbeamercolorempty[bg]{block body#1}{\vskip-.25ex}{\vskip-.75ex}\vbox{}%
+}
+
+\newcommand{\my@block@end}{\end{beamercolorbox}\smallskip}
+
+\defbeamertemplate{block begin}{gauss}{\my@block@begin}
+
+\defbeamertemplate{block end}{gauss}{\my@block@end}
+
+\defbeamertemplate{block example begin}{gauss}{\my@block@begin[ example]}
+
+\defbeamertemplate{block example end}{gauss}{\my@block@end}
+
+\defbeamertemplate{block alerted begin}{gauss}{\my@block@begin[ alerted]}
+
+\defbeamertemplate{block alerted end}{gauss}{\my@block@end}
+
+%% --------------------------- font theme ----------------------------
+
+\setbeamerfont{title}{size=\LARGE}
+\setbeamerfont{subtitle}{size=\large}
+\setbeamerfont{author}{size=\large}
+\setbeamerfont{institute}{size=\normalsize}
+\setbeamerfont{date}{size=\large}
+\setbeamerfont{section in toc}{size=\large}
+\setbeamerfont{subsection in toc}{size=\large}
+\setbeamerfont{frametitle}{size=\large}
+\setbeamerfont{block title}{size=\normalsize}
+
+\usefonttheme{professionalfonts}
+%\usepackage{arev}
+
+\setlength{\parskip}{5pt plus 1pt minus 1pt}
+
+%% ---------------------------- color theme --------------------------
+
+% always use rgb colors in pdf files
+\substitutecolormodel{hsb}{rgb}
+
+\definecolor{red69}{Hsb}{0,0.6,0.9}
+\definecolor{red4x}{Hsb}{0,0.4,1.0}
+\definecolor{yellow69}{Hsb}{60,0.6,0.9}
+\definecolor{yellowxx}{Hsb}{60,1.0,1.0}
+\definecolor{green33}{Hsb}{120,0.3,0.3}
+\definecolor{green39}{Hsb}{120,0.3,0.9}
+\definecolor{green69}{Hsb}{120,0.6,0.9}
+\definecolor{cyan69}{Hsb}{180,0.6,0.9}
+\definecolor{magenta69}{Hsb}{300,0.6,0.9}
+\definecolor{magenta4x}{Hsb}{300,0.4,1.0}
+
+\colorlet{text1}{white}
+\colorlet{back1}{green33}
+\colorlet{accent1}{yellow69}
+\colorlet{accent2}{green69}
+\colorlet{accent3}{red4x}
+\colorlet{accent4}{cyan69}
+\colorlet{accent5}{magenta4x}
+\colorlet{filler1}{accent1!50!back1}
+\colorlet{filler2}{accent2!50!back1}
+\colorlet{filler3}{accent3!50!back1}
+\colorlet{filler4}{accent4!50!back1}
+\colorlet{filler5}{accent5!50!back1}
+\colorlet{tcolor}{green33!95!white}
+\colorlet{dcolor}{white}
+\colorlet{fcolor}{gray}
+
+\setbeamercolor{background canvas}{bg=green33,fg=white}
+\setbeamercolor{normal text}{bg=green33,fg=white}
+\setbeamercolor{structure}{fg=yellowxx}
+\setbeamercolor{local structure}{fg=accent2}
+\setbeamercolor{footline}{bg=,fg=white}
+\setbeamercolor{title}{use=structure,fg=structure.fg}
+\setbeamercolor{subtitle}{parent=normal text}
+\setbeamercolor{author}{fg=white}
+\setbeamercolor{institute}{fg=white}
+\setbeamercolor{date}{fg=white}
+\setbeamercolor{section in toc}{parent=title}
+\setbeamercolor{subsection in toc}{parent=title}
+\setbeamercolor{section in toc shaded}{parent=normal text}
+\setbeamercolor{subsection in toc shaded}{parent=normal text}
+\setbeamercolor{frametitle}{parent=title}
+\setbeamercolor{framesubtitle}{parent=subtitle}
+\setbeamercolor{separator line}{fg=white}
+\setbeamercolor{block title}{fg=accent1,bg=darkgray}
+\setbeamercolor{block body}{bg=gray}
+\setbeamercolor{block title example}{parent=block title,fg=accent2}
+\setbeamercolor{block body example}{parent=block body}
+\setbeamercolor{block title alerted}{parent=block title,fg=accent3}
+\setbeamercolor{block body alerted}{parent=block body}
+
+%% ------------------------ select templates -------------------------
+
+\setbeamertemplate{background canvas}[awesome]
+\setbeamertemplate{background texture}[awesome]
+\setbeamertemplate{background}[circle]
+\setbeamertemplate{footline}[simple]
+\setbeamertemplate{footline left}[title]
+\setbeamertemplate{footline center}[author]
+\setbeamertemplate{footline right}[institute]
+\setbeamertemplate{title page}[circle]
+\setbeamertemplate{at begin section}[plain]
+\setbeamertemplate{at begin subsection}[plain]
+\setbeamertemplate{section page}[circle]
+\setbeamertemplate{subsection page}[circle]
+\setbeamertemplate{block begin}[gauss]
+\setbeamertemplate{block end}[gauss]
+\setbeamertemplate{block example begin}[gauss]
+\setbeamertemplate{block example end}[gauss]
+\setbeamertemplate{block alerted begin}[gauss]
+\setbeamertemplate{block alerted end}[gauss]
+\setbeamertemplate{theorem begin}[default]
+\setbeamertemplate{theorem end}[default]
+\setbeamertemplate{proof begin}[default]
+\setbeamertemplate{proof end}[default]
+\setbeamertemplate{frametitle}[gauss]
+\setbeamertemplate{navigation symbols}{}
+\setbeamertemplate{section}[simple]
+\setbeamertemplate{subsection}[simple]
+\setbeamertemplate{section in toc}[sections numbered]
+\setbeamertemplate{subsection in toc}[subsections numbered]
+\setbeamertemplate{section in toc shaded}[default][100]
+\setbeamertemplate{subsection in toc shaded}[default][100]
+\setbeamertemplate{itemize items}[default]
+\setbeamertemplate{enumerate items}[default]
+
+%% ----------------------- handout mode ------------------------------
+
+\mode<handout>{
+ \setbeamertemplate{background canvas}{}
+ \setbeamertemplate{background texture}{}
+ \colorlet{accent1}{accent1!50!black}
+ \colorlet{accent2}{accent2!50!black}
+ \colorlet{accent3}{accent3!50!black}
+ \colorlet{accent4}{accent4!50!black}
+ \colorlet{accent5}{accent5!50!black}
+ \colorlet{dcolor}{darkgray}
+ \colorlet{fcolor}{white}
+ \setbeamercolor{normal text}{fg=black, bg=white}
+ \setbeamercolor{title}{fg=teal}
+ \setbeamercolor{subtitle}{fg=gray}
+ \setbeamercolor{author}{fg=black}
+ \setbeamercolor{institute}{fg=gray}
+ \setbeamercolor{date}{fg=black}
+ \setbeamercolor{section in toc}{fg=teal!90!gray}
+ \setbeamercolor{subsection in toc}{fg=teal!80!gray}
+ \setbeamercolor{section in toc shaded}{fg=lightgray}
+ \setbeamercolor{subsection in toc shaded}{fg=lightgray}
+ \setbeamercolor{frametitle}{fg=teal!70!gray,bg=white}
+ \setbeamercolor{separator line}{fg=darkgray}
+ \setbeamercolor{footline}{bg=white,fg=black}
+ \setbeamercolor{block title}{bg=}
+ \setbeamercolor{block body}{bg=}
+}
+
+\mode
+<all>
+
+\makeatother
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/demo-gauss.pdf b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/demo-gauss.pdf
new file mode 100644
index 0000000000..cabda048fc
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/demo-gauss.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/demo-gauss.tex b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/demo-gauss.tex
new file mode 100644
index 0000000000..25db3c6e76
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/gauss/demo-gauss.tex
@@ -0,0 +1,175 @@
+% -*- coding: utf-8 -*-
+
+\documentclass[14pt,xcolor={rgb}]{beamer}
+
+\usetheme{gauss}
+
+% remove these two lines to hide footlines in (sub)section pages
+\setbeamertemplate{at begin section}[normal]
+\setbeamertemplate{at begin subsection}[normal]
+
+\usepackage{arev}
+
+\begin{document}
+
+\title{Beamer Theme Gauss}
+\author{Author Name}
+\institute{Institute Name}
+
+\begin{frame}[plain]
+\titlepage
+\end{frame}
+
+\section{Section One}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Two}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Three}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\end{document}
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/beamerthemelagrange.sty b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/beamerthemelagrange.sty
new file mode 100644
index 0000000000..41440e174f
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/beamerthemelagrange.sty
@@ -0,0 +1,379 @@
+% -*- coding: utf-8 -*-
+% ----------------------------------------------------------------------------
+% Author: Jianrui Lyu <tolvjr@163.com>
+% Website: https://github.com/lvjr/concrete
+% License: The LaTeX Project Public License 1.3c
+% ----------------------------------------------------------------------------
+
+\ProvidesPackage{beamerthemelagrange}[2024-01-19 v2024A Beamer Theme Lagrange]
+
+\makeatletter
+
+% compatible with old versions of beamer
+\providecommand{\beamer@endinputifotherversion}[1]{}
+
+\RequirePackage{tikz,etoolbox,manfnt}
+\usetikzlibrary{calc}
+
+\mode<presentation>
+
+\@ifclasswith{beamer}{aspectratio=169}
+ {\setbeamersize{text margin left=5mm,text margin right=5mm}}
+ {\setbeamersize{text margin left=6mm,text margin right=6mm}}
+
+%% ----------------- background canvas and background ----------------
+
+\newcommand{\my@background@canvas@vector@narrow}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[line width=4mm, rounded corners=4mm, corner1,
+ shading=axis,top color=corner2!80,bottom color=corner2!80,middle color=white,shading angle=-45]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[line width=3.5mm, rounded corners=3.8mm, corner2]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[draw=lightgray!50, step=4mm, xshift=6mm, yshift=6mm, opacity=0.5]
+ (0,0) grid ($(\paperwidth,\paperheight)-(12mm,12mm)$);
+ \end{tikzpicture}
+}
+
+\newcommand{\my@background@canvas@vector@wide}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[line width=4mm, rounded corners=4mm, corner1,
+ shading=axis,top color=corner2!80,bottom color=corner2!80,middle color=white,shading angle=-45]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[line width=3.5mm, rounded corners=3.8mm, corner2]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[draw=lightgray!50, step=5mm, xshift=5mm, yshift=5mm, opacity=0.5]
+ (0,0) grid ($(\paperwidth,\paperheight)-(10mm,10mm)$);
+ \end{tikzpicture}
+}
+
+\newcommand{\my@background@canvas@raster@narrow}{%
+ \includegraphics<beamer>[width=\paperwidth,height=\paperheight]{backgroundn1}%
+ \includegraphics<handout>[width=\paperwidth,height=\paperheight]{backgroundn2}%
+}
+
+\newcommand{\my@background@canvas@raster@wide}{%
+ \includegraphics<beamer>[width=\paperwidth,height=\paperheight]{backgroundw1}%
+ \includegraphics<handout>[width=\paperwidth,height=\paperheight]{backgroundw2}%
+}
+
+\@ifclasswith{beamer}{aspectratio=169}{%
+ \let\my@background@canvas@vector=\my@background@canvas@vector@wide
+ \let\my@background@canvas@raster=\my@background@canvas@raster@wide
+}{%
+ \let\my@background@canvas@vector=\my@background@canvas@vector@narrow
+ \let\my@background@canvas@raster=\my@background@canvas@raster@narrow
+}
+
+\defbeamertemplate{background canvas}{vector}{%
+ \my@background@canvas@vector
+}
+
+\defbeamertemplate{background canvas}{raster}{%
+ \my@background@canvas@raster
+}
+
+\defbeamertemplate{background}{logo}[1][height=0.6\paperheight]{%
+ \parbox[c][\paperheight][c]{\paperwidth}{\centering\includegraphics[#1]{logo}}%
+}
+
+\@ifclasswith{beamer}{aspectratio=169}{%
+ \defbeamertemplate{background}{line}[1][\relax]{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[draw=accent2!50, #1, xshift=5mm, yshift=5mm, opacity=0.5]
+ (0,0) grid ($(\paperwidth,\paperheight)-(10mm,10mm)$);
+ %\insertbackgroundmark
+ \end{tikzpicture}%
+ }
+}{
+ \defbeamertemplate{background}{line}[1][\relax]{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[draw=accent2!50, #1, xshift=6mm, yshift=6mm, opacity=0.5]
+ (0,0) grid ($(\paperwidth,\paperheight)-(12mm,12mm)$);
+ %\insertbackgroundmark
+ \end{tikzpicture}%
+ }
+}
+
+\@ifclasswith{beamer}{aspectratio=169}{%
+ \defbeamertemplate{background}{lattice}[1][1mm]{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[draw=accent3!50, step=2.5mm, xshift=5mm, yshift=5mm, opacity=0.5]
+ (0,0) grid ($(\paperwidth,\paperheight)-(10mm,10mm)$);
+ %\insertbackgroundmark
+ \end{tikzpicture}%
+ }
+}{
+ \defbeamertemplate{background}{lattice}[1][1mm]{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[draw=accent3!50, step=2mm, xshift=6mm, yshift=6mm, opacity=0.5]
+ (0,0) grid ($(\paperwidth,\paperheight)-(12mm,12mm)$);
+ %\insertbackgroundmark
+ \end{tikzpicture}%
+ }
+}
+
+%% -------------------------- title page -----------------------------
+
+% add \occasion command
+\newcommand{\occasion}[1]{\def\insertoccasion{#1}}
+\occasion{}
+
+\newlength{\my@title@split@left}
+\newlength{\my@title@split@right}
+\@ifclasswith{beamer}{aspectratio=169}{
+ \setlength{\my@title@split@left}{0.618\textwidth}
+ \setlength{\my@title@split@right}{0.382\textwidth}
+}{
+ \setlength{\my@title@split@left}{0.54\textwidth}
+ \setlength{\my@title@split@right}{0.46\textwidth}
+}
+
+
+\defbeamertemplate{title page}{split}{%
+ \begin{minipage}[c][0.9\textheight]{\my@title@split@left}
+ \linespread{1}\raggedright
+ \vfill
+ \ifx\insertoccasion\@empty\else
+ \usebeamerfont*{occasion}\usebeamercolor[fg]{occasion}\insertoccasion\\[3pt]%
+ \fi
+ \usebeamerfont*{date}\usebeamercolor[fg]{date}\insertdate
+ \vspace{4pt}{\color{gray}\hrule}
+ \vfill\vfill
+ \usebeamerfont*{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\[5pt]\usebeamerfont*{subtitle}\usebeamercolor[fg]{subtitle}\insertsubtitle
+ \fi%
+ \vfill\vfill{\color{gray}\hrule}\vspace{4pt}
+ \usebeamerfont*{author}\usebeamercolor[fg]{author}\insertauthor\\[3pt]%
+ \usebeamerfont*{institute}\usebeamercolor[fg]{institute}\insertinstitute
+ \vfill\vfill
+ \end{minipage}%
+ \begin{minipage}[c][0.9\textheight]{\my@title@split@right}
+ \hfill
+ \IfFileExists{titlepage.png}{%
+ \includegraphics[height=0.9\textheight]{titlepage}%
+ }{%
+ \begin{tikzpicture}[draw=gray,text=darkgray]
+ \draw[use as bounding box] (0,0) rectangle (0.5\paperheight,0.7\paperheight);
+ \draw (0,0) -- (0.5\paperheight,0.7\paperheight);
+ \draw (0,0.7\paperheight) -- (0.5\paperheight,0);
+ \node at (0.25\paperheight,0.35\paperheight) {titlepage.png};
+ \end{tikzpicture}%
+ }%
+ \end{minipage}
+}
+
+%% ----------------------- section and subsection --------------------
+
+\def\sectionintochideskip{10pt}
+\def\sectionintocshowskip{6pt}
+\patchcmd{\beamer@sectionintoc}{\vskip1.5em}{\vskip\sectionintochideskip}{}{}
+\patchcmd{\beamer@sectionintoc}{\vfill}{\vskip\sectionintocshowskip}{}{}
+
+\AtBeginSection[]{%
+ \begin{frame}
+ \tableofcontents[sectionstyle=show/shaded,subsectionstyle=hide]
+ \end{frame}
+}
+
+\defbeamertemplate{section in toc}{numbered}{%
+ \leavevmode\leftskip=8mm\inserttocsectionnumber.\hspace{0.6em}\inserttocsection\par
+}
+\defbeamertemplate{section in toc}{dbend}{%
+ \leavevmode\leftskip=8mm{\color{accent3}\tiny\textdbend\scriptsize\inserttocsectionnumber}%
+ \hspace{0.6em}\inserttocsection\par
+}
+
+\AtBeginSubsection[]{%
+ \begin{frame}
+ \tableofcontents[sectionstyle=show/hide,subsectionstyle=show/shaded/hide]
+ \end{frame}
+}
+
+\defbeamertemplate{subsection in toc}{numbered}{%
+ \vspace{6pt}\leavevmode\leftskip=12mm\inserttocsectionnumber.\inserttocsubsectionnumber
+ \hspace{0.8em}\inserttocsubsection\par
+}
+\defbeamertemplate{subsection in toc}{dbend}{%
+ \vspace{6pt}\leavevmode\leftskip=12mm{\color{accent3}\tiny\textdbend
+ \scriptsize\inserttocsectionnumber.\inserttocsubsectionnumber}%
+ \hspace{0.8em}\inserttocsubsection\par
+}
+
+%% ---------------- headline, footline and textheight ----------------
+
+% make \textheight = \paperheight - 12mm
+\patchcmd{\beamer@calculateheadfoot}{\advance\footheight by 4pt}{}{}{}
+
+% modify plain frames
+\def\beamer@frametemplate@plain{}
+
+\@ifclasswith{beamer}{aspectratio=169}{
+ \setbeamertemplate{headline}{\vspace{5mm}}
+ \setbeamertemplate{footline}{\vspace{5mm}}
+}{
+ \setbeamertemplate{headline}{\vspace{6mm}}
+ \setbeamertemplate{footline}{\vspace{6mm}}
+}
+
+% patch frames with t option
+\patchcmd{\KV@beamerframe@t}
+ {\beamer@frametopskip=.2cm plus .5\paperheight}
+ {\beamer@frametopskip=0mm}
+ {}{}
+
+%% ------------------------- frame title -----------------------------
+
+\defbeamertemplate{frametitle}{simple}[1][]{%
+ \nointerlineskip
+ \begin{beamercolorbox}[wd=\paperwidth,sep=0pt,leftskip=\beamer@leftmargin,%
+ rightskip=\beamer@rightmargin,#1]{frametitle}
+ \usebeamerfont{frametitle}%
+ \rule[-0.45em]{0pt}{1.5em}\insertframetitle\usebeamertemplate{frame number}%
+ \rule[-0.45em]{0pt}{1.5em}\par
+ \end{beamercolorbox}
+}
+
+\defbeamertemplate{frame number}{simple}{%
+ \usebeamercolor{normal text}%
+ \hfill{\color{fg!60!bg}\insertframenumber}%
+}
+
+%% ------------------- block and theorem -----------------------------
+
+% allow it to be modified by user
+\def\myinserttheoremaddition{\inserttheoremaddition}
+
+\defbeamertemplate{theorem begin}{simple}
+{%
+ \upshape%\bfseries\inserttheoremheadfont
+ {\usebeamercolor[fg]{theoremname}%
+ \inserttheoremname\inserttheoremnumber
+ \ifx\inserttheoremaddition\@empty\else
+ \ \usebeamercolor[fg]{local structure}(\myinserttheoremaddition)%
+ \fi%
+ %\inserttheorempunctuation
+ }%
+ \quad\normalfont
+}
+\defbeamertemplate{theorem end}{simple}{\par}
+
+\defbeamertemplate{proof begin}{simple}
+{%
+ %\bfseries
+ {\usebeamercolor[fg]{proofname}\insertproofname}%
+ \quad\normalfont
+}
+\defbeamertemplate{proof end}{simple}{\par}
+
+%% --------------------------- font theme ----------------------------
+
+\setbeamerfont{title}{size=\LARGE,series=\bfseries,family=\rmfamily}
+\setbeamerfont{subtitle}{size=\large}
+\setbeamerfont{occasion}{size=\normalsize}
+\setbeamerfont{date}{size=\normalsize}
+\setbeamerfont{author}{size=\normalsize}
+\setbeamerfont{institute}{size=\normalsize}
+\setbeamerfont{section in toc}{size=\Large}
+\setbeamerfont{subsection in toc}{size=\large}
+\setbeamerfont{frametitle}{size=\large}
+\setbeamerfont{block title}{size=\normalsize}
+
+\usefonttheme{professionalfonts}
+%\usepackage{arev}
+
+%% ---------------------------- color theme --------------------------
+
+% always use rgb colors in pdf files
+\substitutecolormodel{hsb}{rgb}
+
+\definecolor{redx5}{Hsb}{0,1,0.5}
+\definecolor{yellow86}{Hsb}{60,0.8,0.6}
+\definecolor{greenx3}{Hsb}{120,1,0.3}
+\definecolor{azurexx}{Hsb}{210,1,0.5}
+\definecolor{blue29}{Hsb}{240,0.2,0.9}
+\definecolor{magenta88}{Hsb}{300,0.8,0.8}
+
+\colorlet{text1}{black}
+\colorlet{back1}{white}
+\colorlet{accent1}{azurexx}
+\colorlet{accent2}{greenx3}
+\colorlet{accent3}{redx5}
+\colorlet{accent4}{yellow86}
+\colorlet{accent5}{magenta88}
+\colorlet{filler1}{accent1!40!back1}
+\colorlet{filler2}{accent2!40!back1}
+\colorlet{filler3}{accent3!40!back1}
+\colorlet{filler4}{accent4!40!back1}
+\colorlet{filler5}{accent5!40!back1}
+\colorlet{gray1}{black!20}
+\colorlet{gray2}{black!35}
+\colorlet{gray3}{black!50}
+\colorlet{gray4}{black!65}
+\colorlet{gray5}{black!80}
+\colorlet{corner1}{white}
+\colorlet{corner2}{blue29}
+
+\setbeamercolor{normal text}{bg=white,fg=black}
+\setbeamercolor{structure}{fg=accent3}
+\setbeamercolor{local structure}{fg=accent2}
+\setbeamercolor{footline}{bg=,fg=black}
+\setbeamercolor{title}{use=structure,fg=structure.fg}
+\setbeamercolor{subtitle}{fg=black}
+\setbeamercolor{occasion}{fg=accent1}
+\setbeamercolor{date}{fg=black}
+\setbeamercolor{author}{fg=accent2}
+\setbeamercolor{institute}{fg=black}
+\setbeamercolor{section in toc}{parent=occasion}
+\setbeamercolor{subsection in toc}{parent=author}
+\setbeamercolor{section in toc shaded}{parent=normal text}
+\setbeamercolor{subsection in toc shaded}{parent=normal text}
+\setbeamercolor{frametitle}{parent=title}
+\setbeamercolor{theoremname}{parent=occasion}
+\setbeamercolor{proofname}{parent=occasion}
+\setbeamercolor{block title}{fg=white,bg=accent1}
+\setbeamercolor{block body}{bg=lightgray}
+\setbeamercolor{block title example}{fg=white,bg=accent2}
+\setbeamercolor{block body example}{bg=lightgray}
+\setbeamercolor{block title alerted}{fg=white,bg=accent3}
+\setbeamercolor{block body alerted}{bg=lightgray}
+
+%% ------------------------ select templates -------------------------
+
+\setbeamertemplate{background canvas}[vector]
+\setbeamertemplate{title page}[split]
+\setbeamertemplate{theorem begin}[simple]
+\setbeamertemplate{theorem end}[simple]
+\setbeamertemplate{proof begin}[simple]
+\setbeamertemplate{proof end}[simple]
+\setbeamertemplate{frametitle}[simple]
+\setbeamertemplate{frame number}[simple]
+\setbeamertemplate{navigation symbols}{}
+\setbeamertemplate{section in toc}[dbend]
+\setbeamertemplate{subsection in toc}[dbend]
+\setbeamertemplate{subsubsection in toc}{}
+\setbeamertemplate{section in toc shaded}[default][100]
+\setbeamertemplate{subsection in toc shaded}[default][100]
+\setbeamertemplate{itemize items}[default]
+\setbeamertemplate{enumerate items}[default]
+
+%% ----------------------- handout mode ------------------------------
+
+\mode<handout>{
+ \colorlet{corner1}{lightgray}
+ \colorlet{corner2}{white}
+ \setbeamercolor{section in toc shaded}{fg=lightgray}
+ \setbeamercolor{subsection in toc shaded}{fg=lightgray}
+}
+
+\mode
+<all>
+
+\makeatother
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/demo-lagrange.pdf b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/demo-lagrange.pdf
new file mode 100644
index 0000000000..46628de736
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/demo-lagrange.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/demo-lagrange.tex b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/demo-lagrange.tex
new file mode 100644
index 0000000000..59f793bcc4
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/lagrange/demo-lagrange.tex
@@ -0,0 +1,71 @@
+% -*- coding: utf-8 -*-
+
+\documentclass[11pt,xcolor={rgb}]{beamer}
+
+\usetheme{lagrange}
+
+\usepackage{arev}
+
+\usepackage{listings}
+
+\lstset{
+ basicstyle=\ttfamily\color{accent2},
+ frame=single,
+}
+
+\begin{document}
+
+\title{Beamer Theme Lagrange}
+\author{Author Name}
+\institute{Institute Name}
+\occasion{Some Conference}
+
+\begin{frame}[plain]
+\titlepage
+\end{frame}
+
+\section{Introduction}
+
+\begin{frame}
+\frametitle{Introduction}
+Beamer theme Lagrange is inspired by these two themes
+\begin{itemize}
+ \item Pdfscreen theme Overlay4
+ \item Keynote theme Drafting
+\end{itemize}
+\end{frame}
+
+\section{First Example}
+
+\begin{frame}[fragile=singleslide]
+\frametitle{First Example}
+The following is a simple example
+\begin{lstlisting}
+\documentclass[xcolor={rgb}]{beamer}
+
+\usetheme{lagrange}
+
+\begin{document}
+
+\begin{frame}
+ Hello Beamer!
+\end{frame}
+
+\end{document}
+\end{lstlisting}
+Note that you \textcolor{accent3}{need to} use \lstinline!xcolor={rgb}! option for this theme.
+\end{frame}
+
+\section{Customization}
+
+\begin{frame}[fragile=singleslide]
+\frametitle{Customization}
+To change vertical spaces between lines in TOC pages,
+you could redefine these two commands:
+\begin{lstlisting}
+\renewcommand{\sectionintochideskip}{10pt}
+\renewcommand{\sectionintocshowskip}{6pt}
+\end{lstlisting}
+\end{frame}
+
+\end{document}
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/beamerthememobius.sty b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/beamerthememobius.sty
new file mode 100644
index 0000000000..7faf5b36c5
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/beamerthememobius.sty
@@ -0,0 +1,291 @@
+% -*- coding: utf-8 -*-
+% ----------------------------------------------------------------------------
+% Author: Jianrui Lyu <tolvjr@163.com>
+% Website: https://github.com/lvjr/concrete
+% License: The LaTeX Project Public License 1.3c
+% ----------------------------------------------------------------------------
+
+\ProvidesPackage{beamerthememobius}[2024-01-19 v2024A Beamer Theme Mobius]
+
+\makeatletter
+
+% compatible with old versions of beamer
+\providecommand{\beamer@endinputifotherversion}[1]{}
+
+\RequirePackage{tikz,adjustbox}
+\usetikzlibrary{decorations.pathmorphing,calc}
+
+\mode<presentation>
+
+\setbeamersize{text margin left=8mm,text margin right=8mm}
+
+%% ----------------- background canvas and background ----------------
+
+\defbeamertemplate{background}{mobius}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \foreach \i in {0,16,...,128} \foreach \j in {0,16,...,96} {
+ \path[draw=purple94!90!black] (\i mm,\j mm) circle (16mm);
+ }
+ \end{tikzpicture}%
+}
+
+% need "text badly ragged" option for correct space skips
+% see http://tex.stackexchange.com/a/132748/8956
+\gdef\my@background@title{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[fill=fcolor,opacity=0.4]
+ (0,0.3\paperheight) rectangle (\paperwidth,0.8\paperheight);
+ \path[draw=dcolor,thick] (0,0.3\paperheight) -- (\paperwidth,0.3\paperheight)
+ (0,0.8\paperheight) -- (\paperwidth,0.8\paperheight);
+ \node[text width=0.9\paperwidth,text badly ragged] at (0.5\paperwidth,0.55\paperheight) {%
+ \begin{minipage}[c][0.6\paperheight]{0.9\paperwidth}
+ \centering
+ \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\[5pt]\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
+ \insertsubtitle
+ \fi
+ \end{minipage}
+ };
+ \path[fill=fcolor,draw=dcolor,thick,opacity=0.4]
+ (0.15\paperwidth,0) -- (0.5\paperwidth,0.35\paperheight) -- (0.85\paperwidth,0);
+ \node[text width=0.9\paperwidth,text badly ragged] at (0.5\paperwidth,0.15\paperheight) {%
+ \begin{minipage}[c][0.25\paperheight]{0.9\paperwidth}
+ \centering
+ \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor\\[3pt]
+ \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute\\[3pt]
+ \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+\gdef\my@background@section{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[fill=fcolor,thick,opacity=0.4]
+ (0,0.35\paperheight) rectangle (\paperwidth,0.75\paperheight);
+ \path[draw=dcolor,thick] (0,0.35\paperheight) -- (\paperwidth,0.35\paperheight)
+ (0,0.75\paperheight) -- (\paperwidth,0.75\paperheight);
+ \node[text width=\textwidth,text badly ragged] at (0.5\paperwidth,0.55\paperheight) {%
+ \begin{minipage}[c]{\textwidth}
+ \usebeamertemplate{section page content}%
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+%% -------------------------- title page -----------------------------
+
+\defbeamertemplate{title page}{mobius}{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@title
+ \end{adjustbox}%
+}
+
+%% ----------------------- section and subsection --------------------
+
+% create new template for section
+\defbeamertemplate{section}{simple}{%
+ \insertsectionnumber.\hspace*{1ex}\insertsection%
+}
+
+\AtBeginSection[]{\begin{frame}[plain]{\sectionpage}\end{frame}}
+
+\defbeamertemplate{section page}{mobius}{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \my@background@section
+ \end{adjustbox}%
+}
+
+\defbeamertemplate{section page content}{simple}{
+ \begin{beamercolorbox}[wd=\textwidth,center]{section title}%
+ \usebeamerfont{section title}
+ \usebeamertemplate{section}%
+ \end{beamercolorbox}
+}
+
+%% ---------------------- headline and footline ----------------------
+
+\newif\ifmy@subsection \my@subsectionfalse
+
+\newcommand{\my@sectionentry}[5]{%
+ \hfill
+ \ifnum\c@section=#1%
+ \usebeamercolor{footline highlight}%
+ \else%
+ \usebeamercolor{footline}%
+ \fi%
+ \hyperlink{Navigation#3}{%
+ \colorbox{bg}{%
+ \hspace{0.2em}\rule[-1ex]{0pt}{3.25ex}\color{fg}#2\hspace{0.2em}%
+ }%
+ }%
+ \let\slideentry=\my@slideentry
+}
+
+\newcommand{\my@subsectionentry}[5]{\my@subsectiontrue}
+
+\newcommand{\my@slideentry}[6]{%
+ \ifmy@subsection
+ \usebeamercolor{footline}%
+ \def\my@box{$\circ$}%
+ \ifnum\c@section=#1%
+ \usebeamercolor{footline highlight}%
+ \ifnum\c@subsection=#2%
+ \def\my@box{$\bullet$}%
+ \fi
+ \fi
+ \beamer@link(#4){%
+ \colorbox{bg}{%
+ \rule[-1ex]{0pt}{3.25ex}\hspace{0.1em}\color{fg}\my@box\hspace{0.1em}%
+ }%
+ }%
+ \my@subsectionfalse
+ \fi
+}
+
+\defbeamertemplate{footline}{mobius}{%
+ % default height is 0.4pt, which is ignored by adobe reader, so we increase it by 0.2pt
+ {\color{dcolor}\hrule height 0.6pt}%
+ %\pgfsetfillopacity{0.6}%
+ \begin{beamercolorbox}[wd=\paperwidth,ht=2.25ex,dp=1ex]{footline}%
+ \usebeamerfont{footline}%
+ \kern\beamer@leftmargin
+ \setlength{\fboxsep}{0pt}%
+ \let\sectionentry=\my@sectionentry
+ \let\beamer@subsectionentry=\my@subsectionentry
+ \hskip 0pt plus -1fill\dohead
+ \hskip 0pt plus 9fill\relax
+ \Acrobatmenu{GoToPage}{\insertframenumber{}/\inserttotalframenumber}%
+ \kern\beamer@rightmargin
+ \end{beamercolorbox}%
+}
+
+%% ------------------------- frame title -----------------------------
+
+\defbeamertemplate{frametitle}{simple}[1][]{%
+ \nointerlineskip
+ \begin{beamercolorbox}[wd=\paperwidth,sep=0pt,leftskip=\beamer@leftmargin,%
+ rightskip=\beamer@rightmargin,#1]{frametitle}
+ \usebeamerfont{frametitle}%
+ \rule[-3.6mm]{0pt}{12mm}\insertframetitle\rule[-3.6mm]{0pt}{12mm}\par
+ \end{beamercolorbox}
+}
+
+%% --------------------------- font theme ----------------------------
+
+\setbeamerfont{title}{size=\LARGE}
+\setbeamerfont{subtitle}{size=\large}
+\setbeamerfont{author}{size=\large}
+\setbeamerfont{institute}{size=\normalsize}
+\setbeamerfont{date}{size=\normalsize}
+\setbeamerfont{section in toc}{size=\Large}
+\setbeamerfont{footline}{size=\scriptsize}
+\setbeamerfont{frametitle}{size=\large}
+\setbeamerfont{block title}{size=\normalsize}
+
+\usefonttheme{professionalfonts}
+%\usepackage{arev}
+
+%\setlength{\parskip}{5pt plus 1pt minus 1pt}
+
+%% ---------------------------- color theme --------------------------
+
+% always use rgb colors in pdf files
+\substitutecolormodel{hsb}{rgb}
+
+\definecolor{red69}{Hsb}{0,0.6,0.9}
+\definecolor{yellow69}{Hsb}{60,0.6,0.9}
+\definecolor{yellow99}{Hsb}{60,0.9,0.9}
+\definecolor{green69}{Hsb}{120,0.6,0.9}
+\definecolor{azure53}{Hsb}{210,0.5,0.3}
+\definecolor{blue77}{Hsb}{240,0.7,0.7}
+\definecolor{blue88}{Hsb}{240,0.8,0.8}
+\definecolor{blue97}{Hsb}{240,0.9,0.7}
+\definecolor{purple94}{Hsb}{330,0.9,0.4}
+\definecolor{purple63}{Hsb}{320,0.6,0.3}
+
+\colorlet{text1}{white}
+\colorlet{back1}{blue77}
+\colorlet{accent1}{yellow69}
+\colorlet{accent2}{green69}
+\colorlet{accent3}{black}
+\colorlet{filler1}{accent1!40!back1}
+\colorlet{filler2}{accent2!40!back1}
+\colorlet{filler3}{accent3!40!back1}
+\colorlet{dcolor}{white}
+\colorlet{fcolor}{azure53}
+
+\setbeamercolor{normal text}{bg=purple94,fg=white}
+\setbeamercolor{structure}{fg=yellow99}
+\setbeamercolor{local structure}{fg=accent2}
+\setbeamercolor{footline}{bg=purple63,fg=white}
+\setbeamercolor{footline highlight}{parent=footline,bg=filler2}
+\setbeamercolor{navigation symbols}{bg=purple94}
+\setbeamercolor{navigation symbols dimmed}{fg=purple94}
+\setbeamercolor{title}{use=structure,fg=structure.fg}
+\setbeamercolor{subtitle}{fg=white}
+\setbeamercolor{author}{use=local structure,fg=local structure.fg}
+\setbeamercolor{institute}{fg=white}
+\setbeamercolor{date}{fg=white}
+\setbeamercolor{section in toc}{parent=title}
+\setbeamercolor{section in toc shaded}{parent=normal text}
+\setbeamercolor{frametitle}{parent=title}
+\setbeamercolor{block title}{fg=accent1,bg=back1!50!gray}
+\setbeamercolor{block body}{bg=back1!50!lightgray}
+\setbeamercolor{block title example}{fg=accent2,bg=back1!50!gray}
+\setbeamercolor{block body example}{bg=back1!50!lightgray}
+\setbeamercolor{block title alerted}{fg=accent3,bg=back1!50!gray}
+\setbeamercolor{block body alerted}{bg=back1!50!lightgray}
+
+%% ------------------------ select templates -------------------------
+
+\setbeamertemplate{background canvas}[default]
+\setbeamertemplate{background}[mobius]
+\setbeamertemplate{title page}[mobius]
+\setbeamertemplate{section page}[mobius]
+\setbeamertemplate{section page content}[simple]
+\setbeamertemplate{section}[simple]
+\setbeamertemplate{section in toc}[sections numbered]
+\setbeamertemplate{section in toc shaded}[default][100]
+\setbeamertemplate{navigation symbols}{}
+\setbeamertemplate{footline}[mobius]
+\setbeamertemplate{frametitle}[simple]
+\setbeamertemplate{itemize items}[default]
+\setbeamertemplate{enumerate items}[default]
+
+%% ----------------------- handout mode ------------------------------
+
+\mode<handout>{
+ \setbeamertemplate{background canvas}{}
+ \setbeamertemplate{background}{}
+ \colorlet{text1}{black}
+ \colorlet{back1}{white}
+ \colorlet{accent1}{purple94}
+ \colorlet{accent2}{teal!70!black}
+ \colorlet{accent3}{blue77}
+ \colorlet{dcolor}{gray}
+ \colorlet{fcolor}{white}
+ \setbeamercolor{normal text}{fg=black, bg=white}
+ \setbeamercolor{structure}{fg=purple94}
+ \setbeamercolor{title}{fg=purple94}
+ \setbeamercolor{subtitle}{fg=black}
+ \setbeamercolor{author}{fg=accent2}
+ \setbeamercolor{institute}{fg=black}
+ \setbeamercolor{date}{fg=black}
+ \setbeamercolor{section in toc}{fg=purple94}
+ \setbeamercolor{section in toc shaded}{fg=lightgray}
+ \setbeamercolor{section title}{fg=purple94}
+ \setbeamercolor{footline}{bg=white,fg=black}
+ \setbeamercolor{footline highlight}{fg=accent2,bg=white}
+}
+
+\mode
+<all>
+
+\makeatother
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/demo-mobius.pdf b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/demo-mobius.pdf
new file mode 100644
index 0000000000..5260cfa1c6
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/demo-mobius.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/demo-mobius.tex b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/demo-mobius.tex
new file mode 100644
index 0000000000..ea5f47bac7
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/mobius/demo-mobius.tex
@@ -0,0 +1,171 @@
+% -*- coding: utf-8 -*-
+
+\documentclass[12pt,xcolor={rgb}]{beamer}
+
+\usetheme{mobius}
+
+\usepackage{arev}
+
+\begin{document}
+
+\title{Beamer Theme Mobius}
+\author{Author Name}
+\institute{Institute Name}
+
+\begin{frame}[plain]
+\titlepage
+\end{frame}
+
+\section{Section One}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Two}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Three}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\end{document}
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/beamerthemeriemann.sty b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/beamerthemeriemann.sty
new file mode 100644
index 0000000000..82f2fed151
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/beamerthemeriemann.sty
@@ -0,0 +1,945 @@
+% -*- coding: utf-8 -*-
+% ----------------------------------------------------------------------------
+% Author: Jianrui Lyu <tolvjr@163.com>
+% Website: https://github.com/lvjr/concrete
+% License: The LaTeX Project Public License 1.3c
+% ----------------------------------------------------------------------------
+
+\ProvidesPackage{beamerthemeriemann}[2024-01-19 v2024A Beamer Theme Riemann]
+
+\makeatletter
+
+% compatible with old versions of beamer
+\providecommand{\beamer@endinputifotherversion}[1]{}
+
+\RequirePackage{tikz,etoolbox,adjustbox,calc}
+\usetikzlibrary{calc}
+
+\mode<presentation>
+
+\setbeamersize{text margin left=8mm,text margin right=8mm}
+
+%% ----------------- background canvas and background ----------------
+
+\newif\ifbackgroundmarkleft
+\newif\ifbackgroundmarkright
+
+\newcommand{\insertbackgroundmark}{
+ \ifbackgroundmarkleft
+ \foreach \x in {1,2,...,11} \draw[line width=0.2mm,markcolor]
+ (0,\x*\paperheight/12) ++(0.1mm,-0.5mm) rectangle +(1mm,1mm);
+ \fi
+ \ifbackgroundmarkright
+ \foreach \x in {1,2,...,11} \draw[line width=0.2mm,markcolor]
+ (\paperwidth,\x*\paperheight/12) ++(-1.1mm,-0.5mm) rectangle +(1mm,1mm);
+ \fi
+}
+
+\defbeamertemplate{background}{line}[1][]{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[xstep=\paperwidth,ystep=1mm,color=tcolor,#1] (0,0) grid (\paperwidth,\paperheight);
+ \insertbackgroundmark
+ \end{tikzpicture}%
+}
+
+\defbeamertemplate{background}{linear}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[pattern=horizontal lines, pattern color=tcolor]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \insertbackgroundmark
+ \end{tikzpicture}%
+}
+
+\defbeamertemplate{background}{lattice}[1][1mm]{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \draw[step=#1,color=tcolor,semithick] (0,0) grid (\paperwidth,\paperheight);
+ \insertbackgroundmark
+ \end{tikzpicture}%
+}
+
+\defbeamertemplate{background}{empty}{
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \insertbackgroundmark
+ \end{tikzpicture}%
+}
+
+%% -------------------------- title page -----------------------------
+
+% add \occasion command
+\newcommand{\occasion}[1]{\def\insertoccasion{#1}}
+\occasion{}
+
+\defbeamertemplate{title page}{banner}{%
+ \nointerlineskip
+ \begin{adjustbox}{width=\paperwidth,center}%
+ \usebeamertemplate{title page content}%
+ \end{adjustbox}%
+}
+
+% need "text badly ragged" option for correct space skips
+% see http://tex.stackexchange.com/a/132748/8956
+\defbeamertemplate{title page content}{hexagon}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[draw=dcolor,fill=fcolor,opacity=0.8]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \node[text width=0.86\paperwidth,text badly ragged,inner ysep=1.5cm] (main) at (0.5\paperwidth,0.55\paperheight) {%
+ \begin{minipage}[c]{0.86\paperwidth}
+ \centering
+ \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\[5pt]\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
+ \insertsubtitle
+ \fi
+ \end{minipage}
+ };
+ \node[rectangle,inner sep=0pt,minimum size=3mm,fill=dcolor,right] (a) at (0,0.55\paperheight) {};
+ \node[rectangle,inner sep=0pt,minimum size=3mm,fill=dcolor,left] (b) at (\paperwidth,0.55\paperheight) {};
+ \ifx\insertoccasion\@empty
+ \draw[thick,dcolor] (a.north east) -- (main.north west)
+ -- (main.north east) -- (b.north west);
+ \else
+ \node[text badly ragged] (occasion) at (main.north west -| 0.5\paperwidth,\paperheight) {
+ \usebeamerfont{occasion}\usebeamercolor[fg]{occasion}\insertoccasion
+ };
+ \draw[thick,dcolor] (a.north east) -- (main.north west) -- (occasion.west)
+ (b.north west) -- (main.north east) -- (occasion.east);
+ \fi
+ \node[text badly ragged] (date) at (main.south west -| 0.5\paperwidth,0) {
+ \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate
+ };
+ \draw[thick,dcolor] (a.south east) -- (main.south west) -- (date.west)
+ (b.south west) -- (main.south east) -- (date.east);
+ \node[below=4mm,text width=0.9\paperwidth,inner xsep=0.05\paperwidth,
+ text badly ragged,fill=white,draw=dcolor] at (date.south) {%
+ \begin{minipage}[c]{0.9\paperwidth}
+ \centering
+ \textcolor{accent2}{$\blacksquare$}\hspace{0.2em}%
+ \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute
+ \hspace{1em}\textcolor{accent2}{$\blacksquare$}\hspace{0.2em}%
+ \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+\defbeamertemplate{title page content}{rectangle}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[draw=dcolor,fill=fcolor,opacity=0.8]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \node[text width=0.9\paperwidth,text badly ragged,inner ysep=1.5cm] (main) at (0.5\paperwidth,0.55\paperheight) {%
+ \begin{minipage}[c]{0.9\paperwidth}
+ \centering
+ \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\[5pt]\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
+ \insertsubtitle
+ \fi
+ \end{minipage}
+ };
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=3mm,fill=dcolor,below right,xshift=2pt]
+ (a) at (main.north west -| 0,0) {};
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=3mm,fill=dcolor,below left,xshift=-2pt]
+ (b) at (main.north east -| \paperwidth,0) {};
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=3mm,fill=dcolor,above right,xshift=2pt]
+ (c) at (main.south west -| 0,0) {};
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=3mm,fill=dcolor,above left,xshift=-2pt]
+ (d) at (main.south east -| \paperwidth,0) {};
+ \coordinate (mw) at (main.west -| a.west);
+ \coordinate (me) at (main.east -| b.east);
+ \draw[thick,dcolor] (a.south east) -- (a.south west) -- (a.north west) -- (a.north east)
+ -- ++(0,-6mm) -- ++(-3mm,0) -- (mw)
+ (c.north east) -- (c.north west) -- (c.south west) -- (c.south east)
+ -- ++(0,6mm) -- ++(-3mm,0) -- (mw)
+ (b.south west) -- (b.south east) -- (b.north east) -- (b.north west)
+ -- ++(0,-6mm) -- ++(3mm,0) -- (me)
+ (d.north west) -- (d.north east) -- (d.south east) -- (d.south west)
+ -- ++(0,6mm) -- ++(3mm,0) -- (me);
+ \ifx\insertoccasion\@empty
+ \draw[thick,dcolor] (a.south east) -- ++(3mm,0) -- ++(0,3mm) -- (main.north)
+ (b.south west) -- ++(-3mm,0) -- ++(0,3mm) -- (main.north);
+ \else
+ \node[text badly ragged] (occasion) at (main.north west -| 0.5\paperwidth,\paperheight) {
+ \usebeamerfont{occasion}\usebeamercolor[fg]{occasion}\insertoccasion
+ };
+ \draw[thick,dcolor] (a.south east) -- ++(3mm,0) -- ++(0,3mm) -- (occasion.west)
+ (b.south west) -- ++(-3mm,0) -- ++(0,3mm) -- (occasion.east);
+ \fi
+ \node[text badly ragged] (date) at (main.south west -| 0.5\paperwidth,0) {
+ \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate
+ };
+ \draw[thick,dcolor] (c.north east) -- ++(3mm,0) -- ++(0,-3mm) -- (date.west)
+ (d.north west) -- ++(-3mm,0) -- ++(0,-3mm) -- (date.east);
+ \node[below=4mm,text width=0.9\paperwidth,inner xsep=0.05\paperwidth,
+ text badly ragged,fill=white,draw=dcolor] (author) at (date.south) {%
+ \begin{minipage}[c]{0.9\paperwidth}
+ \centering
+ \textcolor{accent2}{$\blacksquare$}\hspace{0.2em}%
+ \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute
+ \hspace{1em}\textcolor{accent2}{$\blacksquare$}\hspace{0.2em}%
+ \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+\defbeamertemplate{title page content}{polygon}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[draw=dcolor,fill=fcolor,opacity=0.8]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \node[text width=0.82\paperwidth,text badly ragged,inner ysep=1.5cm] (main) at (0.5\paperwidth,0.55\paperheight) {%
+ \begin{minipage}[c]{0.82\paperwidth}
+ \centering
+ \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\[5pt]\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
+ \insertsubtitle
+ \fi
+ \end{minipage}
+ };
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=3mm,fill=dcolor,right,yshift=12pt]
+ (a) at (main.north west -| 0,0) {};
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=3mm,fill=dcolor,left,yshift=12pt]
+ (b) at (main.north east -| \paperwidth,0) {};
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=3mm,fill=dcolor,right,yshift=-12pt]
+ (c) at (main.south west -| 0,0) {};
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=3mm,fill=dcolor,left,yshift=-12pt]
+ (d) at (main.south east -| \paperwidth,0) {};
+ \draw[thick,dcolor] (a.south east) -- (main.west) -- (c.north east)
+ (b.south west) -- (main.east) -- (d.north west);
+ \ifx\insertoccasion\@empty
+ \draw[thick,dcolor] (a.south east) -- (main.north west) -- (main.north east) -- (b.south west);
+ \else
+ \node[text badly ragged] (occasion) at (main.north west -| 0.5\paperwidth,\paperheight) {
+ \usebeamerfont{occasion}\usebeamercolor[fg]{occasion}\insertoccasion
+ };
+ \draw[thick,dcolor] (a.south east) -- (main.north west) -- (occasion.west)
+ (b.south west) -- (main.north east) -- (occasion.east);
+ \fi
+ \node[text badly ragged] (date) at (main.south west -| 0.5\paperwidth,0) {
+ \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate
+ };
+ \draw[thick,dcolor] (c.north east) -- (main.south west) -- (date.west)
+ (d.north west) -- (main.south east) -- (date.east);
+ \node[below=4mm,text width=0.9\paperwidth,inner xsep=0.026\paperwidth,
+ text badly ragged,fill=white,draw=dcolor] (author) at (date.south) {%
+ \begin{minipage}[c]{0.9\paperwidth}
+ \centering
+ \textcolor{accent2}{$\blacksquare$}\hspace{0.2em}%
+ \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute
+ \hspace{1em}\textcolor{accent2}{$\blacksquare$}\hspace{0.2em}%
+ \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor
+ \end{minipage}
+ };
+ \path[fill=dcolor] (author.north west) -- (author.north west -| 0,0) -- (author.west)
+ -- (author.south west -| 0,0) -- (author.south west)
+ (author.north east) -- (author.north east -| \paperwidth,0) -- (author.east)
+ -- (author.south east -| \paperwidth,0) -- (author.south east);
+ \end{tikzpicture}
+}
+
+\defbeamertemplate{title page content}{hypotenuse}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[draw=dcolor,fill=fcolor,opacity=0.8]
+ (0,0) rectangle (\paperwidth,\paperheight);
+ \node[text width=0.82\paperwidth,text badly ragged,inner ysep=1.5cm] (main) at (0.5\paperwidth,0.55\paperheight) {%
+ \begin{minipage}[c]{0.82\paperwidth}
+ \centering
+ \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\[5pt]\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
+ \insertsubtitle
+ \fi
+ \end{minipage}
+ };
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=2.7mm,fill=dcolor] (a) at (main.north west) {};
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=2.7mm,fill=dcolor,left] (b) at (main.north -| \paperwidth,0) {};
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=2.7mm,fill=dcolor,right] (c) at (main.south -| 0,0) {};
+ \node[rectangle,inner sep=0pt,outer sep=0pt,minimum size=2.7mm,fill=dcolor] (d) at (main.south east) {};
+ \draw[thick,dcolor] ($(a.south west)+(0.4pt,0)$) -- ($(c.north east)+(-0.4pt,0)$)
+ ($(b.south west)+(0.4pt,0)$) -- ($(d.north east)+(-0.4pt,0)$);
+ \draw[thick,dcolor] ($(a.south east)+(-0.4pt,0)$) -- ($(c.north west)+(0.4pt,0)$)
+ ($(b.south east)+(-0.4pt,0)$) -- ($(d.north west)+(0.4pt,0)$);
+ \ifx\insertoccasion\@empty
+ \draw[thick,dcolor] (a.north west) -- (b.north east)
+ (a.south west) -- (b.south east);
+ \else
+ \node[text badly ragged] (occasion) at (main.north west -| 0.5\paperwidth,\paperheight) {
+ \usebeamerfont{occasion}\usebeamercolor[fg]{occasion}\insertoccasion
+ };
+ \draw[thick,dcolor] (a.north west) -- (a.north west -| occasion.north west)
+ (a.south west) -- (a.south west -| occasion.south west)
+ (b.north east) -- (b.north east -| occasion.north east)
+ (b.south east) -- (b.south east -| occasion.south east);
+ \fi
+ \node[text badly ragged] (date) at (main.south west -| 0.5\paperwidth,0) {
+ \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate
+ };
+ \draw[thick,dcolor] (c.north west) -- (c.north west -| date.north west)
+ (c.south west) -- (c.south west -| date.south west)
+ (d.north east) -- (d.north east -| date.north east)
+ (d.south east) -- (d.south east -| date.south east);
+ \node[below=4mm,text width=0.9\paperwidth,inner xsep=0.015\paperwidth,
+ text badly ragged,fill=white,draw=dcolor] (author) at (date.south) {%
+ \begin{minipage}[c]{0.9\paperwidth}
+ \centering
+ \textcolor{accent2}{$\blacksquare$}\hspace{0.2em}%
+ \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute
+ \hspace{1em}\textcolor{accent2}{$\blacksquare$}\hspace{0.2em}%
+ \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor
+ \end{minipage}
+ };
+ \path[fill=dcolor] (author.north west) -- (author.south west) -- (author.south west -| 0,0)
+ (author.south east) -- (author.north east) -- (author.north west -| \paperwidth,0);
+ \end{tikzpicture}
+}
+
+% Several safe primes and Blum-Blum-Shub generator
+\newcommand{\my@composite}{43921} % 43921=167*263
+\newcounter{my@random@seed}
+\setcounter{my@random@seed}{43787}
+\newcommand{\next@random@seed}{%
+ \setcounter{my@random@seed}{\value{my@random@seed}*\value{my@random@seed}}%
+ \setcounter{my@random@seed}{\value{my@random@seed}-(\value{my@random@seed}/\my@composite)*\my@composite}%
+}
+
+\newlength{\my@title@height}
+
+\defbeamertemplate{title page content}{block}{%
+ \begin{tikzpicture}
+ \useasboundingbox (0,0) rectangle (\paperwidth,\paperheight);
+ \path[draw=dcolor,fill=fcolor,opacity=0.8] (0,0) rectangle (\paperwidth,\paperheight);
+ \path[step=4mm,draw=dcolor,ultra thick] (0,0) grid (\paperwidth,\paperheight);
+ \foreach \x in {0,1,...,31} \foreach \y in {0,1,...,23} {
+ \next@random@seed
+ \ifodd\value{my@random@seed}
+ \path[draw=dcolor,ultra thick,fill=fcolor2,opacity=0.8] (\x*\paperwidth/32,\y*\paperheight/24) rectangle +(4mm,4mm);
+ \fi
+ }
+ \ifx\insertsubtitle\@empty
+ \setlength{\my@title@height}{39.7mm}
+ \else
+ \setlength{\my@title@height}{47.7mm}
+ \fi
+ \node[minimum width=0.84\paperwidth,minimum height=\my@title@height,inner xsep=2mm,inner ysep=0mm,
+ opacity=0.95,text opacity=1,text badly ragged,fill=fcolor] (main) at (0.5\paperwidth,0.542\paperheight) {%
+ \begin{minipage}[c]{0.84\paperwidth}
+ \centering
+ \usebeamerfont{title}\usebeamercolor[fg]{title}\inserttitle
+ \ifx\insertsubtitle\@empty\else
+ \\[5pt]\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}
+ \insertsubtitle
+ \fi
+ \end{minipage}
+ };
+ \ifx\insertoccasion\@empty\else
+ \node[text badly ragged,fill=fcolor,minimum height=7.8mm,draw=dcolor,very thick]
+ (occasion) at (main.north west -| 0.5\paperwidth,\paperheight) {
+ \usebeamerfont{occasion}\usebeamercolor[fg]{occasion}\insertoccasion
+ };
+ \fi
+ \node[text badly ragged,fill=fcolor,minimum height=7.8mm,draw=dcolor,very thick]
+ (date) at (main.south west -| 0.5\paperwidth,0) {
+ \usebeamerfont{date}\usebeamercolor[fg]{date}\insertdate
+ };
+ \node[below=4mm,minimum width=0.84\paperwidth,minimum height=7.6mm,inner xsep=2mm,inner ysep=0mm,
+ opacity=0.85,text opacity=1,text badly ragged,fill=white] at (date.south) {%
+ \begin{minipage}[c]{0.84\paperwidth}
+ \centering
+ \textcolor{accent2}{$\blacksquare$}\hspace{0.2em}%
+ \usebeamerfont{institute}\usebeamercolor[fg]{institute}\insertinstitute
+ \hspace{0.4em}\textcolor{accent2}{$\blacksquare$}\hspace{0.2em}%
+ \usebeamerfont{author}\usebeamercolor[fg]{author}\insertauthor
+ \end{minipage}
+ };
+ \end{tikzpicture}
+}
+
+%% ----------------------- section and subsection --------------------
+
+\newcounter{my@pgf@picture@count}
+
+\def\sectionintocskip{0.5pt plus 0.1fill}
+\patchcmd{\beamer@sectionintoc}{\vskip1.5em}{\vskip\sectionintocskip}{}{}
+
+\AtBeginSection[]{%
+ \begin{frame}%[plain]
+ \sectionpage
+ \end{frame}%
+}
+
+\defbeamertemplate{section name}{simple}{\insertsectionnumber.}
+
+\defbeamertemplate{section name}{chinese}[1][节]{第\CJKnumber{\insertsectionnumber}#1}
+
+\defbeamertemplate{section page}{single}{%
+ \centerline{%
+ \usebeamerfont{section name}%
+ \usebeamercolor[fg]{section name}%
+ \usebeamertemplate{section name}%
+ \hspace{0.8em}%
+ \usebeamerfont{section title}%
+ \usebeamercolor[fg]{section title}%
+ \insertsection
+ }%
+}
+
+\defbeamertemplate{section name in toc}{simple}{%
+ Section \inserttocsectionnumber
+}
+
+\defbeamertemplate{section name in toc}{full}{%
+ Section \ifnum\the\beamer@tempcount<10 0\fi\inserttocsectionnumber
+}
+
+\defbeamertemplate{section name in toc}{chinese}[1][节]{%
+ 第\CJKnumber{\inserttocsectionnumber}#1%
+}
+
+\newcounter{my@section@from}
+\newcounter{my@section@to}
+
+\defbeamertemplate{show sections in toc}{total}{%
+ \setcounter{my@section@from}{1}%
+ \setcounter{my@section@to}{50}%
+}
+
+% show at most five sections
+\defbeamertemplate{show sections in toc}{partial}{%
+ \setcounter{my@section@from}{\value{section}}%
+ \addtocounter{my@section@from}{-2}%
+ \setcounter{my@section@to}{\value{section}}%
+ \addtocounter{my@section@to}{2}%
+ \ifnum\my@totalsectionnumber>0%
+ \ifnum\value{my@section@to}>\my@totalsectionnumber
+ \setcounter{my@section@to}{\my@totalsectionnumber}%
+ \setcounter{my@section@from}{\value{my@section@to}}%
+ \addtocounter{my@section@from}{-4}%
+ \fi
+ \fi
+ \ifnum\value{my@section@from}<1\setcounter{my@section@from}{1}%
+ \setcounter{my@section@to}{\value{my@section@from}}%
+ \addtocounter{my@section@to}{4}%
+ \fi
+}
+
+% reset pgfid to get correct result with \tikzmark in second run
+\defbeamertemplate{section page}{fill}{%
+ \usebeamertemplate{show sections in toc}%
+ \setcounter{my@pgf@picture@count}{\the\pgf@picture@serial@count}%
+ \setlength{\parskip}{5pt minus 1pt}%
+ \tableofcontents[sectionstyle=show/shaded,subsectionstyle=hide,
+ sections={\arabic{my@section@from}-\arabic{my@section@to}}]%
+ \global\pgf@picture@serial@count=\value{my@pgf@picture@count}%
+ \unskip
+}
+
+\defbeamertemplate{section in toc}{fill}{%
+ \noindent
+ \begin{tikzpicture}
+ \node[text width=\textwidth,inner xsep=0pt,inner ysep=5pt,text badly ragged,fill=bg] (title) {%
+ \hspace{0.28\textwidth}\parbox{0.7\textwidth}{\inserttocsection\vphantom{g}}%
+ };
+ \path (title.south west) +(2pt,2pt) coordinate (sw)
+ (title.north west) +(0.25\textwidth,-2pt) coordinate (ne);
+ \path[fill=fg,overlay] (sw) rectangle (ne);
+ \node[inner xsep=0pt,text badly ragged,overlay] at ($(sw)!0.5!(ne)$) {%
+ \color{bg}\vphantom{g}\usebeamertemplate{section name in toc}%
+ };
+ \draw[line width=1pt,dcolor,overlay] ($(ne)+(2pt,2pt)$) -- ($(ne |- title.south)+(2pt,0)$);
+ \end{tikzpicture}%
+ \par
+}
+
+\AtBeginSubsection{%
+ \begin{frame}%[plain]
+ \setlength{\parskip}{0pt}%
+ \offinterlineskip
+ \subsectionpage
+ \end{frame}%
+}
+
+\defbeamertemplate{subsection name}{simple}{%
+ \insertsectionnumber.\insertsubsectionnumber
+}
+
+\defbeamertemplate{subsection page}{single}{%
+ \centerline{%
+ \usebeamerfont{subsection name}%
+ \usebeamercolor[fg]{subsection name}%
+ \usebeamertemplate{subsection name}%
+ \hspace{0.8em}%
+ \usebeamerfont{subsection title}%
+ \usebeamercolor[fg]{subsection title}%
+ \insertsubsection
+ }%
+}
+
+\defbeamertemplate{subsection name in toc}{empty}{}
+
+\newcounter{mysubseccnt}
+\defbeamertemplate{subsection name in toc}{alphabet}{%
+ \setcounter{mysubseccnt}{\inserttocsubsectionnumber}%
+ \Alph{mysubseccnt}%
+}
+
+\defbeamertemplate{subsection name in toc}{simple}{%
+ \inserttocsubsectionnumber
+}
+
+\defbeamertemplate{subsection name in toc}{full}{%
+ \inserttocsectionnumber.\inserttocsubsectionnumber
+}
+
+% reset pgfid to get correct result with \tikzmark in second run
+\defbeamertemplate{subsection page}{fill}{%
+ \setcounter{my@pgf@picture@count}{\the\pgf@picture@serial@count}%
+ \tableofcontents[sectionstyle=show/hide,subsectionstyle=show/shaded/hide]%
+ \global\pgf@picture@serial@count=\value{my@pgf@picture@count}%
+ \unskip
+}
+
+\defbeamertemplate{subsection in toc}{fill}{%
+ \vspace{1pt}\noindent%
+ \begin{tikzpicture}
+ \node[text width=\textwidth,inner xsep=0pt,inner ysep=5pt,text badly ragged,fill=bg] (title) {%
+ \hspace{0.28\textwidth}\parbox{0.7\textwidth}{\inserttocsubsection\vphantom{g}}%
+ };
+ \path (title.south west) +(2pt,2pt) coordinate (sw)
+ (title.north west) +(0.25\textwidth,-2pt) coordinate (ne);
+ \path[fill=fg,overlay] (sw) rectangle (ne);
+ \node[inner xsep=0pt,text badly ragged,overlay] at ($(sw)!0.5!(ne)$) {%
+ \color{bg}\vphantom{g}\usebeamertemplate{subsection name in toc}%
+ };
+ \draw[line width=1pt,dcolor,overlay] ($(ne)+(2pt,2pt)$) -- ($(ne |- title.south)+(2pt,0)$);
+ \end{tikzpicture}%
+ \par
+}
+
+% chinese sections and subsections
+\defbeamertemplate{section and subsection}{chinese}[1][节]{%
+ \setbeamertemplate{section name in toc}[chinese][#1]%
+ \setbeamertemplate{section name}[chinese][#1]%
+ \setbeamertemplate{subsection name in toc}[alphabet]%
+}
+
+%% ---------------------- headline and footline ----------------------
+
+% fix headline bug in old versions
+\@ifclasslater{beamer}{2017/01/23}{}{%
+ \patchcmd{\ps@empty}
+ {\raise\headheight\box\beamer@tempbox\box\@tempboxa}
+ {\raise\headheight\box\beamer@tempbox\raise\headheight\box\@tempboxa}
+ {}{}
+}
+
+\defbeamertemplate{headline mark}{line}{
+ \draw[overlay,color=white,line width=0.8pt] (0,0.5mm) -- (\paperwidth,0.5mm);
+}
+
+\defbeamertemplate{headline}{shading}{%
+ \begin{tikzpicture}
+ \fill[left color=accent2,right color=blue85] (0,0) rectangle (\paperwidth,1mm);
+ \usebeamertemplate{headline mark}
+ \end{tikzpicture}
+}
+
+\defbeamertemplate{headline}{border}{%
+ \begin{tikzpicture}
+ \path[use as bounding box] (0,0) rectangle (\paperwidth,1mm);
+ \fill[left color=accent2,right color=blue85] (0,0) rectangle (\paperwidth,0.8pt);
+ \end{tikzpicture}
+}
+
+\defbeamertemplate{headline}{phantom}{%
+ \begin{tikzpicture}
+ \path[use as bounding box] (0,0) rectangle (\paperwidth,1mm);
+ \end{tikzpicture}
+}
+
+\defbeamertemplate{footline left}{author}{%
+ \insertshortauthor
+}
+
+\defbeamertemplate{footline center}{title}{%
+ \insertshorttitle
+}
+
+\defbeamertemplate{footline right}{number}{%
+ \Acrobatmenu{GoToPage}{\insertframenumber{}/\inserttotalframenumber}%
+}
+\defbeamertemplate{footline right}{normal}{%
+ \hyperlinkframeendprev{$\vartriangle$}
+ \Acrobatmenu{GoToPage}{\insertframenumber{}/\inserttotalframenumber}
+ \hyperlinkframestartnext{$\triangledown$}%
+}
+
+\defbeamertemplate{footline}{simple}{%
+ \hbox{%
+ \begin{beamercolorbox}[wd=.2\paperwidth,ht=2.25ex,dp=1ex,left]{footline}%
+ \usebeamerfont{footline}\kern\beamer@leftmargin
+ \usebeamertemplate{footline left}%
+ \end{beamercolorbox}%
+ \begin{beamercolorbox}[wd=.6\paperwidth,ht=2.25ex,dp=1ex,center]{footline}%
+ \usebeamerfont{footline}\usebeamertemplate{footline center}%
+ \end{beamercolorbox}%
+ \begin{beamercolorbox}[wd=.2\paperwidth,ht=2.25ex,dp=1ex,right]{footline}%
+ \usebeamerfont{footline}\usebeamertemplate{footline right}%
+ \kern\beamer@rightmargin
+ \end{beamercolorbox}%
+ }%
+}
+
+\defbeamertemplate{footline separator}{shading}{%
+ \begin{tikzpicture}
+ \fill[left color=blue85,right color=accent2] (0,0) rectangle (\paperwidth,1pt);
+ \end{tikzpicture}
+}
+
+\defbeamertemplate{footline}{sectioning}{%
+ \usebeamertemplate{footline separator}%
+ \hbox{%
+ \begin{beamercolorbox}[wd=.8\paperwidth,ht=2.25ex,dp=1ex,left]{footline}%
+ \usebeamerfont{footline}\kern\beamer@leftmargin\insertshorttitle
+ \ifx\insertsection\@empty\else\qquad$\vartriangleright$\qquad\insertsection\fi
+ \ifx\insertsubsection\@empty\else\qquad$\vartriangleright$\qquad\insertsubsection\fi
+ \end{beamercolorbox}%
+ \begin{beamercolorbox}[wd=.2\paperwidth,ht=2.25ex,dp=1ex,right]{footline}%
+ \usebeamerfont{footline}\usebeamertemplate{footline right}%
+ \kern\beamer@rightmargin
+ \end{beamercolorbox}%
+ }%
+}
+
+% customize mini frames template to get a section navigation bar
+
+\defbeamertemplate{navigation box}{current}{%
+ \usebeamercolor{navigation box}%
+ \colorbox{bg}{%
+ \rule[-1ex]{0pt}{3.25ex}\color{white}\kern1.4pt\my@navibox\kern1.4pt%
+ }%
+}
+
+\defbeamertemplate{navigation box}{other}{%
+ %\colorbox{white}{%
+ \rule[-1ex]{0pt}{3.25ex}\color{black}\kern1.4pt\my@navibox\kern1.4pt%
+ %}%
+}
+
+\newcommand{\my@navibox@subsection}{$\blacksquare$}
+\newcommand{\my@navibox@frame}{$\square$}
+\let\my@navibox=\my@navibox@frame
+
+% optional navigation box for some special frame
+\newcommand{\my@navibox@frame@opt}{$\boxplus$}
+\newcommand{\my@change@navibox}{\let\my@navibox=\my@navibox@frame@opt}
+\newcommand{\changenavibox}{%
+ \addtocontents{nav}{\protect\headcommand{\protect\my@change@navibox}}%
+}
+
+\newcommand{\my@sectionentry@show}[5]{%
+ \ifnum\c@section=#1%
+ \setbeamertemplate{navigation box}[current]%
+ \else
+ \setbeamertemplate{navigation box}[other]%
+ \fi
+ \begingroup
+ \def\my@navibox{#1}%
+ \hyperlink{Navigation#3}{\usebeamertemplate{navigation box}}%
+ \endgroup
+}
+
+\newif\ifmy@hidesection
+
+\newcommand{\my@sectionentry@hide}[5]{\my@hidesectiontrue}
+
+\pretocmd{\beamer@setuplinks}{\renewcommand{\beamer@subsectionentry}[5]{}}{}{}
+\apptocmd{\beamer@setuplinks}{\global\let\beamer@subsectionentry\mybeamer@subsectionentry}{}{}
+
+\newcommand{\mybeamer@subsectionentry}[5]{\global\let\my@navibox=\my@navibox@subsection}
+
+\newcommand{\my@slideentry@empty}[6]{}
+
+\newcommand{\my@slideentry@section}[6]{%
+ \ifmy@hidesection
+ \my@hidesectionfalse
+ \else
+ \ifnum\c@section=#1%
+ \setbeamertemplate{navigation box}[other]%
+ \ifnum\c@subsection=#2\ifnum\c@subsectionslide=#3%
+ \setbeamertemplate{navigation box}[current]%
+ \fi\fi
+ \beamer@link(#4){\usebeamertemplate{navigation box}}%
+ \fi
+ \fi
+ \global\let\my@navibox=\my@navibox@frame
+}
+
+\newcommand{\my@slideentry@subsection}[6]{%
+ \ifmy@hidesection
+ \my@hidesectionfalse
+ \else
+ \ifnum\c@section=#1%
+ \ifboolexpr{test{\ifnumcomp{\c@subsection}{=}{#2}} or test{\ifnumcomp{#3}{=}{1}}}{%
+ \setbeamertemplate{navigation box}[other]%
+ \ifnum\c@subsection=#2\ifnum\c@subsectionslide=#3%
+ \setbeamertemplate{navigation box}[current]%
+ \fi\fi
+ \beamer@link(#4){\usebeamertemplate{navigation box}}%
+ }{}%
+ \fi
+ \fi
+ \global\let\my@navibox=\my@navibox@frame
+}
+
+\AtEndDocument{%
+ \immediate\write\@auxout{%
+ \noexpand\gdef\noexpand\my@totalsectionnumber{\the\c@section}%
+ }%
+}
+
+\def\my@totalsectionnumber{0}
+
+\defbeamertemplate{footline navigation}{section}{%
+ \setbeamercolor{navigation box}{bg=accent2}%
+ \let\sectionentry=\my@sectionentry@hide
+ \let\slideentry=\my@slideentry@section
+ \dohead
+}
+
+\defbeamertemplate{footline navigation}{subsection}{%
+ \setbeamercolor{navigation box}{bg=accent2}%
+ \let\sectionentry=\my@sectionentry@hide
+ \let\slideentry=\my@slideentry@subsection
+ \dohead
+}
+
+\defbeamertemplate{footline}{navigation}{%
+ \usebeamertemplate{footline separator}%
+ \begin{beamercolorbox}[wd=\paperwidth,ht=2.25ex,dp=1ex]{footline}%
+ \usebeamerfont{footline}%
+ \kern\beamer@leftmargin
+ \setlength{\fboxsep}{0pt}%
+ \setbeamercolor{navigation box}{bg=blue85}%
+ \ifnum\my@totalsectionnumber=0%
+ \insertshorttitle
+ \else
+ \let\sectionentry=\my@sectionentry@show
+ \let\slideentry=\my@slideentry@empty
+ \dohead
+ \fi
+ \hfill
+ \usebeamertemplate{footline navigation}%
+ \kern\beamer@rightmargin
+ \end{beamercolorbox}%
+}
+
+%% ------------------------- frame title -----------------------------
+
+% remove extra vertical space after frametitle
+\patchcmd{\endbeamer@frameslide}{\vskip0.25em}{\relax}{}{}
+
+\defbeamertemplate{frametitle}{simple}[1][]
+{%
+ \nointerlineskip
+ \begin{beamercolorbox}[wd=\paperwidth,sep=0pt,leftskip=\beamer@leftmargin,%
+ rightskip=\beamer@rightmargin,#1]{frametitle}
+ \usebeamerfont{frametitle}%
+ \rule[-3mm]{0pt}{10mm}\insertframetitle\rule[-3mm]{0pt}{10mm}\par
+ \end{beamercolorbox}
+}
+
+%% ------------------- block and theorem -----------------------------
+
+% allow it to be modified by user
+\def\myinserttheoremaddition{\inserttheoremaddition}
+
+\defbeamertemplate{theorem begin}{simple}
+{%
+ \upshape%\bfseries\inserttheoremheadfont
+ {\usebeamercolor[fg]{theoremname}%
+ \inserttheoremname\inserttheoremnumber
+ \ifx\inserttheoremaddition\@empty\else
+ \ \usebeamercolor[fg]{local structure}(\myinserttheoremaddition)%
+ \fi%
+ %\inserttheorempunctuation
+ }%
+ \quad\normalfont
+}
+\defbeamertemplate{theorem end}{simple}{\par}
+
+\defbeamertemplate{proof begin}{simple}
+{%
+ %\bfseries
+ \let\@addpunct=\@gobble
+ {\usebeamercolor[fg]{proofname}\insertproofname}%
+ \quad\normalfont
+}
+\defbeamertemplate{proof end}{simple}{\par}
+
+%% ---------------------- enumerate and itemize ----------------------
+
+\expandafter\patchcmd\csname beamer@@tmpop@enumerate item@square\endcsname
+ {height1.85ex depth.4ex}{height1.85ex depth.3ex}{}{}
+\expandafter\patchcmd\csname beamer@@tmpop@enumerate subitem@square\endcsname
+ {height1.85ex depth.4ex}{height1.85ex depth.3ex}{}{}
+\expandafter\patchcmd\csname beamer@@tmpop@enumerate subsubitem@square\endcsname
+ {height1.85ex depth.4ex}{height1.85ex depth.3ex}{}{}
+
+%% ------------------------ select templates -------------------------
+
+\setbeamertemplate{background canvas}[default]
+\setbeamertemplate{background}[line]
+\setbeamertemplate{headline}[shading]
+\setbeamertemplate{footline}[navigation]
+\setbeamertemplate{footline navigation}[section]
+\setbeamertemplate{footline separator}[shading]
+\setbeamertemplate{footline left}[author]
+\setbeamertemplate{footline center}[title]
+\setbeamertemplate{footline right}[number]
+\setbeamertemplate{title page}[banner]
+\setbeamertemplate{title page content}[hexagon]
+\setbeamertemplate{section page}[fill]
+\setbeamertemplate{show sections in toc}[partial]
+\setbeamertemplate{section name}[simple]
+\setbeamertemplate{section name in toc}[simple]
+\setbeamertemplate{section in toc}[fill]
+\setbeamertemplate{section in toc shaded}[default][50]
+\setbeamertemplate{subsection page}[fill]
+\setbeamertemplate{subsection name}[simple]
+\setbeamertemplate{subsection name in toc}[simple]
+\setbeamertemplate{subsection in toc}[fill]
+\setbeamertemplate{subsection in toc shaded}[default][50]
+\setbeamertemplate{theorem begin}[default]
+\setbeamertemplate{theorem end}[default]
+\setbeamertemplate{proof begin}[default]
+\setbeamertemplate{proof end}[default]
+\setbeamertemplate{frametitle}[simple]
+\setbeamertemplate{navigation symbols}{}
+\setbeamertemplate{itemize items}[square]
+\setbeamertemplate{enumerate items}[square]
+
+%% --------------------------- font theme ----------------------------
+
+\setbeamerfont{title}{size=\LARGE}
+\setbeamerfont{subtitle}{size=\large}
+\setbeamerfont{author}{size=\normalsize}
+\setbeamerfont{institute}{size=\normalsize}
+\setbeamerfont{date}{size=\normalsize}
+\setbeamerfont{occasion}{size=\normalsize}
+\setbeamerfont{section in toc}{size=\large}
+\setbeamerfont{subsection in toc}{size=\large}
+\setbeamerfont{frametitle}{size=\large}
+\setbeamerfont{block title}{size=\normalsize}
+\setbeamerfont{item projected}{size=\footnotesize}
+\setbeamerfont{subitem projected}{size=\scriptsize}
+\setbeamerfont{subsubitem projected}{size=\tiny}
+
+\usefonttheme{professionalfonts}
+%\usepackage{arev}
+
+%% ---------------------------- color theme --------------------------
+
+% always use rgb colors in pdf files
+\substitutecolormodel{hsb}{rgb}
+
+\definecolor{red99}{Hsb}{0,0.9,0.9}
+\definecolor{yellow5x}{Hsb}{60,0.5,1}
+\definecolor{yellow6x}{Hsb}{53,0.6,1}
+\definecolor{yellow86}{Hsb}{60,0.8,0.6}
+\definecolor{yellow99}{Hsb}{60,0.9,0.9}
+\definecolor{cyan95}{Hsb}{180,0.9,0.5}
+\definecolor{blue74}{Hsb}{240,0.7,0.4}
+\definecolor{blue77}{Hsb}{240,0.7,0.7}
+\definecolor{blue85}{Hsb}{230,0.8,0.5}
+\definecolor{blue99}{Hsb}{240,0.9,0.9}
+\definecolor{magenta88}{Hsb}{300,0.8,0.8}
+
+\colorlet{text1}{black}
+\colorlet{back1}{white}
+\colorlet{accent1}{blue99}
+\colorlet{accent2}{cyan95}
+\colorlet{accent3}{red99}
+\colorlet{accent4}{yellow86}
+\colorlet{accent5}{magenta88}
+\colorlet{filler1}{accent1!40!back1}
+\colorlet{filler2}{accent2!40!back1}
+\colorlet{filler3}{accent3!40!back1}
+\colorlet{filler4}{accent4!40!back1}
+\colorlet{filler5}{accent5!40!back1}
+\colorlet{gray1}{black!20}
+\colorlet{gray2}{black!35}
+\colorlet{gray3}{black!50}
+\colorlet{gray4}{black!65}
+\colorlet{gray5}{black!80}
+\colorlet{tcolor}{text1!10!back1}
+\colorlet{dcolor}{white}
+\colorlet{fcolor}{blue77}
+\colorlet{fcolor2}{gray3}
+\colorlet{markcolor}{gray}
+
+\setbeamercolor{normal text}{bg=white,fg=black}
+\setbeamercolor{structure}{fg=blue85}
+\setbeamercolor{local structure}{fg=cyan95}
+\setbeamercolor{footline}{bg=,fg=black}
+\setbeamercolor{title}{fg=yellow99}
+\setbeamercolor{subtitle}{fg=white}
+\setbeamercolor{author}{fg=black}
+\setbeamercolor{institute}{fg=black}
+\setbeamercolor{date}{fg=white}
+\setbeamercolor{occasion}{fg=white}
+\setbeamercolor{section name}{fg=blue85}
+\setbeamercolor{section in toc}{fg=yellow6x,bg=blue85}
+\setbeamercolor{section in toc shaded}{fg=white,bg=blue74}
+\setbeamercolor{subsection name}{parent=section name}
+\setbeamercolor{subsection in toc}{fg=yellow5x,bg=accent2}
+\setbeamercolor{subsection in toc shaded}{fg=white,bg=accent2!50!black}
+\setbeamercolor{frametitle}{parent=structure}
+\setbeamercolor{theoremname}{fg=blue77}
+\setbeamercolor{proofname}{fg=blue77}
+\setbeamercolor{block title}{fg=accent1,bg=gray}
+\setbeamercolor{block body}{bg=lightgray}
+\setbeamercolor{block title example}{fg=accent2,bg=gray}
+\setbeamercolor{block body example}{bg=lightgray}
+\setbeamercolor{block title alerted}{fg=accent3,bg=gray}
+\setbeamercolor{block body alerted}{bg=lightgray}
+
+%% ----------------------- handout mode ------------------------------
+
+\mode<handout>{
+ \setbeamertemplate{background canvas}{}
+ \setbeamertemplate{background}[empty]
+ \setbeamertemplate{headline}[phantom]
+ \setbeamertemplate{footline}[sectioning]
+ \setbeamertemplate{section page}[single]
+ \setbeamertemplate{subsection page}[single]
+ \setbeamerfont{subsection in toc}{size=\large}
+ \colorlet{dcolor}{darkgray}
+ \colorlet{fcolor}{white}
+ \colorlet{fcolor2}{gray1}
+ \setbeamercolor{normal text}{fg=black, bg=white}
+ \setbeamercolor{title}{fg=blue}
+ \setbeamercolor{subtitle}{fg=gray}
+ \setbeamercolor{occasion}{fg=black}
+ \setbeamercolor{date}{fg=black}
+ \setbeamercolor{section in toc}{fg=blue!90!gray,bg=}
+ \setbeamercolor{section in toc shaded}{fg=lightgray,bg=}
+ \setbeamercolor{subsection in toc}{fg=blue!80!gray}
+ \setbeamercolor{subsection in toc shaded}{fg=lightgray}
+ \setbeamercolor{frametitle}{fg=blue!70!gray,bg=}
+ \setbeamercolor{theoremname}{fg=blue!60!gray}
+ \setbeamercolor{proofname}{fg=blue!60!gray}
+ \setbeamercolor{footline}{bg=white,fg=black}
+}
+
+\mode
+<all>
+
+\makeatother
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/demo-riemann.pdf b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/demo-riemann.pdf
new file mode 100644
index 0000000000..982ad4d8d8
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/demo-riemann.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/demo-riemann.tex b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/demo-riemann.tex
new file mode 100644
index 0000000000..ad68361dca
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/beamerthemeconcrete/riemann/demo-riemann.tex
@@ -0,0 +1,178 @@
+% -*- coding: utf-8 -*-
+
+\documentclass[12pt,xcolor={rgb}]{beamer}
+
+\usetheme{riemann}
+
+\usepackage{arev}
+
+%% use these lines to get section numbers in Chinese
+%\usepackage[UTF8,noindent]{ctex}
+%\usepackage{CJKnumb}
+%\setbeamertemplate{section and subsection}[chinese]
+%\usebeamertemplate{section and subsection}
+
+\begin{document}
+
+\title{Beamer Theme Riemann}
+\author{Author Name}
+\institute{Institute Name}
+\occasion{Some Conference}
+
+\begin{frame}[plain]
+\titlepage
+\end{frame}
+
+\section{Section One}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Two}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\section{Section Three}
+
+\subsection{Subsection One}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Two}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\subsection{Subsection Three}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\begin{frame}{Frame Title}
+Frame \insertframenumber
+\end{frame}
+
+\end{document}
diff --git a/macros/latex/contrib/csvsimple/CHANGES.md b/macros/latex/contrib/csvsimple/CHANGES.md
index 18e055de83..768f8f65cb 100644
--- a/macros/latex/contrib/csvsimple/CHANGES.md
+++ b/macros/latex/contrib/csvsimple/CHANGES.md
@@ -16,6 +16,38 @@ and this project adheres to
### Security
+
+## [2.6.0] - 2024-01-19
+
+### Added
+- `consume collected data`
+- `\csvcollecte` (replacement for `\csvcollectx`)
+- New CamelCase macro names for several existing string and number test macros
+ to adapt expl3 naming conventions (issue #34):
+ - `\IfCsvsimStrEqualTF`
+ - `\IfCsvsimTlEqualTF`
+ - `\IfCsvsimTlProtectedEqualTF`
+ - `\IfCsvsimFpCompareTF`
+ - `\IfCsvsimIntCompareTF`
+
+### Changed
+- Default settings for `\csvautotabularray` and friends slightly changed
+ (line width and added uppercase setting)
+- In documentation for `collect data`, `after first line` is
+ added to the list of collected keys (issue/pull request #31)
+- Expl3 scratch variables like `\l_tmpa_tl` replaced by package variables like `\l__csvsim_tmpa_tl`
+- Implementation of `\csvexpval` changed from `\exp_not:V` to `\exp_not:o`
+- Implementation of `data collection` changed to piecewise token list constructions
+- Implementation of `generic collected table` does not alter `after reading` anymore
+- Implementation of `\ifcsvstrcmp` and `\ifcsvstrequal` changed
+- Documentation of Section "String and Number Tests" updated (issue #33)
+- Leading `/` removed from all l3keys inside the documentation
+- `l3keys2e` removed from `csvsimple.sty` and code adapted
+- Needed LaTeX version updated to 2023-11-01
+- Several minor changes
+
+
+
## [2.5.0] - 2023-10-16
### Added
diff --git a/macros/latex/contrib/csvsimple/README.md b/macros/latex/contrib/csvsimple/README.md
index d72e0a6cc7..d3e0860104 100644
--- a/macros/latex/contrib/csvsimple/README.md
+++ b/macros/latex/contrib/csvsimple/README.md
@@ -1,7 +1,7 @@
-# The LaTeX package csvsimple - version 2.5.0 (2023/10/16)
+# The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
-> Copyright (c) 2008-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+> Copyright (c) 2008-2024 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
> This work may be distributed and/or modified under the
> conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/csvsimple/csvsimple-doc.sty b/macros/latex/contrib/csvsimple/csvsimple-doc.sty
index 36f052ac9b..2f507037fb 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-doc.sty
+++ b/macros/latex/contrib/csvsimple/csvsimple-doc.sty
@@ -1,9 +1,9 @@
% !TeX encoding=UTF-8
-%% The LaTeX package csvsimple - version 2.5.0 (2023/10/16)
+%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
%% csvsimple-doc.sty: style file for the documentation
%%
%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2008-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% Copyright (c) 2008-2024 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
@@ -18,8 +18,8 @@
%%
%% This work consists of all files listed in README.md
%%
-\def\version{2.5.0}%
-\def\datum{2023/10/16}%
+\def\version{2.6.0}%
+\def\datum{2024/01/19}%
\IfFileExists{csvsimple-doc.cfg}{\input{csvsimple-doc.cfg}}{}\providecommand\csvpkgprefix{}
@@ -33,7 +33,7 @@
\RequirePackage[english]{babel}
\RequirePackage{lmodern,parskip,array,ifthen,calc,makeidx}
\RequirePackage{amsmath,amssymb}
-\RequirePackage[svgnames,table,hyperref]{xcolor}
+\RequirePackage[svgnames,table]{xcolor}
\RequirePackage{tikz,siunitx,xfp,tabularray}
\RequirePackage{varioref}
\RequirePackage[pdftex,bookmarks,raiselinks,pageanchor,hyperindex,colorlinks]{hyperref}
diff --git a/macros/latex/contrib/csvsimple/csvsimple-example.pdf b/macros/latex/contrib/csvsimple/csvsimple-example.pdf
index 8915e27291..5485a99c1e 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-example.pdf
+++ b/macros/latex/contrib/csvsimple/csvsimple-example.pdf
Binary files differ
diff --git a/macros/latex/contrib/csvsimple/csvsimple-example.tex b/macros/latex/contrib/csvsimple/csvsimple-example.tex
index 5d872f5fb2..364596562a 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-example.tex
+++ b/macros/latex/contrib/csvsimple/csvsimple-example.tex
@@ -1,8 +1,8 @@
-%% The LaTeX package csvsimple - version 2.5.0 (2023/10/16)
+%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
%% csvsimple-example.tex: an example for csvsimple
%%
%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2008-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% Copyright (c) 2008-2024 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
diff --git a/macros/latex/contrib/csvsimple/csvsimple-l3.pdf b/macros/latex/contrib/csvsimple/csvsimple-l3.pdf
index 9bf62e2f40..bbef5c75a9 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-l3.pdf
+++ b/macros/latex/contrib/csvsimple/csvsimple-l3.pdf
Binary files differ
diff --git a/macros/latex/contrib/csvsimple/csvsimple-l3.sty b/macros/latex/contrib/csvsimple/csvsimple-l3.sty
index cb6a676054..9aa9b2c428 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-l3.sty
+++ b/macros/latex/contrib/csvsimple/csvsimple-l3.sty
@@ -1,8 +1,8 @@
-%% The LaTeX package csvsimple - version 2.5.0 (2023/10/16)
+%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
%% csvsimple-l3.sty: Simple LaTeX CSV file processing (LaTeX3)
%%
%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2008-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% Copyright (c) 2008-2024 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
@@ -17,11 +17,11 @@
%%
%% This work consists of all files listed in README.md
%%
-\ProvidesExplPackage{csvsimple-l3}{2023/10/16}{2.5.0}
+\NeedsTeXFormat{LaTeX2e}[2023-11-01]
+\ProvidesExplPackage{csvsimple-l3}{2024/01/19}{2.6.0}
{LaTeX3 CSV file processing}
-
%---- check package
\cs_if_exist:NT \c__csvsim_package_expl_bool
@@ -42,10 +42,12 @@
\bool_new:N \g__csvsim_check_column_count_bool
\bool_new:N \g__csvsim_collect_data_bool
\bool_new:N \g__csvsim_colnames_detection_bool
+\bool_new:N \g__csvsim_consume_collected_data_bool
\bool_new:N \g__csvsim_head_bool
\bool_new:N \g__csvsim_head_to_colnames_bool
\bool_new:N \g__csvsim_line_accepted_bool
\bool_new:N \g__csvsim_line_firstline_bool
+
\bool_new:N \l__csvsim_respect_and_bool
\bool_new:N \l__csvsim_respect_backslash_bool
\bool_new:N \l__csvsim_respect_circumflex_bool
@@ -60,22 +62,30 @@
\int_new:N \g__csvsim_col_int
\int_new:N \g__csvsim_colmax_int
+\int_new:N \g_csvsim_columncount_int
\int_new:N \g_csvsim_inputline_int
\int_new:N \g_csvsim_row_int
-\int_new:N \g_csvsim_columncount_int
+
+\int_new:N \l__csvsim_tmpa_int
+\int_new:N \l__csvsim_tmpb_int
\seq_new:N \g__csvsim_colname_seq
\seq_new:N \g__csvsim_line_seq
\seq_new:N \g__csvsim_range_seq
+\seq_new:N \l__csvsim_tmpa_seq
+
\str_new:N \g__csvsim_curfilename_str
\str_new:N \g__csvsim_filename_str
+
\str_new:N \l__csvsim_csvsorter_command_str
\str_new:N \l__csvsim_csvsorter_configpath_str
\str_new:N \l__csvsim_csvsorter_log_str
\str_new:N \l__csvsim_csvsorter_token_str
\str_new:N \l__csvsim_ppfilename_str
\str_new:N \l__csvsim_temp_filename_str
+\str_new:N \l__csvsim_tmpa_str
+\str_new:N \l__csvsim_tmpb_str
\tl_const:Nn \c__csvsim_par_tl { \par }
@@ -104,16 +114,19 @@
\tl_new:N \g__csvsim_hook_late_after_first_line_tl
\tl_new:N \g__csvsim_hook_late_after_head_tl
\tl_new:N \g__csvsim_hook_late_after_last_line_tl
-\tl_new:N \g__csvsim_hook_late_after_line_tl
\tl_new:N \g__csvsim_hook_late_after_line_application_tl
+\tl_new:N \g__csvsim_hook_late_after_line_tl
\tl_new:N \g__csvsim_hook_table_begin_tl
\tl_new:N \g__csvsim_hook_table_end_tl
\tl_new:N \g__csvsim_preprocessor_tl
\tl_new:N \g__csvsim_separator_tl
\tl_new:N \g__csvsim_table_foot_tl
\tl_new:N \g__csvsim_table_head_tl
+\tl_new:N \g__csvsim_tmpa_tl
\tl_new:N \l__csvsim_filter_condition_tl
+\tl_new:N \l__csvsim_tmpa_tl
+\tl_new:N \l__csvsim_tmpb_tl
\group_begin:
@@ -164,9 +177,9 @@
{
\group_begin:
\g__csvsim_catcode_tl
- \ior_get:NNTF \g__csvsim_ior \l_tmpa_tl
+ \ior_get:NNTF \g__csvsim_ior \l__csvsim_tmpa_tl
{
- \tl_gset_eq:NN \csvline \l_tmpa_tl
+ \tl_gset_eq:NN \csvline \l__csvsim_tmpa_tl
\int_gincr:N \g_csvsim_inputline_int
}
{
@@ -199,13 +212,15 @@
\cs_new_protected_nopar:Npn \__csvsim_process_head_name:n #1
{
- \tl_set:No \l_tmpa_tl {\cs:w csvcol\int_to_roman:n{#1} \cs_end:}
- \exp_args:NnV \cs_set_nopar:cpn {__csvsim__/\l_tmpa_tl} \l_tmpa_tl
+ \tl_set:No \l__csvsim_tmpa_tl {\cs:w csvcol\int_to_roman:n{#1} \cs_end:}
+ \exp_args:NnV \cs_set_nopar:cpn {__csvsim__/\l__csvsim_tmpa_tl} \l__csvsim_tmpa_tl
\bool_if:NT \g__csvsim_head_to_colnames_bool
{
- \tl_set:No \l_tmpb_tl {\cs:w \g__csvsim_headname_prefix_tl \l_tmpa_tl \cs_end:}
- \tl_put_right:NV \l_tmpb_tl \l_tmpa_tl
- \exp_args:NNV \seq_gput_right:Nn \g__csvsim_colname_seq \l_tmpb_tl
+ \exp_args:NNe \seq_gput_right:Nn \g__csvsim_colname_seq
+ {
+ \exp_not:o { \cs:w \g__csvsim_headname_prefix_tl \l__csvsim_tmpa_tl \cs_end: }
+ \exp_not:o { \l__csvsim_tmpa_tl }
+ }
}
}
@@ -215,7 +230,7 @@
\__csvsim_read_line:
\tl_if_eq:NNTF \csvline \c__csvsim_par_tl
{
- \msg_error:nnx { csvsimple }{ empty-head }{ \g__csvsim_filename_str }
+ \msg_error:nne { csvsimple }{ empty-head }{ \g__csvsim_filename_str }
}
{
\int_gzero:N \g_csvsim_columncount_int
@@ -232,20 +247,24 @@
{
\cs_if_exist:cTF {__csvsim__/#1}
{
- \tl_set:Nv \l_tmpa_tl {__csvsim__/#1}
- \tl_put_left:Nn \l_tmpa_tl {#2}
- \exp_args:NNV \seq_gput_right:Nn \g__csvsim_colname_seq \l_tmpa_tl
+ \exp_args:NNe \seq_gput_right:Nn \g__csvsim_colname_seq
+ {
+ \exp_not:n { #2 }
+ \exp_not:v { __csvsim__/#1 }
+ }
}
{
\regex_match:NnTF \c__csvsim_integer_regex {#1}
{
- \tl_set:No \l_tmpa_tl {\cs:w csvcol\int_to_roman:n{#1} \cs_end:}
- \tl_put_left:Nn \l_tmpa_tl {#2}
- \exp_args:NNV \seq_gput_right:Nn \g__csvsim_colname_seq \l_tmpa_tl
+ \exp_args:NNe \seq_gput_right:Nn \g__csvsim_colname_seq
+ {
+ \exp_not:n { #2 }
+ \exp_not:o { \cs:w csvcol\int_to_roman:n{#1} \cs_end: }
+ }
}
{
- \str_set:Nn \l_tmpb_str {#2}
- \msg_error:nnxx { csvsimple }{ column-name }{ #1 }{ \l_tmpb_str }
+ \str_set:Nn \l__csvsim_tmpb_str {#2}
+ \msg_error:nnee { csvsimple }{ column-name }{ #1 }{ \l__csvsim_tmpb_str }
}
}
}
@@ -284,7 +303,7 @@
\int_gset_eq:NN \g__csvsim_colmax_int \c_one_int
\bool_if:NT \g__csvsim_collect_data_bool
{
- \__csvsim_collect_data:
+ \__csvsim_collect_data_begin:
}
% open file
@@ -368,10 +387,10 @@
% clear macros
\int_step_inline:nn \g__csvsim_colmax_int
{
- \tl_set:No \l_tmpa_tl {\cs:w csvcol\int_to_roman:n{##1} \cs_end:}
- \use:x
+ \tl_set:No \l__csvsim_tmpa_tl {\cs:w csvcol\int_to_roman:n{##1} \cs_end:}
+ \use:e
{
- \exp_not:N\tl_gclear:N \exp_not:V\l_tmpa_tl
+ \exp_not:N\tl_gclear:N \exp_not:V\l__csvsim_tmpa_tl
}
}
\__csvsim_set_colnames:
@@ -384,8 +403,7 @@
\g__csvsim_hook_after_reading_tl
\bool_if:NT \g__csvsim_collect_data_bool
{
- \exp_args:NV \tl_gset_eq:NN \g__csvsim_data_collection_tl \g__csvsim_collect_tl
- \tl_gclear:N \g__csvsim_collect_tl
+ \__csvsim_collect_data_end:
}
}
@@ -408,25 +426,6 @@
%---- auxiliary user macros
-% \NewDocumentCommand \csvlinetotablerow { }
- % {
- % \tl_clear:N \l_tmpa_tl
- % \bool_set_false:N \l_tmpa_bool
- % \seq_map_inline:Nn \g__csvsim_line_seq
- % {
- % \bool_if:NTF \l_tmpa_bool
- % {
- % \tl_put_right:Nn \l_tmpa_tl { & ##1 }
- % }
- % {
- % \tl_put_right:Nn \l_tmpa_tl { ##1 }
- % \bool_set_true:N \l_tmpa_bool
- % }
- % }
- % \l_tmpa_tl
- % }
-
-
\NewExpandableDocumentCommand \csvlinetotablerow { }
{
\seq_use:Nn \g__csvsim_line_seq { & }
@@ -475,44 +474,50 @@
}
-\NewExpandableDocumentCommand \ifcsvstrcmp { m m }
+%---- String and Number Tests
+
+
+\NewExpandableDocumentCommand \IfCsvsimStrEqualTF { }
{
- \str_compare:eNeTF {#1} = {#2}
+ \str_if_eq:eeTF
}
+\NewCommandCopy \ifcsvstrcmp \IfCsvsimStrEqualTF
\NewExpandableDocumentCommand \ifcsvnotstrcmp { m m +m +m }
{
- \ifcsvstrcmp{#1}{#2}{#4}{#3}
+ \IfCsvsimStrEqualTF{#1}{#2}{#4}{#3}
}
-\NewDocumentCommand \ifcsvstrequal { m m }
+\NewDocumentCommand \IfCsvsimTlEqualTF { }
{
- \tl_set:Nx \l_tmpa_tl {#1}
- \tl_set:Nx \l_tmpb_tl {#2}
- \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl
+ \tl_if_eq:eeTF
}
+\NewCommandCopy \ifcsvstrequal \IfCsvsimTlEqualTF
-\NewDocumentCommand \ifcsvprostrequal { m m }
+\NewDocumentCommand \IfCsvsimTlProtectedEqualTF { m m }
{
- \protected@edef \l_tmpa_tl {#1}
- \protected@edef \l_tmpb_tl {#2}
- \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl
+ \protected@edef \l__csvsim_tmpa_tl {#1}
+ \protected@edef \l__csvsim_tmpb_tl {#2}
+ \tl_if_eq:NNTF \l__csvsim_tmpa_tl \l__csvsim_tmpb_tl
}
+\NewCommandCopy \ifcsvprostrequal \IfCsvsimTlProtectedEqualTF
-\NewExpandableDocumentCommand \ifcsvfpcmp { m }
+\NewExpandableDocumentCommand \IfCsvsimFpCompareTF { m }
{
\fp_compare:nTF {#1}
}
+\NewCommandCopy \ifcsvfpcmp \IfCsvsimFpCompareTF
-\NewExpandableDocumentCommand \ifcsvintcmp { m }
+\NewExpandableDocumentCommand \IfCsvsimIntCompareTF { m }
{
\int_compare:nTF {#1}
}
+\NewCommandCopy \ifcsvintcmp \IfCsvsimIntCompareTF
%---- filename functions
@@ -525,15 +530,15 @@
\str_set:Nn \l__csvsim_temp_filename_str {#1}
}
{
- \str_set:Nn \l_tmpa_str {#1}
- \str_if_empty:NF \l_tmpa_str
+ \str_set:Nn \l__csvsim_tmpa_str {#1}
+ \str_if_empty:NF \l__csvsim_tmpa_str
{
- \str_compare:eNeF { \str_item:Nn \l_tmpa_str {-1} } = { / }
+ \str_compare:eNeF { \str_item:Nn \l__csvsim_tmpa_str {-1} } = { / }
{
- \str_put_right:Nn \l_tmpa_str {/}
+ \str_put_right:Nn \l__csvsim_tmpa_str {/}
}
\str_concat:NNN \l__csvsim_temp_filename_str
- \l_tmpa_str \l__csvsim_temp_filename_str
+ \l__csvsim_tmpa_str \l__csvsim_temp_filename_str
}
}
}
@@ -635,7 +640,7 @@
no~check~column~count .meta:n = { check~column~count=false },
warn~on~column~count~error .meta:n = { on~column~count~error=
{
- \msg_warning:nnxxxx { csvsimple }{ column-wrong-count }
+ \msg_warning:nneeee { csvsimple }{ column-wrong-count }
{ \int_use:N\g__csvsim_col_int }
{ \int_use:N\g_csvsim_columncount_int }
{ \int_use:N\g_csvsim_inputline_int }
@@ -840,51 +845,51 @@
{
\tl_if_in:nnTF {#1}{-}
{
- \seq_set_split:Nnn \l_tmpa_seq {-} {#1}
- \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
- \seq_pop_left:NN \l_tmpa_seq \l_tmpb_tl
- \tl_if_empty:NTF \l_tmpa_tl
+ \seq_set_split:Nnn \l__csvsim_tmpa_seq {-} {#1}
+ \seq_pop_left:NN \l__csvsim_tmpa_seq \l__csvsim_tmpa_tl
+ \seq_pop_left:NN \l__csvsim_tmpa_seq \l__csvsim_tmpb_tl
+ \tl_if_empty:NTF \l__csvsim_tmpa_tl
{
- \int_set_eq:NN \l_tmpa_int \c_one_int
+ \int_set_eq:NN \l__csvsim_tmpa_int \c_one_int
}
{
- \int_set:Nn \l_tmpa_int { \l_tmpa_tl }
+ \int_set:Nn \l__csvsim_tmpa_int { \l__csvsim_tmpa_tl }
}
- \tl_if_empty:NTF \l_tmpb_tl
+ \tl_if_empty:NTF \l__csvsim_tmpb_tl
{
- \int_set_eq:NN \l_tmpb_int \c_max_int
+ \int_set_eq:NN \l__csvsim_tmpb_int \c_max_int
}
{
- \int_set:Nn \l_tmpb_int { \l_tmpb_tl }
+ \int_set:Nn \l__csvsim_tmpb_int { \l__csvsim_tmpb_tl }
}
}
{
\tl_if_in:nnTF {#1}{+}
{
- \seq_set_split:Nnn \l_tmpa_seq {+} {#1}
- \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
- \seq_pop_left:NN \l_tmpa_seq \l_tmpb_tl
- \tl_if_empty:NTF \l_tmpa_tl
+ \seq_set_split:Nnn \l__csvsim_tmpa_seq {+} {#1}
+ \seq_pop_left:NN \l__csvsim_tmpa_seq \l__csvsim_tmpa_tl
+ \seq_pop_left:NN \l__csvsim_tmpa_seq \l__csvsim_tmpb_tl
+ \tl_if_empty:NTF \l__csvsim_tmpa_tl
{
- \int_set:Nn \l_tmpa_int { 1 }
+ \int_set:Nn \l__csvsim_tmpa_int { 1 }
}
{
- \int_set:Nn \l_tmpa_int { \l_tmpa_tl }
+ \int_set:Nn \l__csvsim_tmpa_int { \l__csvsim_tmpa_tl }
}
- \tl_if_empty:NTF \l_tmpb_tl
+ \tl_if_empty:NTF \l__csvsim_tmpb_tl
{
- \int_set_eq:NN \l_tmpb_int \l_tmpa_int
+ \int_set_eq:NN \l__csvsim_tmpb_int \l__csvsim_tmpa_int
}
{
- \int_set:Nn \l_tmpb_int { \l_tmpa_int + \l_tmpb_tl - 1 }
+ \int_set:Nn \l__csvsim_tmpb_int { \l__csvsim_tmpa_int + \l__csvsim_tmpb_tl - 1 }
}
}
{
- \int_set:Nn \l_tmpa_int {#1}
- \int_set_eq:NN \l_tmpb_int \l_tmpa_int
+ \int_set:Nn \l__csvsim_tmpa_int {#1}
+ \int_set_eq:NN \l__csvsim_tmpb_int \l__csvsim_tmpa_int
}
}
- \seq_gput_right:Nx \g__csvsim_range_seq {{\int_use:N \l_tmpa_int}{\int_use:N \l_tmpb_int}}
+ \seq_gput_right:Ne \g__csvsim_range_seq {{\int_use:N \l__csvsim_tmpa_int}{\int_use:N \l__csvsim_tmpb_int}}
}
@@ -944,28 +949,29 @@
\cs_new_protected_nopar:Npn \__csvsim_gset_tl_to_collect:N #1
{
- \tl_gset:Nx #1
+ \tl_gset:Ne #1
{
- \exp_not:N \tl_gput_right:Nn
+ \exp_not:N \tl_build_gput_right:Nn
\exp_not:N \g__csvsim_collect_tl
- {\exp_not:V #1}
+ { \exp_not:o { #1 } }
}
}
\cs_new_protected_nopar:Npn \__csvsim_gset_tl_to_collect_expanded:N #1
{
- \tl_gset:Nx #1
+ \tl_gset:Ne #1
{
- \exp_not:N \tl_gput_right:Nx
+ \exp_not:N \tl_build_gput_right:Ne
\exp_not:N \g__csvsim_collect_tl
- {\exp_not:V #1}
+ { \exp_not:o { #1 } }
}
}
-\cs_new_protected_nopar:Npn \__csvsim_collect_data:
+\cs_new_protected_nopar:Npn \__csvsim_collect_data_begin:
{
+ \tl_build_gbegin:N \g__csvsim_collect_tl
\__csvsim_gset_tl_to_collect:N \g__csvsim_hook_after_head_tl
\__csvsim_gset_tl_to_collect:N \g__csvsim_hook_after_first_line_tl
\__csvsim_gset_tl_to_collect:N \g__csvsim_hook_after_line_tl
@@ -976,29 +982,50 @@
\__csvsim_gset_tl_to_collect:N \g__csvsim_hook_late_after_last_line_tl
\__csvsim_gset_tl_to_collect:N \g__csvsim_hook_late_after_line_tl
\__csvsim_gset_tl_to_collect_expanded:N \g__csvsim_body_tl
+ }
+
+
+\cs_new_protected_nopar:Npn \__csvsim_collect_data_end:
+ {
+ \tl_build_gend:N \g__csvsim_collect_tl
+ \bool_if:NTF \g__csvsim_consume_collected_data_bool
+ {
+ \g__csvsim_collect_tl
+ \exp_args:NV \tl_gclear:N \g__csvsim_data_collection_tl
+ }
+ {
+ \exp_args:NV \tl_gset_eq:NN \g__csvsim_data_collection_tl \g__csvsim_collect_tl
+ }
\tl_gclear:N \g__csvsim_collect_tl
}
-\cs_set_eq:NN \csvexpval \exp_not:V
+\cs_set_eq:NN \csvexpval \exp_not:o
\cs_set_eq:NN \csvexpnot \exp_not:N
\NewDocumentCommand{ \csvcollectn }{ +m }
{
- \tl_gput_right:Nn \g__csvsim_collect_tl {#1}
+ \tl_build_gput_right:Nn \g__csvsim_collect_tl {#1}
+ }
+
+
+\NewDocumentCommand{ \csvcollecte }{ +m }
+ {
+ \tl_build_gput_right:Ne \g__csvsim_collect_tl {#1}
}
+% alias for \csvcollecte
\NewDocumentCommand{ \csvcollectx }{ +m }
{
- \tl_gput_right:Nx \g__csvsim_collect_tl {#1}
+ \tl_build_gput_right:Ne \g__csvsim_collect_tl {#1}
}
\NewDocumentCommand{ \csvcollectV }{ m }
{
- \tl_gput_right:NV \g__csvsim_collect_tl #1
+ \tl_build_gput_right:Ne \g__csvsim_collect_tl { \exp_not:o { #1 } }
}
@@ -1006,6 +1033,7 @@
{
collect~data .bool_gset:N = \g__csvsim_collect_data_bool,
data~collection .tl_gset:N = \g__csvsim_data_collection_tl,
+ consume~collected~data .bool_gset:N = \g__csvsim_consume_collected_data_bool,
}
@@ -1139,9 +1167,9 @@
{
\g__csvsim_begin_table_center_tl
\g__csvsim_before_table_tl
- \tl_gset:Nn \g_tmpa_tl {\begin{#1}}
- \tl_gput_right:NV \g_tmpa_tl \g__csvsim_generic_table_options_tl
- \g_tmpa_tl
+ \tl_gset:Nn \g__csvsim_tmpa_tl {\begin{#1}}
+ \tl_gput_right:NV \g__csvsim_tmpa_tl \g__csvsim_generic_table_options_tl
+ \g__csvsim_tmpa_tl
\g__csvsim_table_head_tl
}
{
@@ -1155,25 +1183,28 @@
generic~collected~table .meta:n =
{
collect~data,
+ consume~collected~data = true,
_table_ =
{
- \tl_gput_right:NV \g__csvsim_collect_tl \g__csvsim_begin_table_center_tl
- \tl_gput_right:NV \g__csvsim_collect_tl \g__csvsim_before_table_tl
- \tl_gput_right:Nn \g__csvsim_collect_tl { \begin{#1} }
- \tl_gput_right:NV \g__csvsim_collect_tl \g__csvsim_generic_table_options_tl
- \tl_gput_right:NV \g__csvsim_collect_tl \g__csvsim_table_head_tl
+ \tl_build_gput_right:Ne \g__csvsim_collect_tl
+ {
+ \exp_not:o { \g__csvsim_begin_table_center_tl }
+ \exp_not:o { \g__csvsim_before_table_tl }
+ \exp_not:n { \begin{#1} }
+ \exp_not:o { \g__csvsim_generic_table_options_tl }
+ \exp_not:o { \g__csvsim_table_head_tl }
+ }
}
{
- \tl_gput_right:NV \g__csvsim_collect_tl \g__csvsim_table_foot_tl
- \tl_gput_right:Nn \g__csvsim_collect_tl { \end{#1} }
- \tl_gput_right:NV \g__csvsim_collect_tl \g__csvsim_after_table_tl
- \tl_gput_right:NV \g__csvsim_collect_tl \g__csvsim_end_table_center_tl
+ \tl_build_gput_right:Ne \g__csvsim_collect_tl
+ {
+ \exp_not:o { \g__csvsim_table_foot_tl }
+ \exp_not:n { \end{#1} }
+ \exp_not:o { \g__csvsim_after_table_tl }
+ \exp_not:o { \g__csvsim_end_table_center_tl }
+ }
},
late~after~line = \\,
- after~reading =
- {
- \tl_use:N \g__csvsim_collect_tl
- },
},
}
@@ -1338,9 +1369,9 @@
_autotabularray_ = {#1},
generic~table~options =
{ {
- row{1} = {font=\bfseries},
- hline{1,Z} = {0.8pt},
- hline{2} = {0.4pt},
+ row{1} = {font=\bfseries,preto=\MakeUppercase},
+ hline{1,Z} = {0.08em},
+ hline{2} = {0.05em},
} }
},
autotabularray* .meta:n =
@@ -1348,7 +1379,7 @@
_autotabularray_ = {#1},
generic~table~options =
{ {
- hline{1,Z} = {0.8pt},
+ hline{1,Z} = {0.08em},
} }
},
_autolongtabularray_ .meta:n =
@@ -1363,9 +1394,9 @@
_autolongtabularray_ = {#1},
generic~table~options =
{ {
- row{1} = {font=\bfseries},
- hline{1,Z} = {0.8pt},
- hline{2} = {0.4pt},
+ row{1} = {font=\bfseries,preto=\MakeUppercase},
+ hline{1,Z} = {0.08em},
+ hline{2} = {0.05em},
} }
},
autolongtabularray* .meta:n =
@@ -1373,7 +1404,7 @@
_autolongtabularray_ = {#1},
generic~table~options =
{ {
- hline{1,Z} = {0.8pt},
+ hline{1,Z} = {0.08em},
} }
},
}
@@ -1441,14 +1472,14 @@
{
\keys_set:nn { csvsim } { autotabularray={#3}, #2}
}
- \IfNoValueF {#4}
+ \IfValueT {#4}
{
- \IfNoValueTF {#5}
+ \IfValueTF {#5}
{
- \keys_set:nn { csvsim } { generic~table~options = { { #4 } } }
+ \keys_set:nn { csvsim } { generic~table~options = { [ #4 ]{ #5 } } }
}
{
- \keys_set:nn { csvsim } { generic~table~options = { [ #4 ]{ #5 } } }
+ \keys_set:nn { csvsim } { generic~table~options = { { #4 } } }
}
}
\__csvsim_loop:
@@ -1465,14 +1496,14 @@
{
\keys_set:nn { csvsim } { autolongtabularray={#3}, #2}
}
- \IfNoValueF {#4}
+ \IfValueT {#4}
{
- \IfNoValueTF {#5}
+ \IfValueTF {#5}
{
- \keys_set:nn { csvsim } { generic~table~options = { { #4 } } }
+ \keys_set:nn { csvsim } { generic~table~options = { [ #4 ]{ #5 } } }
}
{
- \keys_set:nn { csvsim } { generic~table~options = { [ #4 ]{ #5 } } }
+ \keys_set:nn { csvsim } { generic~table~options = { { #4 } } }
}
}
\__csvsim_loop:
@@ -1532,7 +1563,7 @@
\sys_if_shell_unrestricted:TF
{
\__csvsim_set_temp_filename:n { #1 }
- \msg_note:nnxx { csvsimple }{ sort-info }{ #2 }{ \l__csvsim_temp_filename_str }
+ \msg_note:nnee { csvsimple }{ sort-info }{ #2 }{ \l__csvsim_temp_filename_str }
\cs_if_exist:NF \g__csvsim_iow
{
\iow_new:N \g__csvsim_iow
@@ -1540,7 +1571,7 @@
\iow_open:Nn \g__csvsim_iow { \l__csvsim_csvsorter_token_str }
\iow_now:Nn \g__csvsim_iow { \ExplSyntaxOn \msg_error:nn { csvsimple }{ sort-error } \ExplSyntaxOff }
\iow_close:N \g__csvsim_iow
- \sys_shell_now:x
+ \sys_shell_now:e
{
"\l__csvsim_csvsorter_command_str" \c_space_tl
-c~ "\l__csvsim_csvsorter_configpath_str/\l__csvsim_temp_filename_str" \c_space_tl
@@ -1576,6 +1607,7 @@
head~to~column~names~prefix = ,
head~to~column~names = false,
collect~data = false,
+ consume~collected~data = false,
column~count = 0,
on~column~count~error =,
range =,
diff --git a/macros/latex/contrib/csvsimple/csvsimple-l3.tex b/macros/latex/contrib/csvsimple/csvsimple-l3.tex
index 3377217755..9fad48644d 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-l3.tex
+++ b/macros/latex/contrib/csvsimple/csvsimple-l3.tex
@@ -1,11 +1,11 @@
% \LaTeX-Main\
% !TeX encoding=UTF-8
% !TeX spellcheck=en_US
-%% The LaTeX package csvsimple - version 2.5.0 (2023/10/16)
+%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
%% csvsimple.tex: Manual
%%
%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2008-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% Copyright (c) 2008-2024 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
@@ -26,8 +26,8 @@
\usepackage{\csvpkgprefix csvsimple-l3}
-\tcbmakedocSubKey{docCsvKey}{csvsim}
-\tcbmakedocSubKeys{docCsvKeys}{csvsim}
+\tcbmakedocSubKey[doc key prefix=]{docCsvKey}{csvsim}
+\tcbmakedocSubKeys[doc key prefix=]{docCsvKeys}{csvsim}
\hypersetup{
pdftitle={Manual for the csvsimple-l3 package},
@@ -143,7 +143,7 @@ Not automatically loaded, but used for many examples are the packages
\clearpage
\subsection{First Steps}
Every line of a processable CSV file has to contain an identical amount of
-comma\footnote{See \refKey{/csvsim/separator} for other separators than comma.} separated values. The curly braces |{}| of \TeX\ groups can be used
+comma\footnote{See \refKey{csvsim/separator} for other separators than comma.} separated values. The curly braces |{}| of \TeX\ groups can be used
to mask a block which may contain commas not to be processed as separators.
The first line of such a CSV file is usually but not necessarily a header line
@@ -193,7 +193,7 @@ assigned to \TeX\ macros which may be used deliberately.
\clearpage
|\csvreader| is controlled by a plenty of options. For example, for table
applications line breaks are easily inserted by
-\refKey{/csvsim/late after line}. This defines a macro execution just before
+\refKey{csvsim/late after line}. This defines a macro execution just before
the following line.
Additionally, the assignment of columns to \TeX\ macros is shown in a non automated
way.
@@ -231,10 +231,10 @@ using \refCom{csvstyle} or |keys_define:nn| from |l3keys|.
\clearpage
The next example shows such a style definition with the convenience macro
\refCom{csvstyle}. Here, we see again the automated assignment of header
-entries to column names by \refKey{/csvsim/head to column names}.
+entries to column names by \refKey{csvsim/head to column names}.
For this, the header entries have to be without spaces and special characters.
But you can always assign entries to canonical macro names manually like in the examples
-above. Here, we also add a \refKey{/csvsim/head to column names prefix} to avoid
+above. Here, we also add a \refKey{csvsim/head to column names prefix} to avoid
macro name clashes.
\begin{dispExample}
@@ -344,7 +344,7 @@ a certificate is printed only for students with grade unequal to 5.0.
]{grade.csv}
{1=\name,2=\firstname,3=\matnumber,4=\gender,5=\grade}{%
\begin{center}\Large\bfseries Certificate in Mathematics\end{center}
- \large\ifcsvstrcmp{\gender}{f}{Ms.}{Mr.}
+ \large\IfCsvsimStrEqualTF{\gender}{f}{Ms.}{Mr.}
\firstname~\name, matriculation number \matnumber, has passed the test
in mathematics with grade \grade.\par\ldots\par
}%
@@ -406,7 +406,7 @@ Mainly, the |\csvreader| command consists of a \refCom{csvloop} macro with
following parameters:\par
|\csvloop{|\meta{options}|, file=|\meta{file name}|, column names=|\meta{assignments}|,|\\
\hspace*{2cm} |command=|\meta{command list}|}|\par
- Therefore, the application of the keys \refKey{/csvsim/file} and \refKey{/csvsim/command}
+ Therefore, the application of the keys \refKey{csvsim/file} and \refKey{csvsim/command}
is useless for |\csvreader|.
\end{docCommand}
@@ -436,8 +436,8 @@ is useless for |\csvreader|.
\refCom{csvreader} and \refCom{csvloop}.
Note that most options are set to default values at the begin of these
commands and therefore cannot be defined reasonable by \refCom{csvset}.
- But it may be used for options like \refKey{/csvsim/csvsorter command}
- to give global settings. Also see \refKey{/csvsim/every csv}.
+ But it may be used for options like \refKey{csvsim/csvsorter command}
+ to give global settings. Also see \refKey{csvsim/every csv}.
\end{docCommand}
@@ -575,12 +575,12 @@ purpose:
\begin{docCommand}{csvfilteraccept}{}
All following consistent data lines will be accepted and processed.
This command overwrites all previous filter settings and may be used
- inside \refKey{/csvsim/full filter} to implement
+ inside \refKey{csvsim/full filter} to implement
an own filtering rule together with |\csvfilterreject|.
\begin{dispExample}
\csvreader[
autotabular,
- full filter = \ifcsvstrcmp{\csvcoliv}{m}{\csvfilteraccept}{\csvfilterreject}
+ full filter = \IfCsvsimStrEqualTF{\csvcoliv}{m}{\csvfilteraccept}{\csvfilterreject}
]{grade.csv}{}{%
\csvlinetotablerow
}
@@ -633,7 +633,7 @@ purpose:
}
Typesets the number of columns of the current CSV file. This number
is either computed from the first valid line (header or data) or
- given by \refKey{/csvsim/column count}.
+ given by \refKey{csvsim/column count}.
Despite of the name, there is no associated \LaTeX\ counter |csvcolumncount|,
but \refCom{thecsvcolumncount} accesses the \LaTeX3 integer
\refCom{g_csvsim_columncount_int}.
@@ -689,7 +689,7 @@ for the general table options in combination with \refCom{csvreader} and
}
|\csvautotabular| or |\csvautotabular*|
is an abbreviation for the application of the option key
- \refKey{/csvsim/autotabular} or \refKey{/csvsim/autotabular*}
+ \refKey{csvsim/autotabular} or \refKey{csvsim/autotabular*}
together with other \meta{options} to \refCom{csvloop}.
This macro reads the whole CSV file denoted by \meta{file name}
with an automated formatting.
@@ -713,7 +713,7 @@ for the general table options in combination with \refCom{csvreader} and
}
|\csvautolongtable| or |\csvautolongtable*|
is an abbreviation for the application of the option key
- \refKey{/csvsim/autolongtable} or \refKey{/csvsim/autolongtable*}
+ \refKey{csvsim/autolongtable} or \refKey{csvsim/autolongtable*}
together with other \meta{options} to \refCom{csvloop}.
This macro reads the whole CSV file denoted by \meta{file name}
with an automated formatting.
@@ -739,7 +739,7 @@ for the general table options in combination with \refCom{csvreader} and
}
|\csvautobooktabular| or |\csvautobooktabular*|
is an abbreviation for the application of the option key
- \refKey{/csvsim/autobooktabular} or \refKey{/csvsim/autobooktabular*}
+ \refKey{csvsim/autobooktabular} or \refKey{csvsim/autobooktabular*}
together with other \meta{options} to \refCom{csvloop}.
This macro reads the whole CSV file denoted by \meta{file name}
with an automated formatting.
@@ -761,7 +761,7 @@ for the general table options in combination with \refCom{csvreader} and
}
|\csvautobooklongtable| or |\csvautobooklongtable*|
is an abbreviation for the application of the option key
- \refKey{/csvsim/autobooklongtable} or \refKey{/csvsim/autobooklongtable*}
+ \refKey{csvsim/autobooklongtable} or \refKey{csvsim/autobooklongtable*}
together with other \meta{options} to \refCom{csvloop}.
This macro reads the whole CSV file denoted by \meta{file name}
with an automated formatting.
@@ -779,17 +779,16 @@ for the general table options in combination with \refCom{csvreader} and
\begin{docCommands}[
doc parameter = \oarg{options}\marg{file name}\oarg{taboptions 1}\oarg{taboptions 2},
- doc new = 2023-10-13
]
{
- { doc name = csvautotabularray },
+ { doc name = csvautotabularray, doc new and updated={2023-10-13}{2023-10-17}, },
{ doc name = csvautotabularray* },
{ doc name = csvautolongtabularray },
{ doc name = csvautolongtabularray* },
}
These macros are abbreviations for the application of the option keys
- \refKey{/csvsim/autotabularray}, \refKey{/csvsim/autotabularray*},\\
- \refKey{/csvsim/autolongtabularray}, or \refKey{/csvsim/autolongtabularray*}
+ \refKey{csvsim/autotabularray}, \refKey{csvsim/autotabularray*},\\
+ \refKey{csvsim/autolongtabularray}, or \refKey{csvsim/autolongtabularray*}
together with other \meta{options} to \refCom{csvloop}.
These macros read the whole CSV file denoted by \meta{file name}
with an automated formatting.
@@ -799,22 +798,22 @@ for the general table options in combination with \refCom{csvreader} and
\refCom{csvautolongtabularray} uses the \docAuxEnvironment*{longtblr} environment.
The star variants treat the first line as data line and not as header line.\par
Options to the table environments from \ctanpkg{tabularray} may be given
- by either setting \refKey{/csvsim/generic table options} or
+ by either setting \refKey{csvsim/generic table options} or
using \meta{taboptions 1} and \meta{taboptions 2}.\par
The default setting is
\begin{dispListing}
generic table options =
{ {
- row{1} = {font=\bfseries},
- hline{1,Z} = {0.8pt},
- hline{2} = {0.4pt},
+ row{1} = {font=\bfseries,preto=\MakeUppercase},
+ hline{1,Z} = {0.08em},
+ hline{2} = {0.05em},
} }
\end{dispListing}
For the star variants, the default setting is
\begin{dispListing}
generic table options =
{ {
- hline{1,Z} = {0.8pt},
+ hline{1,Z} = {0.08em},
} }
\end{dispListing}
@@ -829,29 +828,34 @@ Examples:
generic table options =
{{
row{odd} = {red!85!gray!7},
- row{1} = {bg=red!85!gray, fg=white, font=\bfseries},
+ row{1} = {bg=red!85!gray, fg=white,
+ font=\bfseries, preto=\MakeUppercase},
}}
- ]
- {grade.csv}
+ ] {grade.csv}
\end{dispExample}
\clearpage
-Alternatively to \refKey{/csvsim/generic table options}
+Alternatively to \refKey{csvsim/generic table options}
(and overruling this option), one may give options to
\docAuxEnvironment*{tblr} or \docAuxEnvironment*{longtblr}
using \meta{taboptions 1} and \meta{taboptions 2}.
If \meta{taboptions 2} is \emph{not present}, then \meta{taboptions 1}
-is used as mandatory argument.
-Otherwise, \meta{taboptions 1} is used as optional argument and
-\meta{taboptions 2} as mandatory argument.
+is used as
+mandatory argument (\ctanpkg{tabularray} inner specification).
+Otherwise, \meta{taboptions 1} is used as
+optional argument (\ctanpkg{tabularray} outer specification)
+and
+\meta{taboptions 2} as
+mandatory argument (\ctanpkg{tabularray} inner specification).
\begin{dispExample}
\csvautotabularray[table centered]
{grade.csv}
[
row{odd} = {red!85!gray!7},
- row{1} = {bg=red!85!gray, fg=white, font=\bfseries},
+ row{1} = {bg=red!85!gray, fg=white,
+ font=\bfseries, preto=\MakeUppercase},
]
\end{dispExample}
@@ -866,7 +870,8 @@ Otherwise, \meta{taboptions 1} is used as optional argument and
]
[
row{odd} = {red!85!gray!7},
- row{1} = {bg=red!85!gray, fg=white, font=\bfseries},
+ row{1} = {bg=red!85!gray, fg=white,
+ font=\bfseries, preto=\MakeUppercase},
]
\end{dispExample}
@@ -877,7 +882,7 @@ Otherwise, \meta{taboptions 1} is used as optional argument and
\clearpage
\section{Option Keys}\label{sec:schluessel}%
For the \meta{options} in \refCom{csvreader} respectively \refCom{csvloop}
-the following |l3keys| keys can be applied. The \meta{module} name |/csvsim/| is not
+the following |l3keys| keys can be applied. The \meta{module} name |csvsim| is not
to be used inside these macros.
@@ -895,15 +900,15 @@ to be used inside these macros.
\begin{docCsvKey}{before filter}{=\meta{code}}{no default, initially empty}
Sets the \meta{code} to be executed after reading and consistency checking
of a data line. It is executed before any filter condition is checked,
- see e.g. \refKey{/csvsim/filter ifthen} and
- also see \refKey{/csvsim/full filter}.
+ see e.g. \refKey{csvsim/filter ifthen} and
+ also see \refKey{csvsim/full filter}.
No additions to the input stream should be given here.
All line entries are available.
\end{docCsvKey}
\begin{docCsvKey}[][doc new=2021-07-06]{after filter}{=\meta{code}}{no default, initially empty}
Sets the \meta{code} to be executed for an accepted line after
- \refKey{/csvsim/late after line} and before \refKey{/csvsim/before line}.
+ \refKey{csvsim/late after line} and before \refKey{csvsim/before line}.
All line entries are available.
No additions to the input stream should be given here. \meta{code} may
contain processing of data content to generate new values.
@@ -919,73 +924,73 @@ to be used inside these macros.
\begin{docCsvKey}{late after line}{=\meta{code}}{no default, initially empty}
Sets the \meta{code} to be executed after reading and disassembling
- of the next accepted data line (after \refKey{/csvsim/before filter}).
+ of the next accepted data line (after \refKey{csvsim/before filter}).
These operations are executed before further processing of this line.
\meta{code} should not refer to any data content, but may be something
like |\\|.
- \refKey{/csvsim/late after line} overwrites
- \refKey{/csvsim/late after first line} and
- \refKey{/csvsim/late after last line}.
- Note that table options like \refKey{/csvsim/tabular} set this key to |\\|
+ \refKey{csvsim/late after line} overwrites
+ \refKey{csvsim/late after first line} and
+ \refKey{csvsim/late after last line}.
+ Note that table options like \refKey{csvsim/tabular} set this key to |\\|
automatically.
\end{docCsvKey}
\begin{docCsvKey}{late after first line}{=\meta{code}}{no default, initially empty}
Sets the \meta{code} to be executed after reading and disassembling
- of the second accepted data line instead of \refKey{/csvsim/late after line}.
+ of the second accepted data line instead of \refKey{csvsim/late after line}.
\meta{code} should not refer to any data content.
- This key has to be set after \refKey{/csvsim/late after line}.
+ This key has to be set after \refKey{csvsim/late after line}.
\end{docCsvKey}
\begin{docCsvKey}{late after last line}{=\meta{code}}{no default, initially empty}
Sets the \meta{code} to be executed after processing of the last
- accepted data line instead of \refKey{/csvsim/late after line}.
+ accepted data line instead of \refKey{csvsim/late after line}.
\meta{code} should not refer to any data content.
- This key has to be set after \refKey{/csvsim/late after line}.
+ This key has to be set after \refKey{csvsim/late after line}.
\end{docCsvKey}
\begin{docCsvKey}{before line}{=\meta{code}}{no default, initially empty}
- Sets the \meta{code} to be executed after \refKey{/csvsim/after filter}
- and before \refKey{/csvsim/command}.
+ Sets the \meta{code} to be executed after \refKey{csvsim/after filter}
+ and before \refKey{csvsim/command}.
All line entries are available.
- \refKey{/csvsim/before line} overwrites
- \refKey{/csvsim/before first line}.
+ \refKey{csvsim/before line} overwrites
+ \refKey{csvsim/before first line}.
\end{docCsvKey}
\begin{docCsvKey}{before first line}{=\meta{code}}{no default, initially empty}
- Sets the \meta{code} to be executed instead of \refKey{/csvsim/before line}
+ Sets the \meta{code} to be executed instead of \refKey{csvsim/before line}
for the first accepted data line.
All line entries are available.
- This key has to be set after \refKey{/csvsim/before line}.
+ This key has to be set after \refKey{csvsim/before line}.
\end{docCsvKey}
\pagebreak
\begin{docCsvKey}{command}{=\meta{code}}{no default, initially \cs{csvline}}
Sets the \meta{code} to be executed for every accepted data line.
- It is executed between \refKey{/csvsim/before line} and \refKey{/csvsim/after line}.
- \refKey{/csvsim/command} describes the main processing of the line
- entries. \refCom{csvreader} sets \refKey{/csvsim/command} as mandatory
+ It is executed between \refKey{csvsim/before line} and \refKey{csvsim/after line}.
+ \refKey{csvsim/command} describes the main processing of the line
+ entries. \refCom{csvreader} sets \refKey{csvsim/command} as mandatory
parameter.
\end{docCsvKey}
\begin{docCsvKey}{after line}{=\meta{code}}{no default, initially empty}
Sets the \meta{code} to be executed for every accepted data line
- after \refKey{/csvsim/command}.
+ after \refKey{csvsim/command}.
All line entries are still available.
- \refKey{/csvsim/after line} overwrites \refKey{/csvsim/after first line}.
+ \refKey{csvsim/after line} overwrites \refKey{csvsim/after first line}.
\end{docCsvKey}
\begin{docCsvKey}{after first line}{=\meta{code}}{no default, initially empty}
- Sets the \meta{code} to be executed instead of \refKey{/csvsim/after line}
+ Sets the \meta{code} to be executed instead of \refKey{csvsim/after line}
for the first accepted data line.
All line entries are still available.
- This key has to be set after \refKey{/csvsim/after line}.
+ This key has to be set after \refKey{csvsim/after line}.
\end{docCsvKey}
\begin{docCsvKey}{after reading}{=\meta{code}}{no default, initially empty}
@@ -995,7 +1000,7 @@ to be used inside these macros.
\bigskip
The following example illustrates the sequence of command execution.
-Note that \refKey{/csvsim/command} is set by the mandatory last
+Note that \refKey{csvsim/command} is set by the mandatory last
parameter of \refCom{csvreader}.
\begin{dispExample}
@@ -1063,14 +1068,14 @@ see Section~\ref{subsec:tabsupport} from page~\pageref{subsec:tabsupport}.
used as feasible \LaTeX\ macro names.
Note that the macro definition is \emph{global} and may therefore override
existing macros for the rest of the document. Adding
- \refKey{/csvsim/head to column names prefix} may help to avoid unwanted
+ \refKey{csvsim/head to column names prefix} may help to avoid unwanted
overrides.
\end{docCsvKey}
\begin{docCsvKey}[][doc new=2019-07-16]{head to column names prefix}{=\meta{text}}{no default, initially empty}
The given \meta{text} is prefixed to the name of all macros generated by
- \refKey{/csvsim/head to column names}. For example, if you use the settings
+ \refKey{csvsim/head to column names}. For example, if you use the settings
\begin{dispListing}
head to column names,
head to column names prefix=MY,
@@ -1082,7 +1087,7 @@ see Section~\ref{subsec:tabsupport} from page~\pageref{subsec:tabsupport}.
\begin{docCsvKey}[][doc new=2022-02-01]{column names detection}{\colOpt{=true\textbar false}}{default |true|, initially |true|}
If this key is set, the header line is detected for names which can be used
- for \refKey{/csvsim/column names} and \refKey{/csvsim/head to column names}.
+ for \refKey{csvsim/column names} and \refKey{csvsim/head to column names}.
Otherwise, these options are not functional.\\
This key can and should be set to |false|, if the header line contains
macros or characters not allowed inside \LaTeX\ control sequences, because
@@ -1109,10 +1114,10 @@ see Section~\ref{subsec:tabsupport} from page~\pageref{subsec:tabsupport}.
\begin{docCsvKey}[][doc updated=2021-06-24]{column count}{=\meta{number}}{no default, initially |0|}
Sets the \meta{number} of feasible entries per data line.
- If \refKey{/csvsim/column count} is set to |0|, the number of entries of
+ If \refKey{csvsim/column count} is set to |0|, the number of entries of
the first non-empty line determines the column count (automatic detection).
- This setting is only useful in connection with \refKey{/csvsim/no head},
+ This setting is only useful in connection with \refKey{csvsim/no head},
since \meta{number} would be replaced by the number of entries in the
header line otherwise.
\end{docCsvKey}
@@ -1134,8 +1139,8 @@ see Section~\ref{subsec:tabsupport} from page~\pageref{subsec:tabsupport}.
Applying a \emph{filter} means that data lines are only processed / displayed,
if they fulfill a given \emph{condition}.
-The following string compare filters \refKey{/csvsim/filter strcmp} and
-\refKey{/csvsim/filter equal} are identical by logic, but differ in implementation.
+The following string compare filters \refKey{csvsim/filter strcmp} and
+\refKey{csvsim/filter equal} are identical by logic, but differ in implementation.
\begin{docCsvKey}[][doc updated=2022-10-21]{filter strcmp}{=\marg{stringA}\marg{stringB}}{no default}
Only lines where \meta{stringA} and \meta{stringB} are equal after expansion
@@ -1203,7 +1208,7 @@ The following string compare filters \refKey{/csvsim/filter strcmp} and
Only data lines which fulfill a \LaTeX3 \meta{boolean expression} are accepted.
Note that such an \meta{boolean expression} needs expl3 code.
To preprocess the data line before testing the \meta{boolean expression},
- the option key \refKey{/csvsim/before filter} can be used.
+ the option key \refKey{csvsim/before filter} can be used.
\begin{dispExample}
% For convenience, we save the filter
\ExplSyntaxOn
@@ -1232,7 +1237,7 @@ The following string compare filters \refKey{/csvsim/filter strcmp} and
\medskip
\begin{docCommand}[doc new=2021-06-25]{csvfilterbool}{\marg{key}\marg{boolean expression}}
- Defines a new |l3keys| meta key which applies \refKey{/csvsim/filter bool}
+ Defines a new |l3keys| meta key which applies \refKey{csvsim/filter bool}
with the given \meta{boolean expression}.
\begin{dispExample}
% For convenience, we save the filter
@@ -1263,10 +1268,10 @@ The following string compare filters \refKey{/csvsim/filter strcmp} and
The following filter options are \emph{appendable} to the expl3 based
filter options:
\begin{itemize}
-\item \refKey{/csvsim/filter strcmp}
-\item \refKey{/csvsim/filter not strcmp}
-\item \refKey{/csvsim/filter fp}
-\item \refKey{/csvsim/filter bool}
+\item \refKey{csvsim/filter strcmp}
+\item \refKey{csvsim/filter not strcmp}
+\item \refKey{csvsim/filter fp}
+\item \refKey{csvsim/filter bool}
\end{itemize}
\begin{docCsvKeys}[
@@ -1278,7 +1283,7 @@ filter options:
{ doc name = and filter strcmp },
{ doc name = or filter strcmp },
}
- Like \refKey{/csvsim/filter strcmp}, but appended to a required existing
+ Like \refKey{csvsim/filter strcmp}, but appended to a required existing
expl3 based filter with \emph{and} (|&&|) resp. \emph{or} (\texttt{\textbar\textbar}).
\begin{dispExample}
@@ -1305,7 +1310,7 @@ filter options:
{ doc name = and filter not strcmp },
{ doc name = or filter not strcmp },
}
- Like \refKey{/csvsim/filter not strcmp}, but appended to a required existing
+ Like \refKey{csvsim/filter not strcmp}, but appended to a required existing
expl3 based filter with \emph{and} (|&&|) resp. \emph{or} (\texttt{\textbar\textbar}).
\end{docCsvKeys}
@@ -1319,7 +1324,7 @@ filter options:
{ doc name = and filter fp },
{ doc name = or filter fp },
}
- Like \refKey{/csvsim/filter fp}, but appended to a required existing
+ Like \refKey{csvsim/filter fp}, but appended to a required existing
expl3 based filter with \emph{and} (|&&|) resp. \emph{or} (\texttt{\textbar\textbar}).
\end{docCsvKeys}
@@ -1333,7 +1338,7 @@ filter options:
{ doc name = and filter bool },
{ doc name = or filter bool },
}
- Like \refKey{/csvsim/filter bool}, but appended to a required existing
+ Like \refKey{csvsim/filter bool}, but appended to a required existing
expl3 based filter with \emph{and} (|&&|) resp. \emph{or} (\texttt{\textbar\textbar}).
\end{docCsvKeys}
@@ -1375,7 +1380,7 @@ filter test=\iftest{some testing},
Every \meta{boolean expression}
from the \ctanpkg{etoolbox} package is feasible (package loading required!).
To preprocess the data line before testing the \meta{boolean expression},
- the option key \refKey{/csvsim/before filter} can be used.
+ the option key \refKey{csvsim/before filter} can be used.
\begin{dispExample}
% \usepackage{etoolbox,booktabs}
\csvreader[
@@ -1400,7 +1405,7 @@ filter test=\iftest{some testing},
For the \meta{boolean expression}, every term from the \ctanpkg{ifthen} package
is feasible (package loading required!).
To preprocess the data line before testing the \meta{boolean expression},
- the option key \refKey{/csvsim/before filter} can be used.
+ the option key \refKey{csvsim/before filter} can be used.
\begin{dispExample}
% \usepackage{ifthen,booktabs}
@@ -1434,9 +1439,9 @@ filter test=\iftest{some testing},
\begin{docCsvKey}[][doc new=2016-07-01]{full filter}{=\meta{code}}{no default}
- Technically, this key is an alias for \refKey{/csvsim/before filter}.
- Philosophically, \refKey{/csvsim/before filter} computes something before
- a filter condition is set, but \refKey{/csvsim/full filter} should implement
+ Technically, this key is an alias for \refKey{csvsim/before filter}.
+ Philosophically, \refKey{csvsim/before filter} computes something before
+ a filter condition is set, but \refKey{csvsim/full filter} should implement
the full filtering. Especially, \refCom{csvfilteraccept} or
\refCom{csvfilterreject} \emph{should} be set inside the \meta{code}.
\begin{dispExample}
@@ -1478,7 +1483,7 @@ line 10 to 30 of the accepted lines.
Defines a comma separated list of line ranges. If a line number \refCom{thecsvrow}
satisfies one or more of the given \meta{range1}, \meta{range2}, \ldots,
the corresponding line is processed and displayed.
- If \refKey{/csvsim/range} is set to empty, all lines are accepted.
+ If \refKey{csvsim/range} is set to empty, all lines are accepted.
Every \meta{range} can
corresponds to one of the following variants:
@@ -1579,58 +1584,58 @@ The following example displays the last three line numbers:
Surrounds the CSV processing with |\begin{tabular}|\marg{table format}
at begin and with |\end{tabular}| at end.
Additionally, the commands defined by the key values of
- \refKey{/csvsim/before table}, \refKey{/csvsim/table head}, \refKey{/csvsim/table foot},
- and \refKey{/csvsim/after table} are executed at the appropriate places.
- \refKey{/csvsim/late after line} is set to \cs{}\cs{}.
+ \refKey{csvsim/before table}, \refKey{csvsim/table head}, \refKey{csvsim/table foot},
+ and \refKey{csvsim/after table} are executed at the appropriate places.
+ \refKey{csvsim/late after line} is set to \cs{}\cs{}.
\end{docCsvKey}
\begin{docCsvKey}{centered tabular}{=\meta{table format}}{style, no default}
- Like \refKey{/csvsim/tabular} but inside an additional |center| environment.
+ Like \refKey{csvsim/tabular} but inside an additional |center| environment.
\end{docCsvKey}
\begin{docCsvKey}{longtable}{=\meta{table format}}{style, no default}
- Like \refKey{/csvsim/tabular} but for the |longtable| environment.
+ Like \refKey{csvsim/tabular} but for the |longtable| environment.
This requires the package \ctanpkg{longtable} (not loaded automatically).
\end{docCsvKey}
\begin{docCsvKey}{tabbing}{}{style, no value}
- Like \refKey{/csvsim/tabular} but for the |tabbing| environment.
+ Like \refKey{csvsim/tabular} but for the |tabbing| environment.
\end{docCsvKey}
\begin{docCsvKey}{centered tabbing}{}{style, no value}
- Like \refKey{/csvsim/tabbing} but inside an additional |center| environment.
+ Like \refKey{csvsim/tabbing} but inside an additional |center| environment.
\end{docCsvKey}
\begin{docCsvKey}[][doc new=2021-07-06]{tabularray}{=\meta{table format}}{style, no default}
- Like \refKey{/csvsim/tabular} but for the |tblr| environment.
+ Like \refKey{csvsim/tabular} but for the |tblr| environment.
This requires the package \ctanpkg{tabularray} (not loaded automatically).
- This also sets \refKey{/csvsim/collect data} since this kind of table
+ This also sets \refKey{csvsim/collect data} since this kind of table
needs collected content, see \Fullref{sec:datacollection}.
- Note that \refKey{/csvsim/after reading} is set to use the collected
+ Note that \refKey{csvsim/after reading} is set to use the collected
data immediately. See \Fullref{sec:tabularray} for examples.
\end{docCsvKey}
\begin{docCsvKey}[][doc new=2021-07-23]{long tabularray}{=\meta{table format}}{style, no default}
- Like \refKey{/csvsim/tabularray} but using the |longtblr| environment
+ Like \refKey{csvsim/tabularray} but using the |longtblr| environment
from the package \ctanpkg{tabularray} (not loaded automatically).
\end{docCsvKey}
\begin{docCsvKey}[][doc new=2021-07-06]{centered tabularray}{=\meta{table format}}{style, no default}
- Like \refKey{/csvsim/tabularray} but inside an additional |center| environment.
+ Like \refKey{csvsim/tabularray} but inside an additional |center| environment.
\end{docCsvKey}
\begin{docCsvKey}{no table}{}{style, no value}
Deactivates |tabular|-like environments activated by
- \refKey{/csvsim/tabular}, \refKey{/csvsim/longtable}, etc.
- Note that not all settings of \refKey{/csvsim/tabularray} are reverted.
+ \refKey{csvsim/tabular}, \refKey{csvsim/longtable}, etc.
+ Note that not all settings of \refKey{csvsim/tabularray} are reverted.
\end{docCsvKey}
@@ -1663,8 +1668,8 @@ The following example displays the last three line numbers:
\begin{docCsvKey}[][doc new=2021-09-09]{table centered}{\colOpt{=true\textbar false}}{default |true|, initially |false|}
If |true|, the table is put inside an additional |center| environment.
- This environment begins before \refKey{/csvsim/before table}
- and ends after \refKey{/csvsim/after table}. The predefined |tabular|-like environments
+ This environment begins before \refKey{csvsim/before table}
+ and ends after \refKey{csvsim/after table}. The predefined |tabular|-like environments
from Section~\fullref{subsubsec:table_predef} use this option internally,
i.e. \mbox{|centered tabular={ccc}|} is identical to
\mbox{|tabular={ccc}, table centered|}.
@@ -1682,11 +1687,11 @@ are described with predefined keys. The following keys allow to use further
Surrounds the CSV processing with \cs{begin}\marg{name}
at begin and with \cs{end}\marg{name} at end.
Additionally, the commands defined by the key values of
- \refKey{/csvsim/before table}, \refKey{/csvsim/table head}, \refKey{/csvsim/table foot},
- and \refKey{/csvsim/after table} are executed at the appropriate places.
- \refKey{/csvsim/late after line} is set to \cs{}\cs{}.\par
+ \refKey{csvsim/before table}, \refKey{csvsim/table head}, \refKey{csvsim/table foot},
+ and \refKey{csvsim/after table} are executed at the appropriate places.
+ \refKey{csvsim/late after line} is set to \cs{}\cs{}.\par
If the environment \meta{name} takes options, these have to be set using
- \refKey{/csvsim/generic table options}.
+ \refKey{csvsim/generic table options}.
\begin{dispListing}
% The `tabular` environment would be used like the following example
@@ -1698,11 +1703,11 @@ are described with predefined keys. The following keys allow to use further
\end{docCsvKey}
-\begin{docCsvKey}[][doc new=2021-09-09]{generic collected table}{=\meta{name}}{no default, initially empty}
- Like \refKey{/csvsim/generic table} but for environments which need
+\begin{docCsvKey}[][doc new and updated={2021-09-09}{2023-12-18}]{generic collected table}{=\meta{name}}{no default, initially empty}
+ Like \refKey{csvsim/generic table} but for environments which need
collected content, e.g. |tblr| from package \ctanpkg{tabularray}, see \Fullref{sec:datacollection}.
- Note that \refKey{/csvsim/after reading} is set to use the collected
- data immediately.
+ Note that \refKey{csvsim/consume collected data} is set to |true| to
+ use the collected data immediately.
\begin{dispListing}
% The `tblr` environment from package `tabularray` would be used
@@ -1717,7 +1722,7 @@ are described with predefined keys. The following keys allow to use further
\begin{docCsvKey}[][doc new=2021-09-09]{generic table options}{=\marg{code}}{no default, initially empty}
Places \meta{code} immediately after \cs{begin}\marg{name} set up with
- \refKey{/csvsim/generic table} or \refKey{/csvsim/generic collected table}.
+ \refKey{csvsim/generic table} or \refKey{csvsim/generic collected table}.
\meta{code} may contain any parameters the environment \meta{name} needs to have.
\textbf{\color{red!50!black}You are strongly advised to use an extra pair of
curly brackets \marg{code} around \meta{code}}, because the outer pair of braces is
@@ -1812,8 +1817,8 @@ completeness, but are unlikely to be used directly.
}
Reads the whole CSV file denoted \meta{file name} with an automated formatting
using the required |tabularray| package.
- \refKey{/csvsim/autotabularray} uses the \docAuxEnvironment*{tblr} environment and
- \refKey{/csvsim/autolongtabularray} uses the \docAuxEnvironment*{longtblr} environment.
+ \refKey{csvsim/autotabularray} uses the \docAuxEnvironment*{tblr} environment and
+ \refKey{csvsim/autolongtabularray} uses the \docAuxEnvironment*{longtblr} environment.
The star variants treat the first line as data line and not as header line.
\end{docCsvKeys}
@@ -1939,7 +1944,7 @@ as normal characters (|\catcode| 12, other), if one or more of the following opt
\medskip
\item\docValue{tab}: Sets the separator to the tabulator sign.
- Automatically, \refKey{/csvsim/respect tab} is set also.
+ Automatically, \refKey{csvsim/respect tab} is set also.
\clearpage
\item\docValue{space}:\tcbdocmarginnote{\tcbdocnew{2023-05-08}}
@@ -1996,9 +2001,9 @@ as normal characters (|\catcode| 12, other), if one or more of the following opt
\begin{docCsvKey}{preprocessor}{=\meta{macro}}{no default}
Defines a preprocessor for the given CSV file.
The \meta{macro} has to have two mandatory arguments. The first argument
- is the original CSV file which is set by \refKey{/csvsim/file}.
+ is the original CSV file which is set by \refKey{csvsim/file}.
The second argument is the preprocessed CSV file
- which is set by \refKey{/csvsim/preprocessed file}.\par\smallskip
+ which is set by \refKey{csvsim/preprocessed file}.\par\smallskip
Typically, the \meta{macro} may call an external program which preprocesses
the original CSV file (e.\,g. sorting the file) and creates the
preprocessed CSV file. The later file is used by \refCom{csvreader}
@@ -2043,7 +2048,7 @@ First, one should consider the appropriate \emph{place} for sorting:
\end{itemize}
The first two methods are decoupled from anything concerning |csvsimple-l3|.
-For the third method, the \refKey{/csvsim/preprocessor} option is made for.
+For the third method, the \refKey{csvsim/preprocessor} option is made for.
This allows to access an external tool for sorting.
\emph{Which tool} is your choice.
@@ -2112,10 +2117,10 @@ following options.
\begin{itemize}
\item \csvsorter\ uses the given CSV file as input file.
\item \csvsorter\ uses \meta{file name} as configuration file.
- \item The output CSV file is denoted by \refKey{/csvsim/preprocessed file}
+ \item The output CSV file is denoted by \refKey{csvsim/preprocessed file}
which is by default \texttt{\textbackslash\detokenize{jobname_sorted.csv}}.
This output file is this actual file processed by \refCom{csvreader} or \refCom{csvloop}.
- \item \csvsorter\ also generates a log file denoted by \refKey{/csvsim/csvsorter log} which is by default |csvsorter.log|.
+ \item \csvsorter\ also generates a log file denoted by \refKey{csvsim/csvsorter log} which is by default |csvsorter.log|.
\end{itemize}
\par\medskip\textbf{First example:}
@@ -2185,7 +2190,7 @@ following options.
\clearpage
\begin{docCsvKey}{new sorting rule}{=\marg{name}\marg{file name}}{style, initially unset}
This is a convenience option to generate a new shortcut for often used
-\refKey{/csvsim/sort by} applications. It also adds a more semantic touch.
+\refKey{csvsim/sort by} applications. It also adds a more semantic touch.
The new shortcut option is
\tcbox[on line,size=small,colback=white,colframe=red]{|sort by| \meta{name}} which expands to
\tcbox[on line,size=small,colback=white,colframe=red]{|sort by=|\marg{file name}}.\par\medskip
@@ -2209,7 +2214,7 @@ Now, we can use the new rule:
\begin{docCommand}[doc new=2021-06-28]{csvsortingrule}{\marg{name}\marg{file name}}
- Identical in function to \refKey{/csvsim/new sorting rule}, see above.
+ Identical in function to \refKey{csvsim/new sorting rule}, see above.
A good place for setting up a new sorting rule would be inside the preamble:
\csvsortingrule{name}{namesort.xml}
@@ -2235,29 +2240,31 @@ the \ctanpkg{tabularray} package, collecting the data from the CSV file into a m
This macro can be given to the target application for further processing.
-\begin{docCsvKey}[][doc new=2021-07-06]{collect data}{\colOpt{=true\textbar false}}{default |true|, initially |false|}
+\begin{docCsvKey}[][doc new and updated={2021-07-06}{2023-10-17}]{collect data}{\colOpt{=true\textbar false}}{default |true|, initially |false|}
|csvsimple-l3| provides limited and experimental support to collect the input data
from the CSV file plus user additions into a macro named \refCom{csvdatacollection}.
-Setting \refKey{/csvsim/collect data} adds the contents of the following keys
+Setting \refKey{csvsim/collect data} adds the contents of the following keys
to \refCom{csvdatacollection}:
\begin{itemize}
-\item\refKey{/csvsim/after head}
-\item\refKey{/csvsim/after line}
-\item\refKey{/csvsim/before first line}
-\item\refKey{/csvsim/before line}
-\item\refKey{/csvsim/late after first line}
-\item\refKey{/csvsim/late after head}
-\item\refKey{/csvsim/late after last line}
-\item\refKey{/csvsim/late after line}
+\item\refKey{csvsim/after head}
+\item\refKey{csvsim/after first line}
+\item\refKey{csvsim/after line}
+\item\refKey{csvsim/before first line}
+\item\refKey{csvsim/before line}
+\item\refKey{csvsim/late after first line}
+\item\refKey{csvsim/late after head}
+\item\refKey{csvsim/late after last line}
+\item\refKey{csvsim/late after line}
\end{itemize}
Also, the \emph{expanded} content of
\begin{itemize}
-\item\refKey{/csvsim/command}
+\item\refKey{csvsim/command}
\end{itemize}
-is added to \docAuxCommand{csvdatacollection}.
-Note that for \refKey{/csvsim/command} special care has to be taken
+is added to \refCom{csvdatacollection}
+(depending on \refKey{csvsim/consume collected data} and \refKey{csvsim/data collection}).
+Note that for \refKey{csvsim/command} special care has to be taken
\emph{what} should be protected from expansion and \emph{what not}.
-Observe the following hints for \refKey{/csvsim/command}:
+Observe the following hints for \refKey{csvsim/command}:
\begin{itemize}
\item For data macros like |\csvcoli| use |\csvexpval\csvcoli| to add
the \emph{value} of this macro to \refCom{csvdatacollection}.
@@ -2284,14 +2291,22 @@ Collected data:\par
\end{dispExample}
Note that data collection is \emph{limited} to some special cases and does not
-allow to save all possible content. Table options like \refKey{/csvsim/longtable}
-are generally not supported with the important exception of \refKey{/csvsim/tabularray}
-which uses \refKey{/csvsim/collect data} automatically.\par
+allow to save all possible content. Table options like \refKey{csvsim/longtable}
+are generally not supported with the important exception of \refKey{csvsim/tabularray}
+which uses \refKey{csvsim/collect data} automatically.\par
See \Fullref{sec:tabularray} for examples.
\end{docCsvKey}
\clearpage
+\begin{docCsvKey}[][doc new={2023-12-18}]{consume collected data}{\colOpt{=true\textbar false}}{default |true|, initially |false|}
+If set to |false|, the collected data of a CSV file processed with
+\refKey{csvsim/collect data} is saved into \refCom{csvdatacollection}.\par
+Otherwise, if set to |true|, the collected data is not saved, but directly used
+after reading the CSV file, see \refKey{csvsim/generic collected table}.
+\end{docCsvKey}
+
+
\begin{docCsvKey}[][doc new=2021-07-06]{data collection}{=\meta{macro}}{no default, initially \refCom{csvdatacollection}}
Sets the collection macro to an alternative for \refCom{csvdatacollection}.
\begin{dispListing}
@@ -2302,14 +2317,14 @@ Sets the collection macro to an alternative for \refCom{csvdatacollection}.
\begin{docCommand}[doc new=2021-07-06]{csvdatacollection}{}
Macro which contains the collected data of a CSV file processed with
- \refKey{/csvsim/collect data}. This macro name can be changed by
- setting \refKey{/csvsim/data collection}.
+ \refKey{csvsim/collect data}. This macro name can be changed by
+ setting \refKey{csvsim/data collection}.
\end{docCommand}
-\begin{docCommand}[doc new=2021-07-06]{csvexpval}{\meta{macro}}
+\begin{docCommand}[doc new and updated={2021-07-06}{2023-12-17}]{csvexpval}{\meta{macro}}
Recovers the content of the given \meta{macro} and prevents further
- expansion. This is a wrapper for \docAuxCommand*{exp_not:V}.
+ expansion. This is a wrapper for \docAuxCommand*{exp_not:o}.
Alternatively, |\expandonce| from \ctanpkg{etoolbox} could be used.
\end{docCommand}
@@ -2321,90 +2336,128 @@ Sets the collection macro to an alternative for \refCom{csvdatacollection}.
\end{docCommand}
The following macros can only be used inside keys which are \emph{not}
-collected to \refCom{csvdatacollection}, e.g. inside \refKey{/csvsim/after filter}.
+collected to \refCom{csvdatacollection}, e.g. inside \refKey{csvsim/after filter}.
-\begin{docCommand}[doc new=2021-07-06]{csvcollectn}{\marg{code}}
+\begin{docCommand}[doc new and updated={2021-07-06}{2023-12-17}]{csvcollectn}{\marg{code}}
Appends the given \meta{code} to \refCom{csvdatacollection}.\\
- This corresponds to \docAuxCommand*{tl_gput_right:Nn}.
+ This corresponds to \docAuxCommand*{tl_build_gput_right:Nn}.
\end{docCommand}
-\begin{docCommand}[doc new=2021-07-06]{csvcollectx}{\marg{code}}
+\begin{docCommands}[
+ doc parameter = \marg{code}
+ ]
+ {
+ { doc name = csvcollecte, doc new and updated = {2021-07-06}{2023-12-18} },
+ { doc name = csvcollectx }
+ }
Appends the expansion of the given \meta{code} to \refCom{csvdatacollection}.\\
- This corresponds to \docAuxCommand*{tl_gput_right:Nx}.
-\end{docCommand}
+ This corresponds to \docAuxCommand*{tl_build_gput_right:Ne}.\\
+ \refCom{csvcollectx} is an alias for \refCom{csvcollecte} and is kept for backward compatibility.
+\end{docCommands}
-\begin{docCommand}[doc new=2021-07-06]{csvcollectV}{\meta{macro}}
+\begin{docCommand}[doc new and updated={2021-07-06}{2023-12-17}]{csvcollectV}{\meta{macro}}
Appends the content of the given \meta{macro} to \refCom{csvdatacollection}.\\
- This corresponds to \docAuxCommand*{tl_gput_right:NV}.
+ This corresponds to \docAuxCommand*{tl_build_gput_right:Ne} and \docAuxCommand*{exp_not:o} for
+ \meta{macro}.
\end{docCommand}
\clearpage
\section{String and Number Tests}\label{sec:stringtests}%
-The following string tests are complementing the string tests
-from packages like |etoolbox|. They all do the same, i.e.,
-comparing expanded strings for equality. To some extent, they are
-provided for backward compatibility.
-\begin{itemize}
-\item\refCom{ifcsvstrcmp} may be the most efficient method, because it uses
- the native compiler string comparison (if available).
-\item\refCom{ifcsvstrequal} does not rely on a compiler. It also is the
- fallback implementation for \refCom{ifcsvstrcmp}, if there is no
- native comparison method.
-\item\refCom{ifcsvprostrequal} is possibly more failsafe than the other two
- string tests. It may be used, if strings contain dirty things like |\textbf{A}|.
-\end{itemize}
+The following string and number tests are, to some extent, provided for
+backward compatibility.
+Mainly, they are wrappers for corresponding |expl3| conditionals.
+Therefore, you are encouraged to use the following CamelCase macros
+like \refCom{IfCsvsimStrEqualTF} which provide by their name insight
+to the underlying |expl3| functions. The lowercase variants are kept
+for backward compatibility.
\medskip
-\begin{docCommand}[doc new and updated={2016-07-01}{2021-06-28}]{ifcsvstrcmp}{\marg{stringA}\marg{stringB}\marg{true}\marg{false}}
+
+\begin{docCommands}[
+ doc parameter = \marg{string A}\marg{string B}\marg{true}\marg{false}
+ ]
+ {
+ { doc name = IfCsvsimStrEqualTF, doc new and updated = {2016-07-01}{2023-12-19} },
+ { doc name = ifcsvstrcmp, color command=black }
+ }
Compares two strings and executes \meta{true} if they are equal, and \meta{false} otherwise.
- The comparison is done using |\str_compare:eNeTF|.
- \refCom{ifcsvstrcmp} is expandable.
-\end{docCommand}
+ The comparison is done using |\str_if_eq:eeTF|.
+ \refCom{IfCsvsimStrEqualTF} is expandable.
+ Typically, this is the preferred function for many use cases.
+\end{docCommands}
-\begin{docCommand}[doc new and updated={2016-07-01}{2021-06-28}]{ifcsvnotstrcmp}{\marg{stringA}\marg{stringB}\marg{true}\marg{false}}
+\begin{docCommand}[doc new and updated={2016-07-01}{2021-06-28},color command=black]{ifcsvnotstrcmp}{\marg{string A}\marg{string B}\marg{true}\marg{false}}
Compares two strings and executes \meta{true} if they are \emph{not} equal, and \meta{false} otherwise.
- The implementation uses \refCom{ifcsvstrcmp}.
- \refCom{ifcsvstrcmp} is expandable.
+ The implementation uses \refCom{IfCsvsimStrEqualTF}.
+ \refCom{ifcsvnotstrcmp} is expandable.
+ Consider using \refCom{IfCsvsimStrEqualTF} alternatively.
\end{docCommand}
-\begin{docCommand}[doc new and updated={2016-07-01}{2021-06-28}]{ifcsvstrequal}{\marg{stringA}\marg{stringB}\marg{true}\marg{false}}
- Compares two strings and executes \meta{true} if they are equal, and \meta{false} otherwise.
- The strings are expanded
- and the comparison is done using |\tl_if_eq:NNTF|.
- \refCom{ifcsvstrequal} is not expandable.
-\end{docCommand}
+\begin{docCommands}[
+ doc parameter = \marg{token list A}\marg{token list B}\marg{true}\marg{false}
+ ]
+ {
+ { doc name = IfCsvsimTlEqualTF, doc new and updated = {2016-07-01}{2023-12-19} },
+ { doc name = ifcsvstrequal, color command=black }
+ }
+ Compares two token lists and executes \meta{true} if they are equal, and \meta{false} otherwise.
+ The comparison is done using |\tl_if_eq:eeTF|.
+ \refCom{IfCsvsimTlEqualTF} is not expandable.
+ If you have no special reason for using a token list comparison, where
+ characters and category codes of those characters are compared, you may
+ rather choose \refCom{IfCsvsimStrEqualTF}.
+\end{docCommands}
-\begin{docCommand}[doc new and updated={2016-07-01}{2021-06-28}]{ifcsvprostrequal}{\marg{stringA}\marg{stringB}\marg{true}\marg{false}}
- Compares two strings and executes \meta{true} if they are equal, and \meta{false} otherwise.
- The strings are expanded with |\protected@edef|
+
+\begin{docCommands}[
+ doc parameter = \marg{token list A}\marg{token list B}\marg{true}\marg{false}
+ ]
+ {
+ { doc name = IfCsvsimTlProtectedEqualTF, doc new and updated = {2016-07-01}{2023-12-19} },
+ { doc name = ifcsvprostrequal, color command=black }
+ }
+ Compares two token lists and executes \meta{true} if they are equal, and \meta{false} otherwise.
+ The token lists are expanded with |\protected@edef|
in the test, i.e. parts of the
- strings which are protected stay unexpanded.
+ token lists which are protected stay unexpanded.
The comparison is done using |\tl_if_eq:NNTF|.
- \refCom{ifcsvprostrequal} is not expandable.
-\end{docCommand}
-
+ \refCom{IfCsvsimTlProtectedEqualTF} is not expandable.
+\end{docCommands}
-The following number tests are wrappers for corresponding \LaTeX3 conditionals.
-\begin{docCommand}[doc new={2021-06-28}]{ifcsvfpcmp}{\marg{floating point expression}\marg{true}\marg{false}}
+\begin{docCommands}[
+ doc parameter = \marg{floating point expression}\marg{token list B}\marg{true}\marg{false}
+ ]
+ {
+ { doc name = IfCsvsimFpCompareTF, doc new and updated = {2021-06-28}{2023-12-19} },
+ { doc name = ifcsvfpcmp, color command=black }
+ }
Evaluates the given \meta{floating point expression}
and executes \meta{true} or \meta{false} appropriately.
The evaluation is done using |\fp_compare:nTF|.
- \refCom{ifcsvfpcmp} is expandable.
-\end{docCommand}
+ \refCom{IfCsvsimFpCompareTF} is expandable.
+\end{docCommands}
-\begin{docCommand}[doc new={2021-06-28}]{ifcsvintcmp}{\marg{integer expression}\marg{true}\marg{false}}
+
+\begin{docCommands}[
+ doc parameter = \marg{integer expression}\marg{token list B}\marg{true}\marg{false}
+ ]
+ {
+ { doc name = IfCsvsimIntCompareTF, doc new and updated = {2021-06-28}{2023-12-19} },
+ { doc name = ifcsvintcmp, color command=black }
+ }
Evaluates the given \meta{integer expression}
and executes \meta{true} or \meta{false} appropriately.
The evaluation is done using |\int_compare:nTF|.
- \refCom{ifcsvintcmp} is expandable.
-\end{docCommand}
+ \refCom{IfCsvsimIntCompareTF} is expandable.
+\end{docCommands}
+
\clearpage
@@ -2472,13 +2525,13 @@ introduced.
\begin{dispExample}
% this example requires the tcolorbox package
-\newcommand{\ifmale}[2]{\ifcsvstrcmp{\gender}{m}{#1}{#2}}
+\newcommand{\ifmale}[2]{\IfCsvsimStrEqualTF{\gender}{m}{#1}{#2}}
\csvreader[head to column names]{address.csv}{}{%
\begin{tcolorbox}[colframe=DarkGray,colback=White,arc=0mm,width=(\linewidth-2pt)/2,
equal height group=letter,before=,after=\hfill,fonttitle=\bfseries,
adjusted title={Letter to \name}]
- \ifcsvstrcmp{\degree}{}{\ifmale{Mr.}{Ms.}}{\degree}~\givenname~\name\\
+ \IfCsvsimStrEqualTF{\degree}{}{\ifmale{Mr.}{Ms.}}{\degree}~\givenname~\name\\
\street\\\zip~\location
\tcblower
{\itshape Dear \ifmale{Sir}{Madam},}\\
@@ -2809,7 +2862,7 @@ Hessen,B,2100
\csvlisting{data_headless}
-Note that you cannot use the \refKey{/csvsim/no head} option for the auto tabular
+Note that you cannot use the \refKey{csvsim/no head} option for the auto tabular
commands.
If no options are given, the first line is interpreted as header line
which gives an unpleasant result:
@@ -2837,8 +2890,8 @@ This example can be extended to insert a table head for this headless data:
\clearpage
-For the normal \refCom{csvreader} command, the \refKey{/csvsim/no head} option
-should be applied. Of course, we cannot use \refKey{/csvsim/head to column names}
+For the normal \refCom{csvreader} command, the \refKey{csvsim/no head} option
+should be applied. Of course, we cannot use \refKey{csvsim/head to column names}
because there is no head, but the columns can be addressed by their numbers:
\begin{dispExample}
@@ -2858,11 +2911,11 @@ because there is no head, but the columns can be addressed by their numbers:
\subsection{Tables with \texttt{tabularray}}\label{sec:tabularray}%
The \ctanpkg{tabularray} package gives extended control for generating
-tables. \refKey{/csvsim/tabularray} and \refKey{/csvsim/centered tabularray}
+tables. \refKey{csvsim/tabularray} and \refKey{csvsim/centered tabularray}
support such tables. A distinctiveness is that for \ctanpkg{tabularray}
data from a CSV file has to be \emph{collected} first (into a macro)
and applied afterwards. The process is hidden from the user view, but
-has to be taken into account when \refKey{/csvsim/command} is set up,
+has to be taken into account when \refKey{csvsim/command} is set up,
see \Fullref{sec:datacollection}.
The following examples uses |data.csv| from \Fullref{sec:examgrapghpres}.
@@ -2882,7 +2935,7 @@ The following examples uses |data.csv| from \Fullref{sec:examgrapghpres}.
},
table head = {\SetCell[c=4]{c} Important Data Table \\},
]{data.csv}{}{
- \ifcsvstrcmp{\group}{A}{\csvexpnot\SetRow{brown7}}{}
+ \IfCsvsimStrEqualTF{\group}{A}{\csvexpnot\SetRow{brown7}}{}
\csvexpnot\SetCell{bg=purple7}
\csvexpval\land
& \csvexpval\group
@@ -2894,16 +2947,16 @@ The following examples uses |data.csv| from \Fullref{sec:examgrapghpres}.
Note in the example above that
\begin{itemize}
-\item \refKey{/csvsim/table head} is \emph{collected} unexpanded, i.e.
+\item \refKey{csvsim/table head} is \emph{collected} unexpanded, i.e.
|\SetCell| has not to be protected. On the other hand, CSV data could not
be used here.
-\item \refKey{/csvsim/command} is \emph{collected} expanded. This is identical
+\item \refKey{csvsim/command} is \emph{collected} expanded. This is identical
to the mandatory last argument of \refCom{csvreader}.
\begin{itemize}
\item Therefore, expansion of |\SetRow|, |\SetCell|, etc. is prevented by \refCom{csvexpnot}.
\item The \emph{values} (content) of |\land|, |\group|, etc. are recovered by
\refCom{csvexpval}.
- \item |\ifcsvstrcmp| and |\fpeval| are \emph{expandable} and therefore the
+ \item |\IfCsvsimStrEqualTF| and |\fpeval| are \emph{expandable} and therefore the
results of these commands are \emph{collected}.
\item |\tablenum| from \ctanpkg{siunitx} is a robust command and therefore
needs no protection. If you are not sure, if a command is robust or not, it
@@ -2973,7 +3026,7 @@ optional argument.
\csvautotabularray[table centered]{data.csv}
[
row{odd} = {blue!85!gray!7},
- row{1} = {blue!50!gray!25, font=\bfseries},
+ row{1} = {blue!50!gray!25, font=\bfseries, preto=\MakeUppercase},
hline{1,Z} = {0.1em, blue!50!black},
hline{2} = {blue!50!black}
]
diff --git a/macros/latex/contrib/csvsimple/csvsimple-legacy.pdf b/macros/latex/contrib/csvsimple/csvsimple-legacy.pdf
index a2b995531c..7079052a74 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-legacy.pdf
+++ b/macros/latex/contrib/csvsimple/csvsimple-legacy.pdf
Binary files differ
diff --git a/macros/latex/contrib/csvsimple/csvsimple-legacy.sty b/macros/latex/contrib/csvsimple/csvsimple-legacy.sty
index f47d7540bd..28b5562b5d 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-legacy.sty
+++ b/macros/latex/contrib/csvsimple/csvsimple-legacy.sty
@@ -1,8 +1,8 @@
-%% The LaTeX package csvsimple - version 2.5.0 (2023/10/16)
+%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
%% csvsimple-legacy.sty: Simple LaTeX CSV file processing (LaTeX2e)
%%
%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2008-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% Copyright (c) 2008-2024 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
@@ -18,7 +18,7 @@
%% This work consists of all files listed in README.md
%%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{csvsimple-legacy}[2023/10/16 version 2.5.0 LaTeX2e CSV file processing]
+\ProvidesPackage{csvsimple-legacy}[2024/01/19 version 2.6.0 LaTeX2e CSV file processing]
%---- check package
diff --git a/macros/latex/contrib/csvsimple/csvsimple-legacy.tex b/macros/latex/contrib/csvsimple/csvsimple-legacy.tex
index 290d512fb5..caa65712ec 100644
--- a/macros/latex/contrib/csvsimple/csvsimple-legacy.tex
+++ b/macros/latex/contrib/csvsimple/csvsimple-legacy.tex
@@ -1,10 +1,10 @@
% \LaTeX-Main\
% !TeX encoding=UTF-8
-%% The LaTeX package csvsimple - version 2.5.0 (2023/10/16)
+%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
%% csvsimple.tex: Manual
%%
%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2008-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% Copyright (c) 2008-2024 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
diff --git a/macros/latex/contrib/csvsimple/csvsimple.pdf b/macros/latex/contrib/csvsimple/csvsimple.pdf
index e4b5badc01..7f4023fd07 100644
--- a/macros/latex/contrib/csvsimple/csvsimple.pdf
+++ b/macros/latex/contrib/csvsimple/csvsimple.pdf
Binary files differ
diff --git a/macros/latex/contrib/csvsimple/csvsimple.sty b/macros/latex/contrib/csvsimple/csvsimple.sty
index 1d3840f1eb..60776f67ce 100644
--- a/macros/latex/contrib/csvsimple/csvsimple.sty
+++ b/macros/latex/contrib/csvsimple/csvsimple.sty
@@ -1,8 +1,8 @@
-%% The LaTeX package csvsimple - version 2.5.0 (2023/10/16)
+%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
%% csvsimple.sty: Simple LaTeX CSV file processing
%%
%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2008-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% Copyright (c) 2008-2024 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
@@ -17,9 +17,8 @@
%%
%% This work consists of all files listed in README.md
%%
-\RequirePackage{l3keys2e}
-
-\ProvidesExplPackage{csvsimple}{2023/10/16}{2.5.0}
+\NeedsTeXFormat{LaTeX2e}[2022-06-01]
+\ProvidesExplPackage{csvsimple}{2024/01/19}{2.6.0}
{LaTeX CSV file processing}
\cs_if_exist:NT \c__csvsim_package_expl_bool
@@ -36,14 +35,16 @@
\tex_endinput:D
}
-\keys_define:nn { csvsimple }
+\tl_new:N \l__csvsim_package_expl_tl
+
+\DeclareKeys
{
l3 .code:n = \tl_set:Nn \l__csvsim_package_expl_tl { l3 },
legacy .code:n = \tl_set:Nn \l__csvsim_package_expl_tl { legacy },
}
-\keys_set:nn { csvsimple } { legacy }
+\SetKeys{ legacy }
-\ProcessKeysPackageOptions { csvsimple }
+\ProcessKeyOptions
\RequirePackage{csvsimple-\l__csvsim_package_expl_tl}
diff --git a/macros/latex/contrib/csvsimple/csvsimple.tex b/macros/latex/contrib/csvsimple/csvsimple.tex
index 7e4e93d1ed..7d34586a42 100644
--- a/macros/latex/contrib/csvsimple/csvsimple.tex
+++ b/macros/latex/contrib/csvsimple/csvsimple.tex
@@ -1,10 +1,10 @@
% \LaTeX-Main\
% !TeX encoding=UTF-8
-%% The LaTeX package csvsimple - version 2.5.0 (2023/10/16)
+%% The LaTeX package csvsimple - version 2.6.0 (2024/01/19)
%% csvsimple.tex: Manual
%%
%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2008-2023 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% Copyright (c) 2008-2024 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx
index a8dad994d6..0889094f34 100644
--- a/macros/latex/contrib/easybook/easybook.dtx
+++ b/macros/latex/contrib/easybook/easybook.dtx
@@ -15,7 +15,7 @@
%<*class>
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
\RequirePackage{l3keys2e}
-\ProvidesExplClass{easybook}{2024/01/18}{2024K}
+\ProvidesExplClass{easybook}{2024/01/19}{2024L}
{Easily typesetting Chinese theses or books}
\bool_set_false:N \l__eb_compile_draft_bool
@@ -302,7 +302,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2020/10/01]
\RequirePackage{l3keys2e,etoolbox}
-\ProvidesExplPackage{easybase}{2024/01/18}{2024K}
+\ProvidesExplPackage{easybase}{2024/01/19}{2024L}
{Easily typesetting Chinese theses or books}
\cs_generate_variant:Nn \dim_set:Nn { NV }
@@ -323,12 +323,6 @@
\seq_set_from_clist:Nn \l_tmpa_seq {#1}
\seq_map_inline:Nn \l_tmpa_seq {#2}
}
-\cs_new_protected:Npn \eb_char_patch_cmd:Nnn #1#2#3
- {
- \ExplSyntaxOn\makeatletter
- \eb_patch_cmd:Nnn {#1} {#2} {#3}
- \ExplSyntaxOff\makeatother
- }
\cs_new_protected:Npn \eb_patch_cmd:Nnn #1#2#3
{
\ctex_patch_cmd_once:NnnnTF #1 { } {#2} {#3}
@@ -1670,14 +1664,9 @@
{O{Appendix\space}D(){\Alph{chapter}}}
{
\ctex_assign_heading_name:nn { biappendix } {#1}
- \int_compare:nNnTF { \c@chapter } > { 0 }
+ \bool_if:NTF \l__eb_class_mode_book_bool
{
- \eb_char_patch_cmd:Nnn \CTEX@addbitocline
- {
- \def\CTEX@prechapter{\CTEX@prebichapter}
- \def\CTEX@thechapter{\CTEX@bichapter@number}
- \def\CTEX@postchapter{\CTEX@postbichapter}
- }
+ \eb_preto_cmd:nn { eb@before@addbitoc@hook }
{
\def\CTEX@prechapter{\CTEX@prebiappendix}
\def\CTEX@thechapter{#2}
@@ -2334,7 +2323,7 @@
}
%</package>
%<*tcolorbox>
-\ProvidesExplFile{eb-tcolorbox.cfg}{2024/01/18}{2024K}
+\ProvidesExplFile{eb-tcolorbox.cfg}{2024/01/19}{2024L}
{Customization of tcolorbox for easybook}
\cs_set_protected:Npn \addtotcbstyle #1#2
diff --git a/macros/latex/contrib/easybook/easybook.pdf b/macros/latex/contrib/easybook/easybook.pdf
index 265c1e40d0..55a91f1b6b 100644
--- a/macros/latex/contrib/easybook/easybook.pdf
+++ b/macros/latex/contrib/easybook/easybook.pdf
Binary files differ
diff --git a/macros/latex/contrib/easybook/easybook.tex b/macros/latex/contrib/easybook/easybook.tex
index 60c949af32..0387b7301c 100644
--- a/macros/latex/contrib/easybook/easybook.tex
+++ b/macros/latex/contrib/easybook/easybook.tex
@@ -23,8 +23,8 @@
name = easybook,
color-scheme = blue,
title = EASYBOOK使用手册,
- version = v2024K,
- date = 2024/01/18,
+ version = v2024L,
+ date = 2024/01/19,
authors = 瞿毅,
info = 简便地排版中文学位论文或书籍,
email = toquyi@163.com,
@@ -1350,9 +1350,10 @@
\shortversion{v = 1.638,date = 2022/03/04,changes = 增加目录条目样式选项注册命令 \cs{RegisterTocName}。}
\shortversion{v = 1.644,date = 2022/03/10,changes = 增加浮动环境目录声明命令 \cs{DeclareFloatList} 配合 \pkg*{caption} 宏包。}
\shortversion{v = 1.682,date = 2022/05/01,changes = 将迷你页判断命令 \cs{notminipage} 改为被保护命令兼容 \pkg*{circledtext} 宏包。}
- \begin{version}[v = 2024K,date = 2024/01/18,simple]
+ \begin{version}[v = 2024L,date = 2024/01/19,simple]
\item 核对依赖宏包的更新改动,优化使用手册的内容细节。
\item 修复图表等浮动环境题注目录中条目标签编号的计数器值显示错误问题。
+ \item 修复附录命令 \cs{appendix} 的可选参数设置英文目录中条目名字和编号失效的问题。
\item 新增目录风格定义命令 \cs{SetTocStyle} 和使用命令 \cs{UseTocStyle}。
\end{version}
\end{changelog}
diff --git a/macros/latex/contrib/metalogox/README.txt b/macros/latex/contrib/metalogox/README.txt
index 1b67dd9b6b..18c947b32b 100644
--- a/macros/latex/contrib/metalogox/README.txt
+++ b/macros/latex/contrib/metalogox/README.txt
@@ -1,8 +1,8 @@
The LaTeX metalogox package
Automatically adjusts the TeX logo and related, depending on the font.
-v1.02
-Copyright 2019, 2023--2024 Brian Dunn — https://github.com/bdtc/metalogox
+v1.03
+Copyright 2019, 2023–2024 Brian Dunn — https://github.com/bdtc/metalogox
LaTeX Project Public License, version 1.3
The metalogox package extends the metalogo package to automatically adjust
diff --git a/macros/latex/contrib/metalogox/metalogox.dtx b/macros/latex/contrib/metalogox/metalogox.dtx
index b036b6685f..471107229a 100644
--- a/macros/latex/contrib/metalogox/metalogox.dtx
+++ b/macros/latex/contrib/metalogox/metalogox.dtx
@@ -16,7 +16,7 @@
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{metalogox}
-%<package> [2024/01/12 v1.02 Extends the metalogo package with font detection.]
+%<package> [2024/01/19 v1.03 Extends the metalogo package with font detection.]
%
%<*driver>
\documentclass{ltxdoc}
@@ -127,6 +127,7 @@ pageanchor=true,
\usepackage{\mypackagename}
+\makeatletter
\newcommand*{\onetex}[3]{%
\usefont{T1}{#1}{m}{#3}%
\adjustlogos{default}%
@@ -136,6 +137,7 @@ pageanchor=true,
\autoadjustlogos%
\LaTeXe \\
}
+\makeatother
\newcommand*{\textblue}[1]{\textcolor{blue!70!black}{#1}}
@@ -158,6 +160,10 @@ pageanchor=true,
% \changes{v1.01}{2023/01/03}{\ 2023/01/03}
% \changes{v1.02}{2024/01/12}{Updated contact info.}
% \changes{v1.02}{2024/01/12}{\ 2024/01/12}
+% \changes{v1.03}{2024/01/18}{Improved TOC change log and index entries.}
+% \changes{v1.03}{2024/01/18}{Added Atkinson Hyperlegible, Charis SIL, Cuprum,
+% Eczar, Ibarra, Inria, Inter, MLModern, Nunito, Oswald.}
+% \changes{v1.03}{2024/01/19}{2024/01/19}
@@ -192,11 +198,11 @@ pageanchor=true,
% Font & Default & \pkg{metalogox} \\ \midrule
% Latin Modern & \onetex{lmr}{lmodern}{n}
% Erewhon & \onetex{erewhon-TLF}{utopia}{n}
-% Libre Caslon & \onetex{LibreCaslonText-TLF}{baskerville}{n}
+% Libre Caslon & \onetex{LibreCsln-TLF}{baskerville}{n}
% IM Fell English & \onetex{IMFELLEnglish-TLF}{baskerville}{n}
% Coelacanth & \onetex{Coelacanth-TLF}{coelacanth}{n}
% Alegreya & \onetex{Alegreya-TLF}{alegreya}{n}
-% Helvetica & \onetex{phv}{helvetica}{sf}
+% Helvetica & \onetex{phv}{helvetica}{n}
% Antiqua & \onetex{uaq}{antiqua}{n}
% \bottomrule
% \end{tabular}
@@ -342,10 +348,23 @@ pageanchor=true,
%
% \item Since the same settings are usually shared by many fonts,
% some logos may not be perfect.
+%
+% \item If a font is not known by \pkg{metalogox} then a warning is issued,
+% and a few common options are recommended.
+%
+% \item Please contact the author of \pkg{metalogox} if an unknown font is found,
+% \margintag{Unknown font?}
+% especially if it is a common font, as sometimes the font family names
+% are changed. See the contact link on the title page of this document.
% \end{itemize}
%
%
-% \StopEventually{\PrintChanges\PrintIndex}
+% \StopEventually{
+% \appendix
+% \GlossaryPrologue{\section{Change History}}
+% \PrintChanges
+% \IndexPrologue{\section{Index}}
+% \PrintIndex}
%
% \clearpage
%
@@ -1149,6 +1168,14 @@ pageanchor=true,
%
% \subsection{Font detection}
%
+
+% \DescribeBoolean{MLX@@foundfont} Found the font?
+% \changes{v1.03}{2024/01/18}{Warning if font was not found.}
+% \begin{macrocode}
+\newbool{MLX@@foundfont}
+% \end{macrocode}
+
+
% \begin{macro}{\MLX@@detectvariant}
% \marg{1: family} \marg{2: variant} \marg{3: name} \marg{4: setting}
%
@@ -1156,9 +1183,11 @@ pageanchor=true,
%
% (The doubled |@| is to distinguish this from a valid \pkg{metalogox} option.)
%
+% \changes{v1.03}{2024/01/18}{Warning if font was not found.}
% \begin{macrocode}
\newcommand*{\MLX@@detectvariant}[4]{%
\ifdefstring{\MLX@@thisfont}{#1#2}{%
+ \booltrue{MLX@@foundfont}%
\PackageInfo{metalogox}{Detected #1#2, #3. Using #4}%
\adjustlogos{#4}%
}{}%
@@ -1185,6 +1214,7 @@ pageanchor=true,
\MLX@@detectvariant{#1}{Condensed-OsF}{#2}{#3}%
\MLX@@detectvariant{#1}{Condensed-TOsF}{#2}{#3}%
\MLX@@detectvariant{#1}{(0)}{#2}{#3}%
+\MLX@@detectvariant{#1}{(1)}{#2}{#3}%
}
% \end{macrocode}
% \end{macro}
@@ -1196,6 +1226,12 @@ pageanchor=true,
% \begin{macrocode}
\NewDocumentCommand{\autoadjustlogos}{s}{%
% \end{macrocode}
+%
+% Not yet discovered the font:
+% \begin{macrocode}
+\boolfalse{MLX@@foundfont}%
+% \end{macrocode}
+%
% If starred, use the text body font, else use the local font:
% \begin{macrocode}
\IfBooleanTF{#1}{%
@@ -1204,15 +1240,19 @@ pageanchor=true,
\edef\MLX@@thisfont{\f@family}%
}%
% \end{macrocode}
+%
% Announce the desired font:
% \begin{macrocode}
\PackageInfo{metalogox}{Searching for \MLX@@thisfont}%
% \end{macrocode}
+%
% Default if nothing is found:
% \begin{macrocode}
\adjustlogos{lmodern}%
% \end{macrocode}
+%
% Seach a list of possibilities:
+% \changes{v1.03}{2024/01/19}{Updated many fonts for changed family names.}
% \begin{macrocode}
\MLX@@detectone{AccanthisADFStdNoThree}{accanthis}{accanthis}%
\MLX@@detectone{AccanthisADFStdNo3}{accanthis}{accanthis}%
@@ -1224,8 +1264,12 @@ pageanchor=true,
\MLX@@detectone{AntykwaPoltawskiego}{antpolt}{antpolt}%
\MLX@@detectone{antt}{anttor}{antpolt}%%
\MLX@@detectone{AntykwaTorunska}{anttor}{antpolt}%
+\MLX@@detectone{ArchivZero-OsF}{Archiv0}{helvetica}%
+\MLX@@detectone{Archiv0(0)}{Archiv0}{helvetica}%
\MLX@@detectone{fav}{arev}{vera}%
\MLX@@detectone{Arimo}{Arimo}{helvetica}%
+\MLX@@detectone{atkinsn-LF}{Atkinson Hyperlegible}{helvetica}%
+\MLX@@detectone{AtkinsonHyperlegible(0)}{Atkinson Hyperlegible}{helvetica}%
\MLX@@detectone{pag}{Avant Garde}{avantgarde}%
\MLX@@detectone{qag}{tgadventor}{avantgarde}%
\MLX@@detectone{ybv}{baskervald}{baskerville}%
@@ -1243,14 +1287,17 @@ pageanchor=true,
\MLX@@detectone{Cabin}{Cabin}{helvetica}%
\MLX@@detectone{CabinCondensed}{CabinCondensed}{helvetica}%
\MLX@@detectone{Caladea}{caladea}{baskerville}%
-\MLX@@detectone{fca}{cantarell}{helvetica}%
+\MLX@@detectone{cantarell}{cantarell}{helvetica}%
+\MLX@@detectone{Crlt}{Carlito}{crimson}%
\MLX@@detectone{Carlito}{Carlito}{crimson}%
+\MLX@@detectone{charssil}{CharisSIL}{times}%
+\MLX@@detectone{CharisSIL}{CharisSIL}{times}%
\MLX@@detectone{mdbch}{mdbch - Math Design Bitstream Charter}{charter}%
\MLX@@detectone{Chivo}{Chivo}{helvetica}%
\MLX@@detectone{ClearSans}{Clear Sans}{helvetica}%
\MLX@@detectone{Cochineal}{cochineal}{baskerville}%
\MLX@@detectone{Coelacanth}{coelacanth}{coelacanth}%
-\MLX@@detectone{fco}{comfortaa}{avantgarde}%
+\MLX@@detectone{comfortaa}{comfortaa}{avantgarde}%
\MLX@@detectone{ComicNeue}{comicneue}{avantgarde}%
\MLX@@detectone{cmbr}{Computer Modern Bright}{lmodern}%
\MLX@@detectone{lcmss}{Computer Modern Sans Quote}{lmodern}%
@@ -1260,17 +1307,20 @@ pageanchor=true,
\MLX@@detectone{CormorantGaramond}{CormorantGaramond}{garamond}%
\MLX@@detectone{Crimson}{crimson}{crimson}%
\MLX@@detectone{CrimsonPro}{CrimsonPro}{crimson}%
-% cyklop: default
+\MLX@@detectone{cpr}{Cuprum}{utopia}%
+\MLX@@detectone{Cuprum(0)}{Cuprum}{utopia}%
+\MLX@@detectone{cyklop}{Cyklop}{lmodern}%
\MLX@@detectone{DejaVuSerif}{DejaVuSerif}{vera}%
\MLX@@detectone{DejaVuSerifCondensed}{DejaVuSerif Condensed}{vera}%
\MLX@@detectone{DejaVuSans}{DejaVuSans}{verasans}%
-% drm: default
-\MLX@@detectone{fdr}{Droid Serif}{droidserif}%%
-\MLX@@detectone{fds}{Droid Sans}{droidsans}%%
+\MLX@@detectone{drm}{DRM}{lmodern}%
+\MLX@@detectone{droidserif}{Droid Serif}{droidserif}%%
+\MLX@@detectone{droidsans}{Droid Sans}{droidsans}%%
\MLX@@detectone{DroidSerif}{Droid Serif}{droidserif}%%
\MLX@@detectone{DroidSans}{Droid Sans}{droidsans}%%
\MLX@@detectone{EBGaramond}{EB Garamond}{garamond}%
\MLX@@detectone{EBGaramond12}{EB Garamond}{garamond}%
+\MLX@@detectone{Eczar(0)}{Eczar}{times}%
\MLX@@detectone{erewhon}{erewhon}{utopia}%
\MLX@@detectone{Erewhon-Regular}{erewhon}{utopia}%
\MLX@@detectone{fbb}{fbb}{baskerville}%
@@ -1283,12 +1333,12 @@ pageanchor=true,
\MLX@@detectone{futs}{fourier}{utopia}%
\MLX@@detectone{fnc}{fouriernc}{newcent}%
\MLX@@detectone{gentium}{gentium}{gentium}%
-\MLX@@detectone{Gentium}{gentium}{gentium}%
+\MLX@@detectone{GentiumPlus}{gentium}{gentium}%
\MLX@@detectone{artemisia}{gfsartemisia}{baskerville}%
\MLX@@detectone{GFSArtemisia}{gfsartemisia}{baskerville}%
\MLX@@detectone{artemisiaeuler}{gfsartemisia}{baskerville}%
\MLX@@detectone{bodoni}{gfsbodoni}{bodoni}%
-\MLX@@detectone{GFS Bodoni}{gfsbodoni}{bodoni}%
+\MLX@@detectone{GFSBodoni}{gfsbodoni}{bodoni}%
\MLX@@detectone{udidot}{gfsdidot}{didot}%
\MLX@@detectone{FreeSerif}{GNU Freeserif}{times}%
\MLX@@detectone{FreeSans}{GNU Freesans}{helvetica}%
@@ -1303,7 +1353,12 @@ pageanchor=true,
\MLX@@detectone{phv}{helvet}{helvetica}%
\MLX@@detectone{Heuristica}{heuristica}{utopia}%
\MLX@@detectone{heuristica}{heuristica}{utopia}%
+\MLX@@detectone{IbarraRealNova-LF}{Ibarra}{times}%
+\MLX@@detectone{IbarraRealNova(0)}{Ibarra}{times}%
\MLX@@detectone{IMFELLEnglish}{imfellEnglish}{baskerville}%
+\MLX@@detectone{InriaSans}{Inria Sans}{helvetica}%
+\MLX@@detectone{InriaSerif}{Inria Serif}{baskerville}%
+\MLX@@detectone{Inter}{Inter}{helvetica}%
\MLX@@detectone{iwona}{Iwona}{helvetica}%
\MLX@@detectone{Iwona}{Iwona}{helvetica}%
\MLX@@detectone{IwonaLight}{Iwona}{helvetica}%
@@ -1368,6 +1423,7 @@ pageanchor=true,
\MLX@@detectone{jkpxos}{kpfonts}{kpfonts}%
\MLX@@detectone{jkpxosn}{kpfonts}{kpfonts}%
\MLX@@detectone{jkpxvos}{kpfonts}{kpfonts}%
+\MLX@@detectone{JosefinSans}{Josefin}{lmodern}%
\MLX@@detectone{kurier}{Kurier}{helvetica}%
\MLX@@detectone{Kurier}{Kurier}{helvetica}%
\MLX@@detectone{KurierLight}{Kurier}{helvetica}%
@@ -1380,6 +1436,8 @@ pageanchor=true,
\MLX@@detectone{lato}{Lato}{helvetica}%
\MLX@@detectone{Lato}{Lato}{helvetica}%
\MLX@@detectone{lmr}{lmodern}{lmodern}%
+\MLX@@detectone{mlmr}{MLModern}{lmodern}%
+\MLX@@detectone{mlmss}{MLModern}{lmodern}%
\MLX@@detectone{lmss}{lmodern sans}{lmodernsans}%
\MLX@@detectone{lmssq}{lmodern sans}{lmodernsans}%
\MLX@@detectone{LatinModernRoman}{Latin Modern Roman}{lmodern}%
@@ -1391,9 +1449,11 @@ pageanchor=true,
\MLX@@detectone{LibertinusSans}{libertinus-type1}{helvetica}%
\MLX@@detectone{libertinusserif}{libertinus-otf}{libertinus}%
\MLX@@detectone{libertinussans}{libertinus-otf}{helvetica}%
+\MLX@@detectone{LibreBskvl}{librebaskerville}{baskerville}%
\MLX@@detectone{LibreBaskerville}{librebaskerville}{baskerville}%
\MLX@@detectone{LibreBodoni}{LibreBodoni}{librebodoni}%
-\MLX@@detectone{LibreCaslonText}{librecaslon}{baskerville}%
+\MLX@@detectone{LibreCaslonText}{Libre Caslon}{baskerville}%
+\MLX@@detectone{LibreCsln}{Libre Caslon}{baskerville}%
\MLX@@detectone{yly}{libris}{avantgarde}%
\MLX@@detectone{llcmss}{LX Fonts}{avantgarde}%
\MLX@@detectone{ptm}{mathptmx}{times}%
@@ -1401,6 +1461,8 @@ pageanchor=true,
\MLX@@detectone{bch}{mdbch}{charter}%
\MLX@@detectone{mdput}{mdput - Math Design Utopia}{utopia}%
\MLX@@detectone{mdugm}{mdugm - Math Design URW Garamond}{baskerville}%
+\MLX@@detectone{Merriwthr}{merriweather}{merriweather}%
+\MLX@@detectone{MerriwthrSans}{merriweather}{merriweather}%
\MLX@@detectone{Merriweather}{merriweather}{merriweather}%
\MLX@@detectone{MerriweatherSans}{merriweather}{merriweather}%
\MLX@@detectone{MintSpirit}{Mint Spirit}{avantgarde}%
@@ -1410,6 +1472,7 @@ pageanchor=true,
\MLX@@detectone{MontserratAlternates}{Montserrat}{helvetica}%
\MLX@@detectone{pnc}{newcent}{newcent}%
\MLX@@detectone{zpltlf}{newpxtext}{palatino}%
+\MLX@@detectone{minntx}{newtxtext}{times}%
\MLX@@detectone{ntxtlf}{newtxtext}{times}%
\MLX@@detectone{nimbussans}{nimbussans}{helvetica}%
\MLX@@detectone{NimbusSans}{nimbusserif}{helvetica}%
@@ -1419,9 +1482,14 @@ pageanchor=true,
\MLX@@detectone{zhv}{nimbussans}{helvetica}%
\MLX@@detectone{NotoSerif}{noto}{noto}%
\MLX@@detectone{NotoSans}{noto}{noto}%
+\MLX@@detectone{Nunito-TOsF}{Nunito}{helvetica}%
+\MLX@@detectone{Nunito(0)}{Nunito}{helvetica}%
\MLX@@detectone{OldStandard}{Old Standard}{didot}%
\MLX@@detectone{fosj}{opensans}{avantgarde}%
+\MLX@@detectone{opensans}{opensans}{avantgarde}%
\MLX@@detectone{OpenSans}{Open Sans}{avantgarde}%
+\MLX@@detectone{Zeroswald}{Oswald}{utopia}%
+\MLX@@detectone{Ovrlck}{Overlock}{avantgarde}% bug with XeLaTeX%
\MLX@@detectone{Overlock}{Overlock}{avantgarde}% bug with XeLaTeX%
\MLX@@detectone{panr}{pandora}{pandora}%
\MLX@@detectone{pss}{pandora}{pandora}%
@@ -1432,6 +1500,8 @@ pageanchor=true,
\MLX@@detectone{IBMPlexSans}{plex-sans}{plexsans}%
\MLX@@detectone{pxr}{pxfonts}{palatino}%
\MLX@@detectone{pxss}{pxfonts}{helvetica}%
+\MLX@@detectone{Quattro}{quattrocento}{quattrocento}%
+\MLX@@detectone{QuattroSans}{quattrocento}{quattrocento}%
\MLX@@detectone{Quattrocento}{quattrocento}{quattrocento}%
\MLX@@detectone{QuattrocentoSans}{quattrocento}{quattrocento}%
\MLX@@detectone{Raleway}{raleway}{helvetica}%
@@ -1449,6 +1519,7 @@ pageanchor=true,
\MLX@@detectone{stix}{stix}{times}%
\MLX@@detectone{stix2}{stix2}{times}%
\MLX@@detectone{STIXTwoText}{stix2}{times}%
+\MLX@@detectone{pbk}{bookman}{bookman}%
\MLX@@detectone{qbk}{tgbonum}{bookman}%
\MLX@@detectone{qhv}{tgheros}{helvetica}%
\MLX@@detectone{qpl}{tgpagella}{palatino}%
@@ -1461,6 +1532,7 @@ pageanchor=true,
\MLX@@detectone{TeXGyreSchola}{TeX Gyre Schola}{newcent}%
\MLX@@detectone{TeXGyreTermes}{TeX Gyre Termes}{times}%
\MLX@@detectone{txr}{txfonts}{times}%
+\MLX@@detectone{txss}{txfonts}{times}%
\MLX@@detectone{UniversalisADFStd}{Universalis ADF Std}{crimson}%
\MLX@@detectone{ugq}{URW Grotesk}{crimson}%
\MLX@@detectone{put}{utopia}{utopia}%
@@ -1477,6 +1549,23 @@ pageanchor=true,
\MLX@@detectone{yvoa}{venturisold}{venturis}%
\MLX@@detectone{XCharter}{XCharter}{charter}%
\MLX@@detectone{XITS}{XITS}{times}%
+% \end{macrocode}
+%
+% Warning if font was not found:
+% \changes{v1.03}{2024/01/18}{Warning if font was not found.}
+% \begin{macrocode}
+\ifbool{MLX@@foundfont}%
+ {}%
+ {%
+ \PackageWarningNoLine{metalogox}
+ {%
+ Did not find font \MLX@@thisfont.\MessageBreak
+ To improve \string\LaTeX, and related logos:\MessageBreak%
+ \string\usepackage[option]{metalogox}\MessageBreak%
+ Common options: times, bookman for serif,\MessageBreak%
+ helvetica, avantgarde for sans%
+ }
+ }
}
% \end{macrocode}
% \end{macro}
@@ -1512,8 +1601,6 @@ pageanchor=true,
%
% \clearpage
% ^^A \pagestyle{plain}
-% \phantomsection
-% \addcontentsline{toc}{section}{Change History and \indexname}
%
% \pagestyle{plain}
%
diff --git a/macros/latex/contrib/metalogox/metalogox.pdf b/macros/latex/contrib/metalogox/metalogox.pdf
index 8ff317b2ae..19a7a0d596 100644
--- a/macros/latex/contrib/metalogox/metalogox.pdf
+++ b/macros/latex/contrib/metalogox/metalogox.pdf
Binary files differ
diff --git a/macros/latex/contrib/tagpdf/README.md b/macros/latex/contrib/tagpdf/README.md
index 21be5e7a7d..1b6bdfc3b5 100644
--- a/macros/latex/contrib/tagpdf/README.md
+++ b/macros/latex/contrib/tagpdf/README.md
@@ -1,6 +1,6 @@
#tagpdf — A package to create tagged pdf
-Packageversion: 0.98r
-Packagedate: 2023/12/18
+Packageversion: 0.98s
+Packagedate: 2024/01/19
Author: Ulrike Fischer, LaTeX Project Team
## License
diff --git a/macros/latex/contrib/tagpdf/ex-AF-file.pdf b/macros/latex/contrib/tagpdf/ex-AF-file.pdf
index 0467680bb7..979b494e16 100644
--- a/macros/latex/contrib/tagpdf/ex-AF-file.pdf
+++ b/macros/latex/contrib/tagpdf/ex-AF-file.pdf
@@ -1,11 +1,11 @@
%PDF-2.0
%
23 0 obj
-<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<</ModDate (D:20231218165304+01'00') /Size 151 /CheckSum (9C8ECF305917FA946D95ABE1EE87EFE1) >> /Length 151 >>
+<< /Subtype /application#2Fx-tex/Type /EmbeddedFile /Params<</ModDate (D:20240119195615+01'00') /Size 151 /CheckSum (21E1A83BCC98E4F7FCCA5E335BF08D4A) >> /Length 151 >>
stream
%% LaTeX2e file `example-input-file.tex'
%% generated by the `filecontents' environment
-%% from source `ex-AF-file' on 2023/12/18.
+%% from source `ex-AF-file' on 2024/01/19.
%%
Additional info!
@@ -15,7 +15,7 @@ endobj
<< /Type /Filespec /AFRelationship /Unspecified /F <FEFF006500780061006D0070006C0065002D0069006E007000750074002D00660069006C0065002E007400650078> /UF <FEFF006500780061006D0070006C0065002D0069006E007000750074002D00660069006C0065002E007400650078> /EF<</F 23 0 R/UF 23 0 R>> >>
endobj
26 0 obj
-<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20231218) >> /Length 19 >>
+<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20240119) >> /Length 19 >>
stream
Bär with teh shirt
endstream
@@ -24,7 +24,7 @@ endobj
<< /Type /Filespec /AFRelationship /Supplement /F <FEFF007400610067002D0041004600660069006C00650031002E007400780074> /UF <FEFF007400610067002D0041004600660069006C00650031002E007400780074> /EF<</F 26 0 R/UF 26 0 R>> >>
endobj
29 0 obj
-<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20231218) >> /Length 4 >>
+<< /Subtype /text#2Fplain/Type /EmbeddedFile /Params<</ModDate (D:20240119) >> /Length 4 >>
stream
Duck
endstream
@@ -242,17 +242,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-12-18T16:53:27+01:00</rdf:li>
+ <rdf:li>2024-01-19T19:56:37+01:00</rdf:li>
</rdf:Seq>
</dc:date>
<dc:format>application/pdf</dc:format>
<dc:source>ex-AF-file.tex</dc:source>
<xmp:CreatorTool>LaTeX</xmp:CreatorTool>
- <xmp:CreateDate>2023-12-18T16:53:27+01:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-12-18T16:53:27+01:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-12-18T16:53:27+01:00</xmp:MetadataDate>
+ <xmp:CreateDate>2024-01-19T19:56:37+01:00</xmp:CreateDate>
+ <xmp:ModifyDate>2024-01-19T19:56:37+01:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2024-01-19T19:56:37+01:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:38d5a844-2217-4081-87cc-b2129dc357a6</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:0e8072c7-0780-4492-8b11-fb55665e5017</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:5cb7d4e3-b534-443a-870e-a511237fa2cf</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -350,7 +350,7 @@ endobj
<< /Type /Namespace /NS (https://www.latex-project.org/ns/inline/2022) /RoleMapNS 19 0 R >>
endobj
20 0 obj
-<< /Type /Namespace /NS (data:,2E18371-2178-CD86-EAAA-9D751F70709C) >>
+<< /Type /Namespace /NS (data:,BBA0C22B-E40B-3CA4-A17D-CA788152A7FF) >>
endobj
7 0 obj
[ 8 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R ]
@@ -452,7 +452,7 @@ endobj
<< /Type /Catalog /Pages 37 0 R /MarkInfo 38 0 R/Lang (de-DE)/Metadata 32 0 R/StructTreeRoot 5 0 R >>
endobj
47 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20231218165327+01'00')/ModDate (D:20231218165327+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20240119195637+01'00')/ModDate (D:20240119195637+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 48
@@ -461,9 +461,9 @@ xref
0000000003 00000 f
0000000004 00000 f
0000000009 00000 f
-0000016267 00000 n
+0000016268 00000 n
0000013795 00000 n
-0000015690 00000 n
+0000015691 00000 n
0000014006 00000 n
0000000011 00000 f
0000014074 00000 n
@@ -478,34 +478,34 @@ xref
0000015292 00000 n
0000015602 00000 n
0000000000 00000 f
-0000015758 00000 n
+0000015759 00000 n
0000000020 00000 n
0000000382 00000 n
-0000015871 00000 n
+0000015872 00000 n
0000000673 00000 n
0000000828 00000 n
-0000016003 00000 n
+0000016004 00000 n
0000001062 00000 n
0000001202 00000 n
-0000016135 00000 n
+0000016136 00000 n
0000001436 00000 n
0000013649 00000 n
0000013514 00000 n
0000012908 00000 n
-0000020005 00000 n
-0000020359 00000 n
+0000020006 00000 n
+0000020360 00000 n
0000013759 00000 n
0000013852 00000 n
0000013969 00000 n
-0000016372 00000 n
-0000018821 00000 n
-0000016558 00000 n
-0000019042 00000 n
-0000020159 00000 n
-0000020421 00000 n
-0000020539 00000 n
+0000016373 00000 n
+0000018822 00000 n
+0000016559 00000 n
+0000019043 00000 n
+0000020160 00000 n
+0000020422 00000 n
+0000020540 00000 n
trailer
-<< /Size 48 /Root 46 0 R /Info 47 0 R /ID [ <A4888D7EDBF2265F1E4F3942A5101D8C> <A4888D7EDBF2265F1E4F3942A5101D8C> ] >>
+<< /Size 48 /Root 46 0 R /Info 47 0 R /ID [ <C783AA5CC12032BDA358EBEEAE85BFB6> <C783AA5CC12032BDA358EBEEAE85BFB6> ] >>
startxref
-20762
+20763
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf b/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf
index 19b62f6c22..e80d2fbc03 100644
--- a/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf
+++ b/macros/latex/contrib/tagpdf/ex-alt-actualtext.pdf
Binary files differ
diff --git a/macros/latex/contrib/tagpdf/ex-attribute.pdf b/macros/latex/contrib/tagpdf/ex-attribute.pdf
index 3fae0d8e3c..5eaa00749b 100644
--- a/macros/latex/contrib/tagpdf/ex-attribute.pdf
+++ b/macros/latex/contrib/tagpdf/ex-attribute.pdf
@@ -216,17 +216,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-12-18T16:54:32+01:00</rdf:li>
+ <rdf:li>2024-01-19T19:57:37+01:00</rdf:li>
</rdf:Seq>
</dc:date>
<dc:format>application/pdf</dc:format>
<dc:source>ex-attribute.tex</dc:source>
<xmp:CreatorTool>LaTeX</xmp:CreatorTool>
- <xmp:CreateDate>2023-12-18T16:54:32+01:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-12-18T16:54:32+01:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-12-18T16:54:32+01:00</xmp:MetadataDate>
+ <xmp:CreateDate>2024-01-19T19:57:37+01:00</xmp:CreateDate>
+ <xmp:ModifyDate>2024-01-19T19:57:37+01:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2024-01-19T19:57:37+01:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:7a9cf910-1c19-429a-8f24-339c62d8a57f</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:ac67207c-46f2-43f7-8717-d9fb86bb4927</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:f29497e4-c54a-486e-86fd-a1f59a181a57</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -449,7 +449,7 @@ endobj
<< /Type /Catalog /Pages 26 0 R /MarkInfo 27 0 R/Lang (de_DE)/Metadata 21 0 R/StructTreeRoot 5 0 R >>
endobj
38 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/Title (Title)/CreationDate (D:20231218165432+01'00')/ModDate (D:20231218165432+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/Title (Title)/CreationDate (D:20240119195737+01'00')/ModDate (D:20240119195737+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 39
@@ -493,7 +493,7 @@ xref
0000017720 00000 n
0000017838 00000 n
trailer
-<< /Size 39 /Root 37 0 R /Info 38 0 R /ID [ <87A67E5AF52178AFD399D665CB3CE11A> <87A67E5AF52178AFD399D665CB3CE11A> ] >>
+<< /Size 39 /Root 37 0 R /Info 38 0 R /ID [ <175B3F8B0165F50DA2EA61FEB2DEECC4> <175B3F8B0165F50DA2EA61FEB2DEECC4> ] >>
startxref
18075
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-formula-problem.pdf b/macros/latex/contrib/tagpdf/ex-formula-problem.pdf
index a1ee76c724..b293fc5d3f 100644
--- a/macros/latex/contrib/tagpdf/ex-formula-problem.pdf
+++ b/macros/latex/contrib/tagpdf/ex-formula-problem.pdf
@@ -239,17 +239,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-12-18T16:55:04+01:00</rdf:li>
+ <rdf:li>2024-01-19T19:58:08+01:00</rdf:li>
</rdf:Seq>
</dc:date>
<dc:format>application/pdf</dc:format>
<dc:source>ex-formula-problem.tex</dc:source>
<xmp:CreatorTool>LaTeX</xmp:CreatorTool>
- <xmp:CreateDate>2023-12-18T16:55:04+01:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-12-18T16:55:04+01:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-12-18T16:55:04+01:00</xmp:MetadataDate>
+ <xmp:CreateDate>2024-01-19T19:58:08+01:00</xmp:CreateDate>
+ <xmp:ModifyDate>2024-01-19T19:58:08+01:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2024-01-19T19:58:08+01:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:8eb2ce1d-b2ec-440a-8bc2-73733eb3eeb0</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:a6776950-c564-4a23-89bd-1070861bab80</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:9aa99a5f-42c4-4b8e-806c-136f2e587e9a</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>2</prism:pageCount>
</rdf:Description>
@@ -425,7 +425,7 @@ endobj
<< /Type /Catalog /Pages 16 0 R /MarkInfo 23 0 R/Lang (de-DE)/Metadata 19 0 R/StructTreeRoot 5 0 R >>
endobj
33 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20231218165504+01'00')/ModDate (D:20231218165504+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20240119195808+01'00')/ModDate (D:20240119195808+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 34
@@ -464,7 +464,7 @@ xref
0000018886 00000 n
0000019004 00000 n
trailer
-<< /Size 34 /Root 32 0 R /Info 33 0 R /ID [ <7DF556227FCAB9E10CB341987B6AE040> <7DF556227FCAB9E10CB341987B6AE040> ] >>
+<< /Size 34 /Root 32 0 R /Info 33 0 R /ID [ <488A89BFEB9F5F572710D34833184E45> <488A89BFEB9F5F572710D34833184E45> ] >>
startxref
19227
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-list.pdf b/macros/latex/contrib/tagpdf/ex-list.pdf
index 43dfe42bf8..c42445a6a2 100644
--- a/macros/latex/contrib/tagpdf/ex-list.pdf
+++ b/macros/latex/contrib/tagpdf/ex-list.pdf
@@ -210,17 +210,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-12-18T16:55:36+01:00</rdf:li>
+ <rdf:li>2024-01-19T19:58:39+01:00</rdf:li>
</rdf:Seq>
</dc:date>
<dc:format>application/pdf</dc:format>
<dc:source>ex-list.tex</dc:source>
<xmp:CreatorTool>LaTeX</xmp:CreatorTool>
- <xmp:CreateDate>2023-12-18T16:55:36+01:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-12-18T16:55:36+01:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-12-18T16:55:36+01:00</xmp:MetadataDate>
+ <xmp:CreateDate>2024-01-19T19:58:39+01:00</xmp:CreateDate>
+ <xmp:ModifyDate>2024-01-19T19:58:39+01:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2024-01-19T19:58:39+01:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:4c749825-1de7-414c-879f-29e4d0bef66e</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:48712e9e-58ec-4ad8-87e8-3a42043a5fe0</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:063cbb0f-d41e-44a3-8a47-db62ccf9c581</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -653,7 +653,7 @@ endobj
<< /Type /Catalog /Pages 54 0 R /MarkInfo 55 0 R/Lang (en-US)/Metadata 48 0 R/StructTreeRoot 5 0 R >>
endobj
72 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20231218165536+01'00')/ModDate (D:20231218165536+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20240119195839+01'00')/ModDate (D:20240119195839+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 73
@@ -731,7 +731,7 @@ xref
0000029592 00000 n
0000029710 00000 n
trailer
-<< /Size 73 /Root 71 0 R /Info 72 0 R /ID [ <5E4774C3791D95301ACD19EAD1CFC0CF> <5E4774C3791D95301ACD19EAD1CFC0CF> ] >>
+<< /Size 73 /Root 71 0 R /Info 72 0 R /ID [ <AC1B7C8DF05B36B74D0C37D00A0B08DF> <AC1B7C8DF05B36B74D0C37D00A0B08DF> ] >>
startxref
29933
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.pdf b/macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.pdf
index 978f983adf..123ba50946 100644
--- a/macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.pdf
+++ b/macros/latex/contrib/tagpdf/ex-mc-manual-para-split-obsolete.pdf
@@ -243,17 +243,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-12-18T16:56:05+01:00</rdf:li>
+ <rdf:li>2024-01-19T19:59:07+01:00</rdf:li>
</rdf:Seq>
</dc:date>
<dc:format>application/pdf</dc:format>
<dc:source>ex-mc-manual-para-split-obsolete.tex</dc:source>
<xmp:CreatorTool>LaTeX</xmp:CreatorTool>
- <xmp:CreateDate>2023-12-18T16:56:05+01:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-12-18T16:56:05+01:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-12-18T16:56:05+01:00</xmp:MetadataDate>
+ <xmp:CreateDate>2024-01-19T19:59:07+01:00</xmp:CreateDate>
+ <xmp:ModifyDate>2024-01-19T19:59:07+01:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2024-01-19T19:59:07+01:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:c33d64b4-96ec-4e48-8f27-0b3edc831547</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:1595e56f-70f8-4474-867a-1ae2b3cd7f64</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:9847df95-eea1-49b3-8a9e-c1ab77ce723c</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>2</prism:pageCount>
</rdf:Description>
@@ -413,7 +413,7 @@ endobj
<< /Type /Catalog /Pages 14 0 R /Lang (en-US)/Metadata 15 0 R >>
endobj
25 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20231218165605+01'00')/ModDate (D:20231218165605+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20240119195907+01'00')/ModDate (D:20240119195907+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 26
@@ -444,7 +444,7 @@ xref
0000023897 00000 n
0000023978 00000 n
trailer
-<< /Size 26 /Root 24 0 R /Info 25 0 R /ID [ <D3C598AB7A053A3DD44A24FFA696E407> <D3C598AB7A053A3DD44A24FFA696E407> ] >>
+<< /Size 26 /Root 24 0 R /Info 25 0 R /ID [ <299946CEB936BD1617FEBF129FCDEB78> <299946CEB936BD1617FEBF129FCDEB78> ] >>
startxref
24201
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-softhyphen.pdf b/macros/latex/contrib/tagpdf/ex-softhyphen.pdf
index 19a7add1f5..2b430d802e 100644
--- a/macros/latex/contrib/tagpdf/ex-softhyphen.pdf
+++ b/macros/latex/contrib/tagpdf/ex-softhyphen.pdf
@@ -210,17 +210,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-12-18T16:56:31+01:00</rdf:li>
+ <rdf:li>2024-01-19T19:59:33+01:00</rdf:li>
</rdf:Seq>
</dc:date>
<dc:format>application/pdf</dc:format>
<dc:source>ex-softhyphen.tex</dc:source>
<xmp:CreatorTool>LaTeX</xmp:CreatorTool>
- <xmp:CreateDate>2023-12-18T16:56:31+01:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-12-18T16:56:31+01:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-12-18T16:56:31+01:00</xmp:MetadataDate>
+ <xmp:CreateDate>2024-01-19T19:59:33+01:00</xmp:CreateDate>
+ <xmp:ModifyDate>2024-01-19T19:59:33+01:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2024-01-19T19:59:33+01:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:aa82e685-4098-469d-861c-3c45dfc700c7</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:ca29539e-9ba0-41f7-86f8-6cc5a9e4611e</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:8a7b353e-b6b5-40da-83ad-77aea4170264</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -393,7 +393,7 @@ endobj
<< /Type /Catalog /Pages 19 0 R /MarkInfo 20 0 R/Lang (en-US)/Metadata 14 0 R/StructTreeRoot 5 0 R >>
endobj
30 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20231218165631+01'00')/ModDate (D:20231218165631+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20240119195933+01'00')/ModDate (D:20240119195933+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 31
@@ -429,7 +429,7 @@ xref
0000018116 00000 n
0000018234 00000 n
trailer
-<< /Size 31 /Root 29 0 R /Info 30 0 R /ID [ <BF19B56A876C85685B4226B9DA446ACA> <BF19B56A876C85685B4226B9DA446ACA> ] >>
+<< /Size 31 /Root 29 0 R /Info 30 0 R /ID [ <05B8611EC20F37F713A0D2A6789467CE> <05B8611EC20F37F713A0D2A6789467CE> ] >>
startxref
18457
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf b/macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf
index a0eb729bb6..929c9a6aeb 100644
--- a/macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf
+++ b/macros/latex/contrib/tagpdf/ex-spaceglyph-listings.pdf
@@ -210,17 +210,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-12-18T16:56:58+01:00</rdf:li>
+ <rdf:li>2024-01-19T19:59:58+01:00</rdf:li>
</rdf:Seq>
</dc:date>
<dc:format>application/pdf</dc:format>
<dc:source>ex-spaceglyph-listings.tex</dc:source>
<xmp:CreatorTool>LaTeX</xmp:CreatorTool>
- <xmp:CreateDate>2023-12-18T16:56:58+01:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-12-18T16:56:58+01:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-12-18T16:56:58+01:00</xmp:MetadataDate>
+ <xmp:CreateDate>2024-01-19T19:59:58+01:00</xmp:CreateDate>
+ <xmp:ModifyDate>2024-01-19T19:59:58+01:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2024-01-19T19:59:58+01:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:acdc2435-bf29-4e54-8d09-1c9b6dc32038</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:715fe598-2cf7-4804-8ee9-3614435f190c</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:bc642c93-8887-45fe-8177-ac4f6cf315a8</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -354,7 +354,7 @@ endobj
<< /Type /Catalog /Pages 15 0 R /MarkInfo 16 0 R/Lang (en-US)/Metadata 10 0 R/StructTreeRoot 5 0 R >>
endobj
26 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20231218165658+01'00')/ModDate (D:20231218165658+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20240119195958+01'00')/ModDate (D:20240119195958+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 27
@@ -386,7 +386,7 @@ xref
0000015484 00000 n
0000015602 00000 n
trailer
-<< /Size 27 /Root 25 0 R /Info 26 0 R /ID [ <4B690D51D73DA114967668E465C7FF2E> <4B690D51D73DA114967668E465C7FF2E> ] >>
+<< /Size 27 /Root 25 0 R /Info 26 0 R /ID [ <92ADB4969503303AD517B208CBD05D4D> <92ADB4969503303AD517B208CBD05D4D> ] >>
startxref
15825
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf b/macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf
index 9f8c7a0b6f..713aef9a9d 100644
--- a/macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf
+++ b/macros/latex/contrib/tagpdf/ex-structure-obsolete.pdf
@@ -210,17 +210,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-12-18T16:57:26+01:00</rdf:li>
+ <rdf:li>2024-01-19T20:00:24+01:00</rdf:li>
</rdf:Seq>
</dc:date>
<dc:format>application/pdf</dc:format>
<dc:source>ex-structure-obsolete.tex</dc:source>
<xmp:CreatorTool>LaTeX</xmp:CreatorTool>
- <xmp:CreateDate>2023-12-18T16:57:26+01:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-12-18T16:57:26+01:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-12-18T16:57:26+01:00</xmp:MetadataDate>
+ <xmp:CreateDate>2024-01-19T20:00:24+01:00</xmp:CreateDate>
+ <xmp:ModifyDate>2024-01-19T20:00:24+01:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2024-01-19T20:00:24+01:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:bf5e4a2b-cfa9-4fc5-878c-8f9d2ee95445</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:62157a53-a4aa-4084-8ca4-634237e85781</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:391cce5f-6762-4dd5-8345-24759df53df5</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -526,7 +526,7 @@ endobj
<< /Type /Catalog /Pages 26 0 R /MarkInfo 27 0 R/Lang (en-US)/Metadata 20 0 R/StructTreeRoot 5 0 R >>
endobj
43 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20231218165726+01'00')/ModDate (D:20231218165726+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20240119200024+01'00')/ModDate (D:20240119200024+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 44
@@ -575,7 +575,7 @@ xref
0000023426 00000 n
0000023544 00000 n
trailer
-<< /Size 44 /Root 42 0 R /Info 43 0 R /ID [ <80C0A77C79EE32C1370ED68B014C304B> <80C0A77C79EE32C1370ED68B014C304B> ] >>
+<< /Size 44 /Root 42 0 R /Info 43 0 R /ID [ <9B1032D5838A13E78C5BD861432B1F63> <9B1032D5838A13E78C5BD861432B1F63> ] >>
startxref
23767
%%EOF
diff --git a/macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf b/macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf
index eff5cf7637..bc717f0fa6 100644
--- a/macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf
+++ b/macros/latex/contrib/tagpdf/ex-tagpdf-template.pdf
@@ -210,17 +210,17 @@ stream
</dc:language>
<dc:date>
<rdf:Seq>
- <rdf:li>2023-12-18T16:57:56+01:00</rdf:li>
+ <rdf:li>2024-01-19T20:00:52+01:00</rdf:li>
</rdf:Seq>
</dc:date>
<dc:format>application/pdf</dc:format>
<dc:source>ex-tagpdf-template.tex</dc:source>
<xmp:CreatorTool>LaTeX</xmp:CreatorTool>
- <xmp:CreateDate>2023-12-18T16:57:56+01:00</xmp:CreateDate>
- <xmp:ModifyDate>2023-12-18T16:57:56+01:00</xmp:ModifyDate>
- <xmp:MetadataDate>2023-12-18T16:57:56+01:00</xmp:MetadataDate>
+ <xmp:CreateDate>2024-01-19T20:00:52+01:00</xmp:CreateDate>
+ <xmp:ModifyDate>2024-01-19T20:00:52+01:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2024-01-19T20:00:52+01:00</xmp:MetadataDate>
<xmpMM:DocumentID>uuid:f320abfc-f6ab-4d12-8719-d176f4d947cf</xmpMM:DocumentID>
- <xmpMM:InstanceID>uuid:045226fb-45fe-4620-820d-0c52be3f32d6</xmpMM:InstanceID>
+ <xmpMM:InstanceID>uuid:822d8f21-3463-4bbd-8556-f3a87ef8651a</xmpMM:InstanceID>
<prism:complianceProfile>three</prism:complianceProfile>
<prism:pageCount>1</prism:pageCount>
</rdf:Description>
@@ -309,7 +309,7 @@ endobj
<< /Type /Namespace /NS (https://www.latex-project.org/ns/inline/2022) /RoleMapNS 19 0 R >>
endobj
20 0 obj
-<< /Type /Namespace /NS (data:,7C21117D-8985-8D15-E095-29CE1B6DCBC2) >>
+<< /Type /Namespace /NS (data:,2BB44E58-9D2A-B688-A395-4CB6A38386E) >>
endobj
7 0 obj
[ 8 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R ]
@@ -401,7 +401,7 @@ endobj
<< /Type /Catalog /Pages 32 0 R /MarkInfo 33 0 R/Lang (en-US)/Metadata 27 0 R/StructTreeRoot 5 0 R >>
endobj
43 0 obj
-<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20231218165756+01'00')/ModDate (D:20231218165756+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
+<< /Producer (luahbtex-1.17.0)/Creator (LaTeX)/CreationDate (D:20240119200052+01'00')/ModDate (D:20240119200052+01'00') /Trapped /False /PTEX.FullBanner (This is LuaHBTeX, Version 1.17.0 (TeX Live 2023)) >>
endobj
xref
0 44
@@ -410,9 +410,9 @@ xref
0000000003 00000 f
0000000004 00000 f
0000000009 00000 f
-0000014545 00000 n
+0000014544 00000 n
0000012015 00000 n
-0000013973 00000 n
+0000013972 00000 n
0000012288 00000 n
0000000011 00000 f
0000012356 00000 n
@@ -427,30 +427,30 @@ xref
0000013574 00000 n
0000013884 00000 n
0000000000 00000 f
-0000014041 00000 n
-0000014138 00000 n
-0000014225 00000 n
-0000014312 00000 n
-0000014411 00000 n
+0000014040 00000 n
+0000014137 00000 n
+0000014224 00000 n
+0000014311 00000 n
+0000014410 00000 n
0000000020 00000 n
0000011869 00000 n
0000011734 00000 n
0000011500 00000 n
-0000017151 00000 n
-0000017505 00000 n
+0000017150 00000 n
+0000017504 00000 n
0000011979 00000 n
0000012056 00000 n
0000012188 00000 n
0000012225 00000 n
-0000014667 00000 n
-0000016108 00000 n
-0000014754 00000 n
-0000016329 00000 n
-0000017305 00000 n
-0000017567 00000 n
-0000017685 00000 n
+0000014666 00000 n
+0000016107 00000 n
+0000014753 00000 n
+0000016328 00000 n
+0000017304 00000 n
+0000017566 00000 n
+0000017684 00000 n
trailer
-<< /Size 44 /Root 42 0 R /Info 43 0 R /ID [ <B9D89BA811B99E1C236CEFC67C3CB974> <B9D89BA811B99E1C236CEFC67C3CB974> ] >>
+<< /Size 44 /Root 42 0 R /Info 43 0 R /ID [ <35EA0A3564780016E32C886EF0615181> <35EA0A3564780016E32C886EF0615181> ] >>
startxref
-17908
+17907
%%EOF
diff --git a/macros/latex/contrib/tagpdf/tagpdf-backend.dtx b/macros/latex/contrib/tagpdf/tagpdf-backend.dtx
index a257c70058..8a6554e31b 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-backend.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-backend.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-backend.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -47,13 +47,13 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{implementation}
% \begin{macrocode}
%<@@=tag>
%<*luatex>
-\ProvidesExplFile {tagpdf-luatex.def} {2023-12-18} {0.98r}
+\ProvidesExplFile {tagpdf-luatex.def} {2024-01-19} {0.98s}
{tagpdf~driver~for~luatex}
% \end{macrocode}
% \section{Loading the lua}
@@ -158,8 +158,8 @@
local ProvidesLuaModule = {
name = "tagpdf",
- version = "0.98r", --TAGVERSION
- date = "2023-12-18", --TAGDATE
+ version = "0.98s", --TAGVERSION
+ date = "2024-01-19", --TAGDATE
description = "tagpdf lua code",
license = "The LATEX Project Public License 1.3c"
}
@@ -754,6 +754,7 @@ local function @@_mark_spaces (head)
local id = n.id
if id == GLYPH then
local glyph = n
+ default_currfontid = glyph.font
if glyph.next and (glyph.next.id == GLUE)
and not inside_math and (glyph.next.width >0)
then
@@ -790,8 +791,9 @@ local function @@_mark_spaces (head)
if glyph.next and (glyph.next.id == GLUE)
and not inside_math and (glyph.next.width >0) and n.subtype==0
then
- nodesetattribute(glyph.next,iwspaceattributeid,1)
- -- nodesetattribute(glyph.next,iwfontattributeid,glyph.font)
+ nodesetattribute(glyph.next,iwspaceattributeid,1)
+ -- changed 2024-01-18, issue #72
+ nodesetattribute(glyph.next,iwfontattributeid,default_currfontid)
-- for debugging
if ltx.@@.trace.showspaces then
@@_show_spacemark (head,glyph)
@@ -838,6 +840,7 @@ ltx.@@.func.markspaceoff=@@_deactivate_mark_space
% \begin{macrocode}
local default_space_char = nodenew(GLYPH)
local default_fontid = fontid("TU/lmr/m/n/10")
+local default_currfontid = fontid("TU/lmr/m/n/10")
default_space_char.char = 32
default_space_char.font = default_fontid
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-checks.dtx b/macros/latex/contrib/tagpdf/tagpdf-checks.dtx
index 80d865405d..7053050c3f 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-checks.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-checks.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-checks.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{documentation}
% \section{Commands}
@@ -284,16 +284,30 @@
% mc-current}
% Various messages related to mc-chunks. TODO document their meaning.
% \end{function}
-% \begin{function}{struct-no-objnum,struct-faulty-nesting,
+% \begin{function}{struct-unknown,struct-no-objnum,struct-orphan,struct-faulty-nesting,
% struct-missing-tag,struct-used-twice,struct-label-unknown,struct-show-closing}
-% Various messages related to structure. TODO document their meaning.
+% Various messages related to structure. Check the definition in the code for their
+% meaning and the arguments they take.
% \end{function}
%
+% \begin{function}{tree-struct-still-open}
+% Message issued at the end of the compilation
+% if there are (beside Root) other open structures on the stack.
+% \end{function}
+%
+
+% \begin{function}{show-struct,show-kids}
+% These two messages are used in debug mode
+% to show the current structures in the log and terminal.
+% \end{function}
+%
+
% \begin{function}{attr-unknown}
% Message if an attribute i sunknown.
% \end{function}
%
-% \begin{function}{role-missing,role-unknown,role-unknown-tag,role-tag,new-tag}
+% \begin{function}{role-missing,role-unknown,role-unknown-tag,role-tag,new-tag,
+% role-parent-child,role-remapping}
% Messages related to role mapping.
% \end{function}
%
@@ -313,7 +327,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-checks-code} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-checks-code} {2024-01-19} {0.98s}
{part of tagpdf - code related to checks, conditionals, debugging and messages}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-code.pdf b/macros/latex/contrib/tagpdf/tagpdf-code.pdf
index f222571021..0971abe817 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-code.pdf
+++ b/macros/latex/contrib/tagpdf/tagpdf-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/tagpdf/tagpdf-data.dtx b/macros/latex/contrib/tagpdf/tagpdf-data.dtx
index 350b5d645f..dd084f03eb 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-data.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-data.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-data.dtx
%
-% Copyright (C) 2022-2023 Ulrike Fischer
+% Copyright (C) 2022-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -47,7 +47,7 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{documentation}
% This files contains a various data files which are read in
@@ -60,7 +60,7 @@
% It lists the new tag, the rolemap and the namespace of the rolemap.
% \begin{macrocode}
%<*ns-latex>
-%% \ProvidesExplFile {tagpdf-ns-latex.def} {2023-12-18} {0.98r}
+%% \ProvidesExplFile {tagpdf-ns-latex.def} {2024-01-19} {0.98s}
%% {latex} {https://www.latex-project.org/ns/dflt/2022}{}
title, Title, pdf2,
part, Title, pdf2,
@@ -92,7 +92,7 @@ text, P, pdf2,
% It is bound to change
% \begin{macrocode}
%<*ns-latex-book>
-%% \ProvidesExplFile {tagpdf-ns-latex-book.def} {2023-12-18} {0.98r}
+%% \ProvidesExplFile {tagpdf-ns-latex-book.def} {2024-01-19} {0.98s}
%% {latex-book} {https://www.latex-project.org/ns/book/2022}{}
chapter, H1,pdf2,
section, H2,pdf2,
@@ -108,7 +108,7 @@ subparagraph, H6,pdf2,
% loaded.
% \begin{macrocode}
%<*ns-latex-inline>
-%% \ProvidesExplFile {tagpdf-ns-latex-inline.def} {2023-12-18} {0.98r}
+%% \ProvidesExplFile {tagpdf-ns-latex-inline.def} {2024-01-19} {0.98s}
%% {latex-inline} {https://www.latex-project.org/ns/inline/2022}{}
chapter, Span, pdf2,
section, Span, pdf2,
@@ -122,7 +122,7 @@ P, Span, pdf2,
% \section{The pdf namespace data}
% \begin{macrocode}
%<*ns-pdf>
-%% \ProvidesExplFile {tagpdf-ns-pdf.def} {2023-12-18} {0.98r}
+%% \ProvidesExplFile {tagpdf-ns-pdf.def} {2024-01-19} {0.98s}
%% {pdf} {http://iso.org/pdf/ssn}{}
StructTreeRoot,StructTreeRoot,pdf,D,
Document,Document,pdf,D,
@@ -190,8 +190,9 @@ Strong,Span,pdf,I,
% \section{The pdf 2.0 namespace data}
% \begin{macrocode}
%<*ns-pdf2>
-%% \ProvidesExplFile {tagpdf-ns-pdf2.def} {2023-12-18} {0.98r}
+%% \ProvidesExplFile {tagpdf-ns-pdf2.def} {2024-01-19} {0.98s}
%% {pdf2} {http://iso.org/pdf2/ssn}{}
+StructTreeRoot,StructTreeRoot,pdf2,D,
Document,Document,pdf2,D,
Part,Part,pdf2,G,
Sect,Sect,pdf2,G,
@@ -246,7 +247,7 @@ Strong,Strong,pdf2,I,
% \section{The mathml namespace data}
% \begin{macrocode}
%<*ns-mathml>
-%% \ProvidesExplFile {tagpdf-ns-mathml.def} {2023-12-18} {0.98r}
+%% \ProvidesExplFile {tagpdf-ns-mathml.def} {2024-01-19} {0.98s}
% {mathml}{http://www.w3.org/1998/Math/MathML}{}
abs,abs,mathml,
and,and,mathml,
@@ -481,7 +482,7 @@ xor,xor,mathml,
% This will perhaps change in future.
% \begin{macrocode}
%<*parent-child>
-%% \ProvidesExplFile {tagpdf-parent-child.csv} {2023-12-18} {0.98r}
+%% \ProvidesExplFile {tagpdf-parent-child.csv} {2024-01-19} {0.98s}
,,,StructTreeRoot,Document,Art,Part,Div,Sect,BlockQuote,NonStruct,TOC,TOCI,Index,Private,Quote,Note,Reference,BibEntry,P,Hn,H,Lbl,Code,Span,Link,Annot,Form,Ruby,RB,RT,RP,Warichu,WT,WP,L,LI,LBody,Table,TR,TH,TD,THead,TBody,TFoot,Caption,Figure,Formula,MC
Document,both,document level,1,0..n,∅,‡,‡,∅,0..n,‡,∅,∅,∅,0..n,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅
Art,1.7,grouping,∅,0..n,∅,‡,‡,0..n,0..n,‡,∅,∅,∅,0..n,∅,0..n,∅,∅,∅,0..1,0..1,∅,∅,∅,0..n,0..n,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,0..n,∅,∅,0..n,0..n,∅,∅,∅,0..n,0..n,∅,∅
@@ -536,7 +537,7 @@ MC,both,---,∅,∅,∅,∅,∅,∅,0..n,‡,∅,∅,∅,0..n,0..n,0..n,0..n,0..
% This will perhaps change in future.
% \begin{macrocode}
%<*parent-child-2>
-%% \ProvidesExplFile {tagpdf-parent-child-2.csv} {2023-12-18} {0.98r}
+%% \ProvidesExplFile {tagpdf-parent-child-2.csv} {2024-01-19} {0.98s}
,,,StructTreeRoot,Document,DocumentFragment,Art,Part,Div,Sect,Aside,BlockQuote,NonStruct,TOC,TOCI,Index,Private,Title,Sub,Quote,Note,Reference,BibEntry,P,Hn,H,Lbl,Code,Em,Strong,Span,Link,Annot,Form,Ruby,RB,RT,RP,Warichu,WT,WP,FENote,L,LI,LBody,Table,TR,TH,TD,THead,TBody,TFoot,Caption,Figure,Formula,math,mathml,Artifact,MC
Document,both,document level,1,0..n,0..n,∅,‡,‡,∅,0..n,0..n,‡,∅,∅,∅,0..n,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,0..n,∅
DocumentFragment,2.0,document level,∅,0..n,0..n,0..n,‡,‡,0..n,0..n,0..n,‡,∅,∅,∅,0..n,∅,∅,∅,∅*,∅,∅,∅,∅,∅,∅,∅*,∅,∅,∅,∅*,∅*,∅,∅,∅,∅,∅,∅,∅,∅,∅*,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅,∅*,∅,∅,∅,∅,0..n,∅
diff --git a/macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx b/macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx
index 510cd0efe5..c27e33d6e7 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-mc-generic.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-mc-generic.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{documentation}
% \end{documentation}
@@ -55,11 +55,11 @@
% \begin{macrocode}
%<@@=tag>
%<*generic>
-\ProvidesExplPackage {tagpdf-mc-code-generic} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-mc-code-generic} {2024-01-19} {0.98s}
{part of tagpdf - code related to marking chunks - generic mode}
%</generic>
%<*debug>
-\ProvidesExplPackage {tagpdf-debug-generic} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-debug-generic} {2024-01-19} {0.98s}
{part of tagpdf - debugging code related to marking chunks - generic mode}
%</debug>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx b/macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx
index c387249c4c..c10aca5b93 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-mc-luacode.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-mc-luacode.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{implementation}
% The code is splitted into three parts: code shared by all engines,
@@ -86,11 +86,11 @@
% \begin{macrocode}
%<@@=tag>
%<*luamode>
-\ProvidesExplPackage {tagpdf-mc-code-lua} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-mc-code-lua} {2024-01-19} {0.98s}
{tagpdf - mc code only for the luamode }
%</luamode>
%<*debug>
-\ProvidesExplPackage {tagpdf-debug-lua} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-debug-lua} {2024-01-19} {0.98s}
{part of tagpdf - debugging code related to marking chunks - lua mode}
%</debug>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx b/macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx
index 7732ee2eea..f08a0a8f4c 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-mc-shared.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-mc-shared.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{documentation}
% \section{Public Commands}
@@ -181,7 +181,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-mc-code-shared} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-mc-code-shared} {2024-01-19} {0.98s}
{part of tagpdf - code related to marking chunks -
code shared by generic and luamode }
%</header>
diff --git a/macros/latex/contrib/tagpdf/tagpdf-roles.dtx b/macros/latex/contrib/tagpdf/tagpdf-roles.dtx
index 38d6840b8d..c700553f33 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-roles.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-roles.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-roles.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{documentation}
% \begin{function}
@@ -98,7 +98,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-roles-code} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-roles-code} {2024-01-19} {0.98s}
{part of tagpdf - code related to roles and structure names}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-space.dtx b/macros/latex/contrib/tagpdf/tagpdf-space.dtx
index 8421ceba69..4119753bfd 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-space.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-space.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-space.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{documentation}
% \begin{function}{interwordspace (setup-key)}
@@ -64,7 +64,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-space-code} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-space-code} {2024-01-19} {0.98s}
{part of tagpdf - code related to real space chars}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-struct.dtx b/macros/latex/contrib/tagpdf/tagpdf-struct.dtx
index 4808cccece..73224158a7 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-struct.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-struct.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-struct.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{documentation}
% \section{Public Commands}
@@ -63,9 +63,10 @@
% it will check if the \Arg{tag} (after expansion)
% is identical to the current structure on the stack. The tag is not role mapped!
% \end{function}
-% \begin{function}{\tag_struct_use:n}
+% \begin{function}{\tag_struct_use:n,\tag_struct_use_num:n}
% \begin{syntax}
-% \cs{tag_struct_use:n}\Arg{label}
+% \cs{tag_struct_use:n}\Arg{label}\\
+% \cs{tag_struct_use_num:n}\Arg{structure number}
% \end{syntax}
% These commands insert a structure previously stashed away as kid
% into the currently active structure.
@@ -105,6 +106,21 @@
% This gives back the next free /StructParent number (assuming that it is
% together with \cs{tag_struct_insert_annot:nn} which will increase the number.
% \end{function}
+%
+% \begin{function}{\tag_struct_gput:nnn}
+% \begin{syntax}
+% \cs{tag_struct_gput:nnn}\Arg{structure number}\Arg{keyword}\Arg{value}
+% \end{syntax}
+% This is a command that allows to update the data of a structure.
+% This often can't done simply by replacing the value, as we have to
+% preserve and extend existing content. We use therefore dedicated functions
+% adjusted to the key in question.
+% The first argument is the number of the structure,
+% the second a keyword referring to a function,
+% the third the value. Currently the only keyword is \texttt{ref} which updates
+% the Ref key (an array)
+% \end{function}
+%
% \section{Public keys}
% \subsection{Keys for the structure commands}
% \begin{function}{tag (struct-key)}
@@ -269,7 +285,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-struct-code} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-struct-code} {2024-01-19} {0.98s}
{part of tagpdf - code related to storing structure}
%</header>
% \end{macrocode}
@@ -296,6 +312,12 @@
\@@_seq_new:N \g_@@_struct_objR_seq
% \end{macrocode}
% \end{variable}
+% \begin{variable}{\c_@@_struct_null_tl}
+% In lua mode we have to test if the kids a null
+% \begin{macrocode}
+\tl_const:Nn\c_@@_struct_null_tl {null}
+% \end{macrocode}
+% \end{variable}
% \begin{variable}{\g_@@_struct_cont_mc_prop}
% in generic mode it can happen after
@@ -817,20 +839,40 @@
{
% in this case we need a special command in
% luamode to get the array right. See issue #13
- \bool_if:NT\g_@@_mode_lua_bool
+ \bool_if:NTF\g_@@_mode_lua_bool
{
\@@_struct_exchange_kid_command:c
{g_@@_struct_kids_#1_seq}
+% \end{macrocode}
+% check if we get null
+% \begin{macrocode}
+ \tl_set:Ne\l_@@_tmpa_tl
+ {\use:e{\seq_item:cn {g__tag_struct_kids_#1_seq} {1}}}
+ \tl_if_eq:NNF\l__tag_tmpa_tl \c_@@_struct_null_tl
+ {
+ \@@_struct_prop_gput:nne
+ {#1}
+ {K}
+ {
+ \seq_item:cn
+ {
+ g_@@_struct_kids_#1_seq
+ }
+ {1}
+ }
+ }
}
- \@@_struct_prop_gput:nne
- {#1}
- {K}
{
- \seq_item:cn
+ \@@_struct_prop_gput:nne
+ {#1}
+ {K}
{
- g_@@_struct_kids_#1_seq
+ \seq_item:cn
+ {
+ g_@@_struct_kids_#1_seq
+ }
+ {1}
}
- {1}
}
} %
}
@@ -1007,7 +1049,7 @@
\pdf_object_ref:e { @@/struct/\l_@@_struct_stack_parent_tmpa_tl }
}
% increase the int:
- \stepcounter{ g_@@_parenttree_obj_int }
+ \int_gincr:N \c@g_@@_parenttree_obj_int
}
}
% \end{macrocode}
@@ -1863,7 +1905,7 @@
% \section{Attributes and attribute classes}
% \begin{macrocode}
%<*header>
-\ProvidesExplPackage {tagpdf-attr-code} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-attr-code} {2024-01-19} {0.98s}
{part of tagpdf - code related to attributes and attribute classes}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-tree.dtx b/macros/latex/contrib/tagpdf/tagpdf-tree.dtx
index df1f50fdd4..fd0a8bfc2f 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-tree.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-tree.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-tree.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -47,13 +47,13 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{implementation}
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-tree-code} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-tree-code} {2024-01-19} {0.98s}
{part of tagpdf - code related to writing trees and dictionaries to the pdf}
%</header>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf-user.dtx b/macros/latex/contrib/tagpdf/tagpdf-user.dtx
index 5f1a72a3e8..682708d4f9 100644
--- a/macros/latex/contrib/tagpdf/tagpdf-user.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf-user.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf-user.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Version 0.98r, released 2023-12-18}
+% \date{Version 0.98s, released 2024-01-19}
% \maketitle
% \begin{documentation}
% \section{Setup commands}
@@ -120,7 +120,7 @@
% \cs{ShowTagging} \Arg{key-val}
% \end{syntax}
% This is a generic function to output various debugging helps. It not
-% necessarly stops the compilation. The keys and their function are described below.
+% necessarily stops the compilation. The keys and their function are described below.
% \end{function}
%
% \begin{function}{mc-data (show-key)}
@@ -158,6 +158,15 @@
% If no value is used, then the default is |show|.
% \end{function}
%
+% \begin{function}{debug/structures (show-key)}
+% \begin{syntax}
+% |debug/structures| = \meta{structure number}
+% \end{syntax}
+% This key is available only if the tagpdf-debug package is loaded
+% and shows all structures starting with the one with the number
+% given by the key.
+% \end{function}
+
% \section{Extension commands}
% The following commands and code parts are not core commands of tagpdf.
% They either provide work-arounds for missing functionality elsewhere,
@@ -243,6 +252,50 @@
% { Contents }
% { (ref) }
% \end{verbatim}
+%
+% \section{Socket support}
+%
+% \begin{function}{\tag_socket_use:n,\tag_socket_use:nn,\UseTaggingSocket}
+% \begin{syntax}
+% \cs{tag_socket_use:n} \Arg{socket name}\\
+% \cs{tag_socket_use:nn} \Arg{socket name} \Arg{socket argument}\\
+% \cs{UseTaggingSocket} \Arg{socket name} \\
+% \cs{UseTaggingSocket} \Arg{socket name} \Arg{socket argument}\\
+% \end{syntax}
+% \end{function}
+
+% The next \LaTeX{} will use special sockets for the tagging.
+%
+% These sockets will use names starting
+% with \texttt{tagsupport/}. Usually, these sockets have exactly two
+% plugs defined: \texttt{noop} (when no tagging is requested or
+% tagging is not wanted for some reason) and
+% a second plug that enables the tagging. There
+% may be more, e.g., tagging with special debugging, etc., but right
+% now it is usually just on or off.
+%
+% Given that we sometimes have to suspend tagging, it would be fairly
+% inefficient to put different plugs into these sockets whenever that
+% happens. We therefore offer \cs{UseTaggingSocket} which is like
+% \cs{UseSocket} except that the socket name is specified without
+% \texttt{tagsupport/}, i.e.,
+% \begin{quote}
+% \verb=\UseTaggingSocket{foo}= $\to$
+% \verb=\UseSocket{tagsupport/foo}=
+% \end{quote}
+% Beside being slightly shorter, the big advantage is that this way
+% we can change \cs{UseTaggingSocket} to do nothing by switching a boolean
+% instead of changing the plugs of the tagging support sockets back and forth.
+%
+% It is possible to use the tagging support sockets with
+% \cs{UseSocket} directly, but in this case the socket remains active
+% if e.g. \cs{SuspendTagging} is in force. There may be reasons for doing
+% that but in general we expect to always use \cs{UseTaggingSocket}.
+%
+% The L3 programming layer versions \cs{tag_socket_use:n} and
+% \cs{tag_socket_use:nn} are slightly more efficient than
+% \cs{UseTaggingSocket} because they do not have to determine how
+% many arguments the socket takes when disabling it.
% \end{documentation}
%
% \begin{implementation}
@@ -250,7 +303,7 @@
% \begin{macrocode}
%<@@=tag>
%<*header>
-\ProvidesExplPackage {tagpdf-user} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-user} {2024-01-19} {0.98s}
{tagpdf - user commands}
%</header>
% \end{macrocode}
@@ -347,39 +400,6 @@
% \end{macro}
%
% \section{Socket support}
-% The next \LaTeX{} will use special sockets for the tagging.
-%
-% These sockets will use names starting
-% with \texttt{tagsupport/}. Usually, these sockets have exactly two
-% plugs defined: \texttt{noop} (when no tagging is requested or
-% tagging is not wanted for some reason) and
-% a second plug that enables the tagging. There
-% may be more, e.g., tagging with special debugging, etc., but right
-% now it is usually just on or off.
-%
-% Given that we sometimes have to suspend tagging, it would be fairly
-% inefficient to put different plugs into these sockets whenever that
-% happens. We therefore offer \cs{UseTaggingSocket} which is like
-% \cs{UseSocket} except that the socket name is specified without
-% \texttt{tagsupport/}, i.e.,
-% \begin{quote}
-% \verb=\UseTaggingSocket{foo}= $\to$
-% \verb=\UseSocket{tagsupport/foo}=
-% \end{quote}
-% Beside being slightly shorter, the big advantage is that this way
-% we can change \cs{UseTaggingSocket} to do nothing by switching a boolean
-% instead of changing the plugs of the tagging support sockets back and forth.
-%
-% It is possible to use the tagging support sockets with
-% \cs{UseSocket} directly, but in this case the socket remains active
-% if e.g. \cs{SuspendTagging} is in force. There may be reasons for doing
-% that but in general we expect to always use \cs{UseTaggingSocket}.
-%
-% The L3 programming layer versions \cs{tag_socket_use:n} and
-% \cs{tag_socket_use:nn} are slightly more efficient than
-% \cs{UseTaggingSocket} because they do not have to determine how
-% many arguments the socket takes when disabling it.
-%
% Until we can be sure that the kernel defines the commands we provide them before
% redefining them:
% \begin{macrocode}
@@ -718,7 +738,10 @@
% \g_@@_para_main_end_int,
% \l_@@_para_tag_default_tl,
% \l_@@_para_tag_tl,
-% \l_@@_para_main_tag_tl}
+% \l_@@_para_main_tag_tl,
+% \l_@@_para_attr_class_tl,
+% \l_@@_para_main_attr_class_tl,
+% }
% At first some variables.
% \begin{macrocode}
%</package>
@@ -736,6 +759,12 @@
\tl_new:N \l_@@_para_main_tag_tl
\tl_set:Nn \l_@@_para_main_tag_tl {text-unit}
% \end{macrocode}
+% this is perhaps already defined by the block code
+% \begin{macrocode}
+\tl_if_exist:NF \l_@@_para_attr_class_tl
+ {\tl_new:N \l_@@_para_attr_class_tl }
+\tl_new:N \l_@@_para_main_attr_class_tl
+% \end{macrocode}
% \end{macro}
% \begin{macro}
@@ -827,6 +856,10 @@
% \begin{macrocode}
\AddToHook{package/latex-lab-testphase-block/after}
{
+ \tl_if_exist:NT \l_tag_para_attr_class_tl
+ {
+ \tl_set:Nn \l_@@_para_attr_class_tl { \l_tag_para_attr_class_tl }
+ }
\cs_set_protected:Npn \__block_start_para_structure:n #1 {
\__block_debug_typeout:n
{ @endpe = \legacy_if:nTF { @endpe }{true}{false}
@@ -836,7 +869,11 @@
\bool_if:NF \l__tag_para_flattened_bool
{
\@@_gincr_para_main_begin_int:
- \tag_struct_begin:n{tag=\l__tag_para_main_tag_tl}
+ \tag_struct_begin:n
+ {
+ tag=\l_@@_para_main_tag_tl,
+ attribute-class=\l_@@_para_main_attr_class_tl,
+ }
}
}
\@@_gincr_para_begin_int:
@@ -844,7 +881,7 @@
\tag_struct_begin:n
{
tag=\l__tag_para_tag_tl
- ,attribute-class=\l_tag_para_attr_class_tl
+ ,attribute-class=\l_@@_para_attr_class_tl
}
\__tag_check_para_begin_show:nn {green}{#1}
\tag_mc_begin:n {}
diff --git a/macros/latex/contrib/tagpdf/tagpdf.dtx b/macros/latex/contrib/tagpdf/tagpdf.dtx
index 37de4d9927..4eb87d0faf 100644
--- a/macros/latex/contrib/tagpdf/tagpdf.dtx
+++ b/macros/latex/contrib/tagpdf/tagpdf.dtx
@@ -2,7 +2,7 @@
%
%% File: tagpdf.dtx
%
-% Copyright (C) 2019-2023 Ulrike Fischer
+% Copyright (C) 2019-2024 Ulrike Fischer
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -84,7 +84,7 @@
% \begin{macrocode}
%<@@=tag>
%<*package>
-\ProvidesExplPackage {tagpdf} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf} {2024-01-19} {0.98s}
{ A package to experiment with pdf tagging }
\bool_if:nF
@@ -110,7 +110,7 @@
% \end{macrocode}
%<*debug>
% \begin{macrocode}
-\ProvidesExplPackage {tagpdf-debug} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-debug} {2024-01-19} {0.98s}
{ debug code for tagpdf }
\@ifpackageloaded{tagpdf}{}{\PackageWarning{tagpdf-debug}{tagpdf~not~loaded,~quitting}\endinput}
% \end{macrocode}
@@ -133,7 +133,7 @@
% we define a base package with dummy functions
% \begin{macrocode}
%<*base>
-\ProvidesExplPackage {tagpdf-base} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdf-base} {2024-01-19} {0.98s}
{part of tagpdf - provide base, no-op versions of the user commands }
%</base>
% \end{macrocode}
diff --git a/macros/latex/contrib/tagpdf/tagpdf.ins b/macros/latex/contrib/tagpdf/tagpdf.ins
index f0b7ac2284..bc48d45842 100644
--- a/macros/latex/contrib/tagpdf/tagpdf.ins
+++ b/macros/latex/contrib/tagpdf/tagpdf.ins
@@ -2,7 +2,7 @@
File: tagpdf.ins
-Copyright (C) 2019-2023 Ulrike Fischer
+Copyright (C) 2019-2024 Ulrike Fischer
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ for those people who are interested.
\let\MetaPrefix\relax
\preamble
-Copyright (C) 2019-2023 Ulrike Fischer
+Copyright (C) 2019-2024 Ulrike Fischer
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/macros/latex/contrib/tagpdf/tagpdf.pdf b/macros/latex/contrib/tagpdf/tagpdf.pdf
index 9d6e7130e9..e8bd9118bb 100644
--- a/macros/latex/contrib/tagpdf/tagpdf.pdf
+++ b/macros/latex/contrib/tagpdf/tagpdf.pdf
Binary files differ
diff --git a/macros/latex/contrib/tagpdf/tagpdf.tex b/macros/latex/contrib/tagpdf/tagpdf.tex
index d39cd227fc..740d82b290 100644
--- a/macros/latex/contrib/tagpdf/tagpdf.tex
+++ b/macros/latex/contrib/tagpdf/tagpdf.tex
@@ -16,8 +16,8 @@
}
\DebugBlocksOff
\makeatletter
-\def\UlrikeFischer@package@version{0.98r}
-\def\UlrikeFischer@package@date{2023-12-18}
+\def\UlrikeFischer@package@version{0.98s}
+\def\UlrikeFischer@package@date{2024-01-19}
\makeatother
\documentclass[bibliography=totoc,a4paper]{article}
@@ -1057,7 +1057,7 @@ The key-val list understands the following keys:
\begin{docCommands}
{
{doc name=tagmcend},
- {doc name=tag_mc:end}
+ {doc name=tag_mc_end:}
}
\end{docCommands}
@@ -2130,21 +2130,32 @@ of the PDF types can be looked up in the \PDF{}-references
\parencite{pdfspec-iso32000-1,pdfspec-iso32000-2_2020}):
\begin{enumerate}
-\item The \emph{standard structure namespace for PDF 1.7}, also called
- the \emph{default standard structure namespace}. The public name of
- the namespace is |tag/NS/pdf|. This can be used to reference the
- namespace e.g. in attributes. These are the structure names from PDF
- 1.7: \ExplSyntaxOn \clist_clear:N\l_tmpa_clist \prop_map_inline:cn {
- g__tag_role_NS_pdf_prop } { \clist_put_right:Nn \l_tmpa_clist {#1}
- } \clist_use:Nn \l_tmpa_clist {,\c_space_tl } \ExplSyntaxOff
+\item The \emph{standard structure namespace for PDF 1.7}, also called
+ the \emph{default standard structure namespace}. The public name of
+ the namespace is |tag/NS/pdf|. This can be used to reference the
+ namespace e.g. in attributes. These are the structure names from PDF
+ 1.7 (\texttt{StructTreeRoot} is a bit special, it is not really a structure
+ name but nevertheless listed here):
+ \ExplSyntaxOn %%
+ \clist_clear:N\l_tmpa_clist
+ \prop_map_inline:cn
+ {g__tag_role_NS_pdf_prop}
+ {
+ \str_if_eq:eeT
+ {#1}
+ {\use_i:nn #2}
+ { \clist_put_right:Nn \l_tmpa_clist {#1} }
+ }
+ \clist_use:Nn \l_tmpa_clist {,\c_space_tl }. %%
+ \ExplSyntaxOff
\item The \emph{standard structure namespace for PDF 2.0}. The public
name of the namespace is |tag/NS/pdf2|. This can be used to
reference the namespace e.g. in attributes. These are more or less
same types as in PDF. The following types have been removed from
- this set:\\
+ this set\footnote{They still can be used in a PDF 2.0 document!}:\\
%
-\ExplSyntaxOn
+\ExplSyntaxOn %
\clist_clear:N\l_tmpa_clist
\prop_map_inline:cn { g__tag_role_NS_pdf_prop }
{
@@ -2153,20 +2164,19 @@ of the PDF types can be looked up in the \PDF{}-references
{#1}
{ \clist_put_right:Nn \l_tmpa_clist {#1} }
}
-\clist_use:Nn \l_tmpa_clist {,\c_space_tl }\\
-\ExplSyntaxOff
+\clist_use:Nn \l_tmpa_clist {,\c_space_tl },\\
+\ExplSyntaxOff %
and the following are new:\\
-\ExplSyntaxOn
-\clist_clear:N\l_tmpa_clist
-\prop_map_inline:cn { g__tag_role_NS_pdf2_prop }
- {
- \prop_if_in:cnF
- { g__tag_role_NS_pdf_prop }
- {#1}
- { \clist_put_right:Nn \l_tmpa_clist {#1} }
- }
-\clist_use:Nn \l_tmpa_clist {,\c_space_tl }
-\ExplSyntaxOff
+\ExplSyntaxOn %
+ \clist_clear:N\l_tmpa_clist %
+ \prop_map_inline:cn { g__tag_role_NS_pdf_prop }
+ {
+ \str_if_eq:eeF {#1}
+ {\use_i:nn #2}
+ { \clist_put_right:Nn \l_tmpa_clist {#1} }
+ }
+ \clist_use:Nn \l_tmpa_clist {,\c_space_tl }.
+\ExplSyntaxOff %
\item MathML 3.0 as an \emph{other namespaces}. The public name of
the namespace is |tag/NS/mathml|. This can be used to reference the
diff --git a/macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty b/macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty
index 91df3a4761..d6f5e6eb59 100644
--- a/macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty
+++ b/macros/latex/contrib/tagpdf/tagpdfdocu-patches.sty
@@ -1,5 +1,5 @@
%\RequirePackage[enable-debug]{expl3}[2018/06/14]
-\ProvidesExplPackage {tagpdfdocu-patches} {2023-12-18} {0.98r}
+\ProvidesExplPackage {tagpdfdocu-patches} {2024-01-19} {0.98s}
{patches/commands for the tagpdf documentation}
\RequirePackage{etoolbox,xpatch}