texlive[70448] branches/branch2023.final/Master/texmf-dist:

commits+karl at tug.org commits+karl at tug.org
Wed Mar 6 22:09:56 CET 2024


Revision: 70448
          https://tug.org/svn/texlive?view=revision&revision=70448
Author:   karl
Date:     2024-03-06 22:09:56 +0100 (Wed, 06 Mar 2024)
Log Message:
-----------
jslectureplanner (branch) (6mar24)

Modified Paths:
--------------
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/README
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/lecturebib-english.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/lecturehandout-english.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/lecturepresentation-english.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/lectureprogram-english.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/lecturescript-english.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/membertable-blank-english.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/membertable-filled-english.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/presencetable-blank-english.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/presencetable-filled-english.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/presentation-list-english.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/lecturebib.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/lecturehandout.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/lecturepresentation.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/lectureprogram.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/lecturescript.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/membertable-blank.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/membertable-filled.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/presencetable-blank.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/presencetable-filled.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/presentation-list.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/jslectureplanner.pdf
    branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/jslectureplanner.tex
    branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/cologne.lps
    branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/english.lps
    branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/german-default.lps
    branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/jslectureplanner.sty
    branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/jsmembertable.sty

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/README
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/lecturebib-english.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/lecturehandout-english.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/lecturepresentation-english.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/lectureprogram-english.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/lecturescript-english.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/membertable-blank-english.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/membertable-filled-english.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/presencetable-blank-english.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/presencetable-filled-english.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/English/presentation-list-english.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/lecturebib.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/lecturehandout.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/lecturepresentation.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/lectureprogram.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/lecturescript.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/membertable-blank.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/membertable-filled.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/presencetable-blank.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/presencetable-filled.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/examples/German/presentation-list.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/jslectureplanner.pdf
===================================================================
(Binary files differ)

