ubuntuusers.de

Python, Qt Frontend/Templatesystem für LaTeX Letter

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

jazzdd

Avatar von jazzdd

Anmeldungsdatum:
5. November 2007

Beiträge: 200

Moin,

nun stelle ich mal mein neuestes Projekt vor:

Ich habe die erste Alpha des Python Qt Frontends für die Latex Letter Klasse fertig (siehe Bild im Anhang). Allerdings möchte ich wirklich anmerken: das ist mein erstes Python Projekt und wie gesagt Alpha.

was kann mein Programm bisher:

- integriertes Templatesystem, Nutzen bestehender Templates zum Briefschreiben

- einfache Bedienung durch eintragen der Templatevariablen

- Generierung der PDF bei installiertem Latex

- optische Anzeige des Briefes im Programmfenster

wozu ist es da:

- ein Admin/IT Mensch einer Firma/Familie erstellt ein Brief Template (mit Kopf-, Fußzeile, Logo, etc)

- Anwender öffnet das Programm und das entsprechende BriefTemplate und schreibt in der Oberfläche den Brief, beim Speichern wird automatisch eine PDF erzeugt

- die PDF ist ein vollständiges Briefdokument, das per Mail versendet oder gedruckt werden kann

- das ganze ist vorallem für das Büro und Latex fremde Personen gedacht, die einheitlich und schnell Briefe verfassen wollen

Bitte testet das Programm und macht Vorschläge zum Verbessern:

Installation:

- Zip latexLetter entpacken

- Zip pypoppler entpacken (Anzeige der PDF im Programm)

- in den Ordner pypoppler wechseln und sudo make install ausführen (Achtung hier wird ins System installiert, configure.py und make wurde auf meinem System (Ubuntu 9.04) bereits ausgeführt)

- python-qt4 muss installiert sein (wenn nicht: sudo apt-get install python-qt4)

- in den Ordner latexLetter wechseln und python main.py ausführen

- auf Laden klicken und im Ordner tex/ die Datei beispiel.tex öffnen

Anmerkungen:

das es noch eine Alpha ist, ist der Code noch nicht sonderlich schön geschrieben und noch unkommentiert. Variablen sind noch nicht alle sehr sinnvoll benannt und es ist sogut wie noch kein Abfangen von möglichen Fehlern implementiert. Ich arbeite aber dran.

Bitte sagt mir was ihr von dem Projekt haltet ☺

latexLetter.zip (87.0 KiB)
Download latexLetter.zip
pypoppler.zip (1.1 MiB)
Download pypoppler.zip
Bilder

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

Hab mir nur mal den Screenshot angeschaut, sieht gut aus. Das PDF sieht allerdings so aus, als würdest du die ComputerModern-Fonts von TeX benutzen, die sehen in PDF ziemlich pixelig aus.Schau dir mal /usr/share/doc/texlive-doc/latex/psnfss/psnfss2e.pdf an; ich verwende üblicherweise charter für Briefe.

Ich würde für das Programm ein Projekt bei einem OpenSource-Hoster wie https://launchpad.net/ oder http://www.berlios.de registrieren. Wenn du setuptools verwendest und das Projekt bei PyPI registrierst, wird die Installation einfacher.

Die libpoppler-Bindings für Python wollte ich mir schon lange mal anschauen 😉

jazzdd

(Themenstarter)
Avatar von jazzdd

Anmeldungsdatum:
5. November 2007

Beiträge: 200

Moin, also das Bild sieht so verpixelt aus, da es etwas skaliert eingetragen wird. Öffnet man die PDF sind auch die lmodern Schriften bei mir gestochen scharf.

Aber für das Projekt an sich ist es erstmal zweitrangig, weil man sich wie gesagt, ein eigenes Template schreiben kann und dieses dann nur mit Inhalt füllt.

Launchpad und PyPI schau ich mir mal an. Demnächst gibts auch wieder eine neue Version, die ein ganz paar Fehler ausmerzen wird.

Jazz

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

lmodern sieht nicht in jedem Dokumentbetrachter gut aus. Außerdem ist diese Schriftart für Benutzer von Textverarbeitungsprogrammen mitunter ungewohnt, und sie gefällt auch nicht jedem (ich persönlich finde diese Schrift hässlich). Eine Möglichkeit zur Auswahl der Schriftart wäre daher wünschenswert.

