Chemiestudium mit Linux und TeX

Bei der Einrichtung meines neuen Druckers hatte ich festgestellt, dass gewisse PDF-Betrachter beim Ausdrucken die PDF-Dateien auf unterschiedliche Weise entstellen (also manche Zeichen einfach nicht drucken oder mal eben aus jedem Zeichen das nächste im ASCII-Code folgende Zeichen machen oder die Fußzeile nicht drucken…). Meine Idee war dann, die PDF-Datei in eine Pixelgrafik umzuwandeln und anschließend die Pixelgrafiken wieder zu einer PDF-Datei zusammenzufügen, um anschließend diese zu drucken. Das hat auch funktioniert, nur mittlerweile hatte ich keine Lust mehr, das immer manuell durchführen zu müssen und habe mir jetzt deshalb ein Bash-Skript dafür geschrieben, welches ImageMagick verwendet.

Das Skript wurde von Kreuvf verbessert und hier hochgeladen.
hochgeladen.

Der Aufruf erfolgt zum Beispiel mit

Natürlich gibt es für ein solches Skript auch noch andere Anwendungsmöglichkeiten, für die unter Umständen eine Rasterung als JPG sinnvoller ist – hierzu reicht eine einfache Ersetzung aller Vorkommen von png durch jpg und eventuell eine Angabe der Qualität – eine Ersetzung von convert -density 300 durch convert -density 150 -quality 50 erzeugt beispielsweise PDF-Dateien mit JPG-Bildern mit einer Auflösung von 150dpi und einer Qualitätseinstellung von 50%.

Für meine Zwecke ist JPG keine Option, denn 1. soll die Datei danach gedruckt werden, sodass die Qualität so gut es geht erhalten bleiben soll (eine Rasterung auf 300dpi schadet nicht, da ich ohnehin mit dieser Auflösung drucke – 600dpi würde sehr viel länger zum Rastern in Anspruch nehmen) und 2. sind selbst bei einer JPEG-Qualität von 50% (300dpi) die JPG-PDF-Dateien, die natürlich hauptsächlich Text und scharfe Linien enthalten, in allen getesteten Fällen größer als die PNG-PDFs – teilweise immer noch mehr als doppelt so groß.

Nachdem ich nun fast ein ganzes Jahr lang nur meinen alten Dell Inspiron 1525 von 2008 verwendet habe und das neuere Modell von 2012 nur in der Ecke stand, habe ich mich gestern damit beschäftigt, alle eventuell noch wichtigen Daten von der Festplatte zu sichern und habe heute noch einmal ein Image von der Festplatte gemacht (nur falls irgendwelche Registrierungsschlüssel irgendwo in den Tiefen der Registrywiki verschüttet sein sollten). Während ich auf die Fertigstellung des Images gewartet und meinen Sohn mit Bindehautentzündung gepflegt habe, hatte ich eine ganze Menge Zeit, mir über das Partitionierungsschema Gedanken zu machen.

Bis vor kurzem hatte der Rechner eine große Windows-Partition (aufgesetzt zum Spielen von Computerspielen – vor der Geburt meines Sohnes hielt ich das noch für einen sinnvollen Zeitvertreib) und eine kleine Debian-Xfce-Partition. Da ich für die Universität regelmäßig eine Reihe von Windows-Programmen benötige und wegen der Kompatibilitätsprobleme zwischen LibreOffice und Microsoft Office Bitten meiner Kommilitonen, mich an der Korrektur von Protokollen zu beteiligen, aktuell nur mit Formatierungskäfern und Einstellungsquark quittieren kann, war von Anfang an klar, dass ich auf jeden Fall weiterhin eine Windows-Partition haben möchte. Zwar hatte ich darüber nachgedacht, einen Versuch zu starten, alle Programme unter Winewiki laufen zu lassen, aber so viel Ärger sind mir diese Programme nicht wert.

Da ich eine mit 120GB relativ kleine SSD in dem Notebook verbaut habe, habe ich mir lange Gedanken über die Platzaufteilung gemacht. Einerseits weiß ich um die Speicherhungrigkeit von Windows (frisch installiert ohne Updates… ich habe gerade nachgesehen und staune: nur 7,8GiB, was sich aber nach allen „notwendigen“ Updates schnell verdreifacht – und dann soll ja auch noch Platz für Programme sein, ohne dass Windows gleich Panik bekommt, dass die Festplatte voll ist), andererseits sollte natürlich die Linux-Partition so viel Speicher wie möglich eingeräumt bekommen, da ich später mal mein ganzes System darauf migrieren möchte. Meine Idee war, für Windows-Programme und Linux-/home-Partition eine gemeinsame TrueCrypt-verschlüsselte NTFS-Partition zu verwenden. Die Verschlüsselung der installierten Programme wäre zwar ein riesiger Overkill, aber so wäre der Unmöglichkeit, die Speicherallokation im Voraus planen zu müssen, beizukommen gewesen.

Nachdem ich nun aber mein Windows installiert habe, hat sich mir jedoch eine wesentlich einfachere Lösung offenbart: Ich hoffe das mein aktueller Uni-Rechner noch eine ganze Weile hält, kümmere mich um die System-Migration, wenn es so weit ist und belasse den neuen Rechner vorerst gänzlich ohne Linux-Partition. Wenn ich dann mal mein Hauptsystem auf den Rechner umziehen werde, wird das Windows sowieso auswandern müssen – vielleicht auf das Netbook, mit dem ich im 4. Semester experimentiert habe.

Die neue Lösung hat zwar emotional bei mir keine Resonanz gefunden („Ich will Linux auf allen meinen Rechnern…“), aber pragmatisch erscheint sie mir die als die Sinnvollste.

