Lista de Discussão CyrTeX-ru@vsu.ru Mensagem #2521
De: Andrei Sobolevski <CyrTeX-ru@vsu.ru>
Assunto: Re: Обтекаемый объект , прибитый к верху/низу страницы.
Data: Sat, 20 Nov 2010 18:02:07 +0300
Para: Cyrillic TeX Users Group <CyrTeX-ru@vsu.ru>
2010/11/20 Aleksander Gorohovski <CyrTeX-ru@vsu.ru>:
> On Sat, 20 Nov 2010 13:17:29 +0200, Andrew R. Muhametshin  wrote:
>
> *Tex система существует примерно уже четверть века, сформировались
> устоявшиеся схемы-подходы
> и, наверное,.такое решение давно должно было бы появится.

Сложность задачи в том, что в TeXовском алгоритме разбиения текста на
страницы на момент вывода страницы операция разбиения абзацев на
строки уже сделана, причем достаточно необратимо: нельзя переразбить
часть абзаца, попавшую на следующую страницу, на более короткие
строки. Видимо, поэтому на поверхности нет готовых решений.

Если пофантазировать, то по-видимому, надо было бы каждый абзац
сохранять во временный регистр, потом его обычным образом набирать и
разбивать на строки (hbox'ы) и добавлять эти hbox'ы в main vertical
list (MVL). Если при разбиении на страницы оказывается, что очередной
абзац попал на стык страниц и на следующей странице вверху должна быть
обтекаемая картинка высотой N строк, то надо возвращать в MVL всю
только что набранную страницу, потом выбрасывать из MVL те hbox'ы,
которые соответствуют последнему набранному абзацу (запомнив число M
его строк, попавших на набранную страницу) и вновь набирать копию
этого абзаца, сохраненную во временном регистре.

Причем для повторного набора этого несчастного абзаца надо
использовать команду \parshape, где первые M строк имеют ширину,
соответствующую концу предыдущей страницы, следующие N строк -
уменьшенную ширину, соответствующую верхней части страницы с рисунком
(считаем, что рисунок имеет высоту N строк), а остальные строки -
стандартную ширину.

Наверное, полезно было бы еще переопределить "страницы" в алгоритме
разбиения на страницы как вертикальные куски, имеющие одинаковую
ширину строки (т.е. блок строк рядом с верхним рисунком, блок строк
нормальной ширины посредине высоты печатной полосы и блок строк рядом
с нижним рисунком - это три последовательных "страницы") и собирать
эти страницы в настоящие полосы для вывода на печать уже внутри output
routines (OTR).

Но у меня программистская квалификация, увы, не настолько высока,
чтобы вот прям сейчас сесть и такое сделать :)

Про OTR главный (но непонятный) источник - это, конечно, The TeXbook,
но более подробно и хорошо написано в старой книжке D. Salomon "The
Advanced TeXbook": http://books.google.com/books?id=rstheMEAf2gC (надо
смотреть гл. 14 и 16-19). Но это для Plain TeX'а (хотя мне случалось
пользоваться кусками кода из этой книжки и в LaTeXовских проектах).

Вот как-то так.

Андрей
Subscribe (FEED) Subscribe (DIGEST) Subscribe (INDEX) Unsubscribe Mensagem para o Administrador da Lista