#!/bin/sh # vim: filetype=perl ################################################################################ # ausgabe eines taschenkalenders mit feier- und geburtstagen # (c) dr. ingo rohlfs, 1993-2004, www.dr-rohlfs.de # Lizenz: BSD # # aufruf: $0 [jahr [helligkeit der grauwerte] ] # # benoetigte Module # Date::Calc (FreeBSD: devel/p5-Date-Calc) # Date::Holidays::DE (bsdpan-Date-Holidays-DE-0.6) ################################################################################ # zuerst shell-glue: perl -wx "$0" "$@" > kalender.tex latex kalender dvips -o kalender.ps kalender.dvi rm -f kalender.log kalender.aux kalender.dvi kalender.tex exit ################################################################################ # in einer optionalen datei 'termine.txt' koennen geburtstage angegeben werden # format kompatibel zu gcal: # # geburtstag von rautgunde am 31.1.: ################################################################################ 00000131 rautgunde #!perl ### jetzt kommt der perl-code ### use strict; use warnings; my $jahr = $ARGV[0] || 2004; # welches jahr my $helligkeit = $ARGV[1] || 0.8; # grautoenung der feiertage use Date::Calc qw(:all); ################################################################################ # ausgabe der daten eines tages sub tag_ausgabe { ################################################################################ my %feiertag = %{$_[0]}; # referenz auf feiertag-hash my %termin = %{$_[1]}; my @datum = @_[2..4]; # jahr, monat, tag $datum[$_] = sprintf "%02d", $datum[$_] for 1..2; my $datum = join '-', @datum; # hash-key feiertag my $dow = Day_of_Week(@datum); # wochentag ### jetzt die tageszeilen ausgeben ### print # gegen print interpr. as a funktion $feiertag{$datum}|| 6 == $dow || 7 == $dow ? "\\rowcolor[gray]{$helligkeit}" : # feiertagsgrau " " x 20, # platzhalter $datum[2], " ", # tagesnummer im monat substr (Day_of_Week_Abbreviation ($dow), 0, 2), '\quad\textsf{\scriptsize ', $termin{$datum} || '', # leer wenn nicht definiert '}& ', # mittlere tabellenspalte # sommerzeit anfang/ende $datum[2] > 24 && 7 == $dow && (3 == $datum[1] || 10 == $datum[1]) ? '\textbf{Sommerzeit}' : "", '\quad ', $feiertag{$datum} || '', # leer wenn nicht definiert 1 == $dow ? " & ". Week_Number(@datum) : " & ", # wochenummer " \\\\\\hline\n"; } ################################################################################ # geburtstagstermine einlesen ################################################################################ my %termin; if (open inF, ") { next unless /^0/; # kommentare entfernen my ($monat, $tag, $wer) = /^....(..)(..)\s+(.*?)\s*$/; my $datum = join '-', $jahr, $monat, $tag; # zur verwendung beim debuggen $termin{$datum} = $wer; # hash mit den terminen fuellen } } else { warn "termine.txt: $!\n"; } ################################################################################ # latex-kopf ausgeben ################################################################################ print << 'EOF'; \documentclass[a4paper,twocolumn]{article} %\usepackage{times} \usepackage[latin1]{inputenc} \usepackage{array,german,t1enc,color,colortbl,vmargin} \pagestyle{empty} \setpapersize{A4} \setmarginsrb{9mm}{15mm}{7mm}{15mm}{0mm}{0mm}{0mm}{0mm} \setlength{\columnsep}{4.5mm} \setlength{\tabcolsep}{0.8ex} \setlength{\parindent}{0pt} \setlength{\fboxsep}{0pt}% \begin{document}\hbadness=10000 \vbadness=10000 EOF # Assign full names to the internal aliases from Date::Holidays::DE # See the manpage for a list of all aliases. use Date::Holidays::DE qw(holidays); my %feiertagsnamen = ( 'neuj' => 'Neujahr', 'hl3k' => 'Hl. 3 Könige', 'romo' => 'Rosenmontag', 'fadi' => 'Faschingsdienstag', 'karf' => 'Karfreitag', 'osts' => 'Ostern', 'ostm' => 'Ostern', 'pfis' => 'Pfingsten', 'pfim' => 'Pfingsten', 'himm' => 'Himmelfahrt', 'fron' => 'Fronleichnam', '1mai' => 'Maifeiertag', 'mari' => 'Mariä Himmelfahrt', #'3okt' => 'Tag der deutschen Einheit', '3okt' => 'Einheitstag', # so passt es besser rein 'refo' => 'Reformationstag', 'alhe' => 'Allerheiligen', 'buss' => 'Buß- und Bettag', 'heil' => 'Heiligabend', 'wei1' => '1. Weihnachtstag', 'wei2' => '2. Weihnachtstag', 'silv' => 'Silvester' ); # Get the list of holidays for $jahr my %feiertag; for (@{holidays( WHERE => ['common', 'bw'], FORMAT => "%#:%Y-%m-%d", YEAR => $jahr )}) { # Split name and date my ($name, $datum) = split /:/; $feiertag{$datum} = $feiertagsnamen{$name}; } ################################################################################ ### jetzt alle monate und tage durchgehen ################################################################################ Language(Decode_Language("Deutsch")); # deutsch for Date::Calc for my $monat (1..12) { # januar bis dezember ## monatskopf ausgeben my $titel = '\multicolumn{3}{c}{\textbf{\textsc{'. Month_to_Text($monat) . "}\\quad $jahr}}\\\\\n"; print "\\begin{tabular}", "{|>{\\tt}p{41mm}>{\\hfill\\scriptsize}p{41mm}", ">{\\hfill\\scriptsize}p{4mm}|}\n", $titel, "\\hline\n"; for my $tag (0..Days_in_Month($jahr, $monat)-1) { my @datum = Add_Delta_Days($jahr, $monat, 1, $tag); ## jeden tag eine ausgabezeile tag_ausgabe(\%feiertag, \%termin, @datum); # eintrag fuer jeden tag berechnen } ## monatsabschluss ausgeben print $titel, "\\end{tabular} ", # mbox gegen verschlucktes leer } ## latex-abschluss ausgeben print "\\end{document}";