将具有 rowspan 和 colspan 的 XHTML 表格转换为 LaTeX

问题描述 投票:0回答:1

我一直在寻找将 HTML 表格转换为 LaTeX 的合适解决方案。我发现以下问题与我的要求类似:

但是这两个对于我当前的要求并不是 100% 有帮助,因为它不涉及

colspan
rowspan
的内容转换。

输入的 HTML 看起来像:

<html>
 <head>
 </head>
 <body>
  <table border="1">
    <tr>
     <td>This</td>
     <td>is</td>
     <td>a</td>
     <td>test</td>
    </tr>
    <tr>
     <td colspan="2">This is</td>
     <td>a</td>
     <td>test</td>
    </tr>
    <tr>
     <td>This</td>
     <td>is</td>
     <td colspan="2">a test</td>
    </tr>
    <tr>
     <td rowspan="2">This</td>
     <td colspan="2">is a</td>
     <td rowspan="2">test</td>
    </tr>
    <tr>
     <td>is</td>
     <td>a</td>
    </tr>
  </table>
 </body>
</html>

我期望的 LaTeX 代码输出是:

\documentclass{standalone}
\usepackage{multirow}
\begin{document}
\begin{tabular}{*{4}{|l}|}
\hline
This & is & a & test\\
\hline
\multicolumn{2}{|l|}{This is} & a & test \\
\hline
This & is & \multicolumn{2}{|l|}{a test} \\
\hline
\multirow{2}*{This} & \multicolumn{2}{|l|}{is a} & \multirow{2}*{test} \\
\cline{2-3}
 & is & a &  \\
\hline
\end{tabular}
\end{document}

我采用了@DavidCarlisle在使用XSLT将XHTML表转换为LaTeX中给出的解决方案,并进行了如下修改:

<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xsl:output method="text"/>

<xsl:template match="/">
\documentclass{standalone}
\usepackage{multirow}
\begin{document}
<xsl:apply-templates/>
\end{document}
</xsl:template>

<xsl:template match="table">
<xsl:variable name="noc" select="max(tr/sum(td/(@colspan/number(.),1)[1]))"/>
<xsl:text>\begin{tabular}{*{</xsl:text>
<xsl:value-of select="$noc"/>
<xsl:text>}{|l}|}&#10;</xsl:text>
<xsl:apply-templates select="tr[1]">
 <xsl:with-param name="rspans" select="for $i in 1 to xs:integer($noc) return 0"/>
</xsl:apply-templates>
<xsl:text>\end{tabular}</xsl:text>
</xsl:template>

<xsl:template match="tr">
 <xsl:param name="rspans"/>
<xsl:text/>% [<xsl:value-of select="$rspans"/>]
 <xsl:variable name="tr" select="."/>
 <xsl:for-each select="$rspans">
  <xsl:variable name="c" select="position()"/>
  <xsl:variable name="td" select="$tr/td[count($rspans[position() &lt;=$c][.=0])]"/>
  <xsl:if test=".=0">
   <xsl:if test="$td/@rowspan[. &gt; 1]">
    <xsl:text>\multirow{</xsl:text>
    <xsl:value-of select="$td/@rowspan"/>
    <xsl:text>}{*}{</xsl:text>
   </xsl:if>
   <xsl:if test="$td/@colspan[. &gt; 1]">
    <xsl:text>\multicolumn{</xsl:text>
    <xsl:value-of select="$td/@colspan"/>
    <xsl:text>}{|l|}{</xsl:text>
   </xsl:if>
   <xsl:apply-templates select="$td"/>
   <xsl:if test="$td/@colspan[. &gt; 1]">}</xsl:if>
   <xsl:if test="$td/@rowspan[. &gt; 1]">}</xsl:if>
  </xsl:if>
  <xsl:choose>
   <xsl:when test=". &gt;1 and position()=last()">&amp;\\\hline&#10;</xsl:when>
   <xsl:when test="position()=last()">\\\hline&#10;</xsl:when>
   <xsl:otherwise>&amp;</xsl:otherwise>  
  </xsl:choose>
 </xsl:for-each>
 <xsl:apply-templates select="following-sibling::tr[1]">
  <xsl:with-param name="rspans" select="for $c in 1 to count($rspans)
   return
   ($rspans[$c] +
   td[count($rspans[position() &lt;=$c][.=0])]/(@rowspan,1)[1]
   -1)"/>
 </xsl:apply-templates>
</xsl:template>

</xsl:stylesheet>

生成的 LaTeX 代码包含以下问题:

  1. 我无法正确输入
    \cline{...}
    命令。如果当前行中有一行跨越,则需要
    \cline{..}
    。否则需要
    \hline
  2. 在第二行中,在
    \\\hline
    之前的末尾出现了一个额外的 &(与号)符号。
  3. 最后一行,第三列(内容“a”)缺失。

这个问题有什么解决办法吗?

html xslt latex xslt-2.0
1个回答
0
投票

我在 https://www.tablesgenerator.com/ 上取得了一些成功(粘贴了我的 HTML,在乳胶中得到了转换后的表格)。

这是一个客户端软件,所以我想人们可以研究一下他们是如何实现这一目标的。

© www.soinside.com 2019 - 2024. All rights reserved.