Posts tagged ‘Kalender’

Monatskalender für LaTeX mit Python erzeugen

Hier ein Beispiel, wie man mit Python kleine Monatskalender erzeugen kann. Geht auch mit LaTeX allein, ich möchte aber verschiedene Output-Formate (Markdown, HTML, etc.) erzeugen und dabei die komplette Kontrolle über den Code behalten.

# -*- coding: utf-8 -*-
 
import calendar
import datetime
 
def number_of_weeks(year, month):
    """
        Returns a tupel with the ISO no of the first and week and the no of weeks
    """
    tup_month_days = calendar.monthrange(year, month)
    first = datetime.date(year, month, 1)
    last = datetime.date(year, month, tup_month_days[1])
    first_week = first.isocalendar()[1]
    last_week = last.isocalendar()[1]
    return (first_week, last_week, last_week-first_week+1)
 
def gen_cal_latex(year, month):
    """
        https://stackoverflow.com/questions/9459337/assign-value-to-an-individual-cell-in-a-two-dimensional-python-array
    """
    c = calendar.TextCalendar()
    week_month_first, week_month_last, no_of_weeks = number_of_weeks(year, month)
 
    # generate calendar list, using tupel as a key    
    m = {(i, j):' ' for i in range(no_of_weeks) for j in range(7)}
 
    for tupel_date in c.itermonthdays4(year, month):
        t_year, t_month, t_day, t_weekday = tupel_date
        # use only dates inside the required month
        if t_month == month:
            temp_date = datetime.date(t_year, t_month, t_day)
            # check in which week we are with the current date
            # to get index for the list
            week_no = temp_date.isocalendar()[1]
            m[week_no % week_month_first, t_weekday] = t_day
 
    print(r'\begin{tabular}{rrrrrrr}')
    print(r'Mo & Di & Mi & Do & Fr & Sa & So \\')
    for i in m:
        if i[1] < 6:
            print('{0} &'.format(m[i]), end='')
        else:
            print('{0}'.format(m[i]),end='')
        if i[1] == 6:
            print(r'\\')
    print(r'\end{tabular}')
 
gen_cal_latex(2020, 4)

Erzeugt werden kleine Monatskalender der Form

\begin{tabular}{rrrrrrr}
Mo & Di & Mi & Do & Fr & Sa & So \\
  &  &1 &2 &3 &4 &5\\
6 &7 &8 &9 &10 &11 &12\\
13 &14 &15 &16 &17 &18 &19\\
20 &21 &22 &23 &24 &25 &26\\
27 &28 &29 &30 &  &  & \\
\end{tabular}

Per Copy & Paste kann man den Code in ein LaTeX-Dokument kopieren, natürlich lässt sich das alles auch direkt in eine LaTeX-Datei schreiben.

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website

Ein Jahreskalender mit LaTeX und Excel

This entry is part 2 of 3 in the series Kalender mit tikz-kalender

Anbei ein Jahreskalender für 2020, erstellt mit LaTeX und Excel. Excel deshalb, weil die Datumsfunktionen recht praktisch sind und mein LaTeX-Programmierkünste dafür nicht ausreichen.

Die Formel für die einzelnen Tage lautet:

=WENNFEHLER("\node at (" & C$2-1 &"," & -1* $B3 & ") [" & WENN(LINKS(TEXT(DATWERT($B3&"."&C$2&"."&$B$2);"TTT");1)="S";"weekend";"workday") & "] {\hspace*{-0.9em}{"  & TEXT(DATWERT($B3&"."&C$2&"."&$B$2);"TTT")   & "}};";"")

Inhaltlich geschieht dabei folgendes, am 1.1.2020 (Zelle C3)erklärt:

  1. Ich baue ein Datum aus dem Jahr in B2, dem Monat in C2 und dem Tag in B3
  2. Dieses Datum wird mittels TEXT() Funktion in den Tagesnamen umgewandelt
  3. Fängt dieser Tagesname mit „S“ an, handelt es sich um einen Wochenendtag, dann wird „weekend“ genutzt, sonst „workday“
  4. Dann setze ich den Tagesnamen in jeden einzelnen Node und verschiebe den Text dabei um -0.9em nach links (gibt sicher auch was in TikZ, was das macht, so ging es schneller)
  5. Wenn die Formel für den entsprechenden Tag einen Fehler bringt, weil der Tag (31.2.2020) nicht existiert, so wird nichts ausgegeben.
  6. Alle Node-Infos werden dann per copy paste in die TeX-Datei eingefügt und kompiliert

Hier die Dateien:

kalender.pdf

Kalendermacher_blog.xlsx

Hier der LaTeX-Code:

\documentclass{scrartcl}
\usepackage[a4paper,landscape,left=0.25cm,right=0.25cm,top=0.5cm,bottom=0.5cm]{geometry}
 
\usepackage[]{ifdraft}
\usepackage[]{attachfile}
\usepackage[]{eso-pic}
 
\usepackage[english]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
 
