哪裡可以改變\hsize?

哪裡可以改變\hsize?

在第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始終是安全的,因為在輔助垂直清單中工作時使用頁面建構器永遠不會呼叫輸出例程。

相關內容