Add back side template and update README with event.yml workflow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
185
README.md
185
README.md
@@ -2,138 +2,111 @@
|
|||||||
|
|
||||||
LaTeX-basierter Generator für Audax Randonneurs Allemagne Brevetkarten mit Vorder- und Rückseite für den Duplexdruck.
|
LaTeX-basierter Generator für Audax Randonneurs Allemagne Brevetkarten mit Vorder- und Rückseite für den Duplexdruck.
|
||||||
|
|
||||||
## Schnellstart
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Alles bauen und beide PDFs erzeugen
|
|
||||||
make build
|
|
||||||
|
|
||||||
# Die PDFs werden erstellt als:
|
|
||||||
# - brevetkarte.pdf (Vorderseite mit Teilnehmerinfos)
|
|
||||||
# - brevetkarte-rueckseite.pdf (Rückseite mit Kontrollen)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Voraussetzungen
|
## Voraussetzungen
|
||||||
|
|
||||||
- Docker
|
- Docker
|
||||||
- Make
|
- Make
|
||||||
|
- Python 3 + PyYAML (`pip install pyyaml`)
|
||||||
|
|
||||||
|
## Konfigurationsdateien
|
||||||
|
|
||||||
|
Vor dem ersten Build zwei Dateien aus den Beispielen anlegen und befüllen:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cp "Export Brevetkarte.csv.example" "Export Brevetkarte.csv"
|
||||||
|
cp event.yml.example event.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
Beide Dateien sind in `.gitignore` eingetragen und werden nicht ins Repository übernommen.
|
||||||
|
|
||||||
|
### event.yml
|
||||||
|
|
||||||
|
Enthält alle veranstaltungsspezifischen Daten:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
event:
|
||||||
|
title: "Name der Veranstaltung"
|
||||||
|
km: "200"
|
||||||
|
date: "1. Januar 2025"
|
||||||
|
start_location: "Stadt, Ort"
|
||||||
|
club: "Clubname"
|
||||||
|
club_nr: "000000"
|
||||||
|
startzeit: "8:00"
|
||||||
|
|
||||||
|
backside:
|
||||||
|
"1_1": |
|
||||||
|
\vspace{2mm}
|
||||||
|
\textbf{Nr. 1:} Km 0 -- Startort\\
|
||||||
|
...
|
||||||
|
"1_2": "" # leer = Stempelfeld
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Die `backside`-Sektion belegt die 12 Zellen der Rückseite (3 Zeilen × 4 Spalten, Schlüssel `"Zeile_Spalte"`). Der Inhalt ist freies LaTeX. Leere Zellen (`""`) dienen als Stempelfelder.
|
||||||
|
|
||||||
|
### Export Brevetkarte.csv
|
||||||
|
|
||||||
|
Teilnehmerdaten im Format:
|
||||||
|
|
||||||
|
```
|
||||||
|
Startnr, Nachname, Vorname, Straße, PLZ, Ort, Land, Medaille
|
||||||
|
```
|
||||||
|
|
||||||
|
Siehe `Export Brevetkarte.csv.example` für das vollständige Format.
|
||||||
|
|
||||||
## Verwendung
|
## Verwendung
|
||||||
|
|
||||||
### Beide PDFs bauen
|
### Personalisierte Karten erzeugen und bauen
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
make build
|
make build-personalized
|
||||||
```
|
```
|
||||||
|
|
||||||
Dies führt folgende Schritte aus:
|
Führt folgende Schritte aus:
|
||||||
1. Docker-Image mit TeX Live bauen
|
1. `generate_cards.py` liest `Export Brevetkarte.csv` + `event.yml`
|
||||||
2. `brevetkarte.tex` zu `brevetkarte.pdf` kompilieren (Vorderseite)
|
2. Erzeugt `brevetkarte-personalized.tex` (Vorderseite, eine Karte pro Teilnehmer)
|
||||||
3. `brevetkarte-rueckseite.tex` zu `brevetkarte-rueckseite.pdf` kompilieren (Rückseite)
|
3. Erzeugt `brevetkarte-rueckseite.tex` (Rückseite mit Kontrollpunkten aus event.yml)
|
||||||
|
4. Kompiliert beide .tex-Dateien zu PDFs
|
||||||
|
|
||||||
### Einzelne Seiten bauen
|
### Einzelne Schritte
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Nur Vorderseite bauen
|
# Nur tex-Dateien generieren (ohne Docker)
|
||||||
make build-front
|
make generate
|
||||||
|
|
||||||
# Nur Rückseite bauen
|
# Nur Rückseite kompilieren (nach generate)
|
||||||
make build-back
|
make build-back
|
||||||
|
|
||||||
# Beide Seiten bauen
|
# Statische Demo-Vorderseite bauen (ohne CSV, für Tests)
|
||||||
make build-pdf
|
make build-front
|
||||||
```
|
```
|
||||||
|
|
||||||
### Personalisierte Karten aus CSV
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Beispiel-CSV kopieren und Teilnehmerdaten eintragen
|
|
||||||
cp "Export Brevetkarte.csv.example" "Export Brevetkarte.csv"
|
|
||||||
# "Export Brevetkarte.csv" mit den Teilnehmern befüllen
|
|
||||||
|
|
||||||
# 2. Personalisierte Karten erzeugen und bauen
|
|
||||||
make build-personalized
|
|
||||||
# Ausgabe: brevetkarte-personalized.pdf
|
|
||||||
```
|
|
||||||
|
|
||||||
Die CSV-Datei `Export Brevetkarte.csv` wird nicht von git erfasst (sie kann personenbezogene Daten enthalten). Die Datei `Export Brevetkarte.csv.example` zeigt das erwartete Format.
|
|
||||||
|
|
||||||
### Weitere Befehle
|
### Weitere Befehle
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Nur das Docker-Image bauen
|
make build-image # Docker-Image bauen
|
||||||
make build-image
|
make shell # Interaktive Shell im Container
|
||||||
|
make clean # Erzeugte Dateien löschen (.aux, .log, .pdf)
|
||||||
# Interaktive Shell im Container öffnen
|
make clean-all # Alles löschen inkl. Docker-Image
|
||||||
make shell
|
make help # Alle Befehle anzeigen
|
||||||
|
|
||||||
# Erzeugte Dateien löschen (.aux, .log, .pdf)
|
|
||||||
make clean
|
|
||||||
|
|
||||||
# Alles löschen inkl. Docker-Image
|
|
||||||
make clean-all
|
|
||||||
|
|
||||||
# Von Grund auf neu bauen
|
|
||||||
make rebuild
|
|
||||||
|
|
||||||
# Hilfe anzeigen
|
|
||||||
make help
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Dateien
|
## Dateien
|
||||||
|
|
||||||
- `brevetkarte.tex` - LaTeX-Quelle für die Vorderseite (zwei identische Blanko-Karten)
|
| Datei | Beschreibung |
|
||||||
- `brevetkarte-template.tex` - Vorlage für personalisierte Karten (Platzhalter werden aus CSV ersetzt)
|
|---|---|
|
||||||
- `brevetkarte-rueckseite.tex` - LaTeX-Quelle für die Rückseite (Kontrollen)
|
| `event.yml.example` | Vorlage für Veranstaltungsdaten (→ als `event.yml` kopieren) |
|
||||||
- `Export Brevetkarte.csv.example` - Beispiel-CSV mit dem Teilnehmerdatenformat
|
| `Export Brevetkarte.csv.example` | Vorlage für Teilnehmerdaten (→ als `Export Brevetkarte.csv` kopieren) |
|
||||||
- `generate_cards.py` - Erzeugt `brevetkarte-personalized.tex` aus CSV und Vorlage
|
| `brevetkarte-template.tex` | Vorlage Vorderseite (Platzhalter aus CSV + event.yml) |
|
||||||
- `cyclist-logo.png` - Audax Randonneurs Logo
|
| `brevetkarte-rueckseite-template.tex` | Vorlage Rückseite (Zellplatzhalter aus event.yml) |
|
||||||
- `Dockerfile` - Docker-Image-Definition (debian:bookworm-slim + TeX-Live-Pakete)
|
| `brevetkarte.tex` | Statische Demo-Vorderseite (ohne Personalisierung) |
|
||||||
- `Makefile` - Build-Automatisierung
|
| `generate_cards.py` | Generiert personalisierte .tex-Dateien |
|
||||||
|
| `cyclist-logo.png` | Audax Randonneurs Logo |
|
||||||
## Ausgabe
|
| `Dockerfile` | Docker-Image-Definition (debian:bookworm-slim + TeX Live) |
|
||||||
|
| `Makefile` | Build-Automatisierung |
|
||||||
### Vorderseite (brevetkarte.pdf)
|
|
||||||
Enthält zwei identische Brevetkarten, die in der Mitte geschnitten werden können. Jede Karte enthält:
|
|
||||||
- Teilnehmerinformationen (Name, Adresse usw.)
|
|
||||||
- Veranstaltungsdetails (200 km „Auf eine Pommes nach Belgien")
|
|
||||||
- Randonneur-Mondiaux-Regeln
|
|
||||||
- Homologationsbereich
|
|
||||||
- Startzeit: 8:30
|
|
||||||
|
|
||||||
### Rückseite (brevetkarte-rueckseite.pdf)
|
|
||||||
Enthält die Kontrollentabelle (4 Spalten × 6 Zeilen):
|
|
||||||
- **Zeilen 1–3**: Kontrollen für die obere Karte
|
|
||||||
- Nr. 1: Start (Km 0 – Unisport, Bonn)
|
|
||||||
- Nr. 2: Km 57 – Nationalpark-Tor, Heimbach
|
|
||||||
- Nr. 3: Km 100 – Friterie „Au Petit Creux", Waimes
|
|
||||||
- Nr. 4: Km 165 – Mahlberg
|
|
||||||
- Nr. 5: Km 205 – Ziel (Unisport, Bonn)
|
|
||||||
- **Zeilen 4–6**: Kontrollen für die untere Karte (wie oben, aber Nr. 5: Km 214)
|
|
||||||
- Leere Spalten für Stempel/Unterschriften
|
|
||||||
- Kontrollfrage zur Verifikation
|
|
||||||
|
|
||||||
## Duplexdruck
|
## Duplexdruck
|
||||||
|
|
||||||
Die PDFs sind für den Duplexdruck (beidseitiger Druck) ausgelegt:
|
1. `brevetkarte-personalized.pdf` auf einer Seite drucken
|
||||||
1. `brevetkarte.pdf` auf einer Seite drucken
|
|
||||||
2. `brevetkarte-rueckseite.pdf` auf der Rückseite drucken
|
2. `brevetkarte-rueckseite.pdf` auf der Rückseite drucken
|
||||||
3. Spalten und Zeilen sind so ausgerichtet, dass:
|
3. Blatt horizontal in der Mitte schneiden → zwei separate Brevetkarten
|
||||||
- Vorderseitenspalten mit Rückseitenspalten übereinstimmen
|
|
||||||
- Obere Karte (Zeilen 1–3) mit der oberen Vorderseitenkarte fluchtet
|
|
||||||
- Untere Karte (Zeilen 4–6) mit der unteren Vorderseitenkarte fluchtet
|
|
||||||
4. Blatt horizontal in der Mitte schneiden, um zwei separate Brevetkarten zu erhalten
|
|
||||||
|
|
||||||
## Anpassung
|
|
||||||
|
|
||||||
`brevetkarte.tex` bearbeiten für die Vorderseite:
|
|
||||||
- Veranstaltungsname, Datum und Ort
|
|
||||||
- Distanz (200 km)
|
|
||||||
- Startzeit
|
|
||||||
- Vereinsinformationen
|
|
||||||
- Brevetformat
|
|
||||||
|
|
||||||
`brevetkarte-rueckseite.tex` bearbeiten für die Rückseite:
|
|
||||||
- Kontrollpunkte
|
|
||||||
- Kontrollzeiten (von/bis)
|
|
||||||
- Distanzen
|
|
||||||
- Kontrollfragen
|
|
||||||
121
brevetkarte-rueckseite-template.tex
Normal file
121
brevetkarte-rueckseite-template.tex
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
\documentclass[a4paper,10pt,landscape]{article}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage[T1]{fontenc}
|
||||||
|
\usepackage[landscape,top=0.8cm,bottom=0.8cm,left=0.8cm,right=0.8cm]{geometry}
|
||||||
|
\usepackage{array}
|
||||||
|
\usepackage{helvet}
|
||||||
|
|
||||||
|
% Set sans-serif font as default
|
||||||
|
\renewcommand{\familydefault}{\sfdefault}
|
||||||
|
|
||||||
|
\setlength{\parindent}{0pt}
|
||||||
|
\setlength{\tabcolsep}{3pt}
|
||||||
|
\pagestyle{empty}
|
||||||
|
|
||||||
|
\newcommand{\rowheight}{2.833cm}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
% Upper card table (rows 1-3)
|
||||||
|
\noindent
|
||||||
|
\begin{tabular}{|p{6.6cm}|p{6.6cm}|p{6.6cm}|p{6.6cm}|}
|
||||||
|
\hline
|
||||||
|
% Row 1
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_1_1}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_1_2}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_1_3}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_1_4}}}
|
||||||
|
\\
|
||||||
|
\hline
|
||||||
|
|
||||||
|
% Row 2
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_2_1}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_2_2}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_2_3}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_2_4}}}
|
||||||
|
\\
|
||||||
|
\hline
|
||||||
|
|
||||||
|
% Row 3
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_3_1}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_3_2}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_3_3}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_3_4}}}
|
||||||
|
\\
|
||||||
|
\hline
|
||||||
|
\end{tabular}
|
||||||
|
|
||||||
|
\vspace{1.8cm}
|
||||||
|
|
||||||
|
% Lower card table (rows 1-3, identical)
|
||||||
|
\noindent
|
||||||
|
\begin{tabular}{|p{6.6cm}|p{6.6cm}|p{6.6cm}|p{6.6cm}|}
|
||||||
|
\hline
|
||||||
|
% Row 1
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_1_1}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_1_2}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_1_3}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_1_4}}}
|
||||||
|
\\
|
||||||
|
\hline
|
||||||
|
|
||||||
|
% Row 2
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_2_1}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_2_2}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_2_3}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_2_4}}}
|
||||||
|
\\
|
||||||
|
\hline
|
||||||
|
|
||||||
|
% Row 3
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_3_1}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_3_2}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_3_3}}}
|
||||||
|
&
|
||||||
|
\parbox[c][\rowheight][t]{6.5cm}{%
|
||||||
|
{{CELL_3_4}}}
|
||||||
|
\\
|
||||||
|
\hline
|
||||||
|
\end{tabular}
|
||||||
|
|
||||||
|
\end{document}
|
||||||
Reference in New Issue
Block a user