【问题标题】:Algorithm to layout a table of contents on a fixed-sized page (multi-column)在固定大小的页面(多列)上布局目录的算法
【发布时间】:2011-12-16 03:07:09
【问题描述】:

我正在将目录写入标准 8.5 英寸 x 11 英寸页面。方向(横向与纵向)是一个变量。当 x 英寸边距应用于页面(其中 x 是可变的)时,我可以将我的 TOC 写入内部区域。

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

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

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

【问题讨论】:

  • 抱歉,这和编程有什么关系?
  • 我正在寻找一种算法(已标记),我可以用我选择的语言进行编码 =)

标签: algorithm layout tablelayout tableofcontents


【解决方案1】:

首先你需要几个变量:

  • 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

【讨论】:

  • 这是一个很好的解决方案!在尝试实施之前,请等待更多人的来信。
  • 缺少步骤:对纵向和横向都进行计算,并选择产生最大的Total_TOC_Per_Page
【解决方案2】:

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

  1. 遍历表格,找出最长 TOC 条目的(打印的)宽度。
  2. 除以页面宽度减去页边距,然后计算一下可以容纳多少列。
  3. 将页面高度减去页边距除以行高,然后计算出每列有多少行。
  4. 在其他页面方向(例如横向)中重复第 2 步和第 3 步。
  5. 选择提供最多插槽(行乘以列)的那个。

数学稍微复杂一些,因为您需要考虑列之间的“排水沟”。这很容易通过填充您的最宽值来完成。

【讨论】:

  • 谢谢,阿德里安!除非我弄错了,否则您和@LastCoder 提出了相同的解决方案?
猜你喜欢
  • 2017-04-18
  • 2021-09-12
  • 1970-01-01
  • 2015-05-03
  • 2013-12-19
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多