在固定大小页面(多列)上布局内容列表的算法

问题描述:

我正在将内容列表写入标准的8.5in x 11in页面。方向(风景与肖像)是一个变量。当页面上应用x英寸页边距(其中x是可变的)时,我可以将TOC写入内部区域。在固定大小页面(多列)上布局内容列表的算法

原始数据是一个包含两列的表格:主题和页面(即{“Animals”,1},{“Big Plants”,2},{“Small Plants”,2})。这不是一个嵌套的目录 - 没有“子主题”。所有主题都具有相同的重要性级别,字体大小对于所有文本都是固定的。

我想允许每个页面有一列或多列TOC,如果需要,我允许多页TOC。布局完全依赖于主题列中的文本。如果主题很短,您可以想象将2列纵向放置,或3列横向放置。如果主题名称很长,那么可能只有1列适合(如果很长,则可以使用多行代替主题)。如果有很多话题,那么我可能会涉及多个页面。我们的目标是尽可能在每个页面上放置尽可能多的TOC信息。

我意识到这是一个难题。我还没有探索过很多细节(即所有页面的列数是否相同?)。我只是在寻找一个开始......一些简单的工作可以在一两个小时内完成。任何半智能都比强制1列TOC和字符数来确定在页面上放置多少行更好。

+0

对不起,但是这与编程有什么关系? – PengOne 2011-12-15 18:45:09

+0

我正在寻找一种算法(已标记),我可以用我选择的语言进行编码=) – SFun28 2011-12-15 19:11:50

首先,你需要几个变量:

  • 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 

FYI:Floor()表示四舍五入到最接近的整数。 Floor(5.9)= 5,Floor(0.1)= 0

假设你希望所有列具有相同的宽度:

  1. 做一次通过表寻找最长TOC条目(印刷)的宽度。
  2. 划分页面宽度减去页边距,然后开始找出可以填充的列数。
  3. 将页面高度减去边距除以一条线的高度,然后找出每一列有多少行。
  4. 在其他页面方向(例如,横向)上重复步骤2和3。
  5. 选择一个给出最多插槽的行(行数乘以列数)。

数学稍微复杂一些,因为您需要考虑列之间的“阴沟”。这可以通过填充最宽的值来轻松完成。

+0

谢谢,阿德里安!除非我错了,你和@LastCoder提出了同样的解决方案? – SFun28 2011-12-15 20:40:13