mit Python und Latex ein PDF erstellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Georg31
User
Beiträge: 10
Registriert: Montag 3. September 2018, 13:19

Montag 3. September 2018, 13:20

Hallo,

ich beschäftige mich seit kurzem mit einem kleinen Python und Latex Problem. Ich würde gerne mit Python und der Hilfe von Latex eine PDF Datei erzeugen. In Python hat das erstellen der Latexdatei schon funktioniert und ich konnte auch mit Hilfe von Texmaker und Texworks die PDF Datei erstellen. Leider erstellt mir aber das Pythonprogramm nur die Latexdatei und nicht die PDF Datei.
Muss ich in den Programmen Texmaker und Texwork irgendetwas bestimmtes einstellen?

Ich möchte mich schon jetzt für eure Hilfe bedanken.

lg
Georg

Code: Alles auswählen

import re 
import os 
import shutil 

project = "./" 
in_file = "{}example.txt".format(project) 
build_d = "{}.build/".format(project) 
out_file = "{}template".format(build_d) 
template = "test" 


current_object = None 
current_content = "" 
latex_formated_variables = "" 

with open(in_file) as f: 
    content = f.read() 
    keys = re.findall(r"%(.+):", content) 
    values = re. findall(r":\s*([\w\W]+?)\s*(?:%|$)", content) 

options = zip(keys, values) 

tex_code = "" 
for key, value in options: 
    tex_code = tex_code + "\\newcommand{{\\{}}}{{{}}}\n".format(key, value) 
tex_code = tex_code + """ 

\\documentclass{{{}}} % din a4, 11 pt, one-sided, 

\\begin{{document}} 

\\end{{document}} 
""".format(template) 

if not os.path.exists(build_d):  # create the build directory if not exisiting 
    os.makedirs(build_d) 

with open(out_file+".tex", "w") as f:  # saves tex_code to outpout file 
    f.write(tex_code) 

os.system("pdflatex -output-directory {} {}".format(os.path.realpath(build_d), os.path.realpath(out_file))) 

#shutil.copy2(out_file+".pdf", os.path.dirname(os.path.realpath(in_file))) 
Benutzeravatar
__blackjack__
User
Beiträge: 1588
Registriert: Samstag 2. Juni 2018, 10:21

Montag 3. September 2018, 13:51

@Georg31: Was passiert denn wenn Du das laufen lässt? Welche Fehlermeldung(en) bekommst Du?

`os.system()` sollte man nicht mehr verwenden, das ist schon lange durch das `subprocess`-Modul abgelöst. Da hat man dann keine unnötige Shell mehr zwischen dem eigenen Prozess und dem, den man starten möchte und man braucht sich dann auch keine Gedanken mehr um eventuelle Sonderzeichen machen, die mit der Shell Probleme machen könnten. Denn zum einen fangen Sonderzeichen ja schon bei einem simplen Leerzeichen an, und zum anderen ist es ansonsten auch Systemabhängig was für die Shell (cmd.exe, sh, bash, …) eigentlich ein Sonderzeichen ist, und wie man das dann schützt.

Du setzt Pfadteile mit Zeichenkettenoperationen zusammen und nicht mit `os.path.join()`. Das ist nicht plattformunabhängig.

Sind die beiden regulären Ausdrücke eigentlich unabhängig oder ist der ':' am ende des ersten Ausdrucks immer der gleiche ':' am Anfang des zweiten? Denn dann würde man da besser *einen* Ausdruck für schreiben statt das erst in zwei Listen zu sammeln die danach dann paarweise zu einer zusammengeführt werden. Das ist auch robuster, falls das eine oder das andere Muster *alleine* öfter vorkommen kann als beide zusammen.

Zeichenketten in Schleifen mit `+` immer zu erweitern ist ineffizient. Das übliche Idiom hier ist die Teilzeichenketten in einer Liste zu sammeln und am Ende mit `str.join()` zusammenzufügen.

LaTeX und `format()` vertagen sich wegen den geschweiften Klammern nicht so gut. Hier würde ich auf die ältere Variante mit dem ``%``-Operator oder auf `string.Template` zurückgreifen. Beides dürfte lesbarer werden.

Python 3 kennt bei `os.makedir()` ein `exist_ok`-Argument.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Benutzeravatar
__blackjack__
User
Beiträge: 1588
Registriert: Samstag 2. Juni 2018, 10:21

