Seite 1 von 1

gnuplot Hilfe für Latex

Verfasst: Montag 23. Februar 2009, 19:38
von feldmaus
Hi Leute,

wollte hier mein skript vorstellen, wo glaube ich noch viel am Style zu tun ist.
Allerdings bräuchte ich dazu eure Hilfe. Die Beschreibung steht
im Code.

Grüße Markus

Code: Alles auswählen

#!/usr/bin/env python
# encoding: utf8
#
# Autor: M a r k u s --> F e l d m a n n
#
# Lizenz: GPL
#
# Discription: Convert all *.eps files to *.pdf files,
# also create tables which may be inserted into your
# tex document. At least you need one file containing
# the extension *.dat which includes tables of numbers
# according the gnuplot format.
# You also may wish to change the gnuplot commands
# below.
# This script should be exist in the same directory
# where is your *.dat file.
#
# You also may convert only one *.dat file by switch
# the variable <convert_all_dat_files> to False.
# (See below.)
#
#
import os
import re
import subprocess


def create_eps(name_dat_file):
  name_plot_file = "."+name_dat_file.rstrip(".dat")+".plot"
  name_eps_file = name_dat_file.rstrip(".dat")+".eps"
  gnuplot_file = file(name_plot_file, 'w')
  gnuplot_commands ="""
  reset
  set encoding utf8
  set terminal postscript enhanced colo
  set output "%s"
  set xlabel "Signalamplitude/Einheiten -------->"
  set ylabel "U_{pp}/V des Signals ------->"
  set grid
  plot "%s" index 0 using ($1):(($3)/(2*sqrt(2))) title "A)mit 0dB" with lp ,\\
  "%s" index 1 using ($1):(($3)/(2*sqrt(2))) title "B)mit -6dB" with lp""" \
  %(name_eps_file, name_dat_file, name_dat_file)

  gnuplot_file.write(gnuplot_commands)
  gnuplot_file.close()
  return_code = subprocess.call("gnuplot " +name_plot_file \
                         +"; rm " +name_plot_file, \
                         shell=True)
  if return_code == 0:
    conv_eps_to_pdf(name_eps_file)
  else:
    print "Errorcode: ",return_code

def conv_eps_to_pdf(name_eps_file):
  name_pdf_file = name_eps_file.rstrip(".eps")+".pdf"
  subprocess.call("epstopdf " +name_eps_file \
                    +" --outfile=" +name_pdf_file, \
                  shell=True)

def convert_table(name_dat_file):
  laufende_nummer = 1
  letzte_zeile = ""
  name_tex_file = name_dat_file.rstrip(".dat")+str(laufende_nummer)+".tex"
  dat_file = file(name_dat_file, 'r')
  tex_file = file(name_tex_file, 'w')
  re_wert = re.compile('[\w\.-]+')
  re_leerzeile = re.compile('^\s*\Z')
  re_kommentar = re.compile('#')
  for j in dat_file.readlines():
    if not re_leerzeile.match(j) and letzte_zeile == "Leerzeile":
      laufende_nummer += 1
      name_tex_file = name_dat_file.rstrip(".dat")+str(laufende_nummer)+".tex"
      tex_file = file(name_tex_file, 'w')    
    if not re_leerzeile.match(j):      
      if not re_kommentar.search(j) and re_wert.search(j):
	str_zeile = ""
	for k in re_wert.findall(j):
	  str_zeile += k+" & "
	tex_file.write(str_zeile.rstrip(" & ")+"\\\ \hline\n")
	letzte_zeile = "ZeileMitWerten"
    else:
      if letzte_zeile == "ZeileMitWerten":
	tex_file.close()
	letzte_zeile = "Leerzeile"
      else:
	letzte_zeile = "Leerzeile"

  tex_file.close()
  dat_file.close()

if __name__ == '__main__':
  os.chdir(os.path.dirname(os.path.realpath( __file__ )))
  # Here you can switch to convert all
  # *.dat files in the directory of your script
  # or to convert only the *.dat file which name
  # belongs to the name of this script.
  # For example:
  # table2-1.py --> table2-1.dat
  #
  convert_all_dat_files = True
  if convert_all_dat_files is True:
    for i in os.listdir('.'):
      re_dat_files = re.compile('\w*\.dat\Z')
      if re_dat_files.match(i):
        convert_table(i)
        create_eps(i)
  else:
    re_name_this_script = re.compile('/[\w-]+\.py\Z')
    name_this_script = re_name_this_script.findall(__file__)
    name_dat_file = name_this_script[0].rstrip(".py").lstrip("/")+".dat"
    convert_table(name_dat_file)
    create_eps(name_dat_file)

Verfasst: Montag 23. Februar 2009, 19:42
von derdon
Was willst du mit den vielen Unterstrichen am Anfang eines Namens bewirken?

Verfasst: Montag 23. Februar 2009, 19:47
von Leonidas
Du solltest PEP8 lesen, denn dein Code sieht aus wie ein Zeichenwald von spaßigen Operatoren ``"."+_`` könnte glatt aus Perl stammen :) Generell würde man da sowieso eher zu String-Formattierung greifen statt alle Strings mit Plus zu verketten.

