模拟 html 行跨度和列跨度布局

模拟 html 行跨度和列跨度布局

我有一个 html 文件,它通过 wkhtmltopdf 转换为 PDF。我想将其转换为 LaTeX,因为它可以更好地处理页脚、分页符等。

我目前遇到的具体问题在于 html 中定义的表。这是一个粗略的 MWE:

<style>
 table { width: 100% }
 td {
      border: 1px solid black;
      vertical-align: top;
 }
</style>

<table class>
    <tr>
        <td>
            Heading 1 <br>
            A <br>
            B <br>
            C <br>
            D
        </td>
        <td rowspan="2">
            Heading 2 <br>
            A <br>
            B <br>
            C <br>
            D <br>
            E <br>
            F <br>
            G <br>
            H <br>
            I <br>
            J <br>
            K <br>
            L <br>
            M <br>
            N <br>
            O <br>
            P
        </td>
        <td>
            Heading 3 <br>
            A <br>
            B <br>
            C <br>
            D
        </td>
        <td>
            Heading 4 <br>
            A <br>
            B <br>
            C <br>
            D <br>
            E
        </td>
    </tr>
    <tr>
        <td>
            Heading 5 <br>
            A <br>
            B <br>
            C <br>
            D <br>
            E
        </td>
        <td rowspan="2">
            Heading 6 <br>
            A <br>
            B <br>
            C <br>
            D <br>
            E <br>
            F <br>
            G <br>
            H <br>
            I
        </td>
        <td>
            Heading 7 <br>
            A <br>
            B <br>
            C <br>
            D <br>
            E <br>
            F <br>
            G
        </td>
    </tr>
    <tr>
        <td>
            Heading 8 <br>
            A <br>
            B <br>
            C <br>
            D <br>
            E
        </td>
        <td>
            Heading 9 <br>
            A <br>
            B <br>
            C <br>
            D
        </td>
        <td>
            Heading 10 <br>
            A <br>
            B <br>
            C <br>
            D <br>
            E
        </td>
    </tr>
</table>

这将呈现一个大致如下所示的表格: 表格布局,有 4 列 3 行。第 2 列,第 1 行和第 2 行合并。第 3 列,第 2 行和第 3 行合并。

请注意,每行中的单元格都是对齐的,并且当输出大于分配的最小单元格大小时,如在一个合并的单元格中,所有其他单元格都会获得空白空间以保持对齐。

还要注意,项目 A、B、C... 是关键短语,通常足够短以适合其单元格,但偶尔会长到可以填满 2 或 3 行。因此,它们必须能够溢出到其列中的多行上。

我在防止溢出、使文本对齐以及在 LaTeX 中绘制单元格周围的边框方面遇到了一些困难。到目前为止,我所做的最好的工作是使用 minipages 完成以下工作:

\documentclass[]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{multirow}
\begin{document}
    \begin{table}[]
        \begin{tabular}{|p{4cm}|p{4cm}|p{4cm}|p{4cm}|}
            \hline
            \begin{tabular}[c]{@{}l@{}}
                Heading 1 \\
                A \\
                B \\
                C \\
                D
            \end{tabular} &
            \multirow{2}{*}{
                \begin{tabular}[c]{@{}l@{}}
                    Heading 2 \\
                    A \\
                    B \\
                    C \\
                    D \\
                    E \\
                    F \\
                    G \\
                    H \\
                    I \\
                    J \\
                    K \\
                    L \\
                    M \\
                    N \\
                    O \\
                    P
                \end{tabular}
            } &
            \begin{tabular}[c]{@{}l@{}}
                Heading 3 \\
                A \\
                B \\
                C \\
                D
            \end{tabular} &
            \begin{tabular}[c]{@{}l@{}}
                Heading 4 \\
                A \\
                B \\
                C \\
                D \\
                E
            \end{tabular} \\
            \hline
            \begin{tabular}[c]{@{}l@{}}
                Heading 5 \\
                A \\
                B \\
                C \\
                D \\
                E
            \end{tabular} & &
            \multirow{2}{*}{
                \begin{tabular}[c]{@{}l@{}}
                    Heading 6 \\
                    A \\
                    B \\
                    C \\
                    D \\
                    E \\
                    F \\
                    G \\
                    H \\
                    I
                \end{tabular}
            } &
            \begin{tabular}[c]{@{}l@{}}
                Heading 7 \\
                A \\
                B \\
                C \\
                D \\
                E \\
                F \\
                G
            \end{tabular} \\
            \hline
            \begin{tabular}[c]{@{}l@{}}
                Heading 8 \\
                A \\
                B \\
                C \\
                D \\
                E
            \end{tabular} &
            \begin{tabular}[c]{@{}l@{}}
                Heading 9 \\
                A \\
                B \\
                C \\
                D
            \end{tabular} & &
            \begin{tabular}[c]{@{}l@{}}
                Heading 10 \\
                A \\
                B \\
                C \\
                D \\
                E
            \end{tabular} \\
            \hline
        \end{tabular}
    \end{table}
