Как узнать предел сжатия «клея» в TeX?

Как узнать предел сжатия «клея» в TeX?

На странице 69TeXbook, есть фигура: введите описание изображения здесь

На странице 70TeXbook, говорит

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

Как автор здесь рассчитывает пределы сжатия?

решение1

сжатие указывается в единицах, если вы идете, \setlength\baselineskip{15pt minus 2pt}то сжатие составляет 2pt, а минимальный размер составляет 13ptОн также может быть бесконечным fil, fillили filllединицами, \vssнапример, это сокращение от\vskip 0pt plus 1fil minus 1fil

решение2

Вот пример:

\def\ruleA{\vrule height1pt width45pt depth0pt}
\def\ruleB{\vrule height1pt width30pt depth0pt}
\noindent
\vrule height1pt width100pt depth0pt\par
\hbox to 100pt{\ruleA\hskip 20pt plus 4pt minus 15pt\ruleA} % case 1
\hbox to 100pt{\ruleA\hskip 20pt plus 4pt minus 10pt\ruleA} % case 2
\hbox to 100pt{\ruleA\hskip 20pt plus 4pt minus 3pt \ruleA} % case 3
\hbox to 100pt{\ruleB\hskip 20pt plus 4pt minus 3pt \ruleB} % case 4

\bye

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

Я определил две линии (одна шириной 45pt, а другая 30pt). И я склеил линии в горизонтальный блок шириной 100pt.

  • В случаях 1–3 общая ширина двух линеек составляет 90 пунктов, поэтому клей должен сжаться на 10 пунктов, поскольку его естественная ширина составляет 20 пунктов.

    • Случай 1 и случай 2 могут это сделать, потому что их сжимаемость составляет 15pt, 10pt соответственно. Но
    • Случай 3 — нет, минимальная ширина клея составляет 20pt-3pt = 17pt (поэтому Overfull \hbox (7.0pt too wide) detected at line 7выдается предупреждение).
  • В случае 4 клей равен 20pt plus 4pt minus 3pt, что не означает, что максимальная ширина клея составляет 24pt. Фактически, клею разрешено растягиваться произвольно, если у него положительный компонент растяжения. И как вы можете видеть на снимке экрана, ширина последнего клея составляет 100pt-30pt*2 = 40pt (величина растяжения составляет 20pt > 4pt). И этот случай выдает предупреждение Underfull \hbox (badness 10000).

решение3

Первая капля клея равна space 9 stretch 3 shrink 1, поэтому самая узкая, которую она может получить, равна 9 − 1 = 8. (Вы можете подумать, что самая широкая равна 9 + 3 = 12, но текст на странице 70 сразу после процитированной вами части объясняет, что на самом деле это не так, и ее можно растянуть еще шире.)

Сложив все ширины и промежутки, мы получаем 5 + 9 + 6 + 9 + 3 + 12 + 8 = 52 как естественную ширину; но если мы включим также сжатия, то получим 5 + (9 − 1) + 6 + (9 − 2) + 3 + (12 − ​​0) + 8 = 49 как самую узкую ширину, которую он может получить.

Вот так и вычисляются числа 52, 8 и 49. (Остальные числа просто взяты с потолка.)

решение4

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

Код ниже может дать вам визуализацию того, что происходит. Поучительно думать о клее как о пружинах, которые могут расширяться или сжиматься, чтобы расположить набор блоков в других блоках. На схеме ниже они представлены белыми пробелами. Вы можете заметить, что когда ширина строки составляет 35 мм и TeX строит, абзац box4опускается на вторую строку. При 49 мм он просто помещается. Рисунок отображается путем вставки блоков в таблицу. Поэкспериментируйте с изменением значений. Чтобы вручную рассчитать все клеи, сложите положительные и отрицательные значения, чтобы получить растяжимость или усадку.

\documentclass{article}
\usepackage{array,xcolor}
\fboxsep=0pt\fboxrule=0pt
\NewDocumentCommand\Fbox{m m}
{
 \colorbox{cyan}{\hbox to#1{box$_#2$\strut}}
}
\parindent0pt
\setlength\arraycolsep{0pt}
\long\def\maketable#1{\par\leavevmode
\begin{tabular}{l|@{}p{#1}@{}|@{}}
#1 &\Fbox{14mm}{1}\hskip\skipa  
\Fbox{15mm}{2}\hskip\skipb  
\Fbox{8mm}{3}\hskip
\skipc \Fbox{8mm}{4}
\end{tabular}
\smallskip
}
% set the skips
\newskip \skipa
\newskip \skipb
\newskip \skipc
\skipa=0mm plus 3mm minus 1mm
\skipb=0mm plus6mm minus 2mm
\skipc=0mm plus0mm minus 0mm
\begin{document}
%make the tables
\maketable{35mm}
\maketable{49mm}
\maketable{52mm}
\maketable{55mm}
\end{document}

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