1

我在 Ubuntu 13.04 上使用 DockBook 4.5 和RenderX 的 XEP 。DocBook 翻译由 Ubuntu 提供。

我将图像浮动到右侧(它使用 XEP,但没有 FOP),我需要为图像添加边距。DocBook 似乎没有使用边距,因此文本被卡在图像中。

DocBook 在Figure floats上有一个页面。不幸的是,这对我来说毫无意义,HTML 示例也不适用。

DocBook 也有一个FO 参数参考页面,但它没有列出包含所有图形、浮点数和边距的属性。

我尝试将以下覆盖添加到我的自定义book-style.xsl中(以前是 0):

<xsl:attribute name="margin-left">6pt</xsl:attribute>
<xsl:attribute name="margin-right">6pt</xsl:attribute>

但它导致了许多错误:

Document book.xml does not validate
compilation error: file book-style.xsl line 16 element attribute
element attribute only allowed within a template, variable or param
compilation error: file book-style.xsl line 17 element attribute
element attribute only allowed within a template, variable or param
...

如何为图形或图像指定浮动边距?

4

1 回答 1

1

正如 OP 在评论中所触及的那样,仅使用以下内容就足以在向右或向左浮动的数字上引入边距:

<xsl:attribute-set name="figure.properties">
 <xsl:attribute name="margin-left">6pt</xsl:attribute>
 <xsl:attribute name="margin-right">6pt</xsl:attribute>
</xsl:attribute-set>

我认为我的原始答案(如下)过于复杂。


名为floater(参见http://www.sagehill.net/docbookxsl/SideFloats.html#CustomSideFloat)的模板输出fo:float格式化对象。该模板采用默认值为 0 的参数。不幸的是,这些默认值在模板调用时不会更改start.indent,从而导致您看到的问题。end.indentfigurefloater

您只需要在模板匹配中进行一个小修复figure即可使其正常工作(请参阅下面代码中的注释)。因此,将以下内容添加到您的自定义层:

<xsl:template match="figure">
  <xsl:variable name="param.placement"
              select="substring-after(normalize-space($formal.title.placement),
                                      concat(local-name(.), ' '))"/>

  <xsl:variable name="placement">
    <xsl:choose>
      <xsl:when test="contains($param.placement, ' ')">
        <xsl:value-of select="substring-before($param.placement, ' ')"/>
      </xsl:when>
      <xsl:when test="$param.placement = ''">before</xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$param.placement"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <xsl:variable name="figure">
    <xsl:choose>
      <xsl:when test="@pgwide = '1'">
        <fo:block xsl:use-attribute-sets="pgwide.properties">
          <xsl:call-template name="formal.object">
            <xsl:with-param name="placement" select="$placement"/>
          </xsl:call-template>
        </fo:block>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="formal.object">
          <xsl:with-param name="placement" select="$placement"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <xsl:variable name="floatstyle">
    <xsl:call-template name="floatstyle"/>
  </xsl:variable>

  <xsl:choose>
    <xsl:when test="$floatstyle != ''">
      <xsl:call-template name="floater">
        <xsl:with-param name="position" select="$floatstyle"/>
        <xsl:with-param name="content" select="$figure"/>

        <!-- The following two lines added to introduce a 10pt 'margin' for floats (right or left) -->
        <xsl:with-param name="start.indent">10pt</xsl:with-param> 
        <xsl:with-param name="end.indent">10pt</xsl:with-param>

      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:copy-of select="$figure"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>
于 2013-11-08T20:53:00.847 回答