\hsize を変更できるのはどこですか?

\hsize を変更できるのはどこですか?

第 23 章「出力ルーチン」には次の警告があります。

ジョブの最初、または TeX のメモリからすべてのページを削除した後を除いて、\hsize と \vsize をいじらない方がよいでしょう。

しかし、テキストブック自体が変更される例がいくつかあります\hsize

1) story.tex の演習では、1 つの tex ジョブで \hsize が複数回設定されます。

\hsize=4in \input story
\hsize=3in \input story
...

\ejectこのケースは、 story.texの最後に呼び出されるので「合法」だと思います。

さらにいくつかの例:

2) 115ページには\hsize内部にセットされています\topinsert

3) 223ページには\hsizeがセットされています\vbox

どのような状況で改変が「合法」なのか\hsize、そしてなぜこの警告があるのかテキストブック\hsize「悪い」場所で変更すると何が問題になるかを示す例はありますか?

答え1

とは\hsize

プリミティブパラメータは、TeX が段落を行に分割するために使用する長さです( 、およびからの段落形状指示\hsizeも考慮されます)。\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

つまり、6 行で構成される段落が表示され、これは 300 ポイント幅の 6 つのボックスに対応します。

2番目の\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

最初の 6 行はそこにあります。2\parskip番目の段落が始まる場所を確認するために、それを探します。9 行あり、すべて 200 ポイントの幅です。

どこで変更することが合法ですか\hsize?

どこでも。 が使用されていない限り、TeX は段落を行​​に分割するために がスキャンされたときの の\parshape値を使用します。\hsize\par

もちろん、この設定は\hsizeTeXのグループ化を尊重します(グローバル設定をしない限り)。

{\hsize=1pt \nopar\lipsum{1}}\par

が見つかったときにへの変更\hsizeが忘れられているため、前とまったく同じになります。段落が構築されているときに に 2 つの異なる値を持つことはできないことに注意してください (もちろん は除きます)。\par\hsize\parshape

\hsizeページの形状に影響しますか?

TeXの設計によるものではありません。しかし、出力ルーチンはヘッダーとフッターの設定に標準を使用する可能性があり、おそらく使用するでしょう。\hsizeたとえば、\plainoutput\makeheadline

\line{\vbox to 8.5pt{}\the\headline}

そして。\line\hbox to \hsize

\hsizeこれが Knuth の警告の主な意味です。ページの途中で変更すると、出力ルーチンがいつ実行されるかに応じて、予期しない結果が表示される可能性があります。

セカンダリ垂直リストで作業しているときにページ ビルダーを実行しても出力ルーチンが呼び出されないため、\hsize内での変更は常に安全です。\vbox

関連情報