Der Sinn es Pakets cmap erschließt sich mir nicht. Text in PDF-Dokumenten lässt sich auch ohne dieses Paket durchsuchen und kopieren.

Die Optionen fromemail und fromphone sollten nicht hartkodiert werden, da die Angabe von Telefonnummer und/oder E-Mail-Adresse nicht in jedem Brief wünschenswert ist. Die Optionen foldmarks=true, draft=false und fontsize=12pt entsprechen dem dokumentierten Standard des KOMA-Pakets und sind daher überflüssig. foldmarks sollte auch nicht hartkodiert werden, da Faltmarken ebenfalls nicht bei jedem Brief angemessen sind.

Statt \usepackage[utf8x]{inputenc} würde ich \usepackage[utf8]{inputenc}, das funktioniert bei mir besser.

Zum Python-Code:

  • Der Shebang in main.py muss in der ersten Zeile stehen, ansonsten wertet die Shell ihn nicht aus.

  • Anstatt die ui-Dateien mit pyuic zu übersetzen, solltest du sie dynamisch mittels PyQt4.uic.loadUi() laden.

  • Sternchen-Imports solltest du ebenso meiden wie doppelte Imports ala import os.path; from os.path import isfile. Ganz allgemein solltest du deine Imports aufräumen, du importierst vieles doppelt und dreifach, manchmal sogar unter verschiedenen Namen.

  • Der Umgang mit Parametern in viewLatexLetter.py ist zu kompliziert. Ein Wörterbuch, dass den Namen eines Parameters dem dazu gehörenden Eingabe-Widget zuordnet, würde hier einiges an Code sparen.

  • Der Code zum Starten von Unterprozessen in viewLatexLetter.py ist kaputt. Er kommt mit Dateinamen, die Leerzeichen oder Zeichen außerhalb des ASCII-Raums enthalten, nicht zurecht. Statt os.system() solltest du an dieser Stelle das subprocess-Modul einsetzen, was dir auch erlauben würde, die Ausgabe des Compilers in deiner Oberfläche anzuzeigen. Außerdem musst du die Eingaben der GUI korrekt enkodieren, einfach str() aufzurufen ist weder portabel noch robust!

  • Klassen sollten von object ableiten. Außerdem sind Klassen kein Selbstzweck, die Klasse LatexLetter in latexLetter.py ist in ihrer gegenwärtigen Form völlig überflüssig und kann getrost durch ein einfaches dict() ersetzt werden. Außerdem ist es unter Python nicht zu empfehlen, jedes Klasse in eine einzelne Datei zu packen. Triviale Getter und Setter sind in Python ebenfalls völlig überflüssig (das betrifft die ganzen update*()-Methoden der Klasse LatexLetter).

  • Die logische Aufteilung deines Programms halte ich nicht für gelungen. Die Kernfunktionalität, nämlich aus einem Vorlage mittels entsprechender Parameter einen fertigen Latex-Brief zu erzeugen und zu kompilieren, sollte streng von der Anzeige getrennt werden.

  • Mehrere Python-Dateien solltest du in einem Paket zusammenfassen und mit einem Installationsskript ausliefern.

Das ist mir auf die Schnelle aufgefallen, die völlige Abwesenheit von Fehlerbehandlung sowie die Namensgebung hast du ja selbst bereits angemerkt. Im Bezug auf letzteres wäre die Lektüre von PEP 8 sicherlich empfehlenswert.

jazzdd

(Themenstarter)
Avatar von jazzdd

Anmeldungsdatum:
5. November 2007

Beiträge: 200

Moin,

danke für die Kritik.

Allerdings verstehe ich den Abschnitt über Latex nicht ganz. Das was ich als Beispiel und Template mitgegeben habe, ist wie der Name schon sagt nur ein Beispiel und nur ein Template. Dh wenn du cmap nicht willst, nimm es aus dem Template raus, willst du fromemail und fromphone nicht, dann kannst du das aus dem Template auch rausnehmen oder unter der oberfläche gar nicht erst ausfüllen. Dh es ist völlig wurscht, was du für eine Latex Vorlage verwendest, du brauchst dann auch nicht alle möglichen Variablen/Platzhalter in dem Template vorsehen.

Das mit dem Python Code werde ich mir ansehen. Das ist halt mein erstes Python Projekt und damit hab ich halt noch nicht wirklich Erfahrung. Ich hab halt Java programmiert, da braucht man die get und set Funktionen, wenn man die Eigenschaften einer Klasse nicht als public deklariert.

