
TeXbook では (第 14 章で)、段落を行に分割することに関連する合計デメリットを TeX がどのように計算するか、また、合計デメリットが最も少なくなるブレークポイントのシーケンスを TeX が選択する (3 回のパスのプロセスで) ことが詳細に説明されています。ただし、要件を満たすブレークポイントのシーケンスが存在しない場合、具体的に何が起こるかについては簡単に説明されているだけです。
大まかに言うと、\TeX\ は次のように段落を行に分割します。改行ポイントは、現在の ^|\tolerance| を超えない行を生成するために、単語の間またはハイフンの後に挿入されます。このような改行ポイントを挿入できない場合は、^{overfull ボックス} が設定されます。
オーバーフル ボックスのシナリオに関する詳細は、これ以上説明しません。次の詳細に興味があります。このような場合に TeX が余白にはみ出す単語を簡単に説明できますか? (または、それを理解するには TeX のソース コードを読む必要がありますか?) TeX は段落全体を考慮しているため、許容されるブレークポイントのシーケンスがないという問題は、実際には 1 つの単語によって発生するわけではありません。
さらに、TeXbook の上記の記述は完全に正しいわけではないと思います。段落に が含まれている場合\linebreak
、代わりに underfull 行が設定されることがあります。このシナリオは基本的に、「このようなブレークポイントを挿入する方法はない」という前提を満たしていますが、TeX は上記のように overfull 行ではなく underfull 行を設定します。
(この質問は主に興味から出たものです。しかし、オーバーフル行の超過サイズが を超えない場合、オーバーフル行を含む段落が完成した文書に残るシナリオが実際に存在します。\hfuzz
)
答え1
TeXは、行の減点を計算して、その合計値を「合計減点。
TeX のハイフネーション機能を適用しない最初のパスは、整数パラメータによって設定された制限に従わない可能性があります\pretolerance
。しかし、TeX の 2 番目のパスは常に成功します。TeX がオーバーフル行を作成する必要があるという意味では成功しない可能性があります。アンダーフル行は、ユーザーが希望する場合にのみ作成されます。
つまり、\parfillskip=0pt
TeX に、たとえば 1 つのスペースだけを含む短い行を設定して与えると、TeX は行が不足していると報告します。著者は常に最後の改行に責任を負います。1 行の段落では、TeX によって何も挿入されません。同様に、改行コマンドを出力すると、\penalty-10000
著者の希望に従ってこの時点で改行するように TeX に強制されます。これは、TeX が挿入する強制改行です。
TeX の動作は次のとおりです。簡単な言葉を使うようにしていますが、技術的な話になります。TeX は、グルー (カーニングの後にグルーが続く場合や、インライン数式の最後にグルーが続く場合を含む) またはペナルティ (テキスト内のハイフン、2 番目のパスで TeX によって挿入されたハイフン、数式モードの関係の後など) で行を折り返します。また、\penalty-10000
上で説明したように、行を折り返します。
もちろん、TeX はテキストの先頭を最初のブレークポイントとしてカウントします。段落を作成するために、TeX は、ブレークが可能な場所 (2 回目のパスでは、挿入されたハイフンによって TeX によってその場所が作成される場合があります) から次の場所に進みます。これは、縮小または伸縮のいずれかを含む収集された素材の幅によって、TeX が、以前に検出された (または強制された) ブレークポイントの 1 つとともに、現在の許容値に従った不良率の行を構築できるようになるまで続きます。TeX は、このような場所をブレークポイントとしてマークし、関連する以前のブレークポイントを記憶します。これにより、後で段落の最後から、合計のデメリットを最小化する行で先頭に戻ることができます。
TeX は、ユーザーが挿入したのを検出した場合にもブレークポイントを作成します\penalty-10000
。その後、段落の先頭にあるかのようにプロセスを開始します。後続のブレークポイントはこのブレークポイントを超えることはできません。つまり、次のブレークポイントは、このユーザー強制ブレークポイントを前のブレークポイントとして記録する必要があります。
現在の許容値と同じ程度の大きさの不良度で行を構築する場所が見つからない場合、TeX は最初のパスであれば処理を停止し、2 番目のパスを開始します。そうでない場合、TeX が 2 番目のパスであれば、アンダーフル行を構築せずにブレークできる次の場所を探します。行がオーバーフルであっても、これがブレークポイントになります。次に、TeX は処理を続行します。したがって、2 番目のパスは段落全体を処理します。段落にはオーバーフル行が複数ある場合があることに注意してください。
が\emergencystretch
0pt でなく、2 番目のパスが要求されたことを実行できなかった場合、つまり、オーバーフル行なしでブレークポイントを見つけられなかったり、 の場合は行数を減らしたりできなかった場合\looseness=-1
、TeX は 2 番目のパスと同様に動作する 3 番目のパスを開始します。違いは、TeX が の\emergencystretch
次元をすべての行の伸縮性に追加することです。したがって、収集された素材の幅と素材の伸縮性によって、現在の許容値以下の不良度で行を埋めることができなくても、TeX は場所をブレークポイントとして受け入れます。しかし、幅と伸縮性と次元を足すと、
\emergencystretch
それができるほど十分に大きいため、視覚的にはそのような行はアンダーフルです。
レポートとマーキングに影響するパラメータがいくつかあります。おっしゃるとおり、\hfuzz
ディメンションはオーバーフル ルールを省略できますが、オーバーフル ラインが存在するという事実は変わりません。警告が発行されるかどうかは、別のパラメータによって\hbadness
決まります。
したがって、TeXbook の引用テキストは高レベルの非公式な説明であるため、なぜ間違っているのかわかりません。