\end{document}

如下所示,这会导致溢出和奇怪的对齐: 损坏的 LaTeX 表格布局

尝试向单个单元格添加 \hline 也无助于改善问题。

有没有办法在 LaTeX 中实现 html 输出中显示的布局,同时保留一些 html 特性,如扩大单元格以适应内容、保持给定行中的单元格对齐以及保留边框?(请注意,边框不必出现在每个单独的方块周围,如果它们看起来像标准的 Word 表格,彼此之间有连续的边框,那就更好了。)

还有一点需要注意——外观方面,我很清楚所要求的表格不符合最佳实践。但是,这是客户要求的,所以我不能随意对表格布局进行大范围的重新安排。

答案1

不确定这是否是您要找的内容:

姆韦

\documentclass[]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{multirow,lipsum,tabularx}
\let\xpar\par
\def\heading#1{\vskip-10pt\textbf{Heading #1}\par}
\newcolumntype{T}{>{\parskip2ex}X}
\begin{document}
\noindent
\begin{tabularx}{\linewidth}{|T|T|T|T|}\hline
\heading A \lipsum[1][1]\lipsum[1][0]\par\lipsum[1][1]\par\lipsum[1][2] &
\multirow{2}{\linewidth}{\parskip2ex plus 2ex minus 1ex  
\heading B 
\xpar\lipsum[2][1]\lipsum[2][0]\xpar\lipsum[2][1]\xpar\lipsum[2][2]
\lipsum[2][3]\lipsum[2][4]\xpar\lipsum[1][1]
}
 & 
\heading C \lipsum[3][1]\lipsum[3][0]\par\lipsum[3][3]\par\lipsum[3][2] & 
\heading D \lipsum[4][1]\lipsum[4][0]\par\lipsum[4][1]\par\lipsum[4][2] \\\cline{1-1}\cline{3-4}
\heading E \lipsum[5][1]\lipsum[5][0]\par\lipsum[5][1]\par\lipsum[5][2-4] & 
 & % empty cell 
\multirow{2}{\linewidth}{\parskip2ex plus 2ex minus 1ex 
\heading G 
\xpar\lipsum[6][1]\lipsum[6][0]\xpar\lipsum[6][1]\xpar\lipsum[6][2]
\lipsum[7][1]\lipsum[7][0]\xpar\lipsum[7][1]\xpar\lipsum[7][2]
\lipsum[7][3]\xpar\lipsum[7][4-11]
}
& 
\heading H \lipsum[8][1]\lipsum[1][0]\par\lipsum[8][1] \\\cline{1-2}\cline{4-4}
\heading I \lipsum[9][1]\lipsum[9][0]\par\lipsum[9][1] \smallskip & % ending skip  
\heading J \lipsum[10][1]\lipsum[10][0]\par\lipsum[10][1]\par\lipsum[10][2] & 
 & % empty cell
\heading L \lipsum[11][11]\lipsum[11][0]\par\lipsum[11][1]\par\lipsum[11][2] \\\hline
\end{tabularx}

\end{document}

总而言之,该方法只是多行单元格(以便tabularx轻松修复列的宽度),但这些单元格中的段落有点棘手,因此使用\parbox特殊的\xpar(或者,您可以使用带有额外空间的换行符来\\[3ex]制作假段落)。

还要注意,多行单元格的高度不是根据内部\parbox内容扩展,而是根据其他单元格的内容扩展,因此如果您在单元格 B 中添加过多文本,它将与单元格 J 重叠。

相关内容