Mit dem zB import os.path und isfile weiß ich nicht, wie ich das anders machen soll. wenn ich nur import os.path schreibe, findet er die funktion isfile nicht.

Und wie kann ich mehrere Pythondateien und Abhängigkeiten in einem Paket unterbringen, so dass zB nicht jeder Rechner die pyqt bibliotheken installiert haben muss?

Jazz

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

jazzdd schrieb:

Dh wenn du cmap nicht willst

Ich habe nicht gesagt, dass ich dieses Paket nicht will, ich habe mich gefragt, wofür es gut ist 😉

nimm es aus dem Template raus, willst du fromemail und fromphone nicht, dann kannst du das aus dem Template auch rausnehmen oder unter der oberfläche gar nicht erst ausfüllen. Dh es ist völlig wurscht, was du für eine Latex Vorlage verwendest, du brauchst dann auch nicht alle möglichen Variablen/Platzhalter in dem Template vorsehen.

Wenn man den LaTeX-Quellcode bemühen muss, um kleine Optionen zu ändern, kann man auch gleich direkt in Latex schreiben ☺ Daher wäre es vielleicht sinnvoll, zumindest kleinere Optionen auch über die graphische Oberfläche zur Verfügung zu stellen.

Ich hab halt Java programmiert, da braucht man die get und set Funktionen, wenn man die Eigenschaften einer Klasse nicht als public deklariert.

In Java benötigt man Getter und Setter nicht, um auf nicht-öffentliche Attribute zuzugreifen, sondern, weil

Mit dem zB import os.path und isfile weiß ich nicht, wie ich das anders machen soll. wenn ich nur import os.path schreibe, findet er die funktion isfile nicht.

Über os.path.isfile. Das ist aber Grundwissen über das Modulsystem von Python, in dieser Hinsicht solltest du dir vielleicht nochmal das Tutorial und die Sprachdokumentation durchlesen.

> Und wie kann ich mehrere Pythondateien und Abhängigkeiten in einem Paket unterbringen, so dass zB nicht jeder Rechner die pyqt bibliotheken installiert haben muss? Dafür gibt es pyinstaller, allerdings sind solche Pakete unter Linux nicht so sinnvoll, da man die Abhängigkeiten auch komfortabel über die Paketverwaltung installieren kann. Was ich meinte, ist, dass du ein Python-Paket für dein Programm erstellen (falls dir dieser Begriff nichts sagt, kannst du im Tutorial nachlesen) und dieses mittels distutils ausliefern solltest. Das vereinfacht die Installation deiner Software.

jazzdd

(Themenstarter)
Avatar von jazzdd

Anmeldungsdatum:
5. November 2007

Beiträge: 200

Moin,

ja sicher kann man das in Latex selber machen, is ja nicht schwierig. Allerdings gibt es viele die damit überfordert sind. Eigentlich wäre mein Programm für Firmen sehr interessant. Da bastelt der Admin ein Template, zeigt den Nutzern meines Programmes welches Template sie nutzen sollen und die schreiben ihren Text rein, drücken auf "OK" - fertig, Brief im einheitlichen Design erzeugt.

Da wären Optionen zu Paketen (ala Foldmarks, was auch immer), Schriften, etc schon wieder zuviel (finde ich).

So ich lese jetzt schon die Tutorien durch um mich etwas gründlicher in Python einarbeite, denn ich finde die Sprache toll. Sie ist einfach und sehr durchdacht, hat die Überflüssigen Elemente aus anderen Sprachen (Klammern, uä) gleich rausgelassen und zwingt den Nutzer von Anfang an Einrückungen vorzunehmen. Allerdings muss ich mich noch an die Leerzeichen Einrückungen gewöhnen. Ich fand Tabs immer schöner. Ich denke nächste Woche kommt die nächste Version.

Jazz

the-morpheus

Anmeldungsdatum:
24. Februar 2008

Beiträge: 30

Hallo

gute Idee, aber bei funktioniert das Frontend nicht!

~/Desktop/latex$ python main.py 
Traceback (most recent call last):
  File "main.py", line 6, in <module>
    import viewLatexLetter
  File "/home/timo/Desktop/latex/viewLatexLetter.py", line 3, in <module>
    import QtPoppler
ImportError: /usr/lib/python2.6/dist-packages/QtPoppler.so: wrong ELF class: ELFCLASS32

Hoffe, jemand kann mir helfen.

MFG

Antworten |