關於 \shipout 的一切

關於 \shipout 的一切

在閱讀有關允許的軟體包時某些事件的宏,我遇到了這個命令,\shipout.在網路上搜尋並沒有多大幫助,但如果我沒有錯的話,它在某種程度上與創建新頁面有關(或者是嗎?)。

我的問題是,它到底是什麼\shipout,它有什麼作用以及它是如何做到這一點的? (即後台低層發生了什麼事)

答案1

這很簡單:\shipout是一個原語。它的語法是

\出貨⟨盒子⟩

其中 ⟨box⟩ 在 TeXbook 的第 278 頁中被完整指定:

⟨盒子⟩ → \box⟨8 位數字⟩ | \copy⟨8 位數字⟩
  | \lastbox| \vsplit⟨8 位數字⟩ to⟨尺寸⟩
  | \hbox⟨盒子規格⟩ {⟨水平材質⟩ }
  | \vbox⟨盒子規格⟩ {⟨立式材質⟩ }
  | \vtop⟨盒子規格⟩ {⟨立式材質⟩ }
⟨盒子規格⟩ → to⟨尺寸⟩⟨填料⟩ | spread⟨尺寸⟩⟨填料⟩ | ⟨填料⟩

例如,人們可以說

\shipout\hbox{Hello world}

將建立 DVI 或 PDF 文件中的一頁。當然沒有人願意使用\shipout這種方式。它的主要用途是在 TeX 確定它有足夠的材料來彈出整頁時調用的輸出例程中。當前主垂直清單在所選分頁符號處拆分,並將其內容打包到 中\box255,輸出例程可以對其進行操作。例如,Plain TeX 輸出例程執行下列操作:

\shipout\vbox{
  \makeheadline
  \pagebody
  \makefootline
}
\advancepageno
\ifnum\outputpenalty>-\@MM
\else
  \dosupereject
\fi

因此,帶有頁首和頁尾的整頁被運出。的內容\box255由 進行按摩\pagebody。 LaTeX 中的輸出例程要複雜得多。

人們能做的就是重新定義\shipout,以便它可以完成其他工作。執行類似操作的最古老的宏集是quire.tex(仍然可以在 CTAN 和 TeX Live 上使用)

\def\q_init
   {\global\q_sheetnr=0\global\q_qnr=0
    \global\let\q_oldship=\shipout
    \global\let\shipout=\q_boat
    \xdef\q_cycles{\the\deadcycles}%
    \global\let\endquire=\q_endquire
   }

\shipout它保存了命令中的原始含義\q_oldship(巨集用作_“私有”標記)並將其重新定義為\q_boat,這將執行一些工作並最終調用\q_oldship。例如,可以將其設定為將兩個輸出頁面放置在同一實體頁面上,或進行十六個頁面查詢(套件名稱由此而來)。

該包的atbegshi作用類似。它重新定義\shipout,以便它可以在呼叫\shipout和實際頁面發送之間掛鉤。

此原語的確切作用\shipout是將其輸入的垂直清單轉換為低階列印指令(DVI 或 PDF 格式,根據\pdfoutput是否使用pdftex或的值,如果使用則為 XDV,對於 Knuth TeX 僅 DVI)。同時,它執行所有延遲的操作,並擴展令牌:以這種方式保證對頁碼的引用是正確的,因為它們是在頁面被運出時計算的。luatexxetex\write

答案2

課本,第 23 章:輸出例程,第 254 頁:

TeX 的原始命令\shipout<box> 是實際產生輸出的命令。它將盒子的內容發送到dvi文件,該文件是 TeX 的主要輸出文件; TeX 完成後,該dvi文件將包含一個緊湊的獨立於設備的指令編碼,這些指令準確地指定應列印的內容。當一個盒子被運出時,TeX 在你的終端機上顯示\count0through的值\count9,如第 15 章所述;這十個計數器也記錄在dvi文件中,可用於識別頁面。出現在盒子內部的所有\openout\closeout和命令均按照該盒子被運出時的自然順序執行。\write由於\write命令擴展了宏,如第 21 章所述,TeX 的掃描機制可能會在 a\shipout執行過程中偵測到語法錯誤。如果\tracingoutput在 a 時非零\shipout,則正在運送的盒子中的內容將以符號形式寫入您的日誌檔案中。您可以\shipout在任何地方說,而不僅僅是在輸出例程中。

相關內容