Montag 3. September 2018, 14:18

@Georg31: Einige Namen könnten besser/passender sein. Abkürzungen wie ein angehängtes `_d` sollte man vermeiden. Der Name sollte dem Leser vermitteln was der Wert bedeutet und nicht zum Rätselraten verleiten.

Wenn man etwas mit `file` im Namen benennt, dann sollte das auch tatsächlich eine Datei sein, und kein Datei*name*. Das verwirrt sonst.

`current_object`, `current_content`, und `latex_formated_variables` werden definiert, aber nirgends verwendet.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import os 
import re 
import shutil
import string
import subprocess

LATEX_TEMPLATE = string.Template(
r'''$options

\documentclass{$documentclass} % din a4, 11 pt, one-sided, 

\begin{document}

\end{document} 
'''
)


def main():
    project_path = os.path.curdir
    in_filename = os.path.join(project_path, 'example.txt')
    build_path = os.path.join(project_path, '.build')
    out_filename = os.path.join(build_path, 'template')
    documentclass_name = 'test'

    with open(in_filename) as in_filename: 
        content = in_filename.read() 
    options = re.findall(r'%(.+):\s*([\w\W]+?)\s*(?:%|$)', content)

    options_latex = '\n'.join(
        r'\newcommand{\%s}{%s}' % pair for pair in options
    )
    latex = LATEX_TEMPLATE.safe_substitute(
        options=options_latex, documentclass=documentclass_name
    )

    os.makedirs(build_path, exist_ok=True) 
    with open(out_filename + '.tex', 'w') as out_file:
        out_file.write(latex) 

    subprocess.run(['pdflatex', '-output-directory', build_path, out_filename])    

    # shutil.copy2(out_filename + '.pdf', os.path.dirname(in_filename))


if __name__ == '__main__':
    main()

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Georg31
User
Beiträge: 10
Registriert: Montag 3. September 2018, 13:19

Montag 3. September 2018, 15:17

Danke für die rasche Antwort und der detaillierten Rückmeldung.

Bei meinem und deinem Code bekomme ich keine Fehlermeldung. Die .tex Datei wird richtig erstellt, aber sie wird nicht in ein pdf umgewandelt. Deshalb vermute ich, dass irgend eine Einstellung im Texmaker oder Texwork falsch ist.
Sirius3
User
Beiträge: 8805
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 3. September 2018, 15:29

Du rufst direkt "pdflatex" auf, da müßten eigentlich einige Meldungen auf dem Bildschirm erscheinen, unter anderem, ob ein PDF geschrieben worden ist, oder nicht.
Georg31
User
Beiträge: 10
Registriert: Montag 3. September 2018, 13:19

Montag 3. September 2018, 15:31

nein es kommt keine einzige Meldung. Es geschieht leider garnichts.
Sirius3
User
Beiträge: 8805
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 3. September 2018, 15:41

Wie startest Du denn Dein Python-Programm?
Georg31
User
Beiträge: 10
Registriert: Montag 3. September 2018, 13:19

Montag 3. September 2018, 15:43

mit Spyder und dann "F5"
Sirius3
User
Beiträge: 8805
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 3. September 2018, 15:45

Hat Spyder Probleme, den Output externen Programme darzustellen? Ich würde das Programm in einer Konsole starten. Daneben solltest Du auch in den log-Dateien, die LaTeX erzeugt, den Fehler sehen können.

Edit: ähm, zwischen \begin{document} und \end{document} steht nichts, da wird dann also auch kein PDF erzeugt.
Georg31
User
Beiträge: 10
Registriert: Montag 3. September 2018, 13:19

Montag 3. September 2018, 16:01

Wen ich das Programm in der Konsole öffne wird eine weitere Konsole geöffnet (das war vorher nicht)
die Log Datei vom Latex wurde auch schon erstellt aber leider noch kein pdf

Logdatei:
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (MiKTeX 2.9.6800 64-bit) (preloaded format=pdflatex 2018.8.31) 3 SEP 2018 16:55
entering extended mode
**E:/_Hüpfburg/Software/EinnahmenAusgaben/Py-Tex-automation-example-POC/.build
/template.tex

