![以可变高度垂直分隔页面](https://linux22.com/image/301991/%E4%BB%A5%E5%8F%AF%E5%8F%98%E9%AB%98%E5%BA%A6%E5%9E%82%E7%9B%B4%E5%88%86%E9%9A%94%E9%A1%B5%E9%9D%A2.png)
其他解释:
这是一个模板,在标记 #1 处插入了一个表格,在标记 #3 处插入了一些文本。插入的文本和表格对于每个数据集的大小不同。通常两者都适合放在一页上,但有些更长。因此,在正常情况下,两者都小于半页长,\rule
(标记 #2)应该保持垂直居中。在任何其他情况下,如果一个大于半页,它应该向上或向下移动,如果表格(标记 #1)长于 1 页,它甚至应该移动到下一页。如果有两页,\rule
如果文本(标记 #3)不太长,最好将(标记 #2)放在第二页的中央,但这不是必要的。
如何让\rule
(标记#2)垂直保持在页面中心?
如果表格(标记 #1)增大,则应将\rule
(标记 #2)向下移动或移至下一页。如果文本(标记 #3)增大,则应将\rule
(标记 #2)向上移动,然后再开始新的一页。
内容表和文本由python脚本生成,并且每个数据集的大小不一样。
有没有简单的方法可以做到这一点?或者我必须获取文本和表格的大小并计算变量的值\vspace
。
\documentclass{scrartcl}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{blindtext}
\begin{document}
\begin{longtabu}{XXX} %#1
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
\vfill
\noindent\rule[1mm]{1.0\textwidth}{2pt} %#2
\blindtext %#3
\vfill
\end{document}
我\vfill
目前正在使用这种方法来保持页面内容均匀分布,但我的目标是让\rule
(标记 #2)尽可能长时间地保持在页面的中心。表格和文本(标记 #1 和 #2)用 python 填充,文本和表格没有固定长度。因此,文档可能长于一页,并且(标记 #2)可能\rule
在第二页。
一些例子:
| 表格高度 (标记 #1) | 文本高度 (标记 #3) | 距顶部约 x 英寸处的线段 | |------------------------|-----------------------|-----------------------| | 0.25\textheight | 0.25\textheight | 0.50\textheight | | 0.60\textheight | 0.25\textheight | 0.60\textheight | | 0.25\textheight | 0.60\textheight | 0.40\textheight | | 1.50\textheight | 0.25\textheight | 下一页 0.50\textheight |
解决方案:
以下是我现在使用的。它基于 cfr 的答案并支持多页,以便\rule
保持在后续页面的中心,或者如果由于底部文本而需要开始新页面。
这是我第一次做这样的事情,所以如果有错误或更好的方法,请告诉我。
\documentclass{scrartcl}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{calc}
\usepackage{blindtext}
\newlength{\mytopheight}
\newlength{\mybotheight}
\newcommand*\mymidrule{\noindent\rule[1mm]{\linewidth}{2pt}}
\newlength{\targetheight}
\setlength{\targetheight}{\dimexpr\textheight-2pt-2\baselineskip-2\parskip}% if an adjustment is needed for the rule width
\newlength{\mybotoversize}
\newlength{\myspacing}
\newlength{\lengtha}
\newsavebox{\mytop}
\newsavebox{\mybot}
\setlength{\parindent}{0pt}
\newcommand\myrulesplit[2]{%
\sbox{\mytop}{%
\begin{minipage}[t]{\linewidth}
#1
\end{minipage}%
}%
\sbox{\mybot}{%
\begin{minipage}[t]{\linewidth}
#2
\end{minipage}%
}%
\settototalheight{\mytopheight}{\usebox{\mytop}}%
\settototalheight{\mybotheight}{\usebox{\mybot}}%
\loop
\ifdim\mytopheight>\textheight
\setlength{\mytopheight}{\dimexpr\mytopheight-\textheight}%
\repeat
\loop
\ifdim\mybotheight>\textheight
\setlength{\mybotheight}{\dimexpr\mybotheight-\textheight}%
\repeat
\setlength{\mybotoversize}{\dimexpr\mybotheight-.5\targetheight}
\ifdim\mybotoversize<0pt\setlength{\mybotoversize}{0pt}\fi % if smaler than half of the available space
\setlength{\myspacing}{\dimexpr.5\targetheight-\mytopheight}
\ifdim\mybotoversize<\myspacing\setlength{\myspacing}{\dimexpr\myspacing-\mybotoversize}\fi % bottom smaler then available space move rule
\ifdim\myspacing<0pt\setlength{\myspacing}{0pt}\fi % if page is full
#1\par\vspace*{\myspacing}\mymidrule\par#2
% mytopheight:\the\textheight\\
% mytopheight:\the\mytopheight\\
% mybotheight:\the\mybotheight\\
% mybotoversize:\the\mybotoversize\\
% myspacing:\the\myspacing\\
}
\begin{document}
\myrulesplit{%
\begin{longtabu}{XXX} %#1
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
}{%
\blindtext
\blindtext
\blindtext
\blindtext
}
\clearpage
\myrulesplit{%
\begin{longtabu}{XXX} %#1
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
}{%
\blindtext
\blindtext
}
\clearpage
\myrulesplit{%
\begin{longtabu}{XXX} %#1
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
}{%
\blindtext
\blindtext
\blindtext
\blindtext
}
\clearpage
\myrulesplit{%
\begin{longtabu}{XXX} %#1
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
}{%
\blindtext
}
\clearpage
\myrulesplit{%
\begin{longtabu}{XXX} %#1
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
}{%
\blindtext
}
\clearpage
\myrulesplit{%
\begin{longtabu}{XXX} %#1
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
}{%
\blindtext
\blindtext
\blindtext
}
\clearpage
\myrulesplit{%
\begin{longtabu}{XXX} %#1
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
}{%
\blindtext
}
\end{document}
答案1
如果我明白你的问题了,这个可能,可能做一些模糊的你想要的事情。但我对此非常没有信心!
\documentclass{scrartcl}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{calc}
\usepackage{blindtext}
\newlength{\mytopheight}
\newlength{\mybotheight}
\newcommand*\mymidrule{\noindent\rule[1mm]{\linewidth}{2pt}}
\newlength{\targetheight}
\setlength{\targetheight}{\dimexpr\textheight-2pt-2\baselineskip-2\parskip}% if an adjustment is needed for the rule width
\newlength{\lengtha}
\newsavebox{\mytop}
\newsavebox{\mybot}
\newlength{\normalparindent}
\setlength{\normalparindent}{\parindent}
\newcommand\myrulesplit[2]{%
\sbox{\mytop}{%
\begin{minipage}[t]{\linewidth}
\setlength{\parindent}{\normalparindent}%
#1
\end{minipage}%
}%
\sbox{\mybot}{%
\begin{minipage}[t]{\linewidth}
\setlength{\parindent}{\normalparindent}%
#2
\end{minipage}%
}%
\settototalheight{\mytopheight}{\usebox{\mytop}}%
\ifdim\mytopheight>.5\targetheight#1\par\mymidrule\par#2
\else
\settototalheight{\mybotheight}{\usebox{\mybot}}%
\ifdim\mybotheight>.5\targetheight
\setlength{\lengtha}{\dimexpr\mytopheight+\mybotheight}%
\ifdim\lengtha>\targetheight#1\par\mymidrule\par#2
\else#1\vfill\par\mymidrule\par#2%
\fi
\else
\smash{\usebox{\mytop}}\vfill\par\mymidrule\par\smash{\usebox{\mybot}}\vfill%
\fi
\fi
}
\begin{document}
\myrulesplit{%
\begin{longtabu}{XXX} %#1
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
}{%
\blindtext
\blindtext
}
\clearpage
\myrulesplit{%
\begin{longtabu}{XXX} %#1
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
}{%
\blindtext
\blindtext
\blindtext
\blindtext
}
\clearpage
\myrulesplit{%
\begin{longtabu}{XXX} %#1
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
}{%
\blindtext
}
\end{document}
答案2
这是其中一种方法。它\raisebox
正好占据了半页。
\documentclass{scrartcl}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{blindtext}
\newsavebox{\tempbox}
\begin{document}
\noindent\raisebox{-\height}[0pt][0.5\textheight]{%
\begin{minipage}{\textwidth}
\begin{longtabu}{XXX} %#1
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
\end{minipage}}
\noindent\rule[1mm]{1.0\textwidth}{2pt} %#2
\blindtext %#3
\end{document}
这是另一个。由于每个都\vfill
扩展到相同的大小,因此上方和下方占用的空间必须相同。 \smash
使它们实际上不占用任何空间。可以使用\rlap
和\llap
在水平方向上实现相同的效果。
\documentclass{scrartcl}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{blindtext}
\newsavebox{\tempbox}
\begin{document}
\noindent\smash{\begin{minipage}[t]{\textwidth}
\begin{longtabu}{XXX} %#1
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{longtabu}
\end{minipage}}
\vfill
\noindent\rule[1mm]{1.0\textwidth}{2pt} %#2
\noindent\smash{\begin{minipage}[t]{\textwidth}
\blindtext %#3
\end{minipage}}
\vfill
\end{document}