我正在尝试并排添加两个表,它们需要拆分,不能像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
我的建议是:
采取以下使用包
longtable
,datatool
。设计一个可以处理你的任务的表似乎是可能的。还有很多问题没有得到解答。
如果表 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...如果您想改变距离,加载数组并定义新的列类型......
如果您需要更多信息,请随时联系我......