2013-01-11 73 views
4

我想在我編寫的Java程序中將HTML表格解析爲LaTeX代碼(使用longtabu,因爲它支持自定義列寬設置)。我的代碼運行非常穩定,直到現在,輸出看起來還不錯。我必須支持該表的colspan-特徵(我現在正在跳行),這就是問題所在。這是導致問題的表看起來是這樣的:如何計算多列(colspan)HTML表格的寬度?

<table> 
<tr> 
    <td width="385" colspan="3"> 
     Content 
    </td> 
    <td width="359" colspan="3"> 
     Content 
    </td> 
    <td width="151"> 
     Content 
    </td> 
</tr> 
<tr> 
    <td width="24"> 
     Content 
    </td> 
    <td width="361" colspan="2"> 
     Content 
    </td> 
    <td width="359" colspan="3"> 
     Content 
    </td> 
    <td width="151"> 
     Content 
    </td> 
</tr> 
<tr> 
    <td width="24"> 
     Content 
    </td> 
    <td width="276"> 
     Content 
    </td> 
    <td width="85"> 
     Content 
    </td> 
    <td width="198" colspan="2"> 
     Content 
    </td> 
    <td width="161"> 
     Content 
    </td> 
    <td width="151"> 
     Content 
    </td> 
</tr> 

我在事實認定的問題,即沒有一個表中的行定義了所有列的寬度。

在我的理解中,我需要一個線性方程組來解決單列寬度的計算......我是對的還是有一個我錯過了什麼?

在Java中解決這樣的方程組的最佳方法是什麼?

回答

2

假設源表不是過約束,underconstraint,也不不一致約束,我建議:

  • 定義一個事實表,因爲它被確定,其中列出了已知的寬度爲每列
  • 定義每個colspan條目的約束對象集合,用於指定起始列,列跨度和總寬度。
  • 通過整個表格定義收集事實和約束。
  • 然後對事實表進行傳遞,對於未定義的每個列,遍歷所有約束並查看是否存在對所有其他列進行定義的一組列的約束。這樣的約束會爲當前考慮的列產生一個值。
  • 每次發現新列值時,您都會回到事實表的開始處,掃描未知列,併爲每次掃描重新設置整個約束集。

這是一個n平方(或更差)的算法,但應該沒問題,只要該表沒有一萬行或一列。如果表格被正確約束,您將達到定義所有列寬度的點。像這樣的蠻力算法的優點是它相對容易調試並且應該是穩定的。

如果表格受限制不足,則會達到您進行通過的點,並且仍有未計算的列寬。如果要處理此操作,則需要添加另一個傳遞,並且此時採用任意約束,該約束涉及未計算的表列(其中還必須包含一個或多個其他未計算的表列),並在所有未計算的列中均勻分配剩餘空間約束。由於這是一個任意的約束,你可能會在不同的運行中得到不同的答案......但是這個表受到了約束......這有什麼關係嗎?

完成後,您將擁有包含所有列寬的完整事實表,然後可以生成指定了所有表列的LaTeX代碼。

+0

這對我有很大的幫助,並且相當容易實現。謝謝,你只是救了我掙扎着各種ILP庫。 – Bebbo