2011-12-15 2 views
0

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

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

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

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

+0

Извините, но что это связано с программированием? – PengOne

+0

Я ищу алгоритм (помеченный тегами), который я могу кодировать на языке по своему выбору =) – SFun28

ответ

1

Прежде всего, необходимо несколько переменных:

  • Line_hight (дюймов в ТОС линии)
  • Max_TOC_width (дюймы самое длинное название ТОС)
  • Max_pagenum_width (дюймы Ширина самого большого числа страниц при печати)
  • Left, Right, Top, Bottom _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 

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

+0

Это хорошее решение! Ожидание услышать от большего количества людей, прежде чем я попытаюсь рассказать. – SFun28

+0

это получилось отлично. благодаря! – SFun28

+0

Отсутствует шаг: Выполняйте вычисления как для портрета, так и для пейзажа и выберите тот, который дает наибольшую 'Total_TOC_Per_Page'. –

1

Предполагая, что вы хотите, чтобы все колонки были же ширина:

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

Математика немного сложнее, так как вам нужно учитывать «сточную канаву» между колоннами. Это легко выполнить, заполнив свое самое широкое значение.

+0

Спасибо, Адриан! Если я ошибаюсь, вы и @LastCoder предлагаете одно и то же решение? – SFun28

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