58 Stimmen

pdflatex im Hintergrund ausführen

Ich rufe pdflatex aus meinem (C++)-Programm heraus mit system() auf. Unnötig zu sagen, dass der ganze Müll, den pdflatex auf den Bildschirm bringt, in diesem Fall ein wenig irritierend ist.

Also... wie bringe ich pdflatex dazu, auf die langatmigen Ausgaben zu verzichten? Noch besser wäre es, wenn nur Fehler sichtbar wären...

1 Stimmen

67voto

Will Robertson Punkte 58838

Leider hält sich (La)TeX nicht wirklich an die Regeln der stdout y sterr Das liegt (wie ich annehme) an seinen Ursprüngen in den frühen 80er Jahren. Es gibt jedoch einige Schalter, mit denen Sie die Menge der angezeigten Informationen verändern können.

Ausführen latex entweder mit dem -interaction=nonstopmode o -interaction=batchmode schaltet auch im Falle eines Syntaxfehlers auf nicht-haltendes Verhalten um. nonstopmode werden alle üblichen Zeilen gedruckt, es wird nur nicht aufgehört. batchmode unterdrückt alle außer einer Handvoll deklarativer Zeilen ("this is pdfTeX v3.14...").

Diese können auch aus dem Dokument heraus aufgerufen werden mit \batchmode y \nonstopmode aber das ist für die von Ihnen beschriebene Situation weniger nützlich.

0 Stimmen

Was meinen Sie mit "hält sich nicht wirklich an die Regeln der stdout y stderr ?" Verwendet sie andere Ausgabeströme?

0 Stimmen

@Matthew es ist schon eine Weile her, dass ich mir das angeschaut habe, aber ich erinnere mich, dass der Versuch, nur, sagen wir, die Fehlermeldungen irgendwo umzuleiten, überhaupt nicht funktioniert. Aber ich könnte mich irren; entschuldigen Sie, dass ich so vage bin.

0 Stimmen

@Matthew Leingang: Durch Zufall fand ich Re: Latex zum Schweigen bringen (Ruhe-/Batch-Modus)? Ich glaube, das klärt alles? Prost!

24voto

laalto Punkte 143902

Um einfach alle Ausgaben zu ignorieren, leiten Sie pdflatex stdout nach /dev/null um:

system("pdflatex yourdocument >/dev/null");

Sie möchten vielleicht Folgendes hinzufügen \nonstopmode am Anfang Ihres Dokuments, um tex anzuweisen, weiterzumachen, auch wenn Fehler auftreten.

Um die Fehlermeldungen zu erhalten, leiten Sie die pdflatex-Ausgabe in Ihr Programm und suchen Sie nach Fehlern rund um Zeilen, die mit ! z.B.

FILE *outputf = popen("pdflatex yourdocument", "r");

// ... read and analyze output from outputf ...

pclose(outputf);

2 Stimmen

Ich bin mir nicht sicher, ob pdflatex das tut, aber viele Kommandozeilenprogramme schreiben sowohl nach stdout (was von Ihrem ">/dev/null" erfasst wird) als auch nach stderr (was nicht der Fall ist). Zum Schweigen bringen 両方共 fügen Sie " 2>&1" nach der bestehenden system()-Zeichenkette ein.

2 Stimmen

Auch: Unter Windows heißt das erforderliche Gerät einfach "NUL" (beachten Sie 1 "L"), nicht "/dev/null". Der Teil "2>&1" funktioniert wie bei *nix.

0 Stimmen

Das Problem dabei ist, dass pdflatex im Falle eines Fehlers anhält und auf eine Eingabe wartet, die man aber nie verstehen würde. Die Antwort von Will Robertson ist besser (obwohl pdflatex immer noch ein paar Zeilen ausgibt)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X