(E:/_Hüpfburg/Software/EinnahmenAusgaben/Py-Tex-automation-example-POC/.build/
template.tex
LaTeX2e <2018-04-01> patch level 5
(test.cls
Document Class: test

("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\base\article.cl
s"
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\base\size11.clo
"
File: size11.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
)
\c@part=\count80
\c@section=\count81
\c@subsection=\count82
\c@subsubsection=\count83
\c@paragraph=\count84
\c@subparagraph=\count85
\c@figure=\count86
\c@table=\count87
\abovecaptionskip=\skip41
\belowcaptionskip=\skip42
\bibindent=\dimen102
)
("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\geometry\geomet
ry.sty"
Package: geometry 2018/04/16 v5.8 Page Geometry

("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\graphics\keyval
.sty"
Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
\KV@toks@=\toks14
)
("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\generic\oberdiek\ifpd
f.sty"
Package: ifpdf 2017/03/15 v3.2 Provides the ifpdf switch
)
("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\generic\oberdiek\ifvt
ex.sty"
Package: ifvtex 2016/05/16 v1.6 Detect VTeX and its facilities (HO)
Package ifvtex Info: VTeX not detected.
)
("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\generic\ifxetex\ifxet
ex.sty"
Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional
)
\Gm@cnth=\count88
\Gm@cntv=\count89
\c@Gm@tempcnt=\count90
\Gm@bindingoffset=\dimen103
\Gm@wd@mp=\dimen104
\Gm@odd@mp=\dimen105
\Gm@even@mp=\dimen106
\Gm@layoutwidth=\dimen107
\Gm@layoutheight=\dimen108
\Gm@layouthoffset=\dimen109
\Gm@layoutvoffset=\dimen110
\Gm@dimlist=\toks15

("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\geometry\geomet
ry.cfg"))
("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\generic\babel\babel.s
ty"
Package: babel 2018/06/05 3.22 The Babel package

("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\generic\babel\switch.
def"
File: switch.def 2018/06/05 3.22 Babel switching mechanism
)
*************************************
* Local config file bblopts.cfg used
*

("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\arabi\bblopts.c
fg"
File: bblopts.cfg 2005/09/08 v0.1 add Arabic and Farsi to "declared" options of
babel
)
("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\babel-german\ng
erman.ldf"
Language: ngerman 2018/03/29 v2.10 German support for babel (post-1996 orthogra
phy)

("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\babel-german\ng
ermanb.ldf"
Language: ngermanb 2018/03/29 v2.10 German support for babel (post-1996 orthogr
aphy)

("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\generic\babel\babel.d
ef"
File: babel.def 2018/06/05 3.22 Babel common definitions
\babel@savecnt=\count91
\U@D=\dimen111

("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\generic\babel\txtbabe
l.def")
\bbl@dirlevel=\count92
)
Package babel Info: Making " an active character on input line 121.
)))
("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\base\fontenc.st
y"
Package: fontenc 2017/04/05 v2.0i Standard LaTeX package

("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\base\t1enc.def"
File: t1enc.def 2017/04/05 v2.0i Standard LaTeX file
LaTeX Font Info: Redeclaring font encoding T1 on input line 48.
))
("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\base\inputenc.s
ty"
Package: inputenc 2018/04/06 v1.3b Input encoding file
\inpenc@prehook=\toks16
\inpenc@posthook=\toks17

("C:\Users\Illgoutz\AppData\Local\Programs\MiKTeX 2.9\tex\latex\base\latin1.def
"
File: latin1.def 2018/04/06 v1.3b Input encoding file
))) (template.aux)
\openout1 = `template.aux'.

LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 12.
LaTeX Font Info: ... okay on input line 12.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 12.
LaTeX Font Info: ... okay on input line 12.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 12.
LaTeX Font Info: ... okay on input line 12.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 12.
LaTeX Font Info: ... okay on input line 12.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 12.
LaTeX Font Info: ... okay on input line 12.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 12.
LaTeX Font Info: ... okay on input line 12.

*geometry* driver: auto-detecting
*geometry* detected driver: pdftex
*geometry* verbose mode - [ preamble ] result:
* driver: pdftex
* paper: <default>
* layout: <same size as paper>
* layoutoffset:(h,v)=(0.0pt,0.0pt)
* modes:
* h-part:(L,W,R)=(28.45274pt, 788.14136pt, 28.45274pt)
* v-part:(T,H,B)=(71.13188pt, 426.79135pt, 99.58464pt)
* \paperwidth=845.04684pt
* \paperheight=597.50787pt
* \textwidth=788.14136pt
* \textheight=426.79135pt
* \oddsidemargin=-43.81725pt
* \evensidemargin=-43.81725pt
* \topmargin=-38.1381pt
* \headheight=12.0pt
* \headsep=25.0pt
* \topskip=11.0pt
* \footskip=30.0pt
* \marginparwidth=144.0pt
* \marginparsep=10.0pt
* \columnsep=10.0pt
* \skip\footins=10.0pt plus 4.0pt minus 2.0pt
* \hoffset=0.0pt
* \voffset=0.0pt
* \mag=1000
* \@twocolumnfalse
* \@twosidefalse
* \@mparswitchfalse
* \@reversemarginfalse
* (1in=72.27pt=25.4mm, 1cm=28.453pt)

(template.aux) )
Here is how much of TeX's memory you used:
1581 strings out of 492973
22186 string characters out of 3125363
92370 words of memory out of 3000000
5478 multiletter control sequences out of 15000+200000
4709 words of font info for 16 fonts, out of 3000000 for 9000
1141 hyphenation exceptions out of 8191
32i,1n,25p,310b,109s stack positions out of 5000i,500n,10000p,200000b,50000s

No pages of output.
PDF statistics:
0 PDF objects out of 1000 (max. 8388607)
0 named destinations out of 1000 (max. 500000)
1 words of extra memory for PDF output out of 10000 (max. 10000000)
Georg31
User
Beiträge: 10
Registriert: Montag 3. September 2018, 13:19

Montag 3. September 2018, 16:03

Der Text für das PDF befindet sich in diesem Beispiel in dem txt File

Mit Texmaker wird ein PDF erzeugt
Benutzeravatar
__blackjack__
User
Beiträge: 1588
Registriert: Samstag 2. Juni 2018, 10:21

Montag 3. September 2018, 16:31

@Georg31: Was erwartest Du denn als Ausgabe, denn wie Sirius3 ja schon angemerkt hat, ist da tatsächlich kein Text in dem Dokument. Schreib doch da mal etwas rein. Ein einfaches „Hallo“ würde ja schon reichen für einen Test.

Edit: In welchem txt File? Du erzeugst einen Haufen neue LaTeX-Kommandos aus einer Textdatei, das führt ja aber nicht zu einer Ausgabe von Text innerhalb des Dokuments. Dafür müsste dort Text stehen, möglichst welcher der Gebrauch von den Kommandos macht, weil sonst deren Definition nicht so viel Sinn ergibt.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Benutzeravatar
__blackjack__
User
Beiträge: 1588
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 4. September 2018, 09:15

Ich hab's gerade noch mal getestet. Du erzeugst ja LaTeX-Code der so aussieht:

Code: Alles auswählen

\newcommand{\spam}{SPAM}
\newcommand{\answer}{42}
\newcommand{\parrot}{dead bird}

\documentclass{article} % din a4, 11 pt, one-sided, 

\begin{document}

\end{document}
Und das führt bei mir zu:

Code: Alles auswählen

$ pdflatex test.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=pdflatex)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2017-04-15>
Babel <3.18> and hyphenation patterns for 3 language(s) loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo)) (./test.aux)
(./test.aux) )
No pages of output.
Transcript written on test.log.
Und es wird kein PDF erzeugt. Das ist normal. Wenn eines erzeugt würde, dann wäre das ja sowieso leer und damit sinnlos.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Georg31
User
Beiträge: 10
Registriert: Montag 3. September 2018, 13:19

Dienstag 4. September 2018, 13:36

Der Text der im pdf stehen sollte steht ja in der example.txt Datei.
mit dieser example.txt Datei wird eine Latexdatei erstellt in dieser dann der vollständige Text steht. (das funktioniert ja auch)

aber aus irgendeinem Grund wird aber die pdf Datei nicht erstellt.

selbst wenn ich einen Text händisch in zwischen beginn und end Dokument einfüge wird keine pdf Datei erzeugt.
Benutzeravatar
__blackjack__
User
Beiträge: 1588
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 4. September 2018, 13:53

@Georg31: Aus der `example.txt` erstellst Du doch aber nur neue LaTeX-Kommandos und keinen Inhalt für das Dokument‽ Dein Programm lässt das Dokument selbst ja leer.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Antworten