Это на самом деле довольно сложная проблема, потому что строки ломаются на границах слов, а длина слов меняется, как, впрочем, и размеры символов.Кроме того, вы можете иметь произвольное количество явных разрывов строк.Таким образом, чтобы сделать это правильно, необходимо принять во внимание многие особенности текста, и общее аналитическое решение будет довольно сложным.
(В «настоящей» типографии также есть кучахитрости, которые используются, чтобы немного поковыряться в макете, подстраивая интервалы между буквами и словами, чтобы все соответствовало при сохранении приличного внешнего вида, но мы, конечно, не будем вдаваться в это здесь.)
Однако давайтеотложите в сторону точность и вместо этого рассмотрите упрощенную модель, которая может помочь вам в правильном подходе.
Доступная область width * height
.Для данного фрагмента текста данного length
мы хотим определить подходящий fontsize
такой, чтобы обернутая высота текста была близка к height
.
В настоящее время давайте просто приглушимпо всем деталям единиц и капризов текстового содержимого и представьте, что мы можем вычислить общий размер текста из length
и fontsize
:
textWidth = A * fontsize * length
lineHeight = B * fontsize
, где A
и B
некоторые константы масштабирования.(B
должно быть легко рассчитать, и на самом деле его значение равно 1,2. A
немного сложнее и зависит от того, как вы выберете для измерения length
, например, как количество символов, или число, или слова. Однако вы делаетеэто, A
может быть только приблизительным, но если вы имеете дело с разумным количеством текста с хорошим поведением, аппроксимация может быть довольно хорошей.)
Тогда область, занимаемая текстом:
textArea = A * fontsize * length * B * fontsize
= A * B * length * fontsize ^ 2
Установка этого значения равным доступной области дает нам верхний предел для размера шрифта, то есть:
fontsize <= sqrt(width * height/(A * B * length))
Очевидно, что это будет значительно переоценено, поскольку предполагается, что текстовые пакетыотлично, чего не происходит - будет потеряна область в конце строк и в нижней части экрана, даже при отсутствии явных разрывов строк.Тем не менее, вполне вероятно, что, поместив соответствующий коэффициент выдумки в нашу масштабную константу A
(то есть, увеличив нашу расчетную ширину текста, чтобы включить потерянные области), мы можем получить достаточно хороший fontsize
, чтобы идти вместе с ним.
Мы можем сделать анализ более сложным, принимая во внимание более специфические особенности текста.Например, если вы посчитаете количество жестких разрывов строк в тексте, вы можете рассматривать их как отдельные, так как они добавляют высоту без добавления ширины.Это приводит к чуть более сложному квадратному уравнению, для которого вам понадобится квадратная формула для решения, скорее, простого квадратного корня.То, стоит ли это, вероятно, зависит главным образом от того, насколько сильно различаются частоты явных разрывов строк в текстах, с которыми вы имеете дело.
Еще одна вещь, на которую следует обратить внимание, это то, что вы часто можете немного обмануть, настраивая толькомежстрочный интервал, поскольку это позволяет вам изменять вертикальный интервал, не рискуя переформатированием текста.Вы, вероятно, не хотите делать это в больших количествах, потому что это будет выглядеть глупо.Но, безусловно, стоит подумать о добавлении небольшого количества вертикальных отступов, если вы правильно обернули текст, но текст не достиг дна.