Scons + LaTex + "Serienbriefe"

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.
Antworten
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mittwoch 27. August 2008, 10:17

Ich nutze seit Kurzem scons zum Erstellen meiner LaTeX-Files. Jetzt stehe ich vor folgendem Problem beim Erstellen von Übungsblättern: Jeder Teilnehmer soll ein Übungsblatt mit persönlichem Kopf erhalten (Username/Password/...), so ähnlich also wie ein Serienbrief.

Es gibt also ein Template-Texfile mit Platzhaltern, welches ich natürlich compiliere, solange ich an der Erstellung der Übungszettel arbeite. Wenn ich dann die Übungsblätter ausdrucken will, lasse ich momentan ein Script laufen, welches n Kopien von dem Template erstellt, dort die Platzhalter ersetzt, und die Kopien einzeln compiliert.

Am liebsten wäre es mir, ich hätte zwei scons-targets, z.B. uebung_template (okay, das habe ich ja schon :)) und uebung_copies, wobei das Target uebung_copies die Tex-Dateien, die es compilieren soll, ja erstmal aus dem Template erstellen muss. Umgekehrt sollte ein Clean des Targets uebung_copies bewirken, dass auch diese tex-Dateien wieder gelöscht werden.

Hat jemand Anregungen für mich, wie man das am besten umsetzt? Muss ich dafür meinen eigenen Builder schreiben?

EDIT: OK, das mit den eigenen Buildern scheint ja gar nicht so schwer zu sein. Was mir ein wenig Kopfzerbrechen bereitet, ist, dass ein Target ja immer einer Ziel-Datei entspricht, waehrend ich in meinem Fall ja viele Zieldateien habe. Aber eventuell kann ich das Problem umgehen, indem ich die "Persoenlichen Uebungsblaetter" einfach in einen eigenen Ordner schiebe, und den Ordner als Target nehme. Mmhh...

EDIT:
Bin gerade ueber Emitter gestolpert, klingt so, als koennten die mir vielleicht bei meinen vielen Targets helfen.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mittwoch 27. August 2008, 15:02

Ein Versuch mit Emittern: Ein Nachteil ist, dass die erzeugung der Tex-Filenamen und das ausfuellen des Master-Templates dadurch in zwei Funktionen aufgeteil werden, obwohl beide auf die selben Daten zugreifen muessen. Das macht die Sache etwas wurschtelig.

Ein ernsthaftes Problem ist, dass die Funktion serial_build dadurch die komplette Liste aller neuen Tex-Dateien uebergeben bekommt. Wenn ich dann in der Funktion den PDF-Builder auf den einzelnen Dateien aufrufe (Zeile 31), geht das schief:
Multiple ways to build the same target were specified for: uebung1_serial_alice.pdf
Klar, da das gleiche Target in der Funktion serial_build als auch in dem PDF-Builder vorkommt...

Ohne den Emitter, wenn die Dateinamen alle in der Funktion serial_build erzeugt werden, weiss scons erstmal nicht, dass er die auch alle wieder aufraeumen muss, da ich keine Moeglichkeit habe, aus serial_build etwas zurueckzugeben.

Zwei moegliche Ansaetze:
  • Rausfinden, ob man irgendwie einen Builder in einem Builder aufrufen kann, obwohl die Targets uebereinstimmen
  • Den Emitter weglassen und das Clean anders regeln. Hierzu braeuchte man ein "virtuelles Target" oder einen Unterordner oder so, an dem scons erkennt, wann er das Target bauen soll. Oder noch rausfinden, wie man scons das gewuenschte Verhalten anderweitig beibringen kan
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mittwoch 27. August 2008, 21:01

So hab ich es jetzt geloest: http://paste.pocoo.org/show/83550/

Es funktioniert, aber ich bin nicht sicher, ob man es nicht noch besser machen kann. Als Target benutze ich jetzt eine leere Datei, die beim Bauen immer "getoucht" wird. Es waere ausserdem irgendwie netter, wenn ich beim Clean jeweils die Cleans von den einzelnen PDF-Targets triggern koennte, anstatt manuell angeben zu muessen, welche tex-Output-Dateien geloescht werden sollen. Aber dazu wuerde mir nur einfallen, mit einer globalen Variable zu arbeiten, um die zu loeschenden Dateien aus der build-Funktion herauszubekommen.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten