4

左と右に配置されたテキストを区切る点線のリーダーを持つデータのリストがあります。これを実現するために、次の XSL-FO を使用しています。

<fo:block text-align-last="justify">
    <xsl:value-of select="left-text"/>
    <fo:leader leader-pattern="dots"/>
    <xsl:value-of select="right-text"/>
</fo:block>
左側のいくつかのテキスト...................................右側のいくつかのテキスト

これは、テキストがすべて 1 行に収まる場合に完全に機能します。私が抱えている問題は、右側のテキストが新しい行に折り返される方法を正しく処理することです。以下のように、折り返されたテキストを右に揃えてフォーマットするという特定の要件があります。

左側のいくつかのテキスト....右側の長いテキスト
                                                       ラップした

リーダーとテーブルでこれを達成しようとしましたが、役に立ちませんでした。私はアンテナハウスフォーマッターを使用しています。どんなアドバイスでも大歓迎です。助けてくれてありがとう。

4

2 に答える 2

9

これをインスピレーションとして使用し、独自のルールを設定してください。

       <fo:block text-align="justify" text-align-last="right">
           <fo:inline>Some text on the left</fo:inline>
           <fo:leader leader-pattern="dots" leader-length.minimum="2in" leader-length.optimum="2in" leader-length.maximum="3in"/>
           <fo:inline>a long piece of text on the right that has wrapped</fo:inline>
       </fo:block>
        <fo:block text-align="justify" text-align-last="right">
           <fo:inline>Some text</fo:inline>
           <fo:leader leader-pattern="dots" leader-length.minimum="2in" leader-length.optimum="2in" leader-length.maximum="3in"/>
           <fo:inline>a long piece of text on the right that has wrapped and is even longer</fo:inline>
       </fo:block>

あなたが止めることができない唯一のものは、点の下に来るほど長い右手の線ですが、あなたはそれを要件として指定していません. もしそうなら、それに対する解決策はないと思います。また、行が短すぎる場合は、右揃えになります。ラップのみを強制するには、最小/最大値を使用する必要があります。

フォント サイズがわかっている場合は、左右の要素の文字数を数え、合計文字数に応じてテンプレートまたはこのサンプルを呼び出すことができます。

このFOの結果

カウントについては、このテンプレートのように、「50」文字をリーダーの長さで調整して正しい結果を得ることができます。

<xsl:template name="processitem">
    <xsl:choose>
        <xsl:when test="string-length(left) + string-length(right) > 50">
            <fo:block text-align="justify" text-align-last="right">
                <fo:inline><xsl:value-of select="left"/></fo:inline>
                <fo:leader leader-pattern="dots" leader-length.minimum="2in" leader-length.optimum="2in" leader-length.maximum="4in"/>
                <fo:inline><xsl:value-of select="right"/></fo:inline>
            </fo:block>
        </xsl:when>
        <xsl:otherwise>
            <fo:block text-align-last="justify">
                <fo:inline><xsl:value-of select="left"/></fo:inline>
                <fo:leader leader-pattern="dots"/>
                <fo:inline><xsl:value-of select="right"/></fo:inline>
            </fo:block>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

いくつかのサンプル データを使用して、これをレンダリングしました。

サンプル データで上記のテンプレートを使用する

于 2014-07-23T22:37:15.683 に答える
1

fo:inline-container( https://www.w3.org/TR/xsl11/#fo_inline-container ) とmax-widthプロパティ ( https://www.w3.org/TR/xsl11/#max-width ) を使用して、右側の長いテキストの幅。

この例では、axf:text-align-first="justify"拡張子 ( https://www.antennahouse.com/product/ahf66/ahf-ext.html#axf.text-align-firstを参照) を使用して最初の行を揃えています。axf:leader-expansion="force"代わりに拡張機能を使用できます( https://www.antennahouse.com/product/ahf66/ahf-ext.html#axf.leader-expansionを参照)。それらのどちらもなければ、あなたの唯一の他の選択肢は、秒の を推測することだと思いleader-length.optimumますfo:leader

以下の例では、2 つの間に重要な空白文字がないことに注意してくださいfo:leader。これにより、2 つの引出線がフォーマットされたときに、2 つの引出線の間のギャップが回避されます。

<fo:block text-align="justify">
  <fo:inline>Some text</fo:inline><fo:leader
  leader-pattern="dots" leader-length.optimum="100%"
  leader-alignment="end"
  /><fo:inline-container
  max-width="1.5in" text-align="right"
  axf:text-align-first="justify" >
          <fo:block><fo:leader leader-pattern="dots"
  leader-length.minimum="0" />a long piece of text on the right that has wrapped
and is even longer</fo:block>
  </fo:inline-container>
</fo:block>

リーダーの後に右寄せされた複数行のテキストの例。

于 2018-10-12T11:37:46.627 に答える