Verfasst: Montag 23. Februar 2009, 19:48
von cofi
Och ich find die richtig schnucklig ... aber man sieht irgendwie nichts anderes als Striche ...

Btw: Wenn du deine Abkürzungen im Skript erklären musst, dann solltest du mal über die Namen nachdenken.

Verfasst: Montag 23. Februar 2009, 19:54
von feldmaus
derdon hat geschrieben:Was willst du mit den vielen Unterstrichen am Anfang eines Namens bewirken?
Ich meine ich hatte es noch Erinnerung, dass man möglichst versuchen sollte den Geltungsbereich von Variabeln soweit wie möglich einzuschränken,
um Namenskollisionen zu verhindern.

Besonders bei größeren Projekten sollte man das machen?!
Oder muss man das nicht?

Verfasst: Montag 23. Februar 2009, 20:00
von DasIch
Vorallem wenn man nicht in der Lage ist sinnvolle Namen zu finden ist dass sicherlich hilfreich, ansonsten sollte man es lassen.

Verfasst: Montag 23. Februar 2009, 20:01
von Leonidas
feldmann_markus hat geschrieben:Ich meine ich hatte es noch Erinnerung, dass man möglichst versuchen sollte den Geltungsbereich von Variabeln soweit wie möglich einzuschränken,
um Namenskollisionen zu verhindern.

Besonders bei größeren Projekten sollte man das machen?!
Das gilt aber nur für Klasssen und die darin definierten Attribute. Die lokalen Variablen einer Funktion sind so oder so nicht von außen zu sehen[1] da macht das keinen unterschied. In keiner Sprache.

Außerdem ist ``_`` auch kein Allheilmittel und alles mit ``_`` prefixen stört mehr als dass es nutzt.

Und schließlich: dein Skript ist kein großes Projekt. Eigentlich nichtmal ein mittleres :) Da brauchst du auch kein Dependency Injection, Inversion of Control, Factory Pattern, Observer Pattern und Template Method Pattern.

Anderes Thema: sag mal, kennst du TikZ? Damit kann man auch tolle Plots machen und es gibt auch eine ziemlich umfassende Seite in der die Möglichkeiten mit TikZ zu plotten beschrieben werden. Ich finde es viel hübscher die Plots selbst ins Dokument einzubetten, als PDFs einzuhängen :)

Verfasst: Montag 23. Februar 2009, 21:45
von feldmaus
Leonidas hat geschrieben: Anderes Thema: sag mal, kennst du TikZ? Damit kann man auch tolle Plots machen und es gibt auch eine ziemlich umfassende Seite in der die Möglichkeiten mit TikZ zu plotten beschrieben werden. Ich finde es viel hübscher die Plots selbst ins Dokument einzubetten, als PDFs einzuhängen :)
Hey de witzka. Das sieht ja geil aus.
Ne das modul <Tikz> kannte ich noch nicht.
Kann <Tikz> denn auch auf Tabellen innerhalb des Latex Dokuments
zugreifen, sodass ich immer nur eine Tabelle aktualisieren müsste?

Die meisten meiner Grafiken liegen nur als diskrete Werte vor,
die ich dann interpolieren muss.
Also nix mit den schönen determinierten Funktionen.

Mein Skript setzt nämlich nur eine Tabelle voraus und daraus wird
dann eine latex Tabelle und 2 Bilder bereitgestellt, sodass man
nicht so viel rum kramen muss. Und man auch nicht so schnell
was vergisst.

Grüße Markus

Verfasst: Montag 23. Februar 2009, 21:52
von feldmaus
Ich sehe gerade, die Doku von <Tikz> enthalten 710 Seiten.
Ich wollte dieses Jahr noch mit meinem Diplom fertig werden.
Also nach meinem Studium werde ich mir <Tikz> nochmal
angucken, solange muss das warten. :-)

Verfasst: Montag 23. Februar 2009, 22:05
von feldmaus
Leonidas hat geschrieben:Das gilt aber nur für Klasssen und die darin definierten Attribute. Die lokalen Variablen einer Funktion sind so oder so nicht von außen zu sehen[1] da macht das keinen unterschied. In keiner Sprache.
Also gilt das nur für Instanzen von Klassen ?

Verfasst: Dienstag 24. Februar 2009, 10:23
von Leonidas
Ich weiß nicht genau was TikZ alles kann, weil wie du siehst, der Autor von TikZ, Till Tantau (der auch das großartige Beamer-Package geschrieben hat) ein unglaublich mächstiges Tool gemacht hat. Selbst wenn es nicht geht, dann könnte man vermutlich ein Makro schreiben, dass es möglich macht.
Ich nutze TikZ zum Darstellen von GraphViz-Graphen (dot2tex) oder auch zum Setzen der Graphen (tkz-graph, tkz-berge).
feldmann_markus hat geschrieben:
Leonidas hat geschrieben:Das gilt aber nur für Klasssen und die darin definierten Attribute. Die lokalen Variablen einer Funktion sind so oder so nicht von außen zu sehen[1] da macht das keinen unterschied. In keiner Sprache.
Also gilt das nur für Instanzen von Klassen ?
Ja. Lokale Variablen sind nur zur Laufzeit einer Funktion gültig und nur innerhalb der Funktion sichtbar.