|
On Saturday 20 November 2010 18:02:07 Andrei Sobolevski wrote:
> 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овских проектах).
Ещё бывает очень полезно найти на CТAN пакеты, в которых что-то похожее
делается и поучиться на примерах.
Сергей
|
|