ConTeXt で行がいっぱいになるのを完全に防ぐにはどうすればよいでしょうか?

ConTeXt で行がいっぱいになるのを完全に防ぐにはどうすればよいでしょうか?

私はここ数年間 ConTeXt を使ってきましたが、改行を決定するアルゴリズムは各行を個別に調べるのではなく、基本的に段落全体の「悪さ」を最小限に抑えようとするものであることをよく知っています。そのため、時には行がいっぱいになることは「ゲームの一部」にすぎず、や 、 、などhzを使用して最小限に抑える必要があります。fullhzhangingtolerantverytolerantstretch

しかし、私は今、本当にのが好き絶対に、完全に、最終的に、そして常にセクションの見出しに行が多すぎるのを防ぐ。つまり、TeXのアルゴリズムによって行がどれだけ「悪い」ものになっても、一度もない過剰な行に頼る。私は自分の問題を説明する MWE を作成しました:

\definefontsize[e]
\definefontsize[f]

\definebodyfontenvironment[default][
  a=1.200,
  b=1.400,
  c=1.728,
  d=2.0,
  e=4.0,
  f=24.0,
  x=0.9,
  xx=0.8,
  big=1.2,
  small=0.8]

\setuphead[section][
  style=\tfe\em,
  align={flushleft, nothyphenated, fullhz, hanging, verytolerant, stretch},
  number=no,
  alternative=margin,
  after={\blank[4*line]},
  ]


\starttext

\section{Test overfull headings}

\input{knuth}

\input{knuth}

\stoptext

これは次のようになります:

ここに画像の説明を入力してください

アルゴリズムにどう指示すればいいのでしょうか壊すオーバーフルボックスに頼るのではなく、「見出し」という単語の前の行に入力します。 のオプションはどれもalignここでは効果がないようです。

あらゆる助けをいただければ幸いです。

答え1

ハイフネーションを無効にしたときに、ぎざぎざのテキストで行がいっぱいになるのを回避するには、broadオプションにキーワードを追加してalign、改行を改善します。

\definefont [SectionFont] [Italic sa 4]

\setuphead
  [section]
  [ style=SectionFont,
    align={flushleft,broad,nothyphenated},
   number=no]

\starttext

\section{Test overfull headings}

\samplefile{knuth}

\stoptext

答え2

しかし、私は今、セクション ヘッダー内の行がいっぱいになることを絶対に、完全に、究極的に、常に防止したいという状況に直面しています。つまり、TeX のアルゴリズムに従って行がどれだけ「悪い」ものになったとしても、行がいっぱいになることは決してあってはなりません。

この問題に対して ConTeXt で利用できるオプションはほとんど使い尽くしました。これを解決するより良い方法については、以下の Wolfgang のコメントを参照してください。元の回答は以下のとおりです。

幸いなことに、まだ使用できる Plain TeX オプションがいくつかあります。ここでは 4 つのオプションを思いつきます。

\tolerance=10000

TeXbook では次のように提案されています:

残念ながら、オーバーフィルボックスが再び表示されます。入力してみてください。

\tolerance=10000
\input story

何が起こるか見てみましょう。TeXは10000を「無限」の許容値として扱い、任意の広いスペースを許容します。したがって、10000の許容値は一度もない列自体よりも幅が広いハイフンで区切れない単語など、何か異常なことが起きない限り、オーバーフルのボックスを生成します。

\emergencystretch=\maxdimen

再びTeXbookから:

手動で修正せずに、どうしてもボックスがいっぱいになることを避けたい場合は、 を設定したいと思うかもしれません \tolerance=10000。これにより、厳しい状況で任意の悪い行を許容できるようになります。しかし、無限の許容値はよくありません。なぜなら、TeX はひどく悪い行と途方もなくひどい行を区別しないからです。実際、許容値を 10000 にすると、TeX はすべての悪い部分を 1 か所に集中させ、中程度の悪い行 2 つではなく、本当に見苦しい行 1 つを作成します。これは、1 回の「削除」でルールに従って合計のデメリットが最も少なくなるためです。望ましい効果を得るには、はるかに良い方法があります。TeX には、他の方法では\emergencystretchボックスがいっぱいになることが避けられない場合に、悪い行とデメリットを計算するときに、各行の想定される伸縮性に追加される というパラメータがあります。 が 正の場合、最初のパスでと を\emergencystretch満たす方法が見つからなかった場合、TeX は改行を選択する前に段落に対して 3 回目のパスを実行します。の効果は、大きな無限大と小さな無限大を区別できるように、悪さを縮小することです。 を十分に高く設定することで( に基づいて)、 を決して超過しないことが保証されます。したがって、改行タスクが本当に不可能でない限り、ボックスがいっぱいになることは決してありません。\pretolerance\tolerance\emergencystretch\emergencystretch\hsize\tolerance

\rightskip=0pt plus 1fil

もう一度TeXbookから引用します:

たとえば、 を設定する\rightskip=0pt plus1filと、すべての行の右側がスペースで埋められます。ただし、これは、右端が不揃いの余白を作成するのに特に良い方法ではありません。無限の伸縮性により、非常に短い行に不良度が 0 に割り当てられるからです。

ここでは、非常に短い行でも問題ないため、行わないように指示されていることを喜んで実行できます。

\spaceskip=\fontdimen2\font plus \maxdimen minus \fontdimen4\font

これにより、単語のスペースを無限に広げることができるようになり、他のオプションとはまったく異なる効果が得られます。


この例では、最初の 3 つのオプションはすべて同じ効果を生み出します。

(画像はアップロードされません。後で編集します)

最後のオプションはまったく異なる効果をもたらします。

(画像はアップロードされません。後で編集します)

これらのコマンドはドキュメント内のどこにでも配置できますが、この目的のためには、style次のようにキーに追加するのが最も簡単です。

\setuphead[section][
  style=\tfe\em\emergencystretch=\maxdimen,
  align={flushleft, nothyphenated, fullhz, hanging, verytolerant, stretch},
  number=no,
  alternative=margin,
  after={\blank[4*line]},
]

\emergencystretch=\maxdimen一般的に、これは満杯のボックスがある場合にのみ有効になるため、他のすべてのオプションよりもを使用することを好みます。

関連情報