Алгоритм размещения оглавления на странице фиксированного размера (несколько столбцов) - PullRequest
0 голосов
/ 15 декабря 2011

Я пишу оглавление на стандартную страницу размером 8,5 x 11 дюймов.Ориентация (пейзаж против портрета) является переменной.Я могу записать свое оглавление во внутреннюю область, когда на страницу наложены x-дюймовые поля (где x - переменная).

Исходные данные - это таблица с двумя столбцами: Тема и Страница (т.е. {"Животные", 1}, {"Большие растения", 2}, {"Маленькие растения", 2}).Это не вложенное оглавление - здесь нет «подтем».Все темы имеют одинаковый уровень важности, а размер шрифта фиксирован для всего текста.

Я хочу разрешить 1 или более столбцов содержания для каждой страницы, и я разрешаю использовать несколько страниц содержания при необходимости.Макет полностью зависит от текста в столбце Тема.Если темы короткие, вы можете представить 2 колонки в портретной ориентации или 3 колонки в альбомной ориентации.Если есть длинные названия тем, то, возможно, подойдет только 1 столбец (если очень длинный, тогда можно использовать несколько строк для темы).Если есть много тем, то я мог бы перетечь на несколько страниц.Цель состоит в том, чтобы разместить как можно больше информации об оглавлении на каждой странице.

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

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Сначала вам понадобятся несколько переменных:

  • Line_hight (дюймы на строку TOC)
  • Max_TOC_width (дюймы от самого длинного имени TOC)
  • Max_pagenum_width (дюймыширина наибольшего номера страницы при печати)
  • влево, вправо, сверху, снизу _border (дюймы от границы вокруг страницы)

Тогда это довольно легко вычислить.

Lines_Per_Page = Floor( (Page_Height - Top_Border - Bottom_Border) / Line_Height )

Columns_Per_Page = Floor( (Page_Width - Left_Border - Right_Border) / (Max_TOC_Width + Max_PageNum_Width) )

Total_TOC_Per_Page = Lines_Per_Page * Columns_Per_Page

К вашему сведению: Floor () означает округление до ближайшего целого числа.Этаж (5.9) = 5, Этаж (0.1) = 0

1 голос
/ 15 декабря 2011

Если вы хотите, чтобы все столбцы были одинаковой ширины:

  1. Выполните один проход через таблицу, чтобы найти (напечатанную) ширину самой длинной записи TOC.
  2. Разделите ширину страницы минус поля и возьмите слово, чтобы выяснить, сколько столбцов вы можете разместить.
  3. Разделите высоту страницы минус поля на высоту строки и возьмите слово, чтобы выяснить, сколько строк в столбце.
  4. Повторите шаги 2 и 3 в другой ориентации страницы (например, в альбомной ориентации).
  5. Выберите тот, который дает больше слотов (строк и столбцов).

Математика немного сложнее, так как вам нужно учитывать "водосток" между столбцами. Это легко сделать, добавив самое широкое значение.

...