最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Docbook中输出HTML的表格设置为居中对齐

Docbook crifan 2526浏览 0评论

【问题】

Docbook中,之前已经可以实现等的居中对齐了,以及也实现了formal(figure,table,equation等)的标题的中间对齐:

【已解决】如何设置Docbook中的图片的标题为中间对齐

现在对于其中输出的上述的formal的主题内容,即表格table,equation等内容,也想要让其居中对齐,这样才和标题统一。而这部分的需求,对于输出的PDF中,本身由于是自动填充了pdf中的页面的宽度,所以是已经实现了,不需要额外设置,而HTML中,由于默认是左对齐的,所以需要额外设置。

目前的效果是这样的:

HTML中表格主体内容还是左对齐的

希望将HTML中的表格等formal的主体内容,也都是设置为中间对齐。

【解决过程】

1.刚开始不知道如何去设置。

后来想到了,对于原先普通的word文档,其可以另存为HTML网页的,然后可以先去将其中的表格部分设置为中间对齐,然后参考其源码,看看其源码是如何写的,然后再想办法把对应的配置参数,加入到HTML的xsl配置文件中去。

然后就去找了个之前的word,设置某表格为中间对齐,然后另存为HTMl,然后得到其相应源码为:得到word专html中表格主体对齐的源码

可以看到,对于表格主体内容对齐的话,是对应的div中添加align为center,即可。

2.然后就去找HTML的xsl配置,哪里对应着这个表格主体内容的div的。

尝试了几次后,得到了正确的位置,即

docbook-xsl-ns-1.76.1\html\formal.xsl

中formal.object的配置部分中的class="{$class}-contents"的div,然后添加了对应align为center:

<!--============================================================================
formal(figure/table/equation/example/...) setting
=============================================================================-->
<!-- follow are copied from docbook-xsl-ns-1.76.1\html\formal.xsl -->
<xsl:template name="formal.object.heading">
  <xsl:param name="object" select="."/>
  <xsl:param name="title">
    <xsl:apply-templates select="$object" mode="object.title.markup">
      <xsl:with-param name="allow-anchors" select="1"/>
    </xsl:apply-templates>
  </xsl:param>

  <xsl:choose>
    <xsl:when test="$make.clean.html != 0">
      <xsl:variable name="html.class" select="concat(local-name($object),'-title')"/>
      <div class="{$html.class}">
        <xsl:copy-of select="$title"/>
      </div>
    </xsl:when>
    <xsl:otherwise>
      <!-- <p class="title"> -->
      <p class="title" align="center"> <!-- add align to center of header for table/figure/... -->
        <b>
          <xsl:copy-of select="$title"/>
        </b>
      </p>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="formal.object">
  <xsl:param name="placement" select="'before'"/>
  <xsl:param name="class">
    <xsl:apply-templates select="." mode="class.value"/>
  </xsl:param>

  <xsl:call-template name="id.warning"/>

  <xsl:variable name="content">
    <div class="{$class}">
      <xsl:call-template name="anchor">
        <xsl:with-param name="conditional" select="0"/>
      </xsl:call-template>
    
      <xsl:choose>
        <xsl:when test="$placement = 'before'">
          <xsl:call-template name="formal.object.heading"/>
          <!-- <div class="{$class}-contents"> -->
          <div class="{$class}-contents" align="center" > <!-- add align to center for body of table/figure/.. -->
            <xsl:apply-templates/>
          </div>
          <!-- HACK: This doesn't belong inside formal.object; it 
               should be done by the table template, but I want 
               the link to be inside the DIV, so... -->
          <xsl:if test="local-name(.) = 'table'">
            <xsl:call-template name="table.longdesc"/>
          </xsl:if>
    
          <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
        </xsl:when>
        <xsl:otherwise>
          <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
          <div class="{$class}-contents"><xsl:apply-templates/></div>
          <!-- HACK: This doesn't belong inside formal.object; it 
               should be done by the table template, but I want 
               the link to be inside the DIV, so... -->
          <xsl:if test="local-name(.) = 'table'">
            <xsl:call-template name="table.longdesc"/>
          </xsl:if>
    
          <xsl:call-template name="formal.object.heading"/>
        </xsl:otherwise>
      </xsl:choose>
    </div>
    <xsl:if test="not($formal.object.break.after = '0')">
      <br class="{$class}-break"/>
    </xsl:if>
  </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="class"><xsl:value-of 
                     select="$class"/>-float</xsl:with-param>
        <xsl:with-param name="floatstyle" select="$floatstyle"/>
        <xsl:with-param name="content" select="$content"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:copy-of select="$content"/>
    </xsl:otherwise>
  </xsl:choose>

</xsl:template>

得到了想要的效果,即HTML中表格等主体内容,也是中间对齐了:

HTML中表格主体现在是中间对齐了

【总结】

想要设置HTML中formal的(除了标题title外的)主体内容也是中间对齐的话,是要找到HTML的xsl中关于formal的设置,是在docbook-xsl-ns-1.76.1\html\formal.xsl中的

<xsl:template name="formal.object">

然后把对应的:

<div class="{$class}-contents">

改为:

<div class="{$class}-contents" align="center" >

即可实现HTML中输出的formal(表格,图片等)的主体内容部分,都是中间对齐了。

转载请注明:在路上 » 【已解决】Docbook中输出HTML的表格设置为居中对齐

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.187 seconds, using 22.12MB memory