Sie sind hier

\beforefile und \afterfile aus scrlfile.sty und plain-TeX-Syntax der input-Anweisung im LaTeX2e-Kernel-Makro \enddocument

Hallo!

Ich bastle grade an einem eigenen Package herum.

Da sollen Dinge getan werden, just bevor am Ende des LaTeX-Laufes die aux-Datei eingelesen wird und auch just nachdem dieses Einlesen passiert ist.

Erste (unsichere) Möglichkeit:

Laut scrguide.pdf gibt es mit dem scrlfile-Package den \BeforeClosingMainAux-Hook. Dem könnte ich zum einen die Anweisungen mitgeben, die just vor dem Einlesen der geschlossenen aux-Datei ausgeführt werden sollen, und ihn auch nutzen, um als letzten Eintrag in die aux-Datei selbst die Anweisungen reinzuschreiben, die nach dem Einlesen bzw am Schluss des Einlesens der aux-Datei ausgeführt werden sollen.

Allerdings ist das nicht sicher, weil andere diesen Hook nutzen können, um noch mehr Einträge in die aux-Datei zu schreiben.

Zweite (hypothetische) Möglichkeit:

Laut scrguide.pdf gibt es mit dem scrlfile-Package die Möglichkeit, über \beforefile bzw \afterfile Aktionen genau vor bzw nach dem Laden von Dateien ausführen zu lassen - allerdings nur, wenn das Laden irgendwie so geschieht, dass dazu letztenendes \InputIfFileExists verwendet wird (was in-der-Anleitung-dokumentiertermaßen zum Beispiel nicht der Fall ist, wenn man \input mit der plain-TeX-Syntax aufruft, also ohne gewschweifte Klammern um den Dateinamen).

Im ersten Moment dachte ich, dass das ja praktisch ist, weil ich ja nur in den \AtEndDocument-hook diese \beforefile- und \afterfile Anweisungen fürs Laden der aux-Datei einzufügen bräuchte.

Der \AtEndDocument-hook (und damit die \beforefile- und \afterfile Anweisungen) würde am Ende des LaTeX-Laufes ausgeführt, bevor da dann die aux-Datei eingelesen wird.

Allerdings habe ich bei genauerem Hinsehen auch gleich festgestellt, dass sowohl mit, als auch ohne scrlfile.sty die \input-Anweisung im \enddocument-Makro, über die dort die aux-Datei eingelesen wird, in plain-TeX-Syntax ist, sodass \beforefile und \afterfile da eben nicht funktionieren:

> \enddocument=macro:
->
\let\AtEndDocument\@firstofone
\@enddocumenthook
\@checkend{document}%
\clearpage
\begingroup
\if@filesw
  \immediate\closeout\@mainaux
  \let\@setckpt\@gobbletwo
  \let\@newl@bel\@testdef
  \@tempswafalse
  \makeatletter
  \input \jobname.aux % Hier müssten Klammern um das 
                                    %\jobname.aux!!!!
\fi
[... etc p p ...]

Ich kann \enddocument natürlich selber umdefinieren und bei der \input-Anweisung im \enddocument-Makro die Klammern einfügen, aber ich frage mich, ob es sinnvoll sein könnte, das in künftigen Releases durch das scrlfile-Package machen zu lassen, das die \beforefile- und \afterfile-Anweisungen mitbringt, oder ob das nur Ärger bringt im Zusammenhang mit Packages wie "etoolbox", die das \enddocument-Makro patchen.

Mit freundlichem Gruß

Ulrich

Bild von Markus Kohm

Zunächst sei erwähnt, dass scrlfile selbst \enddocument nicht umdefiniert, sondern die gewünschte Funktionalität auf anderem Wege einschleust. Ich will \enddocument eigentlich auch nicht umdefinieren, weil mir das Risiko zu groß ist, dass dann mit einem anderen Paket Probleme entstehen. scrlfile ist immerhin ein Paket, auf das man bei KOMA-Script nicht einfach notfalls verzichten kann. Die KOMA-Script-Klassen brauchen das.

Ich denke aber, dass es für Dich zwei andere Möglichkeiten gibt.

Zum einen könntest Du Dich einfach in \@dofilelist einklinken. Das ist die Anweisung, die nach \input\jobname.aux in \enddocument ausgeführt wird (mit dem Unterschied, dass sie auch dann ausgeführt wird, wenn die aux-Datei gar nicht gelesen wird, was man wiederum per \if@filesw selbst absichern kann). Das Einklingen selbst, sollte man wiederum erst möglichst spät durchführen (beispielweise per \AtEndDocument oder sogar per \BeforeClosingMainAux), damit es nicht durch ein spätes \listfiles zunichte gemacht wird. Natürlich könnte man sich auch zusätzlich in \listfiles einhängen, um die Beschädigung eines manipulierten \@dofilelist zu verhindern. Da gibt es viele Möglichkeiten.

Als zweite Möglichkeit bietet e-TeX mit \everyeof Code unmittelbar vor dem Schließen von Dateien auszuführen. Allerdings werden innerhalb der Haupt-aux-Datei ggf. weitere Dateien gelesen. Damit ist es eventuell schwierig festzustellen, ob man sich am Ende der richtigen Datei befindet.

Falls es nicht ganz so unmittelbar am Ende der aux-Datei sein muss, genügt eventuell auch, in die aux-Datei etwas wie \aftergroup\afterauxcode zu schreiben. Ein großer Teil des Codes in \enddocument wird nämlich innerhalb einer Gruppe ausgeführt. Dazu gehört auch das Einlesen der aux-Datei. Diese Gruppe wird kurz vor dem Ende von \enddocument beendet. An der Stelle würde dann \afterauxcode ausgeführt.

An dieser Stelle der wichtige Hinweis, dass man mit \aftergroup einzelne Token verzögert (siehe TeX by Topic oder The TeXbook). Deshalb habe ich im Beispiel ein einzelnes Makro dahinter stehen und nicht etwa ein Argument in geschweiften Klammern (was nicht funktionieren würde).

Ich könnte darüber nachdenken, eine Anweisung \AfterReadingMainAux in scrlfile zu implementieren, die vermutlich über den \@dofilelist-Trick arbeiten würde. Wenn Du Interesse hast, schick mir eine E-Mail, dann kann ich Dir eine Beta-Version davon schicken (möglichst bald, weil ich demnächst eine neue Release packen will).

Erstmal vielen Dank für Deine ausführliche Antwort.

Die Idee mit dem \aftergroup\afterauxcode - ich könnte mich ohrfeigen, dass ich das nicht selber gesehen habe! Danke, dass Du mich darauf gebracht hast!

Da nicht sicher ist, welche Dokumentklasse geladen ist und welche Packages zusätzlich geladen sind und ich ungern mein Package so gestalten würde, dass man zwingend auf e-TeX angewiesen ist, wollte ich bisher eine Prüfung ablaufen lassen, ob scrlfile oder etoolbox geladen ist/sind und jeweils die bestgeeigneten verfügbaren Hooks nutzen.

Mit Deinem \aftergroup\afterauxcode-Vorschlag erübrigt sich das alles, denn damit kann ich mehr oder weniger bedenkenlos alles per \AtEndDocument machen.

Ich schäme mich, Dich in diesem Forum überhaupt belästigt zu haben, anstatt meine eigenen grauen Zellen mehr auf Trab zu bringen. Nochmals vielen Dank!

Mit freundlichem Gruß

Ulrich

Bild von Markus Kohm

Diese Anweisung existiert übrigens inzwischen.

Comments for "\beforefile und \afterfile aus scrlfile.sty und plain-TeX-Syntax der input-Anweisung im LaTeX2e-Kernel-Makro \enddocument" abonnieren