
在第23章「輸出例程」中有一個警告:
最好不要亂用 \hsize 和 \vsize,除非是在作業一開始,或從 TeX 記憶體彈出所有頁面之後。
但在課本本身有幾個\hsize
改變的例子:
1) 在story.tex 的練習中,\hsize 在一個tex 作業中被設定了多次。
\hsize=4in \input story
\hsize=3in \input story
...
我想,這種情況是“合法的”,因為\eject
在story.tex的末尾被調用
更多範例:
2) 第115頁\hsize
設定在裡面\topinsert
。
3)第223頁上\hsize
設定了裡面\vbox
。
在哪些情況下修改是“合法的”\hsize
以及為什麼會出現此警告課本?有沒有一個例子可以說明如果我們\hsize
在「壞」的地方進行更改會出現什麼問題?
答案1
什麼是\hsize
?
原始參數\hsize
是 TeX 用於將段落分割成行的長度(同時考慮\leftskip
、\rightskip
以及來自\hangindent
和 的段落形狀指令\hangafter
。
當一個段落被分成幾行時,TeX 將向\hsize
當前垂直列表貢獻一堆水平寬度的框。如果使用\hangindent
和 ,則寬度會有所不同,並將反映每條線的實際寬度。\hangafter
\parshape
使用時,就像\hsize
為每一行指定了不同的一樣。
考慮程式碼
\input plipsum
\hsize=300pt
\showboxbreadth=1000 \showboxdepth=0
\lipsum{1}
\showlists
\hsize=200pt
\lipsum{2}
\showlists
\bye
第一個\showlists
命令輸出
### vertical mode entered at line 0
### current page:
\glue(\topskip) 3.05556
\hbox(6.94444+1.94444)x300.0, glue set - 0.62798 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.38911 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set - 0.17653 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.24695 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.36536 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 227.0554fil []
total height 70.0
goal height 643.20255
prevdepth 1.94444, prevgraf 6 lines
所以我們看到一個由六行組成的段落,對應六個 300pt 寬的框。
第二\showlists
條指令輸出
### vertical mode entered at line 0
### current page:
\glue(\topskip) 3.05556
\hbox(6.94444+1.94444)x300.0, glue set - 0.62798 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.38911 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set - 0.17653 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.24695 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 0.36536 []
\penalty 150
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x300.0, glue set 227.0554fil []
\glue(\parskip) 0.0 plus 1.0
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.68265 []
\penalty 250
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set - 0.56822 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.02776 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.76903 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 1.07141 []
\glue(\baselineskip) 3.11111
\hbox(6.94444+1.94444)x200.0, glue set 0.93843 []
\penalty 100
\glue(\baselineskip) 3.11111
\hbox(6.94444+0.0)x200.0, glue set 0.1729 []
\penalty 100
\glue(\baselineskip) 5.05556
\hbox(6.94444+1.94444)x200.0, glue set 0.93886 []
\penalty 250
\glue(\baselineskip) 5.75002
\hbox(4.30554+0.0)x200.0, glue set 179.41664fil []
total height 178.0 plus 1.0
goal height 643.20255
prevdepth 0.0, prevgraf 9 lines
前六行在那裡,尋找\parskip
以查看第二段的開始位置。我們有九行,全都是 200pt 寬。
哪裡可以合法修改\hsize
?
任何地方。除非\parshape
使用 ,否則 TeX 將使用掃描\hsize
時的當前值\par
將段落分成行。
當然,這個設定\hsize
將尊重 TeX 分組(如果你不夠狡猾來進行全域設定)。所以如果我們嘗試
{\hsize=1pt \nopar\lipsum{1}}\par
我們得到的結果與以前完全相同,因為當發現時,對的更改\hsize
將被忘記。請注意,在建構段落時\par
不能有兩個不同的值(當然,除非 )。\hsize
\parshape
\hsize
影響頁面形狀嗎?
不是 TeX 設計的。但是,輸出例程可以而且可能會使用\hsize
設定頁首和頁尾的標準。例如,\plainoutput
有\makeheadline
嗎
\line{\vbox to 8.5pt{}\the\headline}
並且\line
是\hbox to \hsize
。
因此,這就是 Knuth 警告的主要含義:如果您\hsize
在頁面中間進行更改,可能會出現意外結果,具體取決於輸出例程何時生效。
\hsize
在 a 內部進行變更\vbox
始終是安全的,因為在輔助垂直清單中工作時使用頁面建構器永遠不會呼叫輸出例程。