Modified: branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/jslectureplanner.tex
===================================================================
--- branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/jslectureplanner.tex	2024-03-06 21:09:46 UTC (rev 70447)
+++ branches/branch2023.final/Master/texmf-dist/doc/latex/jslectureplanner/jslectureplanner.tex	2024-03-06 21:09:56 UTC (rev 70448)
@@ -87,7 +87,7 @@
 \author{Jürgen Spitzmüller%
 \thanks{Please report issues via \protect\url{https://github.com/jspitz/jslectureplanner}.}}
 
-\date{Version 1.12, 2020/12/08}
+\date{Version 1.13, 2024/03/06}
 
 \maketitle
 
@@ -151,7 +151,6 @@
  \item \textsf{datetime2}
  \item \textsf{etoolbox}
  \item \textsf{ifthen}
- \item \textsf{xkeyval}
  \item \textsf{xparse}
 \end{itemize}
 \pagebreak
@@ -1239,7 +1238,6 @@
  \item \textsf{calc}
  \item \textsf{longtable}
  \item \textsf{hhline}
- \item \textsf{xkeyval}
 \end{itemize}
 \jsmt\ can be used independently of
 \jslp\ to some degree. The latter package is only required for specific
@@ -1439,6 +1437,11 @@
 \section{Release History}
 
 \begin{itemize}
+\item 2024/03/06 (v. 1.13):
+\begin{itemize}
+	\item Use legacy keyvals rather than \textsf{xkeyval}.
+	\item Fix row spacing in prestables.
+\end{itemize}
 \item 2020/12/08 (v. 1.12):
 	\begin{itemize}
 		\item Correctly parse staryear/endyear.

Modified: branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/cologne.lps
===================================================================
--- branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/cologne.lps	2024-03-06 21:09:46 UTC (rev 70447)
+++ branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/cologne.lps	2024-03-06 21:09:56 UTC (rev 70448)
@@ -23,6 +23,8 @@
 %%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+% Version: 1.13 -- 2024/03/06
+
 % Additional lecture types
 \DefLecType{evl}{EVL}{Einf\"uhrungsvorlesung}{Vorlesung}% introductory lecture
 \DefLecType{es}{ES}{Einf\"uhrungsseminar}{Sitzung}% undergraduate seminar

Modified: branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/english.lps
===================================================================
--- branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/english.lps	2024-03-06 21:09:46 UTC (rev 70447)
+++ branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/english.lps	2024-03-06 21:09:56 UTC (rev 70448)
@@ -27,6 +27,8 @@
 % English localization of the default strings used by the jslectureplanner package
 %
 
+% Version: 1.13 -- 2024/03/06
+
 % Lecture types
 \DefLecType{vl}{LEC}{Lecture}{Lecture}% lecture
 \DefLecType{ps}{USE}{Undergraduate Seminar}{Session}% undergraduate seminar

Modified: branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/german-default.lps
===================================================================
--- branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/german-default.lps	2024-03-06 21:09:46 UTC (rev 70447)
+++ branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/german-default.lps	2024-03-06 21:09:56 UTC (rev 70448)
@@ -27,6 +27,8 @@
 % Default strings (German) used by the jslectureplanner package
 %
 
+% Version: 1.13 -- 2024/03/06
+
 % Lecture types
 \DefLecType{vl}{VL}{Vorlesung}{Vorlesung}% lecture
 \DefLecType{ps}{PS}{Proseminar}{Sitzung}% undergraduate seminar

Modified: branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/jslectureplanner.sty
===================================================================
--- branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/jslectureplanner.sty	2024-03-06 21:09:46 UTC (rev 70447)
+++ branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/jslectureplanner.sty	2024-03-06 21:09:56 UTC (rev 70448)
@@ -23,8 +23,8 @@
 %%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-\def\filedate{2020/12/08}
-\def\fileversion{1.12}
+\def\filedate{2024/03/06}
+\def\fileversion{1.13}
 \def\filename{jslectureplanner.sty}
 
 \NeedsTeXFormat{LaTeX2e}
@@ -36,7 +36,6 @@
 % REQUIRED PACKAGES
 %
 \RequirePackage{etoolbox}
-\RequirePackage{xkeyval}
 \RequirePackage[calc,useregional]{datetime2}
 \RequirePackage{calc}
 \RequirePackage{ifthen}
@@ -218,63 +217,96 @@
 %
 % PACKAGE OPTIONS
 %
-\define at key{lec}{lectype}{%
-  \js at AtEndPreambleIfInPreamble{%
-    \ifcsundef{lectype@#1}{%
-       \PackageError{jslectureplanner}{Lecture type '#1' is not defined!}{%
-             Please consult the package manual for instructions how to define it}
-    }{}
-    \def\lectype{\csuse{lectype@#1}}%
-    \def\lectypeverb{\csuse{lectypeverb@#1}}%
-    \def\lectypesession{\csuse{lectypesession@#1}}%
-  }%
-}
-\DeclareOptionX{type}{\setkeys{lec}{lectype=#1}}
 
-\define at key{lec}{lecsem}{%
-  \js at AtEndPreambleIfInPreamble{%
-    \ifcsundef{lecsemshort@#1}{%
-       \PackageError{jslectureplanner}{Semester type '#1' is not defined!}{%
-             Please consult the package manual for instructions how to define it}
-    }{}
-    \def\lecsemshort{\csuse{lecsemshort@#1}}%
-    \def\lecsemverb{\csuse{lecsemverb@#1}}%
-    \def\@nextsem{\csuse{lecsemnext@#1}}%
-    \def\lecnsemshort{\csuse{lecsemshort@\@nextsem}}%
-    \def\lecnsemverb{\csuse{lecsemverb@\@nextsem}}%
-    \def\lecnsemny{\csuse{lecsemnextny@#1}}%
-  }%
-}
-\DeclareOptionX{semester}{\setkeys{lec}{lecsem=#1}}
-
-\define at key{lec}{title}{\def\lectitle{#1}%
+\DeclareKeys[lec]
+{
+  % type=<type>
+  type.code = {
+    \js at AtEndPreambleIfInPreamble{%
+      \ifcsundef{lectype@#1}{%
+         \PackageError{jslectureplanner}{Lecture type '#1' is not defined!}{%
+	       Please consult the package manual for instructions how to define it}
+      }{}
+      \def\lectype{\csuse{lectype@#1}}%
+      \def\lectypeverb{\csuse{lectypeverb@#1}}%
+      \def\lectypesession{\csuse{lectypesession@#1}}%
+    }%
+  },
+  % semester=<type>
+  semester.code = {
+    \js at AtEndPreambleIfInPreamble{%
+      \ifcsundef{lecsemshort@#1}{%
+         \PackageError{jslectureplanner}{Semester type '#1' is not defined!}{%
+	       Please consult the package manual for instructions how to define it}
+      }{}
+      \def\lecsemshort{\csuse{lecsemshort@#1}}%
+      \def\lecsemverb{\csuse{lecsemverb@#1}}%
+      \def\@nextsem{\csuse{lecsemnext@#1}}%
+      \def\lecnsemshort{\csuse{lecsemshort@\@nextsem}}%
+      \def\lecnsemverb{\csuse{lecsemverb@\@nextsem}}%
+      \def\lecnsemny{\csuse{lecsemnextny@#1}}%
+    }%
+  },
+  % title=<title>
+  title.code = {
+    \def\lectitle{#1}%
     \ifx\lecshorttitle\empty%
       \def\lecshorttitle{#1}%
       \global\togglefalse{uniquelecshorttitle}%
-    \fi}
-\define at key{lec}{titlesep}{\def\lectitlesep{#1}}
-\define at key{lec}{subtitle}{\def\lecsubtitle{#1}}
-\define at key{lec}{shorttitle}{%
-    \def\lecshorttitle{#1}%
-    \global\toggletrue{uniquelecshorttitle}}
-\define at key{lec}{year}{\def\lecyear{#1}}
-\define at key{lec}{endyear}{\def\lecendyear{#1}}
-\define at key{lec}{uni}{\def\lecuniversity{#1}}
-\define at key{lec}{institute}{\def\lecinstitute{#1}}
-\define at key{lec}{platform}{\def\lecplatform{#1}}
-\define at key{lec}{officehours}{\def\officehours{#1}}
-\define at key{lec}{officenumber}{\def\officenumber{#1}}
-\define at key{lec}{room}{\def\lecroom{#1}}
-\define at key{lec}{startdate}{\def\lecstartdate{#1}}
-\define at key{lec}{starttime}{\def\@lecstarttime{#1}\def\lecstarttime{\DTMtime{#1}}}
-\define at key{lec}{duration}{\def\lecduration{#1}}
-\define at key{lec}{instructor}{\def\lecinstructor{#1}%
-    \ifx\lecshortinstructor\empty\def\lecshortinstructor{#1}\fi}
-\define at key{lec}{shortinstructor}{%
+    \fi
+  },
+  % titlesep=<sep>
+  titlesep.store = \lectitlesep,
+  % subtitle=<sep>
+  subtitle.store = \lecsubtitle,
+  % shorttitle=<title>
+  shorttitle.code = {
+    \def\lecshorttitle{#1}
+    \global\toggletrue{uniquelecshorttitle}
+  },
+  % year=<year>
+  year.store = \lecyear,
+  % endyear=<year>
+  endyear.store = \lecendyear,
+  % uni=<university>
+  uni.store = \lecuniversity,
+  % institute=<institute>
+  institute.store = \lecinstitute,
+  % platform=<platform>
+  platform.store = \lecplatform,
+  % officehours=<officehours>
+  officehours.store = \lecofficehours,
+  % officenumber=<officenumber>
+  officenumber.store = \lecofficenumber,
+  % room=<room>
+  room.store = \lecroom,
+  % startdate=<startdate>
+  startdate.store = \lecstartdate,
+  % starttime=<starttime>
+  starttime.code = {
+    \def\@lecstarttime{#1}
+    \def\lecstarttime{\DTMtime{#1}}
+  },
+  % duration=<duration>
+  duration.store = \lecduration,
+  % instructor=<instructor>
+  instructor.code = {
+    \def\lecinstructor{#1}%
+    \ifx\lecshortinstructor\empty
+      \def\lecshortinstructor{#1}
+    \fi
+  },
+  % shortinstructor=<shortinstructor>
+  shortinstructor.code = {
     \def\lecshortinstructor{#1}%
-    \global\toggletrue{uniquelecshortinstructor}}
-\define at key{lec}{style}{\AtEndOfPackage{\input{#1.lps}}}
-\define at key{lec}{interval}{%
+    \global\toggletrue{uniquelecshortinstructor}
+  },
+  % style=<style>
+  style.code = {
+    \AtEndOfPackage{\input{#1.lps}}
+  },
+  % interval=<interval>
+  interval.code = {
     % test if the input is a number
     % courtesy of egreg at http://tex.stackexchange.com/a/50131
     \if\relax\detokenize\expandafter{\romannumeral-0#1}\relax
@@ -281,33 +313,17 @@
       \setcounter{lecinterval}{#1}%
     \else
       \PackageError{jslectureplanner}{%
-          Value of 'interval' option must be a number\MessageBreak
-          ('#1' was given instead)}{}%
+        Value of 'interval' option must be a number\MessageBreak
+        ('#1' was given instead)}{}%
     \fi
+  },
+  % sestitlesep=<sestitlesep>
+  sestitlesep.store = \sestitlesep
 }
-\define at key{lec}{sestitlesep}{\def\sestitlesep{#1}}
 
-\DeclareOptionX{title}{\setkeys{lec}{title={#1}}}
-\DeclareOptionX{titlesep}{\setkeys{lec}{titlesep={#1}}}
-\DeclareOptionX{subtitle}{\setkeys{lec}{subtitle={#1}}}
-\DeclareOptionX{shorttitle}{\setkeys{lec}{shorttitle={#1}}}
-\DeclareOptionX{year}{\setkeys{lec}{year=#1}}
-\DeclareOptionX{uni}{\setkeys{lec}{uni={#1}}}
-\DeclareOptionX{institute}{\setkeys{lec}{institute={#1}}}
-\DeclareOptionX{startdate}{\setkeys{lec}{startdate=#1}}
-\DeclareOptionX{starttime}{\setkeys{lec}{starttime=#1}}
-\DeclareOptionX{instructor}{\setkeys{lec}{instructor={#1}}}
-\DeclareOptionX{shortinstructor}{\setkeys{lec}{shortinstructor={#1}}}
-\DeclareOptionX{platform}{\setkeys{lec}{platform={#1}}}
-\DeclareOptionX{officehours}{\setkeys{lec}{officehours={#1}}}
-\DeclareOptionX{officenumber}{\setkeys{lec}{officenumber={#1}}}
-\DeclareOptionX{room}{\setkeys{lec}{room={#1}}}
-\DeclareOptionX{style}{\setkeys{lec}{style=#1}}
-\DeclareOptionX{interval}{\setkeys{lec}{interval=#1}}
-\DeclareOptionX{sestitlesep}{\setkeys{lec}{sestitlesep=#1}}
+% Process package options
+\ProcessKeyOptions[lec]
 
-\ProcessOptionsX
-
 %
 % End Options
 %%
@@ -323,39 +339,39 @@
 \NewDocumentCommand \LecYear { m m }
 {
    % #1: semester/term
-   \setkeys{lec}{lecsem=#1}
+   \SetKeys[lec]{semester=#1}
    % split #2 at / if available (startyear/endyear)
    \seq_set_split:Nnn \seq_jslp_lec_year { / } { #2 }
    \seq_pop_left:NNT \seq_jslp_lec_year \tl_jslp_start_year
    { 
-      \setkeys{lec}{year=\tl_jslp_start_year} 
+      \SetKeys[lec]{year=\tl_jslp_start_year} 
    }
    \seq_get_right:NNT \seq_jslp_lec_year \tl_jslp_end_year
    {
-       \setkeys{lec}{endyear=\tl_jslp_end_year}
+       \SetKeys[lec]{endyear=\tl_jslp_end_year}
    }
 }
 \ExplSyntaxOff
 
-\newcommand*{\LecType}[1]{\setkeys{lec}{lectype=#1}}
-\newcommand*{\LecTitle}[2][]{\setkeys{lec}{shorttitle={#2},#1,title={#2}}}
-\newcommand*{\LecTitleSep}[1]{\setkeys{lec}{titlesep={#1}}}
-\newcommand*{\LecSubTitle}[1]{\setkeys{lec}{subtitle={#1}}}
-\newcommand*{\LecUni}[1]{\setkeys{lec}{uni={#1}}}
-\newcommand*{\LecInstitute}[1]{\setkeys{lec}{institute={#1}}}
-\newcommand*{\LecRoom}[1]{\setkeys{lec}{room={#1}}}
-\newcommand*{\LecStartDate}[1]{\setkeys{lec}{startdate=#1}}
-\newcommand*{\LecStartTime}[1]{\setkeys{lec}{starttime=#1}}
-\newcommand*{\LecDuration}[1]{\setkeys{lec}{duration=#1}}
+\newcommand*{\LecType}[1]{\SetKeys[lec]{type=#1}}
+\newcommand*{\LecTitle}[2][]{\SetKeys[lec]{shorttitle={#2},#1,title={#2}}}
+\newcommand*{\LecTitleSep}[1]{\SetKeys[lec]{titlesep={#1}}}
+\newcommand*{\LecSubTitle}[1]{\SetKeys[lec]{subtitle={#1}}}
+\newcommand*{\LecUni}[1]{\SetKeys[lec]{uni={#1}}}
+\newcommand*{\LecInstitute}[1]{\SetKeys[lec]{institute={#1}}}
+\newcommand*{\LecRoom}[1]{\SetKeys[lec]{room={#1}}}
+\newcommand*{\LecStartDate}[1]{\SetKeys[lec]{startdate=#1}}
+\newcommand*{\LecStartTime}[1]{\SetKeys[lec]{starttime=#1}}
+\newcommand*{\LecDuration}[1]{\SetKeys[lec]{duration=#1}}
 \newcommand*{\LecInstructor}[2][\empty]{%
     \ifx#1\empty
-        \setkeys{lec}{instructor={#2}}%
+        \SetKeys[lec]{instructor={#2}}%
     \else
-        \setkeys{lec}{instructor={#2},shortinstructor={#1}}%
+        \SetKeys[lec]{instructor={#2},shortinstructor={#1}}%
     \fi
 }
-\newcommand*{\LecInterval}[1]{\setkeys{lec}{interval=#1}}
-\newcommand*{\SessionTitleSep}[1]{\setkeys{lec}{sestitlesep=#1}}
+\newcommand*{\LecInterval}[1]{\SetKeys[lec]{interval=#1}}
+\newcommand*{\SessionTitleSep}[1]{\SetKeys[lec]{sestitlesep=#1}}
 
 
 %
@@ -497,16 +513,21 @@
 
 % 2.) Term types
 %
-\define at key{semtype}{next}{\csdef{@ltn}{#1}}
-\define at boolkey{semtype}{nextny}[true]{}
+\newif\if at jslp@semtype at nextny\@jslp at semtype@nextnyfalse
+\DeclareKeys[semtype]
+{
+	next.store = \@ltn,
+	nextny.if = @jslp at semtype@nextny
+}
+
 \newcommand*\DefSemType[4][\empty]{%
   \csdef{@ltn}{}
   \csdef{lecsemshort@#2}{#3}
   \csdef{lecsemverb@#2}{#4}
   \ifx\empty#1\else%
-        \setkeys{semtype}{nextny=false}%
-        \setkeys{semtype}{#1}%
-        \ifKV at semtype@nextny
+        \SetKeys[semtype]{nextny=false}%
+        \SetKeys[semtype]{#1}%
+        \if at jslp@semtype at nextny
             \csdef{lecsemnextny@#2}{y}
         \else
             \csdef{lecsemnextny@#2}{n}
@@ -650,80 +671,115 @@
 
 %
 % Beamer program generation
-\define at key{beamerprogram}{title}{\csdef{@bptitle}{#1}}
-\define at key{beamerprogram}{options}{\csdef{@bpopts}{#1}}
-\define at key{beamerprogram}{listoptions}{\csdef{@bplistopts}{#1}}
-\define at key{beamerprogram}{overlayarg}{\csdef{@bpolarg}{#1}}
-\define at key{beamerprogram}{overlayarg2}{\csdef{@bpolargii}{#1}}
-\define at key{beamerprogram}{overlayarg3}{\csdef{@bpolargiii}{#1}}
-\define at key{beamerprogram}{overlayarg4}{\csdef{@bpolargiv}{#1}}
-\define at boolkey{beamerprogram}{alerted}[true]{}
-\define at boolkey{beamerprogram}{blocksonly}[true]{}
-\define at boolkey{beamerprogram}{uncover}[true]{}
+\newif\if at jslp@beamerprogram at alerted\@jslp at beamerprogram@alertedfalse
+\newif\if at jslp@beamerprogram at blocksonly\@jslp at beamerprogram@blocksonlyfalse
+\newif\if at jslp@beamerprogram at uncover\@jslp at beamerprogram@uncoverfalse
 
+\DeclareKeys[beamerprogram]
+{
+  % title=<title>
+  title.store = \@bptitle,
+  % options = <options>
+  options.store = \@bpopts,
+  % listoptions = <options>
+  listoptions.store = \@bplistopts,
+  % overlayarg = <arg>
+  overlayarg.store = \@bpolarg,
+  % overlayarg2 = <arg>
+  overlayarg2.store = \@bpolargii,
+  % overlayarg3 = <arg>
+  overlayarg3.store = \@bpolargiii,
+  % overlayarg4 = <arg>
+  overlayarg4.store = \@bpolargiv,
+  % overlayarg = <true|false> [not functional!]
+  alerted.if = @jslp at beamerprogram@alerted,
+  % blocksonly = <true|false>
+  blocksonly.if = @jslp at beamerprogram@blocksonly,
+  % uncover = <true|false>
+  uncover.if = @jslp at beamerprogram@uncover
+}
+
 % Overlay specifications for uncover programs
 \newcommand*\beameruncoverspec{\beamerdefaultoverlayspecification{<+(1)->}}
 \newcommand*\beameruncoverffslidesspec{\beamerdefaultoverlayspecification{<+(-1)->}}
 \newcommand*\beameruncoverblocksonlyspec{\beamerdefaultoverlayspecification{<+->}}
+\newcommand*\beameralertspec{}
 
 \newcommand*\makebeamerprogram[1][]{%
   \csdef{@bptitle}{\lecprogram}
   \def\btitleapp{}
   \numdef\pframes{\thefbreaks + 1}
-  \setkeys{beamerprogram}{alerted=false}
-  \setkeys{beamerprogram}{blocksonly=false}
-  \setkeys{beamerprogram}{uncover=false}
-  \setkeys{beamerprogram}{#1}
+  \SetKeys[beamerprogram]{alerted=false}
+  \SetKeys[beamerprogram]{blocksonly=false}
+  \SetKeys[beamerprogram]{uncover=false}
+  \SetKeys[beamerprogram]{#1}
   \def\bpdescbeg{\begin{BeamerProgramList}}
-  \ifKV at beamerprogram@alerted
+  \providebool{alerted}
+  \if at jslp@beamerprogram at alerted
+     \booltrue{alerted}
+  \else
+     \boolfalse{alerted}
   \fi
   \providebool{uncoveredlist}
-  \ifKV at beamerprogram@uncover
+  \if at jslp@beamerprogram at uncover
      \booltrue{uncoveredlist}
   \else
      \boolfalse{uncoveredlist}
   \fi
-  \ifKV at beamerprogram@blocksonly
-     \ifcsdef{@bpolarg}{%
-        \ifcsdef{@bpopts}{%
+  \if at jslp@beamerprogram at blocksonly
+     \ifbool{alerted}{%
+       \ifbool{uncoveredlist}%
+           {\renewcommand*\beameruncoverblocksonlyspec{\beamerdefaultoverlayspecification{<+-| alert at +>}}}%
+           {\renewcommand*\beameralertspec{\beamerdefaultoverlayspecification{<alert at +>}}}%
+     }{}
+     \ifcsvoid{@bpolarg}{%
+       \ifcsvoid{@bpopts}{%
+           \begin{frame}[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
+        }{%
            \begingroup\edef\tempa{\endgroup\noexpand%
-             \begin{frame}<\csuse{@bpolarg}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
-        }{%
-           \begin{frame}<\csuse{@bpolarg}>[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
+             \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
         }%
      }{%
-        \ifcsdef{@bpopts}{%
+       \ifcsvoid{@bpopts}{%
+           \begin{frame}<\csuse{@bpolarg}>[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
+        }{%
            \begingroup\edef\tempa{\endgroup\noexpand%
-             \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
-        }{%
-           \begin{frame}[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
+             \begin{frame}<\csuse{@bpolarg}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
         }%
      }%
-       \ifbool{uncoveredlist}{\beameruncoverblocksonlyspec}{}
+       \ifbool{uncoveredlist}{\beameruncoverblocksonlyspec}{\beameralertspec}
        \begin{BeamerProgramList}
          \ifcsempty{programblocklistbeamer}{\BeamerProgramBlockBlocksOnlyItem{}{}}{\programblocklistbeamer}
        \end{BeamerProgramList}
      \end{frame}
-  \else% not \ifKV at beamerprogram@blocksonly
+  \else% not \if at jslp@beamerprogram at blocksonly
+    \ifbool{alerted}{%
+       \ifbool{uncoveredlist}%
+           {%
+             \renewcommand*\beameruncoverspec{\beamerdefaultoverlayspecification{<+(1)-| alert at +(1)>}}
+             \renewcommand*\beameruncoverffslidesspec{\beamerdefaultoverlayspecification{<+(-1)-| alert at +(-1)>}}
+           }%
+           {\renewcommand*\beameralertspec{\beamerdefaultoverlayspecification{<alert at +(1)>}}}%
+     }{}
     % All but last slide(s) are generated in what follows
     \@ifundefined{programlistbeamerii}{}{%
     \def\btitleapp{\ (1/\pframes)}
-     \ifcsdef{@bpolarg}{%
-        \ifcsdef{@bpopts}{%
-           \begingroup\edef\tempa{\endgroup\noexpand%
-             \begin{frame}<\csuse{@bpolarg}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+     \ifcsvoid{@bpolarg}{%
+        \ifcsvoid{@bpopts}{%
+           \begin{frame}[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
         }{%
-           \begin{frame}<\csuse{@bpolarg}>[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
-        }%
-     }{%
-        \ifcsdef{@bpopts}{%
            \begingroup\edef\tempa{\endgroup\noexpand%
              \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+        }%
+    }{%
+        \ifcsvoid{@bpopts}{%
+           \begin{frame}<\csuse{@bpolarg}>[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
         }{%
-           \begin{frame}[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
+           \begingroup\edef\tempa{\endgroup\noexpand%
+             \begin{frame}<\csuse{@bpolarg}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
         }%
-    }%
-     \ifbool{uncoveredlist}{\beameruncoverspec}{}
+     }%
+     \ifbool{uncoveredlist}{\beameruncoverspec}{\beameralertspec}
      \begin{BeamerProgramList}
       \programlistbeamerii
      \end{BeamerProgramList}
@@ -731,22 +787,22 @@
     }
     \@ifundefined{programlistbeameriii}{}{%
     \def\btitleapp{\ (2/\pframes)}
-    \ifcsdef{@bpolargii}{%
-        \ifcsdef{@bpopts}{%
-           \begingroup\edef\tempa{\endgroup\noexpand%
-             \begin{frame}<\csuse{@bpolargii}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+    \ifcsvoid{@bpolargii}{%
+        \ifcsvoid{@bpopts}{%
+           \begin{frame}[label=beamerprogram2]{\csuse{@bptitle}\btitleapp}
         }{%
-           \begin{frame}<\csuse{@bpolargii}>[label=beamerprogram2]{\csuse{@bptitle}\btitleapp}
-        }%
-     }{%
-        \ifcsdef{@bpopts}{%
            \begingroup\edef\tempa{\endgroup\noexpand%
               \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+        }%
+    }{%
+        \ifcsvoid{@bpopts}{%
+           \begin{frame}<\csuse{@bpolargii}>[label=beamerprogram2]{\csuse{@bptitle}\btitleapp}
         }{%
-           \begin{frame}[label=beamerprogram2]{\csuse{@bptitle}\btitleapp}
+           \begingroup\edef\tempa{\endgroup\noexpand%
+             \begin{frame}<\csuse{@bpolargii}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
         }%
-    }%
-     \ifbool{uncoveredlist}{\beameruncoverffslidesspec}{}
+     }%
+     \ifbool{uncoveredlist}{\beameruncoverffslidesspec}{\beameralertspec}
      \begin{BeamerProgramList}
       \programlistbeameriii
      \end{BeamerProgramList}
@@ -754,22 +810,22 @@
     }
     \@ifundefined{programlistbeameriv}{}{%
     \def\btitleapp{\ (3/\pframes)}
-    \ifcsdef{@bpolargiii}{%
-        \ifcsdef{@bpopts}{%
-           \begingroup\edef\tempa{\endgroup\noexpand%
-             \begin{frame}<\csuse{@bpolargiii}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+    \ifcsvoid{@bpolargiii}{%
+        \ifcsvoid{@bpopts}{%
+           \begin{frame}[label=beamerprogram3]{\csuse{@bptitle}\btitleapp}
         }{%
-           \begin{frame}<\csuse{@bpolargiii}>[label=beamerprogram3]{\csuse{@bptitle}\btitleapp}
-        }%
-     }{%
-        \ifcsdef{@bpopts}{%
            \begingroup\edef\tempa{\endgroup\noexpand%
              \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+        }%
+    }{%
+        \ifcsvoid{@bpopts}{%
+           \begin{frame}<\csuse{@bpolargiii}>[label=beamerprogram3]{\csuse{@bptitle}\btitleapp}
         }{%
-           \begin{frame}[label=beamerprogram3]{\csuse{@bptitle}\btitleapp}
+           \begingroup\edef\tempa{\endgroup\noexpand%
+             \begin{frame}<\csuse{@bpolargiii}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
         }%
-    }%
-     \ifbool{uncoveredlist}{\beameruncoverffslidesspec}{}
+     }%
+     \ifbool{uncoveredlist}{\beameruncoverffslidesspec}{\beameralertspec}
      \begin{BeamerProgramList}
       \programlistbeameriv
      \end{BeamerProgramList}
@@ -778,80 +834,80 @@
     % The last slide is generated separately:
     \ifnumgreater{\thefbreaks}{0}{\def\btitleapp{\ (\pframes/\pframes)}}{}
        \@ifundefined{programlistbeamerii}{%
-          \ifcsdef{@bpolarg}{%
-              \ifcsdef{@bpopts}{%
+          \ifcsvoid{@bpolarg}{%
+             \ifcsvoid{@bpopts}{%
+               \begin{frame}[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
+            }{%
+               \begingroup\edef\tempa{\endgroup\noexpand%
+               \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+             }%
+          }{%
+              \ifcsvoid{@bpopts}{%
+                 \begin{frame}<\csuse{@bpolarg}>[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
+             }{%
                  \begingroup\edef\tempa{\endgroup\noexpand%
                  \begin{frame}<\csuse{@bpolarg}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
-              }{%
-                 \begin{frame}<\csuse{@bpolarg}>[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
              }%
-          }{%
-             \ifcsdef{@bpopts}{%
-               \begingroup\edef\tempa{\endgroup\noexpand%
-               \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
-             }{%
-               \begin{frame}[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
-            }%
           }%
         }{%
           \@ifundefined{programlistbeameriii}{%
-             \ifcsdef{@bpolargii}{%
-               \ifcsdef{@bpopts}{%
+             \ifcsvoid{@bpolargii}{%
+               \ifcsvoid{@bpopts}{%
+                 \begin{frame}[label=beamerprogram2]{\csuse{@bptitle}\btitleapp}
+               }{%
                  \begingroup\edef\tempa{\endgroup\noexpand%
-                 \begin{frame}<\csuse{@bpolargii}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
-               }{%
-                 \begin{frame}<\csuse{@bpolargii}>[label=beamerprogram2]{\csuse{@bptitle}\btitleapp}
+                 \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
                }%
              }{%
-               \ifcsdef{@bpopts}{%
+               \ifcsvoid{@bpopts}{%
+                 \begin{frame}<\csuse{@bpolargii}>[label=beamerprogram2]{\csuse{@bptitle}\btitleapp}
+               }{%
                  \begingroup\edef\tempa{\endgroup\noexpand%
-                 \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
-               }{%
-                 \begin{frame}[label=beamerprogram2]{\csuse{@bptitle}\btitleapp}
+                 \begin{frame}<\csuse{@bpolargii}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
                }%
              }%
           }{%
              \@ifundefined{programlistbeameriv}{%
-                    \ifcsdef{@bpolargiii}{%
-                       \ifcsdef{@bpopts}{%
-                          \begingroup\edef\tempa{\endgroup\noexpand%
-                           \begin{frame}<\csuse{@bpolargiii}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+                    \ifcsvoid{@bpolargiii}{%
+                        \ifcsvoid{@bpopts}{%
+                           \begin{frame}[label=beamerprogram3]{\csuse{@bptitle}\btitleapp}
                         }{%
-                           \begin{frame}<\csuse{@bpolargiii}>[label=beamerprogram3]{\csuse{@bptitle}\btitleapp}
+                           \begingroup\edef\tempa{\endgroup\noexpand%
+                           \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
                         }%
                     }{%
-                        \ifcsdef{@bpopts}{%
-                           \begingroup\edef\tempa{\endgroup\noexpand%
-                           \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+                       \ifcsvoid{@bpopts}{%
+                           \begin{frame}<\csuse{@bpolargiii}>[label=beamerprogram3]{\csuse{@bptitle}\btitleapp}
                         }{%
-                           \begin{frame}[label=beamerprogram3]{\csuse{@bptitle}\btitleapp}
+                          \begingroup\edef\tempa{\endgroup\noexpand%
+                           \begin{frame}<\csuse{@bpolargiii}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
                         }%
                     }%
              }{%
-                  \ifcsdef{@bpolargiv}{%
-                       \ifcsdef{@bpopts}{%
-                          \begingroup\edef\tempa{\endgroup\noexpand%
-                           \begin{frame}<\csuse{@bpolargiv}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+                  \ifcsvoid{@bpolargiv}{%
+                        \ifcsvoid{@bpopts}{%
+                           \begin{frame}[label=beamerprogram4]{\csuse{@bptitle}\btitleapp}
                         }{%
-                           \begin{frame}<\csuse{@bpolargiv}>[label=beamerprogram4]{\csuse{@bptitle}\btitleapp}
+                           \begingroup\edef\tempa{\endgroup\noexpand%
+                           \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
                         }%
                     }{%
-                        \ifcsdef{@bpopts}{%
-                           \begingroup\edef\tempa{\endgroup\noexpand%
-                           \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+                       \ifcsvoid{@bpopts}{%
+                           \begin{frame}<\csuse{@bpolargiv}>[label=beamerprogram4]{\csuse{@bptitle}\btitleapp}
                         }{%
-                           \begin{frame}[label=beamerprogram4]{\csuse{@bptitle}\btitleapp}
+                          \begingroup\edef\tempa{\endgroup\noexpand%
+                           \begin{frame}<\csuse{@bpolargiv}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
                         }%
                     }%
              }%
           }%
       }%
-     \ifbool{uncoveredlist}{\beameruncoverffslidesspec}{}
+     \ifbool{uncoveredlist}{\beameruncoverffslidesspec}{\beameralertspec}
      \begin{BeamerProgramList}
       \programlistbeamer
      \end{BeamerProgramList}
     \end{frame}
-  \fi%\else\ifKV at beamerprogram@blocksonly
+  \fi%\else\if at jslp@beamerprogram at blocksonly
 }
 
 
@@ -860,46 +916,55 @@
   \csdef{@bptitle}{\lecprogram}
   \def\btitleapp{}
   \numdef\pframes{\thefbreaks + 1}
-  \setkeys{beamerprogram}{alerted=false}
-  \setkeys{beamerprogram}{blocksonly=false}
-  \setkeys{beamerprogram}{uncover=false}
-  \setkeys{beamerprogram}{#1}
+  \SetKeys[beamerprogram]{alerted=false}
+  \SetKeys[beamerprogram]{blocksonly=false}
+  \SetKeys[beamerprogram]{uncover=false}
+  \SetKeys[beamerprogram]{#1}
   \def\bpdescbeg{\begin{BeamerProgramList}}
-  \ifKV at beamerprogram@alerted
+  \providebool{alerted}
+  \if at jslp@beamerprogram at alerted
+     \booltrue{alerted}
+  \else
+     \boolfalse{alerted}
   \fi
   \providebool{uncoveredlist}
-  \ifKV at beamerprogram@uncover
+  \if at jslp@beamerprogram at uncover
      \booltrue{uncoveredlist}
   \else
      \boolfalse{uncoveredlist}
   \fi
-  \ifKV at beamerprogram@blocksonly
-  \else% not \ifKV at beamerprogram@blocksonly
+  \if at jslp@beamerprogram at blocksonly
+  \else% not \if at jslp@beamerprogram at blocksonly
+    \ifbool{alerted}{%
+       \ifbool{uncoveredlist}%
+           {\renewcommand*\beameruncoverspec{\beamerdefaultoverlayspecification{<+(1)-| alert at +(1)>}}}%
+           {\renewcommand*\beameralertspec{\beamerdefaultoverlayspecification{<alert at +(1)>}}}%
+     }{}
     % All but last slide(s) are generated in what follows
     \ifcsempty{programlistbeamerexam}{}{%
      \def\btitleapp{}
-      \ifcsdef{@bpolarg}{%
-         \ifcsdef{@bpopts}{%
-            \begingroup\edef\tempa{\endgroup\noexpand%
-              \begin{frame}<\csuse{@bpolarg}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+      \ifcsvoid{@bpolarg}{%
+         \ifcsvoid{@bpopts}{%
+            \begin{frame}[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
          }{%
-            \begin{frame}<\csuse{@bpolarg}>[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
-         }%
-      }{%
-         \ifcsdef{@bpopts}{%
             \begingroup\edef\tempa{\endgroup\noexpand%
               \begin{frame}[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
+         }%
+     }{%
+         \ifcsvoid{@bpopts}{%
+            \begin{frame}<\csuse{@bpolarg}>[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
          }{%
-            \begin{frame}[label=beamerprogram]{\csuse{@bptitle}\btitleapp}
+            \begingroup\edef\tempa{\endgroup\noexpand%
+              \begin{frame}<\csuse{@bpolarg}>[\csuse{@bpopts}]{\csuse{@bptitle}\btitleapp}}\tempa
          }%
-     }%
-      \ifbool{uncoveredlist}{\beameruncoverspec}{}
+      }%
+      \ifbool{uncoveredlist}{\beameruncoverspec}{\beameralertspec}
       \begin{BeamerProgramListExam}
        \programlistbeamerexam
       \end{BeamerProgramListExam}
      \end{frame}
    }%
-  \fi%\else\ifKV at beamerprogram@blocksonly
+  \fi%\else\if at jslp@beamerprogram at blocksonly
 }
 
 
@@ -935,24 +1000,63 @@
 % 1) Session definition
 %
 \newtoggle{shortinstrdef}
-\define at key{session}{titlesep}{\csdef{@sestitlesep}{{#1}}}
-\define at key{session}{subtitle}{\csdef{@sessubtitle}{{#1}}}
-\define at key{session}{shorttitle}{\csdef{@sesshorttitle}{{#1}}\csdef{@usesshorttitle}{{#1}}}
-\define at key{session}{bibsec}{\csdef{@sesbibsec}{#1}}
-\define at key{session}{room}{\csdef{@sesroom}{{#1}}}
-\define at key{session}{starttime}{\csdef{@sesrtime}{#1}\csdef{@sestime}{\DTMtime{#1}}}
-\define at key{session}{duration}{\csdef{@sesduration}{#1}}
-\define at key{session}{instructor}{%
-    \csdef{@sesinstructor}{{#1}}\csdef{@usesinstructor}{{#1}}%
-    \iftoggle{shortinstrdef}{}{\csdef{@sesshortinstructor}{{#1}}\csdef{@usesshortinstructor}{{#1}}}}
-\define at key{session}{shortinstructor}{%
-    \csdef{@sesshortinstructor}{{#1}}\csdef{@usesshortinstructor}{{#1}}\toggletrue{shortinstrdef}}
-\define at key{session}{presstudents}{\csdef{@sespresstudents}{{#1}}}
-\define at boolkey{session}{cancel}[true]{}
-\define at boolkey{session}{draft}[true]{}
-\define at key{session}{topicnumber}{\setcounter{sestopic}{#1-1}}
-\define at key{session}{extradate}{\csdef{@xsesdate}{#1}}
-\define at boolkey{session}{exam}[true]{}
+\newif\if at jslp@session at cancel\@jslp at session@cancelfalse
+\newif\if at jslp@session at draft\@jslp at session@draftfalse
+\newif\if at jslp@session at exam\@jslp at session@examfalse
+
+\DeclareKeys[session]
+{
+  % titlesep = <sep>
+  titlesep.code = { \csdef{@sestitlesep}{{#1}} },
+  % subtitle = <title>
+  subtitle.code = { \csdef{@sessubtitle}{{#1}} },
+  % shorttitle = <title>
+  shorttitle.code = {
+    \csdef{@sesshorttitle}{{#1}}
+    \csdef{@usesshorttitle}{{#1}}
+  },
+  % bibsec = <keyword>
+  bibsec.store = \@sesbibsec,
+  % room = <room>
+  room.code = { \csdef{@sesroom}{{#1}} },
+  % starttime = <starttime>
+  starttime.code = {
+    \csdef{@sesrtime}{#1}
+    \csdef{@sestime}{\DTMtime{#1}}
+  },
+  % duration = <duration>
+  duration.store = \@sesduration,
+  % instructor = <instructor>
+  instructor.code = {
+    \csdef{@sesinstructor}{{#1}}
+    \csdef{@usesinstructor}{{#1}}
+    \iftoggle{shortinstrdef}{}{%
+      \csdef{@sesshortinstructor}{{#1}}
+      \csdef{@usesshortinstructor}{{#1}}%
+    }
+  },
+  % shortinstructor = <instructor>
+  shortinstructor.code = {
+    \csdef{@sesshortinstructor}{{#1}}
+    \csdef{@usesshortinstructor}{{#1}}
+    \toggletrue{shortinstrdef}
+  },
+  % presstudents = <instructor>
+  presstudents.code = { \csdef{@sespresstudents}{{#1}} },
+  % cancel = <true|false>
+  cancel.if = @jslp at session@cancel,
+  % draft = <true|false>
+  draft.if = @jslp at session@draft,
+  % exam = <true|false>
+  exam.if = @jslp at session@exam,
+  % topicnumber = <true|false>
+  topicnumber.code = {
+    \setcounter{sestopic}{#1-1}
+  },
+  % extradate = <date>
+  extradate.store = \@xsesdate
+}
+
 %
 \newcommand*\NewSession[2][]{%
   \stepcounter{sesunit}
@@ -974,10 +1078,10 @@
   \csdef{@usesshortinstructor}{}
   \csdef{@sespresstudents}{}
   \csdef{@xsesdate}{}
-  \setkeys{session}{cancel=false}
-  \setkeys{session}{draft=false}
-  \setkeys{session}{exam=false}
-  \setkeys{session}{#1}
+  \SetKeys[session]{cancel=false}
+  \SetKeys[session]{draft=false}
+  \SetKeys[session]{exam=false}
+  \SetKeys[session]{#1}
   \csdef{@sestitle}{#2}
   % only calculate the date if it is not fixed via extradate.
   \ifcsempty{@xsesdate}{%
@@ -1022,12 +1126,12 @@
   \protected at csxdef{sespresstudents\thesnum}{\csuse{@sespresstudents}}
   \protected at csxdef{sesblock\thesnum}{\csuse{@currentblock}}
   \protected at csxdef{sesblockno\thesnum}{\csuse{@currentblockno}}
-  \ifKV at session@cancel
+  \if at jslp@session at cancel
     \stepcounter{cancellations}
     \protected at eappto\programlist{\noexpand\ProgramListCancelItem{\csuse{sesshortdate\thesnum}}{\csuse{sestitle\thesnum}}{\csuse{@sestitlesep}}{\csuse{@sessubtitle}}}
     \protected at eappto\programlistbeamer{\noexpand\BeamerProgramListCancelItem{\csuse{sesshortdate\thesnum}}{\csuse{sestitle\thesnum}}{\csuse{@sestitlesep}}{\csuse{@sessubtitle}}}
   \else
-    \ifKV at session@exam
+    \if at jslp@session at exam
         \stepcounter{exams}
         \protected at csxdef{examsesno\theexams}{\thesnum}
         \protected at eappto\programlistexam{\noexpand\ProgramListExamItem{\csuse{sesshortdate\thesnum}}{\csuse{sestitle\thesnum}}{\csuse{@sestitlesep}}{\csuse{@sessubtitle}}}
@@ -1039,7 +1143,7 @@
         }%
     \else
         \stepcounter{sestopic}
-        \ifKV at session@draft
+        \if at jslp@session at draft
             \ifcsempty{@sestitle}{\protected at csxdef{sestitle\thesnum}{\sestopic}}{}
         \fi
         \protected at eappto\programlist{\noexpand\ProgramListItem{\csuse{sesshortdate\thesnum}}{\csuse{sestitle\thesnum}}{\csuse{@sestitlesep}}{\csuse{@sessubtitle}}}
@@ -1075,16 +1179,24 @@
 }
 
 % Set break of multiple interval units
-\define at key{break}{units}{\csdef{@breakunits}{#1}}
-\define at key{break}{span}{\csdef{@breakspan}{#1}}
-\define at key{break}{weeks}{%
-  \PackageWarning{jslectureplanner}{\protect\SetBreaks\space option 'weeks' is deprecated. Use 'units' instead.}%
-  \setkeys{break}{units=#1}%
+\DeclareKeys[break]
+{
+  % units = <int>
+  units.store = \@breakunits,
+  % span = <int>
+  span.store = \@breakspan,
+  % weeks = <int> (deprecated!)
+  weeks.code = {
+    \PackageWarning{jslectureplanner}{%
+        \protect\SetBreaks\space option 'weeks' is deprecated. Use 'units' instead.}%
+    \SetKeys[break]{units=#1}%
+  }
 }
+
 \newcommand*\SetBreaks[2][units=1]{%
   \csdef{@breakunits}{}
   \csdef{@breakspan}{}
-  \setkeys{break}{#1}
+  \SetKeys[break]{#1}
   \setcounter{breakunits}{\csuse{@breakunits}}
   \setcounter{sesunit}{\thesesunit+\thebreakunits}
   \setcounter{cancellations}{\thecancellations+\thebreakunits}

Modified: branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/jsmembertable.sty
===================================================================
--- branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/jsmembertable.sty	2024-03-06 21:09:46 UTC (rev 70447)
+++ branches/branch2023.final/Master/texmf-dist/tex/latex/jslectureplanner/jsmembertable.sty	2024-03-06 21:09:56 UTC (rev 70448)
@@ -24,8 +24,8 @@
 %%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-\def\filedate{2020/12/08}
-\def\fileversion{1.12}
+\def\filedate{2024/03/06}
+\def\fileversion{1.13}
 \def\filename{jsmembertable.sty}
 
 \NeedsTeXFormat{LaTeX2e}
@@ -41,32 +41,35 @@
 \RequirePackage{array}
 \RequirePackage{longtable}
 \RequirePackage{hhline}
-\RequirePackage{xkeyval}
 
 %
 % PACKAGE OPTIONS
 %
 
-\newif\if at datatool\@datatoolfalse
-\def\jsmt at datafile{}
-\define at key{mem}{datafile}{%
-  \def\jsmt at datafile{#1.csv}
-  \@datatooltrue
-}
-\DeclareOptionX{datafile}{\setkeys{mem}{datafile=#1}}
+\newif\if at jsmt@datatool\@jsmt at datatoolfalse
 \def\jsmt at datakeys{pname,sname,mid,email}
-\define at key{mem}{datakeys}{%
-  \def\jsmt at datakeys{#1}
+
+\DeclareKeys[jsmt]
+{
+  % datafile=filename
+  datafile.code = {
+     \def\jsmt at datafile{#1.csv}
+     \@jsmt at datatooltrue
+  },
+  datafile.usage = load,
+  % datakeys={<keyorder>}
+  datakeys.store = \jsmt at datakeys,
+  datakeys.usage = load
 }
-\DeclareOptionX{datakeys}{\setkeys{mem}{datakeys={#1}}}
-\ProcessOptionsX
 
+\ProcessKeyOptions[jsmt]
+
 %
 % OPT-IN PACKAGES
 %
 
 % Load datatool if necessary
-\if at datatool
+\if at jsmt@datatool
   \RequirePackage{datatool}
   \DTLloadrawdb[noheader,keys={\jsmt at datakeys}]{data}{\jsmt at datafile}
   \dtlsort{sname,pname}{data}{\dtlicompare}
@@ -197,7 +200,7 @@
          &   \jsemailheader\tabularnewline
   \hhline{-===}
   \endhead
-  \if at datatool
+  \if at jsmt@datatool
     \DTLforeach*{data}{%
       \jsmt at firstname=pname,\jsmt at surname=sname,\jsmt at mid=mid,\jsmt at email=email}{%
       \DTLiffirstrow{}{\tabularnewline\hline}%
@@ -649,11 +652,12 @@
   \hline
   \hline
   \endhead
-  \if at datatool%
+  \strut
+  \if at jsmt@datatool%
     \DTLforeach*{data}{%
       \jsmt at firstname=pname,\jsmt at surname=sname}{%
       \DTLiffirstrow{}{\tabularnewline\hline}%
-      \bodyrowone{\jsmt at surname, \jsmt at firstname}%
+      \bodyrowone{\jsmt at surname, \jsmt at firstname}\strut%
     }%
     \tabularnewline\hline
   \fi%
@@ -677,7 +681,7 @@
     \resettabtoks
     \loop\ifnum\thetabrow<\themembers\relax
       \stepcounter{tabrow}
-      \addtabtoks{\bodyrowtwo{}\tabularnewline\hline}%
+      \addtabtoks{\bodyrowtwo{}\tabularnewline\hline}\strut%
     \repeat
     \ltstarttwo
     \headerptwo
@@ -684,11 +688,12 @@
     \hline
     \hline
     \endhead
-    \if at datatool
+    \strut
+    \if at jsmt@datatool
       \DTLforeach*{data}{%
         \jsmt at firstname=pname,\jsmt at surname=sname}{%
         \DTLiffirstrow{}{\tabularnewline\hline}%
-        \bodyrowtwo{\jsmt at surname, \jsmt at firstname}%
+        \bodyrowtwo{\jsmt at surname, \jsmt at firstname}\strut%
       }%
       \tabularnewline\hline
     \fi%



More information about the tex-live-commits mailing list.