Слишком мало/слишком много использований регистра ящика в лидерах

Слишком мало/слишком много использований регистра ящика в лидерах

Я немного играюсь с лидерами TeX и столкнулся с проблемой, которую не понимаю. Привожу следующий пример кода:

\documentclass{article}

\begin{document}

\def\bul{%
    \begingroup
    \setbox0=\hbox to 10pt{\hss\textbullet\hss}%
    \skip0=\wd0 plus 0.5\wd0 minus 0.5\wd0
%    \skip0=10pt plus 5pt minus 5pt  % the same as above
    \cleaders\box0\hskip\skip0
    \endgroup
}

1: \fbox{\hbox to 30pt{\null\hskip13pt\bul\hskip13pt\null}}  okay, too few space

2: \fbox{\hbox to 30pt{\null\hskip10pt\bul\hskip10pt\null}}  okay, space fits exactly

3: \fbox{\hbox to 30pt{\null\hskip7.5pt\bul\hskip7.5pt\null}}  okay, maximum stretch
\medskip

4: \fbox{\hbox to 30pt{\null\hskip11pt\bul\hskip11pt\null}}  wrong, still enough space left

5: \fbox{\hbox to 30pt{\null\bul\null}} wrong, too many bullets

\end{document}

\bulдолжен, как я понимаю, выводить максимум один \textbulletцентрированный по доступному пространству, если есть свободное горизонтальное пространство от 5 до 15 пунктов. Вот результат:

введите описание изображения здесь

В первой строке осталось только 4pt, поэтому маркера не возникает. В строке 2 маркер может принять свою естественную ширину и поместиться ровно один раз. В третьей строке ему нужно растянуться до максимальной ширины. Эти случаи подходят. Те, которые я не понимаю, находятся в следующих двух строках.

Строка 4 должна оставлять место в 8pt, в котором маркер может поместиться довольно удобно. Однако маркера не появляется. Почему?

Противоположная проблема в строке 5. Здесь превышено максимальное растяжение, поэтому TeX выдает предупреждение underfull \hbox. Но почему он выводит три ящика?

Раздел 9.3.3TeX по темеявно указывает, что вы должны использовать \copyс различными командами лидеров, чтобы убедиться, что регистр ящика не пуст после того, как он был использован первым. На самом деле, это именно тот эффект, которого я хочу добиться, поэтому я и использовал \box. Выходные данные по-прежнему содержат три маркера.

Может ли кто-нибудь объяснить, почему это происходит (и как это исправить)?

решение1

Клей с ненулевым компонентом растяжения в любом случае будет растягиваться, чтобы заполнить пространство, за счет ухудшения качества.

В пятом примере, с \showoutput, вы увидите

...\hbox(4.44444+0.0)x30.0, glue set 4.0
....\hbox(0.0+0.0)x0.0
....\cleaders 10.0 plus 5.0 minus 5.0
.....\hbox(4.44444+0.0)x10.0, glue set 2.5fil
......\glue 0.0 plus 1.0fil minus 1.0fil
......\mathon
......\tensy ^^O
......\mathoff
......\glue 0.0 plus 1.0fil minus 1.0fil
....\hbox(0.0+0.0)x0.0

где коэффициент растяжения клея равен 4. Следовательно, клей считается за 10+4*5=30 pt. Никаких исправлений, так и должно быть.

Примечание: \tensyэто потому, что я набираю текст с помощью обычного TeX, чтобы избежать появления ненужных частей.

С вашим документом соответствующая диагностика будет

..........\hbox(4.44444+0.0)x30.0, glue set 4.0
...........\hbox(0.0+0.0)x0.0
...........\cleaders 10.0 plus 5.0 minus 5.0
............\hbox(4.44444+0.0)x10.0, glue set 2.5fil
.............\glue 0.0 plus 1.0fil minus 1.0fil
.............\OMS/cmsy/m/n/10 ^^O
.............\glue 0.0 plus 1.0fil minus 1.0fil
...........\hbox(0.0+0.0)x0.0

Связанный контент