Init
This commit is contained in:
commit
23134f9886
18
.drone.yml
Normal file
18
.drone.yml
Normal file
|
@ -0,0 +1,18 @@
|
|||
kind: pipeline
|
||||
name: default
|
||||
type: exec
|
||||
|
||||
steps:
|
||||
- name: lfs
|
||||
commands:
|
||||
- git lfs install
|
||||
- git lfs pull
|
||||
|
||||
- name: lint
|
||||
commands:
|
||||
- ./lint.sh
|
||||
|
||||
- name: build
|
||||
commands:
|
||||
- nix build -L
|
||||
- readlink -f result
|
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
attachments/*.pdf filter=lfs diff=lfs merge=lfs -text
|
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
*.aux
|
||||
*.fdb_latexmk
|
||||
*.fls
|
||||
*.log
|
||||
*.out
|
||||
*.pdf
|
||||
*.synctex.gz
|
||||
*.toc
|
||||
*.xdv
|
||||
|
||||
!/attachments/*.pdf
|
||||
|
||||
/result
|
19
LICENSE
Normal file
19
LICENSE
Normal file
|
@ -0,0 +1,19 @@
|
|||
Copyright 2020-2021 Simon Bruder
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
17
Makefile
Normal file
17
Makefile
Normal file
|
@ -0,0 +1,17 @@
|
|||
.PHONY: all
|
||||
all: $(patsubst %.tex,%.pdf,$(wildcard *.tex))
|
||||
|
||||
%-sitzung.pdf: %-sitzung.tex podcastproto.cls
|
||||
latexmk -xelatex $<
|
||||
|
||||
clean:
|
||||
rm -f \
|
||||
*.aux \
|
||||
*.fdb_latexmk \
|
||||
*.fls \
|
||||
*.log \
|
||||
*.out \
|
||||
*.pdf \
|
||||
*.synctex.gz \
|
||||
*.toc \
|
||||
*.xdv
|
13
README.md
Normal file
13
README.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
# Redacted version of protocol template
|
||||
|
||||
Since the production repository for the protocols includes personal data,
|
||||
it can’t be published.
|
||||
This repository includes a snapshot of the templates used to generate the protocols.
|
||||
|
||||
## How to get dates of all meetings
|
||||
|
||||
grep 'date=\\DTMdisplaydate' -ri *.tex | sort -n | sed -r 's/([0-9]*)-sitzung.tex: date=\\DTMdisplaydate\{([0-9][0-9][0-9][0-9])\}\{([0-9]*)\}\{([0-9]*)\}\{-1\},/\4.\3.\2: \1. Sitzung/' | sed -r 's/(^|\.)([0-9])(\.|:)/\10\2\3/g'
|
||||
|
||||
## License
|
||||
|
||||
The MIT License, see [LICENSE](./LICENSE) for the full text.
|
43
flake.lock
Normal file
43
flake.lock
Normal file
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"locked": {
|
||||
"lastModified": 1619345332,
|
||||
"narHash": "sha256-qHnQkEp1uklKTpx3MvKtY6xzgcqXDsz5nLilbbuL+3A=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "2ebf2558e5bf978c7fb8ea927dfaed8fefab2e28",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1619796933,
|
||||
"narHash": "sha256-Tw9QyuOL8ROhMKkpYBmj8r8h9ehEn9JKhZ+VyK4OfMI=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "c8dff328e51f62760bf646bc345e3aabcfd82046",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
42
flake.nix
Normal file
42
flake.nix
Normal file
|
@ -0,0 +1,42 @@
|
|||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = { self, flake-utils, nixpkgs }: flake-utils.lib.eachDefaultSystem (system: rec {
|
||||
packages.p-seminar-protocols = nixpkgs.legacyPackages.${system}.callPackage ({ stdenv, texlive }:
|
||||
let
|
||||
texlive' = texlive.combine {
|
||||
inherit (texlive) scheme-small
|
||||
datetime2
|
||||
datetime2-german
|
||||
latexmk
|
||||
tracklang
|
||||
xkeyval;
|
||||
};
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
name = "p-seminar-protocols";
|
||||
|
||||
nativeBuildInputs = [
|
||||
texlive'
|
||||
];
|
||||
|
||||
src = self;
|
||||
|
||||
enableParallelBuilding = true;
|
||||
|
||||
# We only build a PDF
|
||||
dontFixup = true;
|
||||
|
||||
installPhase = ''
|
||||
mkdir $out
|
||||
cp *-sitzung.pdf $out
|
||||
'';
|
||||
}) { };
|
||||
|
||||
defaultPackage = packages.p-seminar-protocols;
|
||||
});
|
||||
}
|
30
lint.sh
Executable file
30
lint.sh
Executable file
|
@ -0,0 +1,30 @@
|
|||
#!/bin/sh
|
||||
set -o pipefail
|
||||
|
||||
fail=0
|
||||
|
||||
for file in *.tex *.cls; do
|
||||
basename="$(basename -- "$file")"
|
||||
filefail=0
|
||||
|
||||
(grep -n $'\t' "$file" | sed 's/\t/↹/g') && echo -e "$file: Found tab (expected only spaces)\n" && filefail=1
|
||||
(grep -n '\s$' "$file" | sed 's/\s/·/g') && echo -e "$file: Trailing whitespace\n" && filefail=1
|
||||
[ "${basename##*.}" = "tex" ] && (grep -nE '^ [^&]*\\\\' "$file") && echo -e "$file: Forced linebreak outside of table\n" && filefail=1
|
||||
[[ -x "$file" ]] && echo -e "$file: Executable bit is set (but filetype does not need to be executable)\n" && filefail=1
|
||||
|
||||
if [ "$filefail" = "1" ]; then
|
||||
fail=1
|
||||
echo # additional newline after each failed file
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$CI" = "true" ]; then
|
||||
pdfs=$(find . -iname "*.pdf" -not -path "./attachments/*")
|
||||
[ -n "$pdfs" ] && echo -e "Found PDF files not in ./attachments/:\n$pdfs" && fail=1
|
||||
fi
|
||||
|
||||
if [ "$fail" = "1" ]; then
|
||||
exit 1
|
||||
else
|
||||
echo "Linting passed"
|
||||
fi
|
127
podcastproto.cls
Normal file
127
podcastproto.cls
Normal file
|
@ -0,0 +1,127 @@
|
|||
% vim: set ft=tex
|
||||
\ProvidesClass{podcastproto}
|
||||
|
||||
\LoadClass[
|
||||
DIV=20,
|
||||
parskip=half,
|
||||
]{scrartcl}
|
||||
|
||||
% hyphenation
|
||||
\RequirePackage[ngerman]{babel}
|
||||
|
||||
% cretion of nice dates from numbers
|
||||
\RequirePackage[useregional]{datetime2}
|
||||
|
||||
% if conditions for commands
|
||||
\RequirePackage{etoolbox}
|
||||
|
||||
% key-value pairs for command options
|
||||
\RequirePackage{xkeyval}
|
||||
|
||||
% attachments
|
||||
\RequirePackage{pdfpages}
|
||||
|
||||
% links/pdf toc
|
||||
\RequirePackage[unicode, hidelinks]{hyperref}
|
||||
|
||||
% roman font for title
|
||||
\addtokomafont{disposition}{\rmfamily}
|
||||
|
||||
% No dots in TOC
|
||||
% https://tex.stackexchange.com/a/53899
|
||||
\makeatletter
|
||||
\renewcommand\@dotsep{1000}
|
||||
\makeatother
|
||||
|
||||
% no page numbers
|
||||
\pagenumbering{gobble}
|
||||
|
||||
% only subsection in agenda
|
||||
\setcounter{tocdepth}{\sectiontocdepth}
|
||||
|
||||
\makeatletter
|
||||
\define@key{meta}{number}{\def\Number{#1}}
|
||||
\define@key{meta}{date}{\def\Date{#1}}
|
||||
\define@key{meta}{present}{\def\PeoplePresent{#1}}
|
||||
\define@key{meta}{absent}{\def\PeopleAbsent{#1}}
|
||||
\define@key{meta}{duration}{\def\Duration{#1}}
|
||||
\define@key{meta}{location}{\def\Location{#1}}
|
||||
\define@key{meta}{chairperson}{\def\Chairperson{#1}}
|
||||
\define@key{meta}{secretary}{\def\Secretary{#1}}
|
||||
\define@key{meta}{secretaryAddress}{\def\SecretaryAddress{#1}}
|
||||
\define@key{meta}{attachments}{\def\Attachments{#1}}
|
||||
\setkeys{meta}{
|
||||
duration=15:55 bis 17:25,
|
||||
location=Raum 126 der Christian-von-Bomhard-Schule Uffenheim,
|
||||
chairperson=redigiert
|
||||
}
|
||||
\makeatother
|
||||
|
||||
% header
|
||||
\newcommand*{\header}[1][]{
|
||||
\begingroup
|
||||
\setkeys{meta}{#1}
|
||||
|
||||
{\DTMsetstyle{pdf}
|
||||
\hypersetup{
|
||||
pdftitle={P-Seminar „Einen Podcast erstellen“ -- Niederschrift über die \Number. Sitzung},
|
||||
pdfauthor={\Secretary},
|
||||
pdfinfo={
|
||||
CreationDate={\Date}
|
||||
}
|
||||
}}
|
||||
|
||||
\begin{center}
|
||||
{\bfseries
|
||||
{\Large
|
||||
Christian-von-Bomhard Schule \\
|
||||
P-Seminar „Einen Podcast erstellen“
|
||||
}
|
||||
|
||||
\vspace{2em}
|
||||
|
||||
Niederschrift \\
|
||||
über die \\
|
||||
\Number. Sitzung \\
|
||||
am \Date
|
||||
}
|
||||
\end{center}
|
||||
|
||||
\vspace{2em}
|
||||
|
||||
\begin{tabular}{l l}
|
||||
Anwesend: & \PeoplePresent\ Seminarteilnehmende \\
|
||||
\ifdef{\PeopleAbsent}{Abwesend: & \PeopleAbsent \\}{}
|
||||
Zeit: & \Duration\\
|
||||
Ort: & \Location \\
|
||||
Vorsitzende: & \Chairperson \\
|
||||
\SecretaryAddress: & \Secretary \\
|
||||
\ifdef{\Attachments}{Anlagen: & \Attachments \\}{}
|
||||
\end{tabular}
|
||||
\endgroup
|
||||
|
||||
% End (needs to access variables from header)
|
||||
\newcommand*\protoend{
|
||||
\begingroup
|
||||
\setkeys{meta}{#1}
|
||||
\filbreak % rather break here than somewhere we don’t need it
|
||||
|
||||
\vspace{5mm}
|
||||
Uffenheim, \Date
|
||||
\vspace{5mm}
|
||||
|
||||
\makebox[6cm][c]{\textbf{\SecretaryAddress:}}\hfill
|
||||
\makebox[6cm][c]{\textbf{Vorsitzende:}}
|
||||
\vspace{1.5cm}\par
|
||||
\makebox[6cm]{\hrulefill} \hfill\makebox[6cm]{\hrulefill} \\
|
||||
\makebox[6cm][c]{(\Secretary)} \hfill\makebox[6cm][c]{(\Chairperson)}
|
||||
\endgroup
|
||||
}
|
||||
}
|
||||
|
||||
% Agenda
|
||||
\newcommand*{\agenda}{
|
||||
\DeclareTOCStyleEntry[]{undottedtocline}{section}
|
||||
\renewcommand*{\contentsname}{Tagesordnung}
|
||||
\tableofcontents
|
||||
}
|
Loading…
Reference in a new issue