两张并排的长桌

两张并排的长桌

我正在尝试并排添加两个表,它们需要拆分,不能像a & b & & & & c & d

\begin{longtable}{cc} 
    \begin{longtable}
        \hline
        a & b\\
    \end{longtable} &

    \begin{longtable}
        \hline
        c & b\\
    \end{longtable}
\end{longtable} 

然而,这种方法导致 TeX 容量超出范围。

后续我正在使用 Python 的 Jinja2 模板包将内容动态添加到我的 latex 文件中,然后使用 Python 的 latex 包编译该 latex 文件。

无论如何,在 Python 中,我不知道何时到达当前页面的末尾,因此如果我使用表格,我会离开该页面。Longtable 很有前途,因为它会自动继续向下到第二页,并实现平滑过渡。

还有其他方法可以解决这个问题吗?

答案1

如果我理解您的需求:您需要将一个表格的数据以紧凑的形式放置在源文件中,然后放置第二个表格的数据,然后将这些表格一个接一个地打印出来,它们具有不同的高度,并且必须可以分页。这可以通过以下代码完成:

\newbox\tleftbox \newbox\trightbox

\def\tableleft{\setbox\tleftbox=\vbox\bgroup\tablelr}
\def\tableright{\setbox\trightbox=\vbox\bgroup\tablelr}

\def\tablelr#1{\let\\=\cr
   \halign{\vrule\strut\hbox to2em{\hss##\unskip\hss}&%
                       \hbox to2em{\strut\hss##\unskip\hss}\vrule\cr
   \noalign{\penalty0\hrule\nobreak}#1\crcr
   \noalign{\hrule\kern-.4pt\kern-\dp\strutbox}}
   \egroup
}
\def\printtables{\medskip\bgroup
   \splittopskip=0pt plus5pt \offinterlineskip
   \dimen0=\wd\tleftbox \dimen1=\wd\trightbox
   \setbox0=\vsplit\tleftbox to0pt \setbox1=\vsplit\trightbox to0pt
   \printtablesA \egroup
   \kern\dp\strutbox \medskip
}
\def\printtablesA{
   \setbox0=\vsplit\tleftbox to16pt \setbox1=\vsplit\trightbox to16pt
   \ifvoid0 \ifvoid1 \let\printtablesA=\relax \fi\fi
   \ifx\printtablesA\relax \else \hbox{\tline0\kern15pt\tline1}\fi
   \printtablesA
}
\def\tline#1{\ifvoid#1\kern\dimen#1 \else \vbox{\unvbox#1}\fi}

\vsize=3cm \raggedbottom % Just for testing

\tableleft{
 a & b \\
 c & d \\
 e & f \\
 g & h \\   
 i & j \\
 k & l \\
 m & n \\
 o & p \\   
 a & b \\
 c & d \\  
 e & f \\
 g & h \\   
 i & j \\
 k & l \\  
 m & n \\
 o & p \\   
}
\tableright{
 q & r \\
 s & t \\   
 u & v \\
 w & x \\   
 y & z \\
 q & r \\
 s & t \\
 u & v \\   
 w & x \\
 y & z \\
}
\printtables

\end

为了测试这一点,您可以运行它pdftex file,或者在添加 LaTeX 命令后使用 LaTeX 尝试它(\documentclass等等)。您不需要任何特殊的包。

解释表格首先保存到\tleftbox\trightbox。如果您需要更多表格,您可以声明一个新框\tnextbox(例如),您可以在此处保存下一个表格(或者您可以使用另一个更具描述性的名称约定)。然后宏\printtables进行初始设置并重复运行。此宏从和\printtablesA获取第一行并使用原语将它们移动到和。您可以通过例如为下一个表格添加类比过程。如果所有框都是空的:\tleftbox\trightbox\box0\box1\vsplit\setbox2=\vsplit\tnextbox to16pt

\ifvoid0 \ifvoid1 \ifvoid2 \let\printtablesA=\relax \fi\fi\fi

然后循环结束。由 构成的行\box0使用和宏\box1打印到输出中。对于三个表,它看起来像\hbox\tline

\hbox{\tline0\kern15pt\tline1\kern15pt\tline2}

表格之间的水平间距在此处指定(15pt)。输出由此类 es 填充,\hbox并且这些 es 的列表\hbox当然可以分成几页。

答案2

虽然 Python 不能知道当表格到达页面底部时,它可以做出很好的猜测。如果所有条目的大小大致相同,则只需计算表格中的行数并每n行开始一个新表格,具体n取决于页面的几何形状、字体大小、表格中的条目等。

根据表格的内容,如果您在每页上始终放置相同数量的行,这也可能对读者有所帮助。然后,如果您查找特定行,则可以估计必须在哪一页上查找。

答案3

我的建议是:

采取以下使用包

longtabledatatool。设计一个可以处理你的任务的表似乎是可能的。还有很多问题没有得到解答。

如果表 1 比表 2 长得多怎么办?如果表 1 比表 2 短得多怎么办?您想如何处理这种情况?

也许我有一个解决方案给你,但目前我只能猜测。

\documentclass[10pt]{article}
\usepackage{graphicx,fancyhdr,import,hyperref}
\usepackage{longtable}
\usepackage{datatool}

\begin{document}

\DTLsetseparator{,}
\DTLloadrawdb[noheader,keys={a,b,c,d}]{ex}{data.csv} 
\begin{longtable}{|c|c|cccc|c|c|}\hline
\DTLforeach{ex}{\a=a, \b=b,\c=c,\d=d}%
            {%
            \DTLiffirstrow{}%
                {%
                    \\%
                }%
             \protect\a&%
             \protect\b&&&&&\protect\c&\protect\d%
            }%
\end{longtable}

\end{document}

您应该调整 longtable header、firstheader、firstfooter、lastfooter...如果您想改变距离,加载数组并定义新的列类型......

如果您需要更多信息,请随时联系我......

相关内容