Skip to content

Kommutative Diagramme mit LaTeX

Momentan komme ich in den Genuss, im Rahmen der mathematischen Vorlesungen viele kommutative Diagramme zeichnen zu müssen. Das AMS-Paket bringt mit dem Paket amscd bereits eine kleine, einfache Funktionalität mit. Jedoch kommt man hier leicht an die Grenzen. Ich nutze lieber das Paket xypic. Das wrd mittels \usepackage{xypic} eingebunden und in einer Matheumgebung ($...$, \[...\], \begin{gather*}...{end{gather*} etc.) steht dann das Makro \xymatrix{} zur Verfügung.

In der heutigen Vorlesung wollte ich folgendes Diagramm zeichnen:
dreieckiges CD
Dazu habe ich folgenden LaTeX-Code verwendet:

\begin{gather*}
  \xymatrix{X \ar[d]|{Q_{N(Q)}} \ar[r]|{Q} & Y\\
    X/_{N(Q)} \ar[ur]|{T_{0}} & }
\end{gather*}

Dabei sind X, Q und X/_{N(Q)} die Knoten im Diagramm. Diese Einträge werden durch & getrennt. Die \ar-Einträge zeichnen die Pfeile. Ein \ar muss immer dort stehen, wo der Pfeil beginnt. Der erste nach dem X beginnt auch beim X und das d in eckigen Klammern sagt aus, dass er nach unten (down) zeigt. Andere gültige Buchstaben wären r (rechts), l (links), u(up = hoch) usw. In der zweiten Zeile des Beispiels sieht man, dass die Buchstaben auch kombiniert werden können. Zum Schluss muss der Pfeil noch beschriftet werden. Dies geschieht u.a. mit ^, _ oder wie oben |. Genau wie im Mathesatz bringt der Hut (^) die Beschriftung über den Pfeil, der Unterstrich setzt die Beschriftung darunter und das | trennt die Pfeile, wie in meinem Beispiel.

Mit xypic komme ich sehr schnell zum Ziel und setze es daher sehr gern für kommutative Diagramme ein. Vielleicht findest du ja auch Gefallen daran.

Tip #15: Maximum in einem Array finden

Stellt euch vor, ihr habt ein Array gut gefüllt mit verschiedenen Integer-Werten und wollt das Maximum bestimmen. Wie geht das mit zsh-Mitteln? Ganz einfach:

jens@frankenstein:~/ > a=( 12 232 45 1 56 232 124 12 3442 345)
jens@frankenstein:~/ > print -l ${${(On)a}[1]}
3442

Was macht der Ausdruck? Ganz einfach! Er sortiert das Array numerisch und gibt dann den ersten Wert aus.

Programm für Videoschnitt gesucht

Ein Bekannter von mir sucht ein Programm mit dem er einen kleinen Kurzfilm erstellen kann. Was soll das Programm können?

  • Es muss eine Möglichkeit geben, Bilder in das Video einzufügen
  • Das Video soll man mit Ton unterlegen können. Dabei muss der Ton auch geschnitten werden können. Denn es gibt einen Sprecher, dessen Worte zurechtgebogen werden müssen.
  • Eine kleine Auswahl an Effekten sollte verfügbar sein.
  • Das Programm muss muss unter Linux laufen.
  • Von der Vorstellung her, sollte es eine verbesserte Version von Movie Maker sein.

Kennt jemand aus der Leserschaft ein derartiges Programm bzw. eines, was in die Nähe der Anforderungen kommt? Das Thema liegt weit weg von meinen Interessen und ich habe Hoffnung, dass jemand von euch weiterhelfen kann.

Tip #14: E-Mails mit mutt automatisch verschlüsseln

Ich sinniere schon seit einiger Zeit, wie ich ausgehende E-Mails weitgehend automatisch verschlüsseln kann. Vor längerer Zeit stiess ich dabei auf das Perlskript von Martin Grandrath. Auf der Seite ist gut beschrieben, wie das einzurichten ist. Das problem am Skript ist die relativ lange Startzeit. Es vergehen in der regel mehrere Sekunden bis mutt einsatzfähig ist.

Vor kurzem unterhielt ich mich mit Jörg Sommer darüber. Er hat eine Lösung mit zsh-Mitteln gebastelt. Diese ist zudem noch wesentlich schneller als die obige Variante:


#!/bin/zsh

hook_name=send-hook
blacklist_file=$HOME/Mail/crypt_blacklist
output_file=$HOME/Mail/crypt_hook_list

setopt extendedglob

gpg_dump=( ${(f)“$(gpg --list-keys --with-colons)”} )

# filter out lines without @
people=( ${(f)"$(for line in ${(M)gpg_dump:#(pub|uid):*@*}; do 
  print ${“${(@s.:.)line}”[10]}; done)"} )

typeset -a -U addresses
# possible bad lines:
# • email@example.com  -- only an address
# • name (<…>) 
addresses=( ${${people%>}##*<} )

[[ -r $blacklist_file ]] &&
  addresses=( ${addresses:#${(j:|:)~${${(f)"$(<$blacklist_file)"}:#\#*}}} )

print -l "$hook_name\t~A\tunset crypt_autoencrypt" \
  "$hook_name\t'~t \""${(j:|:)addresses//./\\\\.}"\"'\tset crypt_autoencrypt" \
  > $output_file

Was macht das Skript? Anfangs werden zunächst ein paar Variablen festgelegt und das erweiterte Globbing der zsh eingeschalten. In der Variable gpg_dump wird alsdann die Ausgabe von gpg --list-keys --with-colons gespeichert. Nun folgt ein wenig zsh-Magic. ;-) Die Anweisung hinter people entspricht in etwa der Shellzeile awk -F: ‘/^(pub|uid)/ { print $10 }’ gpg_dump, d.h. dort liegen dann alle E-Mail-Adressen, die auf den Schlüsseln angegeben waren. Schließlich wird für alle Adressen auf der Blackliste ein enstprechender Eintrag erzeugt und die Konfiguration in die Variable output_file geschrieben.Die Adressen in der Blackliste werden entfernt. Was übrig bleibt, schreibt das Skript in Datei, deren Name in output_file gespeichert ist. Dabei muss man beachten, dass mutt nicht unendlich viele Einträge akzeptiert. Es scheint eine Begrenzung irgendwo bei 200 Einträgen zu geben.

Das ist aus meiner Sicht eine gute Alternative zu Martins Skript. Solltet ihr Anmerkungen, Fragen, Kommentare haben, schreibt mir es unten rein oder schreibt direkt eine E-Mail an Jörg.

Update: Eine Zeile im Beitrag war ungenau formuliert. Nach einem Hinweis von Jörg habe ich das verbessert.

URL-Escapezeichen in UTF-8 wandeln

Ich stand gerade vor dem Problem, Daten aus URLs zu extrahieren. Nun kann man in eine URL nicht unmittelbar bestimmte Zeichen (Umlaute, Leerzeichen etc.) eingeben. Diese werden durch so genannte Escapezeichen markiert. Aus einem Leerzeichen wird dann %20 oder ein " wird ein %22 usw. Mein Problem bestand darin, diese Zeichen wieder zurück zu transformieren. Mit sed würde das gehen, aber einen recht hohen Aufwand darstellen. Auch weitere Programme schienen ungeeignet. Aber Maddi brachte mich auf die richtige Spur: uni2ascci. Der Aufruf ascii2uni -aJ < datei löste mein Problem. ;-)

cronjob