geekkoo - November 25th, 2008 [entries|archive|friends|userinfo]
geekkoo

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

November 25th, 2008

Окаменелости в LaTeX [Nov. 25th, 2008|12:28 pm]
У латеха (и вообще всех систем основанных на TeX-е) есть одна серьезная баго-фича, из-за которой его сложно использовать где-либо вне его ниши любительской полуавтоматической верстки. У него минимальный квант текста, с которым он оперирует - это параграф. Соответственно и вавод материала у него идет по-параграфам. Неясно, почему Кнут решил использовать именно такой алгоритм, может это как-то связано с аппаратурными ограничениями 80-х годов, но с тех пор об эту проблему спотыкаются все, кто пытается пропатчить output-routine. А таких уже набралось изрядное количество - Arthur Ogawa (автор revtex4 - лучшего класса для верстки научного текста), Nicola Talbott (автор flowfram - стилевого файла для постеров и брошюр) и авторов multicol (который совершенно дурацкий, поскольку там floats не работают).

Эта проблема возникает, когда нужно перейти со страницы (или колонки, врезки) одной ширины на другую с другой шириной. Дело в том, что латех сначала верстает параграф целиком, а потом только его печатает. Если при печати он натыкается на конец страницы, то действует он по-простому - отрезает лишнюю часть параграфа и просто переклеивает его на следующую. При этом, что другая страница имеет другую ширину его нисколько не заботит, эти изменения будут учтены только при вёрстке следующего параграфа.

И не нужно считать, что это важно только при вёрстке рекламных журнальчиков. На самом деле есть контрпример - Фейнмановские лекции по физике. Там каждая глава начиналась со страницы, где внешнее поле было более широким, чем на следующих, и туда вставлялось мини-оглавление с перечислением параграфов в этой главе. Как раз в латехе этот переход с первой странице на вторую автоматическом режиме проделать невозможно.

В качестве workaround можно пользоваться /parshape - высчитываете количество строк в последнем параграфе и перечисляете с какой строки нужно перейти на новую ширину. Понятно, что всё это делается вручную и при любой смене дизайна это придётся переделывать заново.

Если бы можно было переделать output-routine, чтобы вёрстка была многопроходной - один раз сверстал, вывел, наткнулся на конец страницы, откатился назад, вставил нужный /parshape и сверстал снова, и так пока весь параграф кончится. Но, по-моему, это как раз невозможно - 80-е годы, никуда не денешься.
Link4 comments|Leave a comment

navigation
[ viewing | November 25th, 2008 ]
[ go | Previous Day|Next Day ]