vorlagevortrag/ahilbig-semester.sty
2021-04-11 14:32:21 +02:00

534 lines
18 KiB
TeX

% -*- coding: utf-8; -*-
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
% |
% (C)opyright A. Hilbig, mail@andrehilbig.de |
% http://www.andrehilbig.de/Publications |
% |
% diese Datei: ahilbig-semester.sty |
% |
% Das Dokument steht unter der Lizenz: Creative Commons by-nc-sa Version 4.0 |
% http://creativecommons.org/licenses/by-nc-sa/4.0/deed.de |
% |
% Nach dieser Lizenz darf das Dokument beliebig kopiert und bearbeitet werden, |
% sofern das Folgeprodukt wiederum unter gleichen Lizenzbedingungen vertrieben |
% und auf die ursprünglichen Urheber verwiesen wird. |
% Eine kommerzielle Nutzung ist ausdrücklich ausgeschlossen. |
% |
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
% |
% HINWEISE/ERWEITERUNG |
% Diese Pakete basieren auf den entsprechenden Paketen von Prof. Dr. Ludger Humbert |
% (http://ddi.uni-wuppertal.de/ -- humbert@uni-wuppertal.de) und wurden zum Teil angepasst. Seine |
% Pakete basieren wiederum auf Entwicklungen von Prof. Dr. Till Tantau |
% (http://www.tcs.uni-luebeck.de/de/mitarbeiter/tantau/). Beiden gilt mein Dank hierfür. |
% |
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
% |
\ProvidesPackage{ahilbig-semester}
\RequirePackage{pgffor}
\RequirePackage{pgfcalendar}
\RequirePackage{soul,color} % wg. \hl ... = highlight
\RequirePackage{multicol}
\RequirePackage[
backend=biber
,sortlocale=de_DE%.UTF-8
,style=authoryear
,bibencoding=UTF8
,block=space
,autocite=inline % \autocite[..][..]{..} erzeugt Literaturverweise mit runden Klammern
]{biblatex}
\RequirePackage[scale=1.9]{ccicons}
\newenvironment{topcolumns}{\begin{columns}[t]}{\end{columns}}
\RequirePackage{isodate}
\newcommand*\jahr{\number\year}
\newcounter{jahrp}
\addtocounter{jahrp}{\jahr}
\stepcounter{jahrp}
\newcommand*\sommersemester{\jahr}
\newcommand*\wintersemester{\jahr/\thejahrp}
%
% Semester dates
%
% Sets the dates of the semester.
%
% Usage: \setsummerdates{first date of semester}{first lecture date}%
% {last lecture date}{last date of semester}
\def\setsummerdates#1#2#3#4{%
\edef\lec@summerstart{#1}
\edef\lec@summerfirstlec{#2}
\edef\lec@summerlastlec{#3}
\edef\lec@summerend{#4}
}
\def\setwinterdates#1#2#3#4{%
\edef\lec@winterstart{#1}
\edef\lec@winterfirstlec{#2}
\edef\lec@winterlastlec{#3}
\edef\lec@winterend{#4}
}
% Getter and setter:
\def\getsummerstartdate{\lec@summerstart}
\def\getsummerfirstlecturedate{\lec@summerfirstlec}
\def\getsummerlastlecturedate{\lec@summerlastlec}
\def\getsummerenddate{\lec@summerend}
\def\getwinterstartdate{\lec@winterstart}
\def\getwinterfirstlecturedate{\lec@winterfirstlec}
\def\getwinterlastlecturedate{\lec@winterlastlec}
\def\getwinterenddate{\lec@winterend}
%
% Lectures
%
% Sets the lecture dates.
%
% Usage:
%
% \lecturelistofdates{
% 2013-01-01,
% 2013-02-28,
% 2013-12-24,
% }
\def\lecturelistofdates#1{
\foreach \lec@date[count=\lec@i] in {#1} {
\expandafter\xdef\csname lec@date@\lec@i\endcsname{\lec@date}
}
}
% Sets the exercise dates.
%
% Usage:
%
% \exerciselistofdates{
% 2013-01-01->2013-01-08,
% 2013-02-28->2013-03-07,
% 2013-12-24->2013-12-31,
% }
\def\exerciselistofdates#1{%
\def\ex@parsedates##1->##2\foo{%
\def\ex@tutorial{##1}%
\def\ex@deadline{##2}%
}%
\foreach \ex@date[count=\ex@i] in {#1} {%
\edef\ex@tmpdate{\ex@date}%
\expandafter\ex@parsedates\ex@tmpdate\foo
\expandafter\xdef\csname ex@tutorial@\ex@i\endcsname{\ex@tutorial}%
\expandafter\xdef\csname ex@deadline@\ex@i\endcsname{\ex@deadline}%
}%
}
\newcount\lec@lastlecnumber % stores the last lecture id
\newcount\ex@lastexercisenumber % same for exercise id
% Sets the chronological list of lectures with their ids.
%
% \lecturelistofids{
% <lecture id>,
% <lecture id>,
% <lecture id>,
% }
\def\lecturelistofids#1{
\foreach \lec@id[count=\lec@i] in {#1} {
\expandafter\xdef\csname lec@id@\lec@i\endcsname{\lec@id}%
\expandafter\xdef\csname lec@number@\lec@id\endcsname{\lec@i}%
\global\lec@lastlecnumber=\lec@i
}
}
% Sets the chronological list of exercises with their ids.
%
% \exerciselistofids{
% <exercise id>,
% <exercise id>,
% <exercise id>,
% }
\def\exerciselistofids#1{
\foreach \ex@id[count=\ex@i] in {#1} {
\expandafter\xdef\csname ex@id@\ex@i\endcsname{\ex@id}%
\expandafter\xdef\csname ex@number@\ex@id\endcsname{\ex@i}%
\global\ex@lastexercisenumber=\ex@i
}
}
% Testing whether a lecture exists
\def\ddiiflectureidexists#1#2#3{%
\expandafter\ifx\csname lec@number@#1\endcsname\relax%
#3\else#2\fi%
}
% Testing whether an exercise exists
\def\ddiifexerciseidexists#1#2#3{%
\expandafter\ifx\csname ex@number@#1\endcsname\relax%
#3\else#2\fi%
}
% Starts a new lecture. This defines the lecture title, subtitle, and
% the date for the next \maketitle command. Furthermore it sets the
% lecture number and defines a corresponding label.
%
% Usage: \lecturewithid{<lecture id>}
\def\lecturewithid#1#2#3{
\lecture[\getlecturenumberfromid{#1}]{#2}{lecture-#1}
\subtitle{#3}
\date{\getlecturedatefromid{#1}}
}
% Starts a new exercise. This defines the sheet number, date of the
% tutorial, and the date for the next \maketitle command. Furthermore
% it sets the exercise number and defines a corresponding label.
%
% Usage: \exercisewithid{<exercise id>}
\def\exercisewithid#1{%
\def\insertsheetnumber{\getexercisenumberfromid{#1}}%
\edef\ddi@tmpdeadline{\get@exercisedeadlinedatefromid{#1}}%
\def\ddi@none{none}%
\let\insertdeadline=\undefined
\ifx\ddi@none\ddi@tmpdeadline\else
\def\insertdeadline{\getexercisedeadlinedatefromid{#1}}%
\fi
}
% Getter and setter:
%
% Lecture
\def\getlecturedatefromid#1{%
\edef\ddi@tmp@isodate{\csname lec@date@\getlecturenumberfromid{#1}\endcsname}%
\expandafter\ddi@isodatetohumanreadable\ddi@tmp@isodate\pgf@stop%
}
\def\sem@getisodatefromlectureid#1{\csname lec@date@\getlecturenumberfromid{#1}\endcsname}
\def\getlecturenumberfromid#1{\csname lec@number@#1\endcsname}
% Exercise
\def\getexercisedeadlinedatefromid#1{%
\edef\ddi@tmp@deadlineisodate{\csname ex@deadline@\getexercisenumberfromid{#1}\endcsname}%
\edef\ddi@tmp@none{none}%
\edef\ddi@tmp{\ddi@tmp@deadlineisodate}%
\ifx\ddi@tmp@none\ddi@tmp
\def\ddi@tmp@deadlinedate{keine Abgabe}%
\else
\def\ddi@tmp@deadlinedate{\expandafter\ddi@isodatetohumanreadable\ddi@tmp@deadlineisodate\pgf@stop}%
\fi
\ddi@tmp@deadlinedate%
}
\def\get@exercisedeadlinedatefromid#1{%
\csname ex@deadline@\getexercisenumberfromid{#1}\endcsname
}
\def\getexercisetutorialdatefromid#1{%
\edef\ddi@tmp@isodate{\csname ex@tutorial@\getexercisenumberfromid{#1}\endcsname}%
\expandafter\ddi@isodatetohumanreadable\ddi@tmp@isodate\pgf@stop%
}
\def\sem@getisodatefromexerciseid#1{\csname ex@date@\getexercisenumberfromid{#1}\endcsname}
\def\getexercisenumberfromid#1{\csname ex@number@#1\endcsname}
\def\lecturegetfirstdate{\sem@getisodatefromlectureid{1}}
\def\lecturegetlastdate{\sem@getisodatefromlectureid{\lec@lastlecnumber}}
\def\setsummerfirstlectureid#1{\edef\lec@summerfirstlectureid{#1}}
\def\setsummerlastlectureid#1{\edef\lec@summerlastlectureid{#1}}
\def\setwinterfirstlectureid#1{\edef\lec@winterfirstlectureid{#1}}
\def\setwinterlastlectureid#1{\edef\lec@winterlastlectureid{#1}}
\def\getsummerfirstlectureid{\lec@summerfirstlectureid}
\def\getsummerlastlectureid{\lec@summerlastlectureid}
\def\getwinterfirstlectureid{\lec@winterfirstlectureid}
\def\getwinterlastlectureid{\lec@winterlastlectureid}
%
% Lecture titles and subtitles.
%
\def\getlecturetitlefromid#1{\sem@getlecturetitlesfromid{#1}\sem@lecturetitle}
\def\getlecturesubtitlefromid#1{\sem@getlecturetitlesfromid{#1}\sem@lecturesubtitle}
\newif\ifsem@continuereadfile
\def\sem@empty{}
\def\sem@lecturetitle{}
\def\sem@lecturesubtitle{}
\newread\sem@lecturetitlesinputstream
\newread\sem@exercisetitlesinputstream
% Searches the body file of lecture with id #1 for the first
% occurrence of \lecturewithid at the very beginning of a line and
% stores the corresponding lecture title and subtitle in the macros
% \sem@lecturetitle and \sem@lecturesubtitle respectively.
%
\newread\sem@inputstream%
\def\sem@getlecturetitlesfromid#1{%
% Set iteration condition.
\sem@continuereadfiletrue%
%
% Macro for extracting and saving the result.
\def\sem@extractlecturetitles##1##2##3 \lecturewithid{%
\def\sem@lecturetitle{##2}%
\def\sem@lecturesubtitle{##3}%
}%
%
% Macro for examining the line.
\long\def\sem@checkandgetargument##1\lecturewithid##2\pgf@stop{%
% Prepare for \ifx check.
\def\sem@tmp{##1}%
\def\sem@tmpa{##2}%
\ifx\sem@tmp\sem@empty%
\ifx\sem@tmpa\sem@empty%
\else%
% We found the line!
\sem@continuereadfilefalse%
% Extract and store the result.
\expandafter\sem@extractlecturetitles##2%
\fi%
\fi%
}%
%
% Open the corresponding file.
\immediate\openin\sem@lecturetitlesinputstream=\sem@lecgetbodyfilefromid{#1}%
% Iterate over the lines.
\loop \ifsem@continuereadfile%
% Read the next line.
\immediate\read\sem@lecturetitlesinputstream to \sem@nextline
% Examine the line.
\expandafter\sem@checkandgetargument\sem@nextline\lecturewithid\pgf@stop%
\repeat%
% We're done. Close the input stream.
\immediate\closein\sem@lecturetitlesinputstream
}
\def\sem@getexercisetitlesfromid#1{%
% Set iteration condition.
\sem@continuereadfiletrue%
%
% Macro for extracting and saving the result.
\def\sem@extractexercisetitles##1 \title{%
\def\sem@exercisetitle{##1}%
}%
%
% Macro for examining the line.
\long\def\sem@checkandgetargument##1\title##2\pgf@stop{%
% Prepare for \ifx check.
\def\sem@tmp{##1}%
\def\sem@tmpa{##2}%
\ifx\sem@tmp\sem@empty%
\ifx\sem@tmpa\sem@empty%
\else%
% We found the line!
\sem@continuereadfilefalse%
% Extract and store the result.
\expandafter\sem@extractexercisetitles##2%
\fi%
\fi%
}%
%
% Open the corresponding file.
\immediate\openin\sem@exercisetitlesinputstream=\sem@exgetbodyfilefromid{#1}%
% Iterate over the lines.
\loop \ifsem@continuereadfile%
% Read the next line.
\immediate\read\sem@exercisetitlesinputstream to \sem@nextline
% Examine the line.
\expandafter\sem@checkandgetargument\sem@nextline\title\pgf@stop%
\repeat%
% We're done. Close the input stream.
\immediate\closein\sem@exercisetitlesinputstream
}
% To my future me:
% You once really liked the two macros above.
%
% Lecture Parts
%
\newcount\sem@numberofparts % stores the number of ranges
% Sets the lecture parts.
%
% Usage:
% \lecturelistofparts{
% <id of first lecture in part>=<parttitle>,
% <id of first lecture in part>=<parttitle>,
% }
\def\lecturelistofparts#1{
\foreach \sem@partstartidandtitle[count=\map@i] in {#1} {
\expandafter\sem@parse@partstartidandtitle\sem@partstartidandtitle\pgf@stop{\map@i}
\global\sem@numberofparts=\map@i
}
}
\def\sem@parse@partstartidandtitle#1=#2\pgf@stop#3{
\expandafter\gdef\csname sem@partstart@lectureid@#3\endcsname{#1}
\expandafter\gdef\csname sem@partstart@title@#3\endcsname{#2}
}
% Getter and setter.
\def\sem@getnumberofsemesterparts{\the\sem@numberofparts}
\def\sem@getlectureidfrompartnumber#1{\csname sem@partstart@lectureid@#1\endcsname}
\def\sem@getparttitlefrompartnumber#1{\csname sem@partstart@title@#1\endcsname}
% Translates lecture ids to file names. This is required for
% - automatically inserting the lecture targets into the map,
% - extraction of the lecture titles and subtitles of the body
% files.
%
% This translation process should be removed, but this requires
% appropriate renaming of the folders within lecture_slides.
\def\lectureidstofoldernamelist#1{
\foreach \sem@idfilenametuple in {#1} {
\expandafter\sem@parse@idandfilename\sem@idfilenametuple\pgf@stop
}
}
\def\sem@parse@idandfilename#1=#2\pgf@stop{
\expandafter\xdef\csname sem@filename@#1\endcsname{../#2/body.tex}
}
\def\sem@getbodyfilefromid#1{\csname sem@filename@#1\endcsname}
\def\sem@lecgetbodyfilefromid#1{../lecture_slides/#1/body.tex}
\def\sem@exgetbodyfilefromid#1{../exercises/#1/body.tex}
% The following macro creates the file podcasts.aux that is required
% for creating the XML files for Till's podcasts. In this file, the
% i'th line consists of the title and the subtitle of the i'th
% lecture, separated by two hashmarks.
\def\makeauxfiles{%
% Open outstreams
\message{^^JOpening outstreams.^^J}
\newwrite\pod@auxfile \immediate\openout\pod@auxfile=podcasts.aux
\newwrite\pres@auxfile \immediate\openout\pres@auxfile=upload-presentation-files.aux
\newwrite\preswiki@auxfile \immediate\openout\preswiki@auxfile=wiki-presentation-files.aux
\newwrite\ex@auxfile \immediate\openout\ex@auxfile=upload-exercise-files.aux
\newwrite\exwiki@auxfile \immediate\openout\exwiki@auxfile=wiki-exercise-files.aux
% Define counters for the following loop that iterates over all the
% lecture numbers.
\newcount\pod@tmpcnt \pod@tmpcnt=0
\newcount\pod@lecmax \pod@lecmax=\lec@lastlecnumber
\newcount\ex@tmpcnt \ex@tmpcnt=0
\newcount\ex@maxcnt \ex@maxcnt=\ex@lastexercisenumber
% Create temporary token registers
\newtoks\pod@titletoks
\newtoks\pod@subtitletoks
% Generate lecture files
\message{^^JGenerating lecture files.}
\message{Considering the following lecture IDs:^^J}
\loop
\def\lectureid{\csname lec@id@\the\pod@tmpcnt\endcsname}
\advance\pod@tmpcnt by 1
{
\sem@getlecturetitlesfromid{\lectureid}
\expandafter\global\expandafter\pod@titletoks\expandafter=\expandafter{\sem@lecturetitle}
\expandafter\global\expandafter\pod@subtitletoks\expandafter=\expandafter{\sem@lecturesubtitle}
\message{\the\pod@tmpcnt. \lectureid: \the\pod@titletoks^^J}
}
\immediate\write\pod@auxfile{\the\pod@titletoks__\the\pod@subtitletoks}
\immediate\write\pres@auxfile{\lectureid}
\edef\ddi@tmp@isodate{\csname lec@date@\getlecturenumberfromid{\lectureid}\endcsname}%
\immediate\write\preswiki@auxfile{%
1. [attachment:\lectureid.pdf Vorlesung: \the\pod@titletoks],
\expandafter\ddi@isodatetohumanreadable\ddi@tmp@isodate\pgf@stop%
}
\ifnum\pod@tmpcnt<\pod@lecmax
\repeat
\message{^^JFinished generating lecture files.^^J}
% Create temporary token registers
\newtoks\ex@titletoks
\message{^^JGenerating exercise files.}
\message{Considering the following exercise IDs:^^J}
% Generate exercise files
\loop
\def\exerciseid{\csname ex@id@\the\ex@tmpcnt\endcsname}
\advance\ex@tmpcnt by 1
{
\sem@getexercisetitlesfromid{\exerciseid}
\expandafter\global\expandafter\ex@titletoks\expandafter=\expandafter{\sem@exercisetitle}
\message{\the\ex@tmpcnt. \exerciseid: \the\ex@titletoks^^J}
}
\immediate\write\ex@auxfile{\exerciseid}
\edef\ddi@tmp@tutorialisodate{\csname ex@tutorial@\getexercisenumberfromid{\exerciseid}\endcsname}%
\edef\ddi@tmp@tutorialdate{\expandafter\ddi@isodatetohumanreadable\ddi@tmp@tutorialisodate\pgf@stop}%
\edef\ddi@tmp@deadlineisodate{\csname ex@deadline@\getexercisenumberfromid{\exerciseid}\endcsname}%
% Check whether sheet has deadline or not
\def\ddi@tmp@none{none}%
\edef\ddi@tmp{\ddi@tmp@deadlineisodate}%
\ifx\ddi@tmp@none\ddi@tmp
\def\ddi@tmp@deadlinedate{keine Abgabe}
\else
\def\ddi@tmp@deadlinedate{\expandafter\ddi@isodatetohumanreadable\ddi@tmp@deadlineisodate\pgf@stop}%
\fi
\immediate\write\exwiki@auxfile{%
|| [attachment:\exerciseid.pdf \the\ex@tmpcnt. Übung: \the\ex@titletoks]
|| \ddi@tmp@tutorialdate || \ddi@tmp@deadlinedate ||%
}
\ifnum\ex@tmpcnt<\ex@maxcnt
\repeat
\message{^^JFinished generating exercise files.^^J}
\message{^^JClosing outstreams.^^J}
% Close outstreams
\closeout\pod@auxfile
\closeout\pres@auxfile
\closeout\preswiki@auxfile
\closeout\ex@auxfile
\closeout\exwiki@auxfile
\message{Finished. Bye^^J^^J}
}
\def\ddi@isodatetohumanreadable#1-#2-#3\pgf@stop{%
\number#3. \translate{\ddi@arabmonth@to@textmonth{#2}} #1}
\def\ddi@arabmonth@to@textmonth#1{\csname ddi@monthname@#1\endcsname}
\expandafter\def\csname ddi@monthname@01\endcsname{Januar}
\expandafter\def\csname ddi@monthname@02\endcsname{Februar}
\expandafter\def\csname ddi@monthname@03\endcsname{März}
\expandafter\def\csname ddi@monthname@04\endcsname{April}
\expandafter\def\csname ddi@monthname@05\endcsname{Mai}
\expandafter\def\csname ddi@monthname@06\endcsname{Juni}
\expandafter\def\csname ddi@monthname@07\endcsname{Juli}
\expandafter\def\csname ddi@monthname@08\endcsname{August}
\expandafter\def\csname ddi@monthname@09\endcsname{September}
\expandafter\def\csname ddi@monthname@10\endcsname{Oktober}
\expandafter\def\csname ddi@monthname@11\endcsname{November}
\expandafter\def\csname ddi@monthname@12\endcsname{Dezember}