\renewcommand{\familydefault}{\sfdefault}
\RequirePackage[scaled=0.9]{helvet}
\usepackage{tikz}
\usepackage[right]{showlabels}
\usetikzlibrary{positioning}
\pagestyle{empty}
 
\usepackage{xcolor}
 
\usepackage{hyperref}
\usepackage{url}
 
\definecolor{weekendday}{RGB}{240,240,240}
\newcommand{\file}[1]{\textattachfile{#1}{\textcolor{blue}{\LaTeX\ Sourcecode}}}
 
\begin{document}  
 
\AddToShipoutPictureFG*{
  \put(35,10){\footnotesize Uwe Ziegenhagen, ziegenhagen@gmail.com %, \file{\jobname.tex}	
}
}
 
\begin{center}
\begin{tikzpicture}
[
    x=23mm,y=6mm,
    mybox/.style={rectangle,rounded corners,minimum width=23mm, minimum height=6mm,align=left},
	month/.style={mybox,align=center,draw=black,align=left,fill=white,thick,font=\bfseries\large},
    date/.style={mybox,draw=gray,fill=white,align=left,thick,minimum width=5mm,font=\bfseries\large},
    workday/.style={mybox,draw=black,text width=1.5cm,font=\bfseries\tiny},
    weekend/.style={mybox,draw=black,text width=1.5cm,fill=weekendday,font=\bfseries\tiny}
]
\node at (0,0) [month] {Januar};
\node at (1,0) [month] {Februar};
\node at (2,0) [month] {März};
\node at (3,0) [month] {April};
\node at (4,0) [month] {Mai};
\node at (5,0) [month] {Juni};
\node at (6,0) [month] {Juli};
\node at (7,0) [month] {August};
\node at (8,0) [month] {September};
\node at (9,0) [month] {Oktober};
\node at (10,0) [month] {November};
\node at (11,0) [month] {Dezember};
 
\node at (-0.7,-1) [date] {01};
\node at (-0.7,-2) [date] {02};
\node at (-0.7,-3) [date] {03};
\node at (-0.7,-4) [date] {04};
\node at (-0.7,-5) [date] {05};
\node at (-0.7,-6) [date] {06};
\node at (-0.7,-7) [date] {07};
\node at (-0.7,-8) [date] {08};
\node at (-0.7,-9) [date] {09};
\node at (-0.7,-10) [date] {10};
\node at (-0.7,-11) [date] {11};
\node at (-0.7,-12) [date] {12};
\node at (-0.7,-13) [date] {13};
\node at (-0.7,-14) [date] {14};
\node at (-0.7,-15) [date] {15};
\node at (-0.7,-16) [date] {16};
\node at (-0.7,-17) [date] {17};
\node at (-0.7,-18) [date] {18};
\node at (-0.7,-19) [date] {19};
\node at (-0.7,-20) [date] {20};
\node at (-0.7,-21) [date] {21};
\node at (-0.7,-22) [date] {22};
\node at (-0.7,-23) [date] {23};
\node at (-0.7,-24) [date] {24};
\node at (-0.7,-25) [date] {25};
\node at (-0.7,-26) [date] {26};
\node at (-0.7,-27) [date] {27};
\node at (-0.7,-28) [date] {28};
\node at (-0.7,-29) [date] {29};
\node at (-0.7,-30) [date] {30};
\node at (-0.7,-31) [date] {31};
 
\node at (11.7,-1) [date] {01};
\node at (11.7,-2) [date] {02};
\node at (11.7,-3) [date] {03};
\node at (11.7,-4) [date] {04};
\node at (11.7,-5) [date] {05};
\node at (11.7,-6) [date] {06};
\node at (11.7,-7) [date] {07};
\node at (11.7,-8) [date] {08};
\node at (11.7,-9) [date] {09};
\node at (11.7,-10) [date] {10};
\node at (11.7,-11) [date] {11};
\node at (11.7,-12) [date] {12};
\node at (11.7,-13) [date] {13};
\node at (11.7,-14) [date] {14};
\node at (11.7,-15) [date] {15};
\node at (11.7,-16) [date] {16};
\node at (11.7,-17) [date] {17};
\node at (11.7,-18) [date] {18};
\node at (11.7,-19) [date] {19};
\node at (11.7,-20) [date] {20};
\node at (11.7,-21) [date] {21};
\node at (11.7,-22) [date] {22};
\node at (11.7,-23) [date] {23};
\node at (11.7,-24) [date] {24};
\node at (11.7,-25) [date] {25};
\node at (11.7,-26) [date] {26};
\node at (11.7,-27) [date] {27};
\node at (11.7,-28) [date] {28};
\node at (11.7,-29) [date] {29};
\node at (11.7,-30) [date] {30};
\node at (11.7,-31) [date] {31};
 
 
% hier kommen die Sachen aus Excel rein
 
\end{tikzpicture}
\end{center}
\end{document}

Uwe

Uwe Ziegenhagen likes LaTeX and Python, sometimes even combined. Do you like my content and would like to thank me for it? Consider making a small donation to my local fablab, the Dingfabrik Köln. Details on how to donate can be found here Spenden für die Dingfabrik.

More Posts - Website