Я немного играюсь с лидерами 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