XSL转换后,LaTeX表不适合线宽

时间:2013-11-21 12:36:22

标签: xml xslt xhtml latex xslt-1.0

我正在尝试使用XSLT(版本1.0)将表格从XHTML转换为LaTeX,但该表格不适合文档有用区域(宽度 - 16cm)。

没有colspan的表格恰好适合文档的有用区域,但是带有colspan的表格超出了这个区域。

我无法弄清楚我做错了什么。

实施例

XHMTL表

<table border="1" cellspacing="0" cellpadding="0">
    <tr>
        <td colspan="2"> <strong>LOREM</strong></td> 
        <td colspan="10"><strong>IPSUM DOLOR SIT AMET</strong></td> 
    </tr>
    <tr>
        <td colspan="2"></td>
        <td><strong>consectetuer</strong></td> 
        <td><strong>adipiscing</strong></td> 
        <td><strong>elit</strong></td> 
        <td><strong>Aenean</strong></td> 
        <td><strong>commodo</strong></td> 
        <td><strong>ligula</strong></td> 
        <td><strong>eget</strong></td> 
        <td><strong>dolor</strong></td> 
        <td><strong>Aenean</strong></td> 
        <td><strong>massa</strong></td> 
    </tr>
    <tr>
        <td><strong>Cum</strong></td> 
        <td>sociis</td> 
        <td>natoque</td> 
        <td>penatibus</td> 
        <td>magnis</td> 
        <td>parturient</td> 
        <td>montes</td> 
        <td>nascetur</td> 
        <td>ridiculus</td> 
        <td>Donec</td> 
        <td>felis</td> 
        <td><strong>ultricies</strong></td> 
    </tr>
</table>

xsl代码

<xsl:template match="xhtml:table">
    <xsl:text>\begin{center}&#10;</xsl:text>
    <xsl:text>\begin{tabulary}{\linewidth}{</xsl:text>

    <xsl:variable name="total_columns">
        <xsl:value-of select="sum(xhtml:tr[1]/*/@colspan) + count(xhtml:tr[1]/*[not(@colspan)])"/>
    </xsl:variable>

    <xsl:text>*{</xsl:text>
    <xsl:value-of select="$total_columns"/>
    <xsl:text>}{C}}&#10;</xsl:text>

    <xsl:text>\toprule&#10;</xsl:text>

    <xsl:for-each select="xhtml:tr">
        <xsl:if test="position() != 1">
            <xsl:text>\midrule&#10;</xsl:text>
        </xsl:if>

        <xsl:if test="position() = 2">
            <xsl:text>\midrule&#10;</xsl:text>
        </xsl:if>

        <xsl:for-each select="xhtml:td|xhtml:th">
            <xsl:if test="self::xhtml:th">\bfseries</xsl:if>

            <xsl:choose>
                <xsl:when test="@colspan">
                    <xsl:if test="current()/@colspan&gt;=0">
                        \multicolumn{<xsl:value-of select="current()/@colspan"/>}{
                        >{\centering\arraybackslash}m{
                        <xsl:value-of select="((16 div $total_columns) * current()/@colspan)"/>cm}}{
                    </xsl:if>
                </xsl:when>
            </xsl:choose>

            <xsl:apply-templates/>

            <xsl:choose>
                <xsl:when test="@colspan">
                    <xsl:if test="current()/@colspan&gt;=0">}</xsl:if>
                </xsl:when>
            </xsl:choose>

            <xsl:if test="position() != last()">
                <xsl:text>&amp;</xsl:text>
            </xsl:if>
        </xsl:for-each>

        <xsl:if test="position()!=last()">\\&#10;</xsl:if>
    </xsl:for-each>

    <xsl:text>\\&#10;\bottomrule</xsl:text>
    <xsl:text>&#10;\end{tabulary}&#10;</xsl:text>
    <xsl:text>\end{center}</xsl:text>

</xsl:template>

1 个答案:

答案 0 :(得分:1)

  

我不确定LaTeX有什么问题,生成了桌子,但即使宽度限制在16cm,桌子也超出了面积。然后,这不一定是XSLT问题。不完全是主题,但您可能希望使用TeXML(getfo.org/texml)转换XHTML&gt; LaTeX与XSLT(其中TeXML是中间步骤)。