Ich habe hin und wieder das Problem, dass ich aus einer PDF-Datei nur einzelne Absätze ausdrucken möchte, die aber dummerweise umgebrochen werden. Das ist einerseits Papierverschwendung, weil ich für eine halbe Seite, die ich drucken möchte gleich, zwei Seiten voll bedrucken müsse. Andererseits ist das auch problematisch, wenn ich diese Absätze in irgendeiner Form präsentieren will, da dann der überwiegende Teil der ausgedruckten Informationen für meine Zwecke irrelevant ist. Beispielsweise bereite ich gerade für das Landesseminar Chemieolympiade ein paar Übungsaufgaben aus alten IChOlink-Klausuren vor, wo vielfach das Problem auftritt, dass eine relativ kurze Aufgabe über zwei Seiten geht. Ich habe mir deshalb überlegt, die jeweiligen Seiten als PNG rendern zu lassen, aus diesen PNG-Dateien mit GIMP die relevanten Bereich auszuschneiden und diese dann manuell in einer Datei zusammenzufügen. Das Rendern der PNG-Dateien richtig hinzubekommen, war nicht ganz einfach, obwohl ich das schon einmal gemacht hatte. Ich hatte das Paket imagemagick noch installiert (ansonsten findest es sich in den Debian-Repositorys) und konnte deshalb einfach den convert-Befehl verwenden. Wichtig waren hierbei zwei Optionen: die Auflösung und die zu rendernden Seiten. Erreichen lässt sich mein Ziel beispielsweise mit
convert -density 600 pdf.pdf[10] seite11.png,
wodurch Seite 11 der PDF-Datei pdf.pdf in 600dpi als PNG gerendert wird. Etwas seltsam mutet an, dass die erste Seite mit 0 referenziert wird und folglich Seite 11 mit [10], aber mit dieser Eigenheit kommt man klar.

Als ich meinem Laptop zwecks Studium und Uni-Alltag aufgesetzt habe, habe ich ihn vor allem transportsicher machen wollen. Zu diesem Zweck baute ich eine 80GB-SSD ein, was dann jedoch bei der Partitionierung Kopfzerbrechen bereitete. Ich wollte einerseits genug Systemspeicherplatz haben, andererseits aber auch nicht so viel, dass ich dafür keine persönlichen Dateien mehr speichern konnte. Da ich noch Windows-artige Ausmaße der Systempartition im Kopf hatte, war dies eine schwere Entscheidung – bei 40GiBwiki: Unterschied GB/GiB für die Systempartition blieben gerade mal 30GiB oder so für meine eigenen Dateien übrig. Ich entschied mich schließlich für eine weitere Abstraktionsebene, die unter Windows (soweit ich weiß) kein Äquivalent hat: der Logical Volume Manager (LVM) erlaubt es, abstrakte Partitionen anzulegen, deren Größe bei laufendem System schnell verändert (insbesondere sicher vergrößert) werden kann, ohne dass dafür Daten verschoben werden müssten. Ich konnte so für System- und /home-Partition erst einmal eine geringe Menge an Speicher reservieren und diesen bei Bedarf auffüllen. Als ich gerade eine größere Datei aus dem Internet geladen habe, habe ich routinemäßig im Terminal mit dem Befehl df den freien Speicher auf den Partitionen anzeigen lassen und dabei festgestellt, dass auf der /home-Partition nur noch etwa 1GB zur Verfügung steht. Das vierte Mal habe ich im Internet gekramt, wie man eine lvm-Partition vergrößern kann – ein klarer Fall für eine Aufgabe, die ich dokumentieren sollte, um es mir in Zukunft leichter zu machen. Zum Vergrößern der Partition habe ich mich zunächst mit su als root angemeldet und dann mit lvm den Logical Volume Manager geöffnet. Mit lvdisplay konnte ich den Pfad der LVM-Partition herausfinden:
/dev/volgroup/homevol
in meinem Fall. Mit
lvextend -L +2G /dev/volgroup/homevol
habe ich die Partition um 2GB vergrößert, dann mit exit den LVM wieder verlassen und dann mit
btrfs filesystem resize max /home
das in der Partition enthaltene Dateisystem an die Partitionsgröße angepasst. Mit df konnte ich mich schließlich davon überzeugen, dass wieder genug Speicher zur Verfügung steht.

Am Ende des letzten Semesters dachte ich, in den Semesterferien würde ich mehr Zeit damit verbringen, Wikipedia zu verbessern und mich näher mit Statistik zu beschäftigen. Mit dem Einstieg in die Statistik habe ich tatsächlich begonnen, jedoch schnell feststellen müssen, dass die Bücher, die ich mir dazu bestellt und ausgeliehen hatte, bereits zu viele Grundkenntnisse voraussetzen. Ein Buch zur statistischen Inferenz hat mich dann immerhin der Programmiersprache R nähergebracht. Kaum war ich jedoch beim Programmieren, hat es mich (zum mittlerweile vierten Mal in meinem Leben) in Richtung C++ gezogen. Dem Programmieren ging dieses Mal eine intensive Suche nach einer geeigneten Entwicklungsumgebung (IDE) voraus. Nachdem ich von Windows immer mehr Abstand genommen hatte und ich nach der Geburt meines Sohnes auch keine Zeit mehr mit Computerspielen verbrachte, verband mich nur noch Delphi mit Windows, wobei ich mich in letzter Zeit intensiver mit dem plattformübergreifenden Lazarus-Projektlink auseinandergesetzt hatte, mit dem ich beispielsweise auch die Monte-Carlo-Integration der Fläche des Reuleaux-Dreiecks und -Tetraeders durchgeführt hatte. Mit Lazarus als Vergleichsbasis hing die Messlatte relativ hoch, jedoch hatte ich mit Lazarus auch von Anfang an meine Probleme, denn die momentan noch schnelle Entwicklung des Projekts ist mit meinem Wunsch nach einem stabilen Betriebssystem (Debian Wheezy) nicht so recht zu vereinbaren, sodass ich mich doch nach Alternativen umsehen wollte. Zusammen mit der Tatsache, dass Pascal eine relativ exotische Sprache ist (die lediglich die Eigenheit besitzt, dass deutsche Schulen sie anscheinend lieben), war mir klar, dass ich nicht nur nach einer neuen Entwicklungsumgebung sondern auch nach einer anderen Sprache suchte. Die Entwicklungsumgebung sollte dabei natürlich nativ die Erstellung grafischer Oberflächen unterstützen.

Schaut man sich im Bereich freier Software einmal nach Bibliotheken für die Erstellung grafischer Oberflächen um, fallen besonders schnell GTK und Qt auf. Gewisse Interessanz hatte für mich auch wxWidgets, welches keine eigene grafische Oberfläche bietet, sondern gewissermaßen eine weitere Abstraktionsebene bildet und die native Bibliothek auf dem Zielrechner verwendet, um grafische Oberflächen zu erzeugen. Während ich die Idee eines Programms, dass sich in einer GTK-Umgebung so verhält, wie man es für GTK erwarten würde, auf einem Apple-Gerät so, wie es von Mac erwartet wird und auch unter Windows die native Oberfläche nutzt, fand ich die Vorstellung, dass gewisse Komponenten eines Programms sich in verschiedenen Umgebungen anders verhalten können, doch etwas abschreckend. Hinzu kam, dass ich keine IDE für wxWidgets finden konnte, sodass ich meine aktive Wahl auf GTK und Qt beschränkte. Da ich selbst Xfce als Desktopoberfläche verwende, welches auf GTK2 basiert, war ich zunächst eher geneigt, in Richtung GTK zu gehen. Nach einiger Recherche fand ich jedoch einiges über die enge Verzahnung mit Gnome und die (damit verbundenen?) ständigen nicht abwärtskompatiblen Änderungen in Minor-Versionen heraus, was mich dann doch sehr abgeschreckt hat.

Auch bin ich darauf aufmerksam geworden, dass sich LXDE mit dem Erscheinen von GTK3 von GTK abwendet und in Zukunft auf Qt basieren soll, was gleichzeitig mit einem Merge mit razor-qt einhergehen soll – eine Entwicklung, die ich äußerst spannend finde, da ich aus der Linux-Welt bisher immer nur von Forks gehört hatte; bei Desktopoberflächen insbesondere von den vielen Gnome-Forks, die es seit dem Erscheinen von Gnome 3 (welches mich erstmal für zwei Jahre von Linux fortgescheucht hatte, bis ich mich dann von Windows so eingeengt fühlte, dass ich schließlich zu Xfce fand) gab: Unity, Mate, Cinnamon, … Wenn dann (in ferner Zukunft?) einmal LXQt-Pakete für Debian zur Verfügung stehen sollten, werde ich es mit Sicherheit ausprobieren. Bis dahin übe ich mich aber in Geduld und freue mich, dass ich mit meinem Xfce/Debian-System endlich mal nicht die Semesterferien damit verbringen muss, meinen Rechner neu aufzusetzen (zumindest nicht meinen Arbeitsrechner).

Zurück zu C++ und Entwicklungsumgebung: Nachdem ich dann noch mehr über GTK vs Qt gelesen hatte, entschied ich mich schließlich für Qt, wobei ich es sehr praktisch fand, dass es dafür mit QtCreator auch eine IDE gibt, die ich mit einem simplen
aptitude install qtcreator
installieren konnte. Als erste Übungen schrieb ich ein simples Hello-world-Programm und ein Zahlenraten.

Schnell hatte ich ein erstes großes Projekt gefunden, das für die ersten Versuche, mit einer Sprache, einem Framework und einer Entwicklungsumgebung gleichzeitig klarzukommen sehr hoch angesetzt ist, denn ich setzte dem Ganzen nämlich noch eine Programmierschnittstelle oben drauf: OpenGL – und da wir im Jahr 2014 leben, natürlich nicht im Immediate-Mode, in dem man die CPU damit beansprucht, ständig der Grafikkarte mitzuteilen, wo der nächste Vertex (Eckpunkt) des zu zeichnenden Dreiecks liegt, welche Normale, Farbe und Texturkoordinate ihm zugeordnet sind, während sich die GPU-Kerne langweilen und Däumchen drehen. Ich hatte schon vor, es in modernem OpenGL zu programmieren. Die ersten Versuche, einen Shader zu programmieren und zu kompilieren endeten dann jedoch mit einem schwarzen Bild, auf dem weiße Dreiecke zu sehen waren. Das Debugfenster hatte dazu Folgendes zu sagen:
GLSL 3.30 is not supported. Supported versions are: 1.00 ES, 1.10, and 1.20
Man muss dazu sagen, ich programmiere auf einem Dell Inspiron 1525 mit Intel Core 2 Duo T5750. Die 2×2.0 GHz sind für meine Zwecke in der Regel mehr als genug (auch wenn Firefox/Iceweasel mit 120 Tabs nicht mehr ganz flüssig läuft^^). Da ich den Rechner im August 2008 aber nicht zu dem Zweck gekauft hatte, 3D-Spiele zu spielen, habe ich auf eine dedizierte Grafikkarte verzichtet und mich mit dem eingebauten Intel GM965-Modul zufriedengegeben. Angesichts der Tatsache, dass GM965 nur OpenGL 1.5 unterstützt, finde ich es schon erstaunlich, dass es überhaupt mit Shadernwiki und GLSLwiki zurechtkommt, insbesondere da Intel ja nicht dafür bekannt ist, dass es sonderlich großzügig bei der OpenGL-Unterstützung ist (beispielsweise unterstützen Sandy-Bridge-Prozessoren von Anfang 2011 jetzt endlich die 2009 veröffentlichte OpenGL-Version 3.2Quelle. Nachdem ich das herausgefunden hatte, musste ich mich dann erstmal auf GLSL 1.10 beschränken (1.20 brachte keine bahnbrechenden Änderungen, sodass ich darauf verzichten konnte). Die Beschränkung auf GLSL 1.10 hatte einige hässliche Workarounds zur Folge, die aber andererseits auch ein wenig Kreativität forderten. Vielleicht erzähle ich ein anderes Mal mehr darüber.

Über das Projekt will ich aktuell nur so viel verraten: Es handelt sich um ein rundenbasiertes Spiel, in dem es mehr um Glück als um Verstand geht. Durch die Programmierung habe ich neben einer kleinen Einarbeitung in altes GLSL (bisher etwa 70 Zeilen) auch C++ kennengelernt (das Projekt zählt aktuell neun Klassen und etwa 2000 Zeilen Code) und das Signal-Slot-Konzept von Qt kennen und schätzen gelernt. Im gleichen Zug habe ich es geschafft, so abhängig von Signalen und Slots zu werden, dass ich sie auch unter Umständen verwenden will, unter denen sie nicht funktionieren… aber dazu mehr in meinem nächsten Post.

WordPress-Backup

Ich wurde gerade, nachdem ich diesen Blog seit einer Weile nicht aktualisiert habe, beim Anmelden darauf hingewiesen, dass ich WordPress aktualisieren solle und es ratsam sei, vorher ein Backup anzulegen. Da mir nicht sofort klar war, wie das geht, fasse ich hier die Resultate meiner Recherche zusammen in der Hoffnung, dass ich beim nächsten Mal diese Anweisungen einfach nur befolgen muss und dann schneller bin.

Zunächst braucht man Zugang zum phpMyAdmin der entsprechenden WordPress-Datenbank. Bei 1&1-Konten klickt man dazu im 1&1-Control-Center auf den Reiter „Hosting“. Im Fenster „Webspace verwalten“ gibt es eine Option „MySQL-Datenbank“. Über den Button „phpMyAdmin“ der entsprechenden Datenbank, in der die Einträge und Einstellungen des WordPress-Accounts gespeichert sind, gelingt der Zugriff auf die phpMyAdmin-Umgebung.

Im phpMyAdmin liefert ein Klick auf den Reiter „Databases“ eine Liste der verfügbaren Datenbanken. Ein Klick auf die entsprechende Datenbank, in der die WordPress-Daten gespeichert sind, öffnet eine Ansicht mit mehreren Einträgen für Optionen, Posts, Kommentare, Metadaten und so weiter.

Ein Klick auf den Reiter „Export“ zeigt ein Fenster mit Export-Methoden an. Bei Wahl der Option „Custom“ können im nächsten Abschnitt „Table(s)“ alle zu archivierenden Tabellen ausgewählt werden – ein Klick auf „Select All“ markiert alle, wenn dies noch nicht geschehen ist. Im Abschnitt „Output“ kann die Ausgabeform des Backups spezifiziert werden: „wordpress_@DATABASE@“, „utf8“, „gzipped“ ist für meine Zwecke am sinnvollsten – für versierte Windows-Nutzer mag die Kompression „zipped“ sinnvoller sein. Im Abschnitt „Format“ kann in einem Dropdown-Menü das Export-Format gewählt werden. Für einen Backup ist natürlich das Wichtigste die Wiederherstellbarkeit, sodass ein Export im nativen Format (SQL) am sichersten ist (Ich weiß nicht, ob andere Formate gegebenenfalls auch wiederhergestellt werden könnten). Der Abschnitt „Format-specific options“ hat für das SQL-Format mehrere Unterabschnitte. Im Abschnitt „Object creation options“ ist ein Klick auf „Add DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT statement“ sinnvoll für den Fall, dass eine existierende Datenbank überschrieben werden soll.Quelle Ein Klick auf den Button „Go“ öffnet einen Dialog, in dem der Speicherort für die Datei angegeben werden kann (Browser-spezifisch).

Nachdem ich nun mein Backup habe (in dem ironischerweise dieser Eintrag noch nicht gespeichert ist), werde ich mein WordPress jetzt aktualisieren.

Interessanterweise habe ich es tatsächlich geschafft, zwei Monate mit meinem TeXstudio zu arbeiten, ohne zu bemerken, dass die automatische Silbentrennung für die deutsche Sprache nicht installiert war. Zwar hatte ich das eine oder andere Mal bemerkt, dass Wörter seltsam getrennt wurden, aber das habe ich immer darauf zurückgeführt, dass es sich dabei um Fachtermini handelt, die vielleicht nicht in der Liste der Worttrennungen stehen. Als ich heute einen kurzen Einleitungstext für das Fortgeschrittenenpraktikum „Physikalische Chemie“ geschrieben hatte und dann nach einem kurzen Tipp auf F1 so etwas
Ein Text, in dem Energie als En-ergie getrennt wird
erlebt habe, dachte ich mir, dass irgendwas nicht ganz stimmt. Das Wort „Energie“ ist ganz sicher allgemein bekannt und die Trennung „En-ergie“ nicht nur ungewöhnlich, sondern schlicht falsch. Im TeX-Log fand ich dann diese Zeile
No hyphenation patterns were loaded for (babel) the language `ngerman'.
Da hat doch tatsächlich mein TeXstudio die ganze Zeit deutsche Texte mit der englischen Silbentrennung verarbeitet und mir ist es nicht aufgefallen… Ich dachte mir, dass dieser Fehler sicher so häufig vorkommt, dass ich am schnellsten bin, wenn ich nicht danach suche, wie ich deutsche Silbentrennung installieren kann, sondern direkt den Fehler in einer Suchmaschine eingebe. Mit einer Suchmaschine, die nicht ganz so datenhungrig ist,link fand ich als erstes Ergebnis einen sehr hilfreichen Artikellink.
Diesem folgend bekam ich nach einer kurzen Installation mit
sudo aptitude install texlive-lang-german
bei erneutem Setzen mit F1 diese Ausgabe:
Ein Text, in dem Energie als Ener-gie getrennt wird

Nachdem ich die schier unendlich große Hürde, Arial in \LaTeX zu verwenden, überwunden hatte, ging es nun um den Inhalt des Protokolls. Hierzu wollte ich etwas bei SciFinder recherchieren. Mein Uni-Account für SciFinder funktioniert allerdings nur aus dem Universitätrechennetz heraus. Da ich gerade zu Hause war, brauchte ich also eine VPN-Verbindung. Natürlich funktioniert SciFinder nur mit aktiviertem JavaScript, sodass eine WebVPN-Verbindung der Universität nicht ausreicht. Es ist eine Verbindung über einen VPN-Client erforderlich.

Ich habe also von der Uni-Seite beide Versionen des VPN-Clients für Linux heruntergeladen, beide ausprobiert, aber nicht zum Laufen bringen können. Im Netz auf der Suche nach neueren Versionen fand ich heraus, dass das Debian-Paket vpnc es genauso tut. Ich installierte es mit aptitude, holte mir von der Uni-Seite die PCF-Datei, ließ mit
sudo pcf2vpnc uni-leipzig-vpn_cisco_windows_macos.pcf /etc/vpnc.conf
die Konfigurationsdatei in eine für vpnc lesbare Datei umwandeln, editierte diese Datei mit
sudo mousepad /etc/vpnc.conf,
wobei ich die Zeilen
# Xauth username <your username>
# Xauth password <your password>

ihrer Kommentarzeichen beraubte und <your username> mit meiner Uni-Mail-Adresse sowie <your password> mit dem dazugehörigen Passwort ersetzte. Es fehlte noch
sudo chmod 600 /etc/vpnc.conf,
um die Datei vor unberechtigtem Zugriff zu schützen (was unwahrscheinlich ist, da mein komplettes Betriebssystem verschlüsselt ist, aber man kann ja nie wissen). Mit
sudo vpnc
hatte ich dann meine VPN-Verbindung und konnte recherchieren.

Für das 4. Semester ist unter anderem das Grundpraktikum „Organische Chemie“ vorgesehen. Die Anforderungen an die Protokolle sind – soweit ich das beurteilen kann, ohne ein Protokoll geschrieben zu haben – nicht so hoch wie dies beispielsweise im Praktikum „Physikalische Chemie“ im letzten Semester der Fall war. Hierzu trägt vor allem die Tatsache bei, dass zu den meisten Experimenten keine aufwendige Auswertung notwendig ist. Was an Inhalt weniger anspruchsvoll ist, wird jedoch an Form mehr verlangt.

Zwei Forderungen lauten, dass als Schriftart für den gesamten Text und Strukturformeln Arial zu verwenden ist und dass chemische Strukturformeln mit ChemDraw gezeichnet werden sollen. Letzterer Forderung könnte ich nachkommen, da ich zur Not noch einen Windows-Rechner habe, mit dem ich die Strukturformeln in ChemDraw zeichnen könnte. Das Einbinden der Formeln wäre sicherlich auch irgendwie machbar. Bis jetzt sieht aber mein Plan so aus, dass ich weiterhin Chemfiglink verwende, was mir die gleichzeitige Verwendung mehrerer Rechner und Programme ersparen würde. Spannender ist dagegen die erste Forderung, die für mich eine relativ große Hürde darstellt, da ich bisher nur \LaTeX-Schriftarten verwendet habe.

Arial in \LaTeX mit TeXstudio unter Debian Wheezy. Geht das überhaupt? – Die ernüchternde Antwort, die ich im Internet gefunden habe, war erst einmal: Schwierig, denn Arial ist eine proprietäre TrueType-Schriftart, \LaTeX dagegen arbeitet nur mit OpenType-Schriftarten. Ich habe jedoch die Empfehlung gefunden, statt \LaTeX XeTeX zu verwenden. Dies erstaunte mich zunächst, da ich nicht gewusst hatte, dass XeTeX zu \LaTeX überhaupt kompatibel ist. Um auszuprobieren, ob es tatsächlich so einfach sein kann, installierte ich erstmal XeTeX. Hierzu habe ich unter Debian Wheezy im Paketmanager „aptitude“ nach „xetex“ gesucht. Das Paket „texlive-xetex“, welches als einziges gefunden wurde, habe ich dann installiert. Da ich TeXstudio 2.3 verwende, hatte ich dann das Problem, dass dieses XeTeX nicht standardmäßig unterstützt. Ich habe jedoch diese Seite gefunden und bin nach der Anleitung vorgegangen. Da es nicht auf Anhieb funktionierte, habe ich ein wenig herumprobiert und schließlich folgende Änderungen gegenüber der Standardkonfiguration vorgenommen. Unter dem Menüeintrag „Options“ habe ich „Configure TeXstudio“ gewählt und im Reiter „Commands“ den Eintrag für „PdfLaTeX“ mit dem Befehl
xelatex -interaction=nonstopmode %.tex
ersetzt. Als „Quick Build“-Option verwende ich nach wie vor „PdfLaTeX + Pdf viewer“. Damit wäre erst einmal XeTeX unter TeXstudio zum Laufen gebracht.

Dann brauchte ich Arial. Da ich glücklicherweise über eine Windows-Installation verfüge, habe ich mir einfach die TTF-Dateien aus dem Ordner C:\Windows\Fonts einer Windows-Installation auf einen USB-Stick kopiert und von dort aus auf den Linux-Rechner in den Ordner /usr/share/fonts/truetype/windows übertragen. (Ohne Administratorrechte können die Schriftarten auch in den Ordner /home/~/.fonts installiert werden. Die Tilde steht hierbei für den eigenen Benutzernamen und der Ordner „.fonts“ ist versteckt, sodass gegebenenfalls versteckte Ordner eingeblendet werden müssen, um ihn öffnen zu können. Es kann auch sein, dass der Ordner noch nicht existiert. Dann muss er vorher erstellt werden.)

Nun kam der lustige Teil mit den Kompatibilitätsproblemen der einzelnen Pakete untereinander. Ich fügte zunächst die Zeilen
\usepackage{fontspec}
\setmainfont[Mapping=tex-text, BoldFont={Arial Bold}, ItalicFont={Arial Italic}]{Arial Unicode MS}

hinzu. Danach funktionierte gar nichts mehr. Es hat eine Weile gedauert, die Datei wieder in eine syntaktisch einwandfreie Form zu bringen. Danach musste ich aber feststellen, dass die Mathematikumgebung immer noch in der Standardschriftart war. Dies habe ich mit
\usepackage{unicode-math}
\setmathfont{Arial Unicode MS}
\setmathfont[range=\mathit]{Arial Italic}

zu korrigieren versucht. Die Datei war dann sogar noch setzbar, nur leider mit dem Problem, dass mathematische Symbole wie \sum und \int fehlten und \sqrt{~} nicht mehr lesbar war.
Ich will den Problemlösungsprozess, der zehn Stunden in Anspruch genommen hat, nicht in voller Gänze ausführen. Letztlich waren aber die Hauptverursacher meiner Probleme Pakete, auf die ich nur sehr ungern verzichten will, besonders prominent darunter chemmacros und babel und ein Codierungsproblem, welches ich bis jetzt noch sehr seltsam finde, momentan aber erst einmal umgangen habe: Meine ersten vier Zeilen der Datei lauten
% !TeX encoding = utf8
\documentclass[10pt,a4paper,bibtotocnumbered]{article}
\usepackage[latin1]{inputenc}
\usepackage[margin=2.5cm]{geometry}

Genau, ich zeige einerseits TeX die UTF-8-Codierung an, andererseits aber inputenc die Latin1-Codierung. Die Datei selbst ist UTF-8-codiert. Alle anderen Kombinationen führen dazu, dass entweder die Datei nicht setzbar ist, weil sie Nicht-UTF-8-Zeichen enthält oder die Datei zwar gesetzt wird, die Nicht-ASCII-Zeichen als Kätschen mit Fragezeichen angezeigt werden. Wenn ich irgendwann einmal eine Lösung für dieses Rätsel gefunden haben sollte, werde ich an dieser Stelle darauf verweisen.

Nun zur Mathematik: Da ich ja Arial verwenden soll, fallen amsfonts und amssymb (die ich sonst immer verwendet habe) aus dem Katalog der verwendbaren Pakete heraus. Stattdessen verwende ich nun mathspec, stelle Arial als Schriftart ein und verwende mdsymbol, welches Sans-Serif-Mathematiksymbole zur Verfügung stellt.
% Mathematik
\usepackage{amsmath}
\usepackage{mathspec}
\setmathsfont(Digits,Latin,Greek)[Numbers={Lining,Proportional}]{Arial}
\usepackage{mdsymbol}

Als Naturwissenschaftler verwende ich natürlich noch siunitx, welches ich mit
% siunitx für SI-Einheiten (Befehle \SI \si \num ...)
\usepackage{siunitx}
\sisetup{
output-decimal-marker={,},
per-mode=reciprocal,
exponent-product=\cdot,
retain-explicit-plus,
range-phrase = {\dots},
separate-uncertainty,
list-separator={; },
list-final-separator={; }}

ausgiebig meinen Präferenzen anpasse:

  • output-decimal-marker bestimmt das Dezimaltrennzeichen, als welches wir ja in Deutschland das Komma (und nicht den Punkt) verwenden.
  • per-mode gibt die Art und Weise an, wie der Befehl /per interpretiert wird; im Fall von reciprocal ist es eine hochgestellte -1, Alternativen sind symbol (ein /) und fraction (Darstellung als Bruch mit Einheiten in Zähler und Nenner).
  • exponent-product ist das Zeichen, welches beispielsweise in 1 \cdot 10^{-4} steht; hier bevorzuge ich den Malpunkt gegenüber dem Malkreuz (Standard).
  • retain-explicit-plus ist dafür da, explizit gesetzte positive Vorzeichen zu erhalten, was zum Beispiel für Angaben wie +0.35 \mathrm{V} ganz nützlich ist.
  • range-phrase definiert die Zeichen, die in den Befehlen \SIrange und \numrange vorkommen; hier finde ich die horizontale Ellipse … wesentlich ansprechender als jedes englische oder deutsche Wort.
  • separate-uncertainty stellt die Unsicherheit beispielsweise wie in (4.525 \pm 0.011)\,\mathrm{m} dar, was ich gegenüber der Standardnotation 4.525(11)\,\mathrm{m} einerseits intuitiver und andererseits auch schöner finde.
  • list-separator und list-final-separator geben schließlich an, welche Trennzeichen in \SIlist und \numlist verwendet werden; auch hier finde ich ein Sonderzeichen wie das Semikolon schöner als jedes Wort.

Zu Schriftart, Sprache und Codierung haben sich folgende Zeilen durchgesetzt:
% Sprache, Codierung und Schrift
%\usepackage[ngerman]{babel}
%\usepackage{fontspec}
%\usepackage[T1]{fontenc}
\setmainfont[Mapping=tex-text, BoldFont={Arial Bold}, ItalicFont={Arial Italic}]{Arial Unicode MS}
\renewcommand{\d}{\mathsf{d}}
\usepackage{setspace}\setstretch{1.33} % Zeilenabstand
\parindent=0pt % Einrückung eines neuen Absatzes
\parskip=10pt % Abstand zwischen zwei Absätzen

Auch wenn diese Konfiguration aktuell funktioniert, besteht insgesamt eindeutig Verbesserungsbedarf. Das Paket fontspec konnte ich auskommentieren, da es bereits von mathspec geladen wird. Schlimmer ist, dass ich auf fontenc und babel ganz verzichten musste. Das Paket babel verträgt sich nicht mit dem Befehl
\setmathsfont(Digits,Latin,Greek)[Numbers={Lining,Proportional}]{Arial}
oder genauer der Einbindung griechischer Arial-Buchstaben mit
\setmathsfont(Greek)[Numbers={Lining,Proportional}]{Arial}
und muss somit erstmal aus der Liste meiner Pakete entfernt werden. Ich habe inzwischen gelesen, dass das Problem ist, dass babel das Zeichen ", welches für die Codierung griechischer Buchstaben verwendet wird. Im Zusammenspiel beider Pakete ergeben sich damit endlose Rekursionen, die dazu führen, dass die Dateien auch nach Stunden nicht gesetzt sind. fontenc dagegen überschreibt auf eine mysteriöse Art und Weise die Schriftart, was im Endeffekt dazu führt, dass die PDF nicht in Arial, sondern in Computer Modern ausgegeben wird. Da ich nicht auf fontenc bestehe, habe ich hier erstmal nicht weiter nachgeforscht und mich damit abgegeben, dass es weg ist.

Für Chemie habe ich besonders die Pakete chemstyle, chemmacros und chemfig zu schätzen gelernt, die ich mit
% Chemie
\usepackage{chemstyle}
\usepackage{chemmacros}
\chemsetup[ox]{explicit-sign=true,roman=false}
\chemsetup[phases]{pos=sub}
\usepackage{chemfig}
\setatomsep{0.4cm}
\setcrambond{0.1cm}{}{}
\renewcommand*\printatom[1]{\scriptsize \ensuremath{\mathsf{#1}}}

einbinde. Das Paket chemstyle verwende ich tatsächlich nur, um das mit dem Befeh \standardstate definierte Zeichen, welches den Standardzustand symbolisiert, einzubinden. Das Paket chemmacros ist für chemische Gleichungen sehr nützlich und chemfig ist natürlich für Strukturformeln äußerst elegant zu verwenden und klappt in der Regel besser als externe Formeln einzubinden (auch wenn es einer gewissen Einarbeitung bedarf). Die meisten Probleme machte mir hier leider chemmacros, da es – wie auch mathspec – amsmath lädt, jedoch anscheinend mit anderen Optionen. Die Lösung war hier, chemmacros vor mathspec zu laden. Aber auch dann bekam ich einen netten Fehler
! LaTeX Error: Too many math alphabets used in version normal.
Die einzige Möglichkeit, dieses Problem zu „lösen“, war, die Zeile
\usepackage{mdsymbol}
auszukommentieren – und so waren meine mühsam gefundenen Sans-Serif-Mathematiksymbole auch schon wieder verloren… bis ich diese Seite gefunden habe. Von dort habe ich den Code-Fetzen
% Too many math alphabets used? Not anymore!
\usepackage{etoolbox}
\makeatletter
\def\new@mathgroup{\alloc@8\mathgroup\mathchardef\@cclvi}
\patchcmd{\document@select@group}{\sixt@@n}{\@cclvi}{}{}
\patchcmd{\select@group}{\sixt@@n}{\@cclvi}{}{}
\makeatother

ohne Sinn und Verstand kopiert und voilà – es funktioniert!

Wir sehen: Einige Limitationen hat dieses Vorgehen noch, aber ich habe jetzt immerhin eine Präambel, die mir erlaubt, meine OC-Protokolle in Arial zu schreiben:
% !TeX encoding = utf8
\documentclass[10pt,a4paper,bibtotocnumbered]{article}
\usepackage[latin1]{inputenc}
\usepackage[margin=2.5cm]{geometry}
% Too many math alphabets used? Not anymore!
\usepackage{etoolbox}
\makeatletter
\def\new@mathgroup{\alloc@8\mathgroup\mathchardef\@cclvi}
\patchcmd{\document@select@group}{\sixt@@n}{\@cclvi}{}{}
\patchcmd{\select@group}{\sixt@@n}{\@cclvi}{}{}
\makeatother
% Chemie
\usepackage{chemstyle}
\usepackage{chemmacros}
\chemsetup[ox]{explicit-sign=true,roman=false}
\chemsetup[phases]{pos=sub}
\usepackage{chemfig}
\setatomsep{0.4cm}
\setcrambond{0.1cm}{}{}
\renewcommand*\printatom[1]{\scriptsize \ensuremath{\mathsf{#1}}}
% Mathematik
\usepackage{amsmath}
\usepackage{mathspec}
\setmathsfont(Digits,Latin,Greek)[Numbers={Lining,Proportional}]{Arial}
\usepackage{mdsymbol}
% Sprache, Codierung und Schrift
\setmainfont[Mapping=tex-text, BoldFont={Arial Bold}, ItalicFont={Arial Italic}]{Arial Unicode MS}
\renewcommand{\d}{\mathsf{d}}
\usepackage{setspace}\setstretch{1.33} % Zeilenabstand
\parindent=0pt % Einrückung eines neuen Absatzes
\parskip=10pt % Abstand zwischen zwei Absätzen
% siunitx für SI-Einheiten (Befehle \SI \si \num ...)
\usepackage{siunitx}
\sisetup{
output-decimal-marker={,},
per-mode=reciprocal,
exponent-product=\cdot,
retain-explicit-plus,
range-phrase = {\dots},
separate-uncertainty,
list-separator={; },
list-final-separator={; }}
\begin{document}
Dieser Text ist in Arial und Mathe jetzt auch:
\begin{align}
\sum\limits_{i=0}^n i = \frac {i(i+1)} 2
\end{align}
\end{document}

Ich, Toshiki Ishii, studiere seit Herbst 2012 an der Universität Leipzig Chemie (jetzt im 4. Semester). Mein großes Vorwissen zu Beginn des Studiums nutzte ich, um die ersten Vorlesungen dazu zu zweckentfremden, das Mitschreiben am Computer zu lernen – um das zu einer echten Herausforderung zu machen, wählte ich dazu das Satzsystem LaTeXwiki, mit welchem ich zu diesem Zeitpunkt nur wenig Erfahrung hatte. Entsprechend bedurfte es einer Recherche und Nacharbeit, die ersten Mitschriften zunächst in eine syntaktisch korrekte und dann später in eine lesbare, ästhetisch akzeptable Form zu bringen. Aufgrund des hohen Aufwandes schaffte es dabei nur eine Mitschrift in das Endstadium.

Meine Kenntnisse konnte ich dann im zweiten Semester weiter verbessern. Die Mitschriften hatten von Anfang an eine höhere Qualität und weniger Fehler. Außerdem wurden in dieser Zeit die ersten Protokolle geschrieben. Insbesondere das 76-seitige Protokoll zum Praktikum „Instrumentelle Analytik“ wäre ohne diesen Kenntnisstand innerhalb der 7-Tage-Frist nicht zu bewerkstelligen gewesen. Extra für dieses Projekt schrieb ich mir noch ein Programm, mit dem ich Diagramme mit Datenpunkten leichter in das LaTeX-Paket TikZwiki übernehmen konnte. Dieses verbesserte ich dann bei mehreren Gelegenheiten, zuletzt im Praktikum „Physikalische Chemie“.

Im 3. Semester bin ich dann auf die Grenzen des Machbaren gestoßen. Das Mitschreiben in LaTeX gab ich in der Vorlesung „Organische Chemie“ nach wenigen Tagen auf – das Übernehmen aller Strukturformeln und Skizzen in einer druckreifen Form wäre in der Kürze der Zeit hier einfach nicht möglich gewesen und eine Einbindung aller Grafiken erschien mir zu aufwendig. Da ich nachträglich gebeten wurde, auch aus dieser Vorlesung meine Notizen zur Verfügung zu stellen, habe ich mich dann mit dem Scannen und der nachträglichen verlustbehafteten Datenreduktion meiner eingescannten Mitschriften beschäftigt.

Angesichts der Stunden, die ich über das Semester verteilt allein mit dieser Aufgabe verbracht hatte, wollte ich in den Semesterferien ein Programm schreiben, mit dem sich dieser Prozess automatisieren ließe. Die Aufgabe erschien zunächst sehr reizvoll und ich hatte viele Ideen zur Umsetzung. Die ersten Testläufe waren dann aber doch eher ernüchternd. Ich bin zu dem Schluss gekommen, dass diese Aufgabe in der Kürze der Semesterferien nicht zu schaffen wäre und dass es auch unverhältnismäßig wäre, diese Menge an Arbeit in das Projekt zu stecken. Stattdessen entschied ich mich, ein Convertible Netbook zuzulegen, mit dem ich dann handschriftliche Notizen direkt in einem Vektorformat aufzeichnen wollte. Auf meiner Suche nach einem Programm, das Vektorgrafiken als TikZ-Code exportiert, bin ich dann jedoch nicht fündig geworden, sodass ich in der letztne Woche der Semesterferien daran machte, mir selbst ein solches Programm zu schreiben. Nach ersten Testläufen war ich von der schlechten Lesbarkeit insbesondere chemischer Strukturformeln sehr enttäuscht, sodass ich kurzerhand einen QnD-Chemiemodus einfügte. Dieser ist momentan noch so umständlich zu bedienen, dass ich ihn noch einmal werde überarbeiten müssen, bevor ich damit wirklich glücklich werden kann. Erste Gedanken für eine einfache und (hoffentlich) intuitive Oberfläche habe ich jedoch bereits, sodass ich, so mich nicht Quelltextfehler stundenlang verfolgen, die Oberfläche im Laufe des Tages in eine nutzbare Form werde bringen können.

Warum fange ich jetzt mit diesem Blog an? – Weil ich festgestellt habe, dass ich es mir zeitlich nicht leisten kann, keinen zu haben. Klingt paradox, ist aber einfach zu erklären: Ich habe im letzten und auch in diesem Semester immer wieder festgestellt, dass ich mich immer wieder mit den gleichen LaTeX- und Linux-Problemen herumschlage, aber jedes Mal aufs Neue stundenlang eine Lösung recherchieren/finden muss, weil ich bereits wieder vergessen habe, wie ich ein Problem in der Vergangenheit gelöst habe. Neulich habe ich einen Blog von einem Ubuntu-Nutzer gefunden, dem vielfach für seine hilfreichen Posts gedankt wurde. Darauf antwortete er an einer Stelle schlicht, dass es ihn freue, dass sein Blog anderen Leuten hilfreich wäre, dass er ihn aber hauptsächlich für sein zukünftiges Selbst schreibe. Genau dieses Ziel verfolge ich mit diesem Blog auch.