2020-06-06, 17:48
Unter https://tex.stackexchange.com/questions/443714/bilingual-slides-beamer-comment-package-and-non-ascii-characters-umlauts-dia gibt es ein gutes Beispiel, wie man mehrsprachige Beamer-Folien erstellen kann. Je nach gesetztem \newcommand{\lvlang}{EN}
wird entweder die englische oder deutsche Version erzeugt.
Der Code müsste sich noch verbessern lassen, wenn man beispielsweise globale Klassenoptionen wie english
oder ngerman
auswertet. Nachtrag: Siehe dazu https://www.uweziegenhagen.de/?p=4352
Hier ein vollständiges Beispiel:
\documentclass{beamer}
\newcommand{\lvlang}{EN}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{comment}
\long\def\WriteCommentLine#1{\immediate\write\CommentStream{\unexpanded{#1}}}
\let\ThisComment\WriteCommentLine
\usepackage{ifthen}
\newcommand{\iflvlangde}[2]{%
\ifthenelse{\equal{\lvlang}{DE}}{#1}{#2}%
}
\makeatletter
\iflvlangde{
\usepackage[main=ngerman]{babel}
\includecomment{DE}
\excludecomment{EN}
}{
\usepackage[main=english]{babel}
\includecomment{EN}
\excludecomment{DE}
}
\makeatother
\begin{document}
\begin{DE}
\begin{frame}[fragile]{Hallo Welt}
Hallo Welt
\end{frame}
\end{DE}
\begin{EN}
\begin{frame}[fragile]{Hello World}
Hello World
\end{frame}
\end{EN}
\end{document} |
\documentclass{beamer}
\newcommand{\lvlang}{EN}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{comment}
\long\def\WriteCommentLine#1{\immediate\write\CommentStream{\unexpanded{#1}}}
\let\ThisComment\WriteCommentLine
\usepackage{ifthen}
\newcommand{\iflvlangde}[2]{%
\ifthenelse{\equal{\lvlang}{DE}}{#1}{#2}%
}
\makeatletter
\iflvlangde{
\usepackage[main=ngerman]{babel}
\includecomment{DE}
\excludecomment{EN}
}{
\usepackage[main=english]{babel}
\includecomment{EN}
\excludecomment{DE}
}
\makeatother
\begin{document}
\begin{DE}
\begin{frame}[fragile]{Hallo Welt}
Hallo Welt
\end{frame}
\end{DE}
\begin{EN}
\begin{frame}[fragile]{Hello World}
Hello World
\end{frame}
\end{EN}
\end{document}
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
Schlagwörter:
Beamer,
LaTeX Category:
LaTeX |
Kommentare deaktiviert für Mehrsprachige Beamer-Folien erstellen
2020-06-06, 17:33
Für eine Anwendung habe ich eine Möglichkeit gesucht, die „passendste“ Datei in einem Verzeichnis zu suchen. Dies kann relevant sein, wenn die Anwendung eine bestimmte Datei in einem Verzeichnis erwartet, die aber leicht anders benannt wurde als es die Vorgabe erfordert.
Das folgende Beispielprogramm nutzt die Levenshtein-Funktionen der fuzzywuzzy Bibliothek, um die Datei zu finden, die das größte Maß an Gleichheit zum Muster besitzt.
Man kann natürlich auch RegExps benutzen, mit der fuzzywuzzy Bibliothek ist es aber auch recht intuitiv.
# -*- coding: utf-8 -*-
import os
from fuzzywuzzy import fuzz
def guess_file(template, path):
max_ratio = 0
file_max_ratio = ''
for file in os.listdir(path):
file_wo_suffix = os.path.splitext(file)[0]
ratio = fuzz.ratio(file_wo_suffix, template)
if ratio > max_ratio:
max_ratio = ratio
file_max_ratio = file
return(file_max_ratio, max_ratio)
print(guess_file('Meine Inputdaten','R:/')) |
# -*- coding: utf-8 -*-
import os
from fuzzywuzzy import fuzz
def guess_file(template, path):
max_ratio = 0
file_max_ratio = ''
for file in os.listdir(path):
file_wo_suffix = os.path.splitext(file)[0]
ratio = fuzz.ratio(file_wo_suffix, template)
if ratio > max_ratio:
max_ratio = ratio
file_max_ratio = file
return(file_max_ratio, max_ratio)
print(guess_file('Meine Inputdaten','R:/'))
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
2020-06-06, 12:10
Bisher nutze ich immer die lokale Python-Installation bzw. Distributionen wie WinPython oder Anaconda, für einen meiner Linux-Server möchte ich jedoch virtuelle Umgebungen nutzen, die von der lokalen Python-Installation strikt getrennt sind. Hier die notwendigen Schritte:
python3 -m venv /home/uwe/vpython
Falls das nicht geht: apt-get install python3-venv
installiert das venv Modul
cd /home/uwe/vpython/bin
source activate
kann nicht direkt aufgerufen werden, es muss (bei der Bash/zsh) mittels source
aufgerufen werden. Verlassen kann man die virtuelle Umgebung mittels deactivate
.
Der Prompt ändert sich zu (vpython) uwe@zotac:~/vpython/bin$
, unsere virtuelle Umgebung ist fertig.
In der Umgebung können wir jetzt weitere Pakete installieren:
(vpython) uwe@zotac:~/vpython/bin$ pip3 install pandas
Collecting pandas
Downloading https://files.pythonhosted.org/packages/a4/5f/1b6e0efab4bfb738478919d40b0e3e1a06e3d9996da45eb62a77e9a090d9/pandas-1.0.4-cp37-cp37m-manylinux1_x86_64.whl (10.1MB)
100% |████████████████████████████████| 10.1MB 33kB/s
Collecting pytz>=2017.2 (from pandas)
Downloading https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl (510kB)
100% |████████████████████████████████| 512kB 629kB/s
Collecting python-dateutil>=2.6.1 (from pandas)
Downloading https://files.pythonhosted.org/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl (227kB)
100% |████████████████████████████████| 235kB 1.2MB/s
Collecting numpy>=1.13.3 (from pandas)
Downloading https://files.pythonhosted.org/packages/d6/c6/58e517e8b1fb192725cfa23c01c2e60e4e6699314ee9684a1c5f5c9b27e1/numpy-1.18.5-cp37-cp37m-manylinux1_x86_64.whl (20.1MB)
100% |████████████████████████████████| 20.1MB 16kB/s
Collecting six>=1.5 (from python-dateutil>=2.6.1->pandas)
Downloading https://files.pythonhosted.org/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl
Installing collected packages: pytz, six, python-dateutil, numpy, pandas
Successfully installed numpy-1.18.5 pandas-1.0.4 python-dateutil-2.8.1 pytz-2020.1 six-1.15.0
(vpython) uwe@zotac:~/vpython/bin$
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
2020-05-24, 17:49
Here’s a short overview of SQL joins, find the source code of the document attached to the PDF (use Adobe Reader to access it).
SQL Joins
\documentclass[12pt]{article}
\usepackage{xcolor}
\usepackage{arev}
\usepackage{attachfile}
\usepackage{tikz}
\usetikzlibrary{shapes,snakes}
\def\firstcircle{(0,0) circle (2cm)}
\def\secondcircle{(0:3cm) circle (2cm)}
\colorlet{circle edge}{blue!50}
\colorlet{circle area}{blue!20}
\colorlet{white area}{white}
\tikzset{
filled/.style={fill=circle area, draw=circle edge, thick},
outline/.style={draw=circle edge, thick},
white/.style={fill=white area, draw=circle edge, very thick}
}
\begin{document}
\textattachfile{\jobname.tex}{\LaTeX~Code}
\section{Inner Join}
Inner joins return those records, that are present in table 1 and table 2.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Inner Join
\begin{scope}
\clip \firstcircle;
\fill[filled] \secondcircle;
\end{scope}
\draw[outline] \firstcircle node {A};
\draw[outline] \secondcircle node {B};
\end{tikzpicture}
\end{center}
\section{Left Join}
Every record from table 1 is returned, regardless if it has a matching record in table 2. If the record has a matching record in table 2 this record from table 2 is returned as well.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Left Join
\begin{scope}
\clip \firstcircle;
\draw[filled] \firstcircle node {A}
\secondcircle;
\end{scope}
\draw[outline] \firstcircle
\secondcircle node {B};
\end{tikzpicture}
\end{center}
\clearpage
\section{Left Outer Join}
Those records from table 1 are returned, that do not have a match in table 2.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Left Outer Join
\draw[filled] \firstcircle node {A};
\draw[white] \secondcircle node {B};
\draw[outline] \firstcircle node {A};
\end{tikzpicture}
\end{center}
\section{Right Join}
Every record from table 2 is returned, regardless if it has a matching record in table 1. If the record has a matching record in table 1 this record from table 1 is returned as well.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Right Join
\begin{scope}
\clip \secondcircle;
\draw[filled] \firstcircle \secondcircle node {B};
\end{scope}
\draw[outline] \firstcircle node {A} \secondcircle;
\end{tikzpicture}
\end{center}
\clearpage
\section{Right Outer Join}
Those records from table 2 are returned, that do not have a match in table 1.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Right Join 2
\draw[filled] \secondcircle node {B};
\draw[white] \firstcircle node {A};
\draw[outline] \secondcircle node {B};
\end{tikzpicture}
\end{center}
\section{Theta Join}
Every row from dataset 1 is multiplied by every row of dataset 2. Usually a mistake unless you really want this Cartesian product.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Theta
\draw[filled] \firstcircle node {A} \secondcircle node {B};
\end{tikzpicture}
\end{center}
\clearpage
\section{Full Outer}
Returns all records from table 1 and table 2 regardless if they have matches in the other table. Records, that do match, are linked together via key.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Full Outer
\draw[filled] \firstcircle node {A};
\draw[filled] \secondcircle node {B};
\begin{scope}
\clip \firstcircle;
\fill[white] \secondcircle;
\draw[outline] \secondcircle;
\draw[outline] \firstcircle;
\end{scope}
\end{tikzpicture}
\end{center}
\end{document} |
\documentclass[12pt]{article}
\usepackage{xcolor}
\usepackage{arev}
\usepackage{attachfile}
\usepackage{tikz}
\usetikzlibrary{shapes,snakes}
\def\firstcircle{(0,0) circle (2cm)}
\def\secondcircle{(0:3cm) circle (2cm)}
\colorlet{circle edge}{blue!50}
\colorlet{circle area}{blue!20}
\colorlet{white area}{white}
\tikzset{
filled/.style={fill=circle area, draw=circle edge, thick},
outline/.style={draw=circle edge, thick},
white/.style={fill=white area, draw=circle edge, very thick}
}
\begin{document}
\textattachfile{\jobname.tex}{\LaTeX~Code}
\section{Inner Join}
Inner joins return those records, that are present in table 1 and table 2.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Inner Join
\begin{scope}
\clip \firstcircle;
\fill[filled] \secondcircle;
\end{scope}
\draw[outline] \firstcircle node {A};
\draw[outline] \secondcircle node {B};
\end{tikzpicture}
\end{center}
\section{Left Join}
Every record from table 1 is returned, regardless if it has a matching record in table 2. If the record has a matching record in table 2 this record from table 2 is returned as well.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Left Join
\begin{scope}
\clip \firstcircle;
\draw[filled] \firstcircle node {A}
\secondcircle;
\end{scope}
\draw[outline] \firstcircle
\secondcircle node {B};
\end{tikzpicture}
\end{center}
\clearpage
\section{Left Outer Join}
Those records from table 1 are returned, that do not have a match in table 2.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Left Outer Join
\draw[filled] \firstcircle node {A};
\draw[white] \secondcircle node {B};
\draw[outline] \firstcircle node {A};
\end{tikzpicture}
\end{center}
\section{Right Join}
Every record from table 2 is returned, regardless if it has a matching record in table 1. If the record has a matching record in table 1 this record from table 1 is returned as well.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Right Join
\begin{scope}
\clip \secondcircle;
\draw[filled] \firstcircle \secondcircle node {B};
\end{scope}
\draw[outline] \firstcircle node {A} \secondcircle;
\end{tikzpicture}
\end{center}
\clearpage
\section{Right Outer Join}
Those records from table 2 are returned, that do not have a match in table 1.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Right Join 2
\draw[filled] \secondcircle node {B};
\draw[white] \firstcircle node {A};
\draw[outline] \secondcircle node {B};
\end{tikzpicture}
\end{center}
\section{Theta Join}
Every row from dataset 1 is multiplied by every row of dataset 2. Usually a mistake unless you really want this Cartesian product.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Theta
\draw[filled] \firstcircle node {A} \secondcircle node {B};
\end{tikzpicture}
\end{center}
\clearpage
\section{Full Outer}
Returns all records from table 1 and table 2 regardless if they have matches in the other table. Records, that do match, are linked together via key.
\begin{center}
\begin{tikzpicture}[scale=1, every node/.style={scale=1}] % Full Outer
\draw[filled] \firstcircle node {A};
\draw[filled] \secondcircle node {B};
\begin{scope}
\clip \firstcircle;
\fill[white] \secondcircle;
\draw[outline] \secondcircle;
\draw[outline] \firstcircle;
\end{scope}
\end{tikzpicture}
\end{center}
\end{document}
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
Schlagwörter:
SQL,
TikZ,
Joins Category:
SQL |
Kommentare deaktiviert für Overviews of SQL Joins (with LaTeX code)
2020-05-24, 16:07
Ich habe heute die erste Version einer Beamer-Vorlage für Vorlesungen auf github hochgeladen. Ziel war es, sowohl einzelne Module (Vorlesungen) als auch den kompletten Foliensatz erzeugen zu können. Die Vorlage eignet sich nicht nur für MINT-Veranstaltungen, mein Fokus lag aber auf dem sauberen Einbinden von Quellcodes, was bei geisteswissenschaftlichen Vorlesungen vielleicht nicht der Hauptfokus ist.
Die Dateien finden sich unter https://github.com/UweZiegenhagen/MINT-Lecture-Slide-Template
Pull Requests, Kommentare und Vorschläge werden gern gesehen.
Als nächstes baue ich noch Beispiele für die von mir definierten Befehle ein, die ein vereinfachtes Einbetten von Grafiken und Quellcodes erlauben.
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
2020-05-22, 23:03
Für einen meiner Raspberry Pi 4, den ich vor allem als Mediacenter mit Kodi nutzen möchte, habe ich mir ein Argon One Gehäuse bestellt.
Die Installation des Pi im Gehäuse war leicht, die Passform ist gut. Die Installation der Software war aber ein wenig hakelig, daher möchte ich sie hier kurz beschreiben.
Für die folgenden Dinge aktiviert man in Libreelec den SSH-Zugang, mittels User „root“ und Passwort „libreelec“ kommt man dann z.B. via Putty auf den Pi. Da man als root unterwegs ist, entfallen sudo Befehle.
Als erstes installiert man folgende Addons aus dem Libreelec Repo: „Raspberry Pi Tools“ und „System Tools“
Die Argon-Software für Libreelec erhält und führt man aus mittels
curl https://download.argon40.com/argonone-setup-libreelec.sh | bash
Das normale Skript für Raspian (https://download.argon40.com/argon1.sh) funktioniert hier m.E. nicht, es muss die Version für Libreelec sein.
Das Skript für die Konfiguration kann man dann mittels ./argonone-config
ausführen. Standardmäßig ist der Lüfter so eingestellt, dass er bei 90° C auf 100% springt. Möchte man das anpassen, kann man mittels nano argononed.conf
die Konfiguration anpassen.
LibreELEC:~ # nano argononed.conf
#
# Argon One Fan Speed Configuration
#
# Min Temp=Fan Speed
45=25
65=50
90=100
Mittels reboot oder systemctl restart argononed.service kann man den Dienst (neu) starten.
Die aktuelle Temperatur erhält man übrigens mittels vcgencmd measure_temp
.
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
2020-05-17, 20:05
Ich habe seit ein paar Monaten wieder verstärkt Gelegenheit, meine rostigen SQL-Kenntnisse aufzufrischen. Kürzlich bin ich dabei an einer kleinen Herausforderung vorbeigekommen, die mich doch ein paar Minuten mehr beschäftigt hat. Gegeben sind zwei Tabellen, Namen und Adressen.
Namen
ID |
Name |
1 |
Anna Amsel |
2 |
Bernd Borstel |
3 |
Cesar Causel |
4 |
Dagmal Dack |
Adressen
ID |
NameID |
Adresse |
1 |
1 |
Amselweg 2 |
2 |
2 |
Badgasse 34 |
3 |
3 |
Chausseeweg 123 |
4 |
3 |
Dorfstraße 34 |
5 |
1 |
Alabasterpfad 32 |
ID ist jeweils der Primary Key, NameID der Fremdschlüssel von Adressen auf Namen. Ziel der Übung ist es, alle Namen mit der (sofern vorhanden) aktuellsten Adresse abzufragen.
Ein inner join
bringt ganz klar das falsche Ergebnis, denn Dagmar Dack fehlt in der Ergebnismenge, Anna und Cesar sind zweimal vertreten.
SELECT n.Name, a.Adresse FROM Namen n JOIN Adressen a ON n.ID = a.NameID ; |
SELECT n.Name, a.Adresse from Namen n JOIN Adressen a on n.ID = a.NameID ;
Ein left join
muss her, was das Ergebnis aber nur ein wenig besser macht: Dagmar ist jetzt drin, Anna und Cesar aber immer noch doppelt:
SELECT n.Name, a.Adresse FROM Namen n JOIN Adressen a ON n.ID = a.NameID ; |
SELECT n.Name, a.Adresse from Namen n JOIN Adressen a on n.ID = a.NameID ;
Beholfen habe ich mir dann mit einem Subselect:
SELECT n.Name, a.Adresse FROM Namen n
LEFT JOIN (SELECT MAX(ID) ID, MIN(NameID) NameID, MIN(Adresse) Adresse FROM Adressen GROUP BY NameID) a
ON n.ID = a.NameID |
select n.Name, a.Adresse from Namen n
left join (select max(ID) ID, min(NameID) NameID, min(Adresse) Adresse from Adressen group by NameID) a
on n.ID = a.NameID
Ergebnis
Name |
Adresse |
Anna Amsel |
Alabasterpfad 32
|
Bernd Borstel |
Badgasse 34 |
Cesar Causel |
Chausseeweg 123 |
Dagmal Dack |
NULL |
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
Schlagwörter:
SQL,
Join Category:
SQL |
Kommentare deaktiviert für SQL: Nur den aktuellsten Eintrag aus einer gejointen Tabelle laden
2020-04-27, 21:52
Heute mal ein Beispiel, wie man mit dem tasks Paket Aufgabenlisten setzen kann. Im nächsten Schritt werde ich dann die Listen per Export aus Trello befüllen.
\documentclass[12pt,ngerman]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{tasks}
\usepackage{fontawesome}
\NewTasksEnvironment[label=\faHandORight,label-width=15pt]{todo}[*](1)
\NewTasksEnvironment[label=\faHandRockO,label-width=15pt]{progress}[*](1)
\NewTasksEnvironment[label=\faThumbsOUp,label-width=15pt]{done}[*](1)
\begin{document}
\section*{TODO}
\begin{todo}
* Blumen gießen
* Einkaufen gehen
* Zeitschriften sortieren
\end{todo}
\section*{PROGRESSING}
\begin{progress}
* Keller aufräumen
* Bücher sortieren
* Rechner neu installieren
\end{progress}
\section*{DONE}
\begin{done}
* Steuererklärung
* Server neu installieren
* SSH-Zugang einrichten
\end{done}
\end{document} |
\documentclass[12pt,ngerman]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{tasks}
\usepackage{fontawesome}
\NewTasksEnvironment[label=\faHandORight,label-width=15pt]{todo}[*](1)
\NewTasksEnvironment[label=\faHandRockO,label-width=15pt]{progress}[*](1)
\NewTasksEnvironment[label=\faThumbsOUp,label-width=15pt]{done}[*](1)
\begin{document}
\section*{TODO}
\begin{todo}
* Blumen gießen
* Einkaufen gehen
* Zeitschriften sortieren
\end{todo}
\section*{PROGRESSING}
\begin{progress}
* Keller aufräumen
* Bücher sortieren
* Rechner neu installieren
\end{progress}
\section*{DONE}
\begin{done}
* Steuererklärung
* Server neu installieren
* SSH-Zugang einrichten
\end{done}
\end{document}
![](https://www.uweziegenhagen.de/wp-content/uploads/2020/04/tasks.png)
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
Category:
LaTeX,
Pakete |
Kommentare deaktiviert für Aufgabenlisten mit dem tasks Paket setzen
2020-04-26, 18:42
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) |
# -*- 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 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
2020-04-25, 11:13
Aus dem Nachlass eines Nachbarn habe ich gestern ein Xerox 860 System bekommen.
Wer es nicht kennt (so wie ich bis gestern noch):
Bevor PCs und Macs den Markt aufrollten, gab es auch Systeme für die Verarbeitung von Texten, die sich durch hohe Kosten und (aus heutiger Sicht) ungewöhnliche Maße auszeichnen.
Das Xerox 860 war so etwas wie der Rolls-Royce unter diesen Systemen. 128 KByte (!) RAM, keine Festplatte, zwei 8″ Diskettenlaufwerke in einem 80 Kilo Block, dazu ein fast 30 Kilo schwerer Drucker und ein Schwarz-Weiss-Monitor.
Es gibt sogar einen Basic-Interpreter dafür, das System ist wohl CP/M kompatibel.
![](https://www.uweziegenhagen.de/wp-content/uploads/2020/04/x4.jpg)
![](https://www.uweziegenhagen.de/wp-content/uploads/2020/04/x3.jpg)
![](https://www.uweziegenhagen.de/wp-content/uploads/2020/04/x2.jpg)
![](https://www.uweziegenhagen.de/wp-content/uploads/2020/04/x1.jpg)
Da die Maschine nicht wirklich wohnzimmer-tauglich ist, suche ich ein Plätzchen in einem Museum oder einer privaten Sammlung dafür. Ich möchte kein Geld dafür haben, die Maschine muss nur in Köln abgeholt werden.
UPDATE 17.05.2020
Die Xerox hat, zusammen mit einer SUN, einer VAX und weiteren Stücken, ihren Weg in das Technikmuseum Matthias Schmitt (www.tecmumas.de) angetreten.
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