init
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
.claude
|
||||||
|
abgaben/*.pdf
|
||||||
|
abgaben/gruppe0.yaml
|
||||||
|
abgaben/*.md
|
||||||
|
abgaben/referenzen.bib
|
||||||
|
abgaben/metadata.yaml
|
||||||
|
.DS_Store
|
||||||
Vendored
+38
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "SM: Aktuelle Abgabe rendern",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "make render FILE='${relativeFile}'",
|
||||||
|
"options": {
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"panel": "shared",
|
||||||
|
"clear": true
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "SM: Alle Abgaben rendern",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "make all",
|
||||||
|
"options": {
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
"group": "build",
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "always",
|
||||||
|
"panel": "shared",
|
||||||
|
"clear": true
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
export PATH := /Library/TeX/texbin:$(PATH)
|
||||||
|
|
||||||
|
TEMPLATE := templates/sm-template.tex
|
||||||
|
DEFAULTS := templates/sm-defaults.yaml
|
||||||
|
FILENAME_TPL := templates/filename.tpl
|
||||||
|
META_FILE ?= abgaben/metadata.yaml
|
||||||
|
PANDOC := pandoc
|
||||||
|
|
||||||
|
ABS_TEMPLATE := $(abspath $(TEMPLATE))
|
||||||
|
ABS_DEFAULTS := $(abspath $(DEFAULTS))
|
||||||
|
ABS_META := $(abspath $(META_FILE))
|
||||||
|
ABS_FILENAME_TPL := $(abspath $(FILENAME_TPL))
|
||||||
|
|
||||||
|
SOURCES := $(shell find abgaben -name "*.md" 2>/dev/null)
|
||||||
|
|
||||||
|
.PHONY: all render clean help
|
||||||
|
|
||||||
|
# -- Alle Abgaben -------------------------------------------------------------
|
||||||
|
|
||||||
|
all:
|
||||||
|
@for src in $(SOURCES); do \
|
||||||
|
$(MAKE) --no-print-directory render FILE=$$src || exit 1; \
|
||||||
|
done
|
||||||
|
|
||||||
|
# -- Einzeldatei (VSCode-Task / manuell) --------------------------------------
|
||||||
|
# PDF-Dateiname wird aus den Metadaten ermittelt: Gruppe0_SM-1b_Vorbereitung.pdf
|
||||||
|
# Aufruf: make render FILE=abgaben/irgendwas.md
|
||||||
|
|
||||||
|
render:
|
||||||
|
ifndef FILE
|
||||||
|
$(error Bitte FILE angeben: make render FILE=abgaben/datei.md)
|
||||||
|
endif
|
||||||
|
$(eval SRCDIR := $(dir $(abspath $(FILE))))
|
||||||
|
$(eval OUTNAME := $(shell $(PANDOC) \
|
||||||
|
--template=$(ABS_FILENAME_TPL) \
|
||||||
|
--metadata-file=$(ABS_META) \
|
||||||
|
-t plain "$(FILE)" 2>/dev/null | tr -d '\n\r'))
|
||||||
|
@if [ -z "$(OUTNAME)" ]; then \
|
||||||
|
echo "FEHLER: PDF-Name konnte nicht aus Metadaten ermittelt werden."; \
|
||||||
|
echo " Pflichtfelder in Frontmatter: gruppe, aufgabenkennung"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
@echo "Baue $(FILE) --> $(SRCDIR)$(OUTNAME)..."
|
||||||
|
cd "$(SRCDIR)" && $(PANDOC) "$(notdir $(FILE))" \
|
||||||
|
--defaults=$(ABS_DEFAULTS) \
|
||||||
|
--template=$(ABS_TEMPLATE) \
|
||||||
|
--metadata-file=$(ABS_META) \
|
||||||
|
-o "$(OUTNAME)"
|
||||||
|
@echo " => $(SRCDIR)$(OUTNAME)"
|
||||||
|
|
||||||
|
# -- Aufraeumen ---------------------------------------------------------------
|
||||||
|
|
||||||
|
clean:
|
||||||
|
find abgaben -name "*.pdf" -delete 2>/dev/null; true
|
||||||
|
@echo "PDFs geloescht."
|
||||||
|
|
||||||
|
# -- Hilfe --------------------------------------------------------------------
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Verwendung:"
|
||||||
|
@echo " make Alle Abgaben bauen"
|
||||||
|
@echo " make render FILE=abgaben/<datei>.md Einzelne Datei rendern"
|
||||||
|
@echo " make META_FILE=abgaben/x.yaml ... Andere Metadaten-Datei"
|
||||||
|
@echo " make clean Alle PDFs loeschen"
|
||||||
|
@echo ""
|
||||||
|
@echo "PDF-Name aus Metadaten: Gruppe0_SM-1b_Vorbereitung.pdf"
|
||||||
|
@echo "VSCode: Cmd+Shift+B rendert die aktuell geoeffnete Datei."
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
## Requirements
|
||||||
|
|
||||||
|
OS: Macos
|
||||||
|
Software:
|
||||||
|
- Tex Renderer
|
||||||
|
- pandoc
|
||||||
|
- make
|
||||||
|
Tex Packages:
|
||||||
|
- truncate
|
||||||
|
- lastpage
|
||||||
|
- fancyhdr
|
||||||
|
- lm
|
||||||
|
- microtype
|
||||||
|
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew install pandoc basictex
|
||||||
|
|
||||||
|
sudo tlmgr update --self
|
||||||
|
sudo tlmgr install lastpage fancyhdr lm microtype truncate
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Create markdown Files with frontmatter (see example). Run `make render FILE=abgaben/example.md`
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make help # see all commands
|
||||||
|
|
||||||
|
make render FILE=<path-to-file> # render specific file
|
||||||
|
make # render all files
|
||||||
|
```
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
gruppe: 0
|
||||||
|
usecase: "USE CASE"
|
||||||
|
|
||||||
|
mitglieder:
|
||||||
|
- name: "John Doe"
|
||||||
|
matrikel: "1000001"
|
||||||
|
|
||||||
|
hochschule: "Hochschule / Uni"
|
||||||
|
fachbereich: "Fachbereich VI"
|
||||||
|
studiengang: "B.Sc. IT-Sicherheit Online"
|
||||||
|
modul: ""
|
||||||
|
dozent: ""
|
||||||
|
semester: ""
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Gruppe$gruppe$_SM-$kapitelkennung$$if(aufgabentyp)$_$aufgabentyp$$endif$.pdf
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
from: markdown+smart+fenced_code_blocks+inline_code_attributes+bracketed_spans
|
||||||
|
to: pdf
|
||||||
|
# template wird im Makefile als absoluter Pfad übergeben (wegen cd-Aufruf)
|
||||||
|
pdf-engine: pdflatex
|
||||||
|
citeproc: true
|
||||||
|
number-sections: true
|
||||||
|
standalone: true
|
||||||
|
# reference-section-title: Literaturverzeichnis
|
||||||
@@ -0,0 +1,185 @@
|
|||||||
|
\documentclass[12pt,a4paper]{article}
|
||||||
|
|
||||||
|
% --- Encoding & Language ---
|
||||||
|
\usepackage[T1]{fontenc}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage[ngerman]{babel}
|
||||||
|
\usepackage{microtype}
|
||||||
|
\usepackage{lmodern}
|
||||||
|
|
||||||
|
% --- Page Layout ---
|
||||||
|
\usepackage[a4paper,
|
||||||
|
top=2.5cm, bottom=2.5cm,
|
||||||
|
left=2.5cm, right=2.5cm,
|
||||||
|
headheight=15pt]{geometry}
|
||||||
|
|
||||||
|
% --- Header / Footer ---
|
||||||
|
\usepackage{fancyhdr}
|
||||||
|
\usepackage{lastpage}
|
||||||
|
\usepackage{truncate}
|
||||||
|
|
||||||
|
|
||||||
|
% --- Tables & Figures ---
|
||||||
|
\usepackage{booktabs}
|
||||||
|
\usepackage{longtable}
|
||||||
|
\usepackage{array}
|
||||||
|
\usepackage{calc}
|
||||||
|
\usepackage{float}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\usepackage{caption}
|
||||||
|
\usepackage{subcaption}
|
||||||
|
\usepackage{xcolor}
|
||||||
|
\makeatletter
|
||||||
|
\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
|
||||||
|
\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
|
||||||
|
\makeatother
|
||||||
|
\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
|
||||||
|
|
||||||
|
% --- Math ---
|
||||||
|
\usepackage{amsmath}
|
||||||
|
\usepackage{amssymb}
|
||||||
|
|
||||||
|
% --- Code ---
|
||||||
|
\usepackage{fancyvrb}
|
||||||
|
\usepackage{listings}
|
||||||
|
$if(highlighting-macros)$
|
||||||
|
$highlighting-macros$
|
||||||
|
$endif$
|
||||||
|
|
||||||
|
% --- Hyperlinks ---
|
||||||
|
\usepackage{hyperref}
|
||||||
|
\hypersetup{
|
||||||
|
colorlinks=true,
|
||||||
|
linkcolor=black,
|
||||||
|
filecolor=black,
|
||||||
|
citecolor=black,
|
||||||
|
urlcolor=blue,
|
||||||
|
pdftitle={$title$},
|
||||||
|
pdfauthor={Gruppe $if(gruppe)$$gruppe$$endif$},
|
||||||
|
}
|
||||||
|
|
||||||
|
% --- Pandoc compatibility ---
|
||||||
|
\providecommand{\tightlist}{%
|
||||||
|
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
|
||||||
|
|
||||||
|
% --- Absatzformatierung: kein Einzug, sichtbarer Abstand zwischen Absaetzen ---
|
||||||
|
\setlength{\parindent}{0pt}
|
||||||
|
\setlength{\parskip}{0.6\baselineskip}
|
||||||
|
|
||||||
|
% --- Section breaks: jede H1 (section) beginnt auf einer neuen Seite ---
|
||||||
|
\let\oldsection\section
|
||||||
|
\renewcommand{\section}{\clearpage\oldsection}
|
||||||
|
|
||||||
|
% --- CSL Bibliography (pandoc 3.x --citeproc, kein enumitem nötig) ---
|
||||||
|
$if(csl-refs)$
|
||||||
|
\def\citeproctext{}
|
||||||
|
\def\citeproc#1#2{\begingroup\def\citeproctext{#2}\cite{#1}\endgroup}
|
||||||
|
\makeatletter
|
||||||
|
\let\@cite@ofmt\@firstofone
|
||||||
|
\def\@biblabel#1{}
|
||||||
|
\def\@cite#1#2{{#1\if@tempswa , #2\fi}}
|
||||||
|
\makeatother
|
||||||
|
\newlength{\cslhangindent}
|
||||||
|
\setlength{\cslhangindent}{1.5em}
|
||||||
|
\newlength{\csllabelwidth}
|
||||||
|
\setlength{\csllabelwidth}{3em}
|
||||||
|
\newenvironment{CSLReferences}[2]
|
||||||
|
{\begin{list}{}{%
|
||||||
|
\setlength{\leftmargin}{\cslhangindent}
|
||||||
|
\setlength{\itemindent}{-1\cslhangindent}
|
||||||
|
\setlength{\parsep}{\parskip}
|
||||||
|
\setlength{\itemsep}{#2\baselineskip}}}
|
||||||
|
{\end{list}}
|
||||||
|
\newcommand{\CSLBlock}[1]{\item{}\textnormal{#1}\strut}
|
||||||
|
\newcommand{\CSLLeftMargin}[1]{\item[\textnormal{#1}]}
|
||||||
|
\newcommand{\CSLRightInline}[1]{\textnormal{\hangindent0em #1}}
|
||||||
|
\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1}
|
||||||
|
$endif$
|
||||||
|
|
||||||
|
% =============================================================================
|
||||||
|
% Metadata commands (with defaults)
|
||||||
|
% =============================================================================
|
||||||
|
$if(hochschule)$\newcommand{\SMHochschule}{$hochschule$}$else$\newcommand{\SMHochschule}{Hochschule (nicht gesetzt)}$endif$
|
||||||
|
$if(fachbereich)$\newcommand{\SMFachbereich}{$fachbereich$}$else$\newcommand{\SMFachbereich}{Fachbereich Informatik}$endif$
|
||||||
|
$if(studiengang)$\newcommand{\SMStudiengang}{$studiengang$}$else$\newcommand{\SMStudiengang}{B.Sc. IT-Sicherheit}$endif$
|
||||||
|
$if(modul)$\newcommand{\SMModul}{$modul$}$else$\newcommand{\SMModul}{Sicherheitsmanagement (SM 2026)}$endif$
|
||||||
|
$if(dozent)$\newcommand{\SMDozent}{$dozent$}$else$\newcommand{\SMDozent}{T. Wa\ss{}mann}$endif$
|
||||||
|
$if(aufgabenkennung)$\newcommand{\SMAufgabenkennung}{$aufgabenkennung$}$else$\newcommand{\SMAufgabenkennung}{}$endif$
|
||||||
|
$if(aufgabentyp)$\newcommand{\SMAufgabentyp}{$aufgabentyp$}$else$\newcommand{\SMAufgabentyp}{}$endif$
|
||||||
|
$if(gruppe)$\newcommand{\SMGruppe}{$gruppe$}$else$\newcommand{\SMGruppe}{X}$endif$
|
||||||
|
$if(usecase)$\newcommand{\SMUsecase}{$usecase$}$else$\newcommand{\SMUsecase}{}$endif$
|
||||||
|
$if(semester)$\newcommand{\SMSemester}{$semester$}$else$\newcommand{\SMSemester}{}$endif$
|
||||||
|
$if(abgabedatum)$\newcommand{\SMAbgabedatum}{$abgabedatum$}$else$\newcommand{\SMAbgabedatum}{\today}$endif$
|
||||||
|
$if(kapitel)$\newcommand{\SMKapitel}{$kapitel$}$else$\newcommand{\SMKapitel}{\text{}}$endif$
|
||||||
|
$if(kapitelkennung)$\newcommand{\SMKapitelkennung}{$kapitelkennung$}$else$\newcommand{\SMKapitelkennung}{\text{}}$endif$
|
||||||
|
|
||||||
|
% =============================================================================
|
||||||
|
% Header / Footer (every page except title)
|
||||||
|
% =============================================================================
|
||||||
|
\pagestyle{fancy}
|
||||||
|
\fancyhf{}
|
||||||
|
\fancyhead[L]{\small\textbf{Gruppe~\SMGruppe{}} - \SMKapitelkennung{}: \truncate{6 0ex}{\SMKapitel{}}}
|
||||||
|
\fancyhead[R]{\small\SMAufgabenkennung~-~\SMAufgabentyp}
|
||||||
|
\fancyfoot[C]{\small Seite~\thepage~von~\pageref{LastPage}}
|
||||||
|
\renewcommand{\headrulewidth}{0.4pt}
|
||||||
|
\renewcommand{\footrulewidth}{0pt}
|
||||||
|
|
||||||
|
% =============================================================================
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
% --- Title Page --------------------------------------------------------------
|
||||||
|
\begin{titlepage}
|
||||||
|
\thispagestyle{empty}
|
||||||
|
\centering
|
||||||
|
|
||||||
|
% uni / studiengang
|
||||||
|
{\Large\textbf{\SMHochschule}}\par\vspace{0.25cm}
|
||||||
|
{\large\SMFachbereich}\par\vspace{0.25cm}
|
||||||
|
{\large\SMStudiengang}\par
|
||||||
|
|
||||||
|
\vspace{0.8cm}
|
||||||
|
|
||||||
|
% modul / dozent
|
||||||
|
{\normalsize Modul:~\textbf{\SMModul}}\par\vspace{0.4cm}
|
||||||
|
{\normalsize Dozent:~\SMDozent}\par
|
||||||
|
|
||||||
|
\vspace{0.8cm}
|
||||||
|
\noindent\rule{\linewidth}{0.6pt}\par
|
||||||
|
|
||||||
|
% aufgabe / thema
|
||||||
|
\vspace{1.2cm}
|
||||||
|
{\LARGE\textbf{\SMAufgabentyp{} \SMAufgabenkennung}}\par\vspace{0.35cm}
|
||||||
|
{\normalsize \textbf{\SMKapitelkennung{}:} \SMKapitel{}}\par
|
||||||
|
\vspace{0.8cm}
|
||||||
|
|
||||||
|
\noindent\rule{\linewidth}{0.6pt}\par
|
||||||
|
|
||||||
|
% gruppen infos
|
||||||
|
\vspace{0.8cm}
|
||||||
|
{\large\textbf{Gruppe~\SMGruppe}}\par\vspace{0.25cm}
|
||||||
|
$if(usecase)$\vspace{0.35cm}{\normalsize Use-Case:~\SMUsecase}\par$endif$
|
||||||
|
|
||||||
|
\vspace{0.4cm}
|
||||||
|
{\normalsize\textbf{Gruppenmitglieder:}}\par
|
||||||
|
\vspace{0.4cm}
|
||||||
|
$for(mitglieder)${\normalsize $it.name$$if(it.matrikel)$~~(Matr.-Nr.~$it.matrikel$)$endif$}\par\vspace{0.15cm}
|
||||||
|
$endfor$
|
||||||
|
|
||||||
|
% semester
|
||||||
|
\vfill
|
||||||
|
{\normalsize Semester:~\SMSemester}\par
|
||||||
|
{\normalsize Abgabedatum:~\SMAbgabedatum}\par
|
||||||
|
\end{titlepage}
|
||||||
|
|
||||||
|
\setcounter{page}{1}
|
||||||
|
|
||||||
|
% --- Table of Contents -------------------------------------------------------
|
||||||
|
$if(toc)$
|
||||||
|
\tableofcontents
|
||||||
|
\clearpage
|
||||||
|
$endif$
|
||||||
|
|
||||||
|
% --- Body --------------------------------------------------------------------
|
||||||
|
$body$
|
||||||
|
|
||||||
|
\end{document}
|
||||||
Reference in New Issue
Block a user