
第 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
もちろん、この設定は\hsize
TeXのグループ化を尊重します(グローバル設定をしない限り)。
{\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