4

longtabu私が書いているJavaプログラムでHTMLテーブルをLaTeXコードに解析しようとしています(カスタム列幅設定をサポートしているため使用しています)。私のコードは非常に安定して実行されており、出力は今まで非常に問題がないように見えました。テーブルの機能をサポートする必要がありcolspan(今は行スパンをスキップしています)、そこに問題があります。問題を引き起こしているテーブルは次のようになります。

<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でそのような方程式システムを解くための最良のアプローチは何でしょうか?

4

1 に答える 1

2

ソーステーブルが過度に制約されたり、制約が不足したり、一貫性がないように制約されたりしていないと仮定すると、次のことをお勧めします。

  • 決定された各列の既知の幅をリストするファクトテーブルを定義します
  • 開始列、列スパン、および合計幅を指定する各colspanエントリのConstraintオブジェクトのコレクションを定義します。
  • 事実と制約を収集するテーブル定義全体をパスします。
  • 次に、ファクトテーブルを通過し、定義されていない各列について、すべての制約を実行し、他のすべての列が定義されている列のセットに制約があるかどうかを確認します。このような制約は、現在考慮されている列の値を生成します。
  • 新しい列の値が検出されるたびに、ファクトテーブルの最初から始めて、不明な列をスキャンし、スキャンごとに制約セット全体を再度スキャンします。

これはn-squared(またはそれより悪い)アルゴリズムですが、テーブルに1万の行または列がない限り問題ありません。テーブルが正しく制約されている場合は、すべての列幅が定義されているポイントに到達します。このようなブルー​​トフォースアルゴリズムの利点は、デバッグが比較的簡単で、安定している必要があることです。

テーブルの制約が不足している場合は、パスを作成するポイントに到達し、計算されていない列幅が残ります。これを処理する場合は、別のパスを追加します。今回は、計算されていないテーブル列を含む任意の制約を取ります。これには、他の1つ以上の計算されていないテーブル列も含まれている必要があり、残りのスペースは、のすべての計算されていない列に均等に割り当てられます。制約。これは任意の制約であるため、実行ごとに異なる答えが得られる可能性があります...しかし、テーブルは制約されています...それは重要ですか?

完了すると、すべての列幅を含む完全なファクトテーブルが作成され、すべてのテーブル列を指定してLaTeXコードを生成できます。

于 2013-01-12T18:58:53.203 に答える