
在閱讀有關允許的軟體包時鉤某些事件的宏,我遇到了這個命令,\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)。同時,它執行所有延遲的操作,並擴展令牌:以這種方式保證對頁碼的引用是正確的,因為它們是在頁面被運出時計算的。luatex
xetex
\write
答案2
從課本,第 23 章:輸出例程,第 254 頁:
TeX 的原始命令
\shipout
<box> 是實際產生輸出的命令。它將盒子的內容發送到dvi
文件,該文件是 TeX 的主要輸出文件; TeX 完成後,該dvi
文件將包含一個緊湊的獨立於設備的指令編碼,這些指令準確地指定應列印的內容。當一個盒子被運出時,TeX 在你的終端機上顯示\count0
through的值\count9
,如第 15 章所述;這十個計數器也記錄在dvi
文件中,可用於識別頁面。出現在盒子內部的所有\openout
、\closeout
和命令均按照該盒子被運出時的自然順序執行。\write
由於\write
命令擴展了宏,如第 21 章所述,TeX 的掃描機制可能會在 a\shipout
執行過程中偵測到語法錯誤。如果\tracingoutput
在 a 時非零\shipout
,則正在運送的盒子中的內容將以符號形式寫入您的日誌檔案中。您可以\shipout
在任何地方說,而不僅僅是在輸出例程中。