2010-08-22 3 views
3

Я реализовал базовый алгоритм компоновки страниц для размещения сносок. В принципе:Алгоритм компоновки сносок с колонками

  1. Макет строки текста кузова.
  2. Если он содержит ссылки на сноски, выложите сноски по строкам.
  3. Перейти к 1.

На каждом шаге, я проверяю, если общая высота (тело текст + сноска текст + пробел) превышает высоту страницы. Если это так, я удаляю самую последнюю выложенную строку, и страница завершена.

Мой вопрос: Как я могу справиться с ситуацией, когда текст тела находится в двух столбцах?

Мне было бы необходимо знать общую допустимую высоту текста тела, чтобы правильно выложить столбцы, но это невозможно узнать, пока я не узнаю высоту текста сноски.

Я также не могу просто взять накопленную высоту строк текста тела и разделить на 2, из-за разную высоту строки, межстрочный интервал, интервал между абзацами и т.д.

ответ

1

У вас есть 3 блока - два для столбцов и один для сносок. Очевидно (высота столбца + высота сносок + зазор) должна быть ниже высоты страницы.

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

+0

Спасибо, это работает. Это не так просто, как кажется, так как я должен реализовать механизм отслеживания переменных, которые могут меняться в зависимости от того, находится ли строка над столбцом или нет, например, расстояние между абзацами, но это отличный старт. – yclevine

1

Интересной проблемой. (Прочитано: Вы должны получить больше upvotes.)

Как справиться с ситуацией, когда текст тело находится в двух столбцах?

Я не думаю, что есть прямой ответ на этот вопрос. Ответ действительно зависит от эстетического идеала, который вы задали для своих документов.

Я бы изменить свой алгоритм лишь незначительно, так что:

  • Первичная область содержимого фиксируется на данной странице
  • Сноски и друзей не будет появляться в первичной области содержимого.

В этом случае выберите количество текста, которое вы можете поместить в многоколоночный макет. Затем определите все сноски в этом разделе текста. Перенумеровать сноски (например, если вы сжимаете несколько страниц в один). Теперь разместите сноски в одной колонке в выделенной области.

Проблемы/вопросы:

  • Если общий текст сноски не может быть пригодным в разделе сноске: Из того, что я видел, как вы, вероятно, необходимо провести над текстом сноски на следующей странице ,

  • Должны ли ваши сноски быть многоколоночными? Я никогда не видел документа, где сноски, где многостолбцовые, но это зависит от вас.

  • Если есть жесткое требование, чтобы весь текст сноски лежал на той же странице, что и содержание, которое относится к нему: вам нужно будет алгоритмически вычислить (на ум приходит динамическое программирование), насколько вы можете поместиться под заданные ограничения страниц, вырезать остальную часть и компоновку только столько, сколько вы можете, а затем играть с текстом, чтобы не было большого количества пробелов, чтобы беспокоить читателя.

+0

Звучит как простое решение - НО - это для специализированного приложения для чтения для академического контента. Некоторые статьи (и некоторые страницы в статьях) будут иметь огромные сноски, а некоторые - ни одного, ни почти. – yclevine

Смежные вопросы