2011-12-15 65 views
0

我正在將內容列表寫入標準的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

回答

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 

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

1

假設你希望所有列具有相同的寬度:

  1. 做一次通過表尋找最長TOC條目(印刷)的寬度。
  2. 劃分頁面寬度減去頁邊距,然後開始找出可以填充的列數。
  3. 將頁面高度減去邊距除以一條線的高度,然後找出每一列有多少行。
  4. 在其他頁面方向(例如,橫向)上重複步驟2和3。
  5. 選擇一個給出最多插槽的行(行數乘以列數)。

數學稍微複雜一些,因爲您需要考慮列之間的「陰溝」。這可以通過填充最寬的值來輕鬆完成。

+0

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