運送並寫入文件

運送並寫入文件

在乳膠文檔的編譯過程中,頁面一次「發出」一個。據我所知,這是由控制台訊息 [1]、[2]、[3] 等標記的,製作每個頁面。然而,透過檢查 DVI 檔案的寫入,我確定在列印這些 [n] 訊息時,實際上並未寫入 DVI 檔案。相反,數據似乎被緩存並且僅在稍後的某個時刻才到達磁碟。對於小文檔,似乎所有頁面都是在編譯過程結束時一次性編寫的。

為了調查這個問題,我攔截了 fwrite 呼叫。並不是每次發貨時都會調用它。

我的問題是:有沒有辦法強制 Latex 在每次發貨時(即,當它完成編譯每一頁內容時)寫入 DVI 檔案。這是為了啟用我想要實現的一些自訂 dvi 預覽功能。

答案1

dvi_buf_size正如您所猜測的,DVI 檔案的輸出會被緩衝,並一次寫出一半。

在原始 Knuth TeX 中,請參閱第594章:

DVI 位元組輸出到緩衝區,而不​​是直接寫入輸出檔。這使得可以減少子程式呼叫的開銷,從而顯著加快計算速度,因為 DVI 位元組的輸出是 TeX 內迴圈的一部分。

另請參閱第 597-598 節,其中詳細介紹了實施方式:

  • 位元組被寫入緩衝區dvi_out
  • 當緩衝區的未刷新部分達到 大小的一半時dvi_buf,將呼叫該過程write_dvi,該過程將實際寫入檔案。

在 PdfTeX 中保留了相同的實作(§624–625)。實際上,在web2c中,程式write_dvi改變了A稱呼fwrite

如果您不關心速度(無論如何,這可能只會產生很小的影響:對於大多數 LaTeX 文檔,大部分時間都花在擴展宏而不是寫入輸出文件上),您可以嘗試更改TeX 和重新編譯:要么將改dvi_buf_size得非常小(有評論說它需要是 8 的倍數,所以也許 8 可以工作?),或者重新定義dvi_out(旨在將一個字節寫入 DVI 緩衝區)使用 直接將字節寫入文件fwrite。會很想知道它是否有效!

答案2

我猜這可能與常數「dvi_buf_size」有關,在某些發行版中該常數設定為 16384(我不確定我的版本。)所以我想知道 \shipout 是否只會在頁面出現時觸發寫入檔案size 耗盡了這個緩衝區(或一半)。

所以我的理論是 \shipout 不會寫入 DVI 文件,它只是將資料傳送到 DVI 緩衝區,該緩衝區每 8192 位元組寫入文件一次。文檔的實際頁面結構無關。如果 \shipout 不會導致緩衝區達到 8192 字節,則不會觸發對檔案的寫入,並且如果 \shipout 提供超過 8192 字節,我推測這將導致對檔案的寫入,直到緩衝區小於8192 字節。無論如何,對文件的寫入並不是逐頁的。

相關內容