Ausliefern und in Datei schreiben

Ausliefern und in Datei schreiben

Während der Kompilierung eines Latex-Dokuments werden die Seiten einzeln „ausgeliefert“. Soweit ich weiß, wird dies durch die Konsolenmeldungen [1], [2], [3] usw. gekennzeichnet, die jede Seite erstellen. Durch die Überprüfung der Schreibvorgänge in die DVI-Datei habe ich jedoch festgestellt, dass die DVI-Datei zum Zeitpunkt des Druckens dieser [n] Meldungen nicht tatsächlich geschrieben wird. Vielmehr scheinen die Daten zwischengespeichert zu werden und erst zu einem späteren Zeitpunkt auf die Festplatte zu gelangen. Bei kleinen Dokumenten scheinen alle Seiten am Ende des Kompilierungsprozesses in einem Durchgang geschrieben zu werden.

Um dies zu untersuchen, habe ich den fwrite-Aufruf abgefangen. Er wird nicht bei jedem Versand aufgerufen.

Meine Frage ist: Gibt es eine Möglichkeit, Latex zu zwingen, bei jedem Versand, also wenn die Kompilierung jeder Inhaltsseite abgeschlossen ist, in die DVI-Datei zu schreiben? Dies dient dazu, einige benutzerdefinierte DVI-Vorschaufunktionen zu aktivieren, die ich implementieren möchte.

Antwort1

dvi_buf_sizeWie Sie vermutet haben, wird die Ausgabe in die DVI-Datei gepuffert und jeweils zur Hälfte ausgegeben .

Im ursprünglichen Knuth TeX siehe§ 594:

Die DVI-Bytes werden in einen Puffer ausgegeben, anstatt direkt in die Ausgabedatei geschrieben zu werden. Dadurch kann der Overhead von Unterprogrammaufrufen reduziert und die Berechnung dadurch messbar beschleunigt werden, da die Ausgabe von DVI-Bytes Teil der inneren Schleife von TeX ist.

Siehe auch §§ 597–598, in denen auf die Einzelheiten der Umsetzung eingegangen wird:

  • Bytes werden in den Puffer geschrieben mitdvi_out
  • Wenn der nicht geleerte Teil des Puffers die Hälfte der Größe von erreicht dvi_buf, wird die Prozedur write_dviaufgerufen, die den eigentlichen Schreibvorgang in die Datei durchführt.

In PdfTeX wird die gleiche Implementierung beibehalten (§624–625write_dvi). In der Praxis ist das Verfahren im Web2CgeändertZuSeiAAnrufZu fwrite.

Wenn Ihnen die Geschwindigkeit egal ist (auf die dies wahrscheinlich ohnehin nur geringe Auswirkungen hat: Bei den meisten LaTeX-Dokumenten wird die meiste Zeit mit dem Erweitern von Makros und nicht mit dem Schreiben in die Ausgabedatei verbracht), können Sie versuchen, die Implementierung von TeX zu ändern und neu zu kompilieren: entweder indem Sie den Wert so ändern, dvi_buf_sizedass er wirklich klein ist (ein Kommentar besagt, dass er ein Vielfaches von 8 sein muss, also geht vielleicht 8?), oder indem Sie ihn neu definieren dvi_out(wobei ein Byte in den DVI-Puffer geschrieben werden soll), um das Byte direkt mit in die Datei zu schreiben fwrite. Ich bin gespannt, ob es funktioniert!

Antwort2

Ich vermute, dass dies mit der Konstanten „dvi_buf_size“ zu tun haben könnte, die in manchen Distributionen auf 16384 eingestellt ist (bei meiner bin ich mir nicht sicher). Daher frage ich mich, ob \shipout nur dann einen Schreibvorgang in eine Datei auslöst, wenn die Seitengröße diesen Puffer (oder die Hälfte davon) erschöpft. Und tatsächlich sehe ich bei meinen Tests 8192 Schreibvorgänge in DVI-Dateien, was in der Tat die Hälfte von 16384 ist.

Meine Theorie ist also, dass \shipout nicht in die DVI-Datei schreibt, sondern die Daten nur an den DVI-Puffer sendet, der alle 8192 Bytes in die Datei geschrieben wird. Die tatsächliche Seitenstruktur des Dokuments ist irrelevant. Wenn \shipout nicht dazu führt, dass der Puffer 8192 Bytes erreicht, wird kein Schreibvorgang in die Datei ausgelöst, und wenn \shipout mehr als 8192 Bytes liefert, vermute ich, dass dies Schreibvorgänge in die Datei auslöst, bis der Puffer weniger als 8192 Bytes enthält. In jedem Fall werden die Schreibvorgänge in die Datei nicht seitenweise durchgeführt.